4.3 最优装载

news2024/11/25 6:39:31

 


  • 博主简介:一个爱打游戏的计算机专业学生
  • 博主主页: @夏驰和徐策
  • 所属专栏:算法设计与分析

 1.什么是贪心算法的最优装载问题?

最优装载问题(Bin Packing Problem)是一个经典的组合优化问题,涉及将一组物品放入有限数量的容器中,使得所使用的容器数最少。

以下是最优装载问题的贪心算法的基本思想和步骤:

1. 贪心策略:选择最适合的物品放入当前可用的容器中。在最优装载问题中,一种常用的贪心策略是"首次适应法"(First Fit),即将每个物品依次尝试放入已有的容器中,如果无法放入任何容器,则开启一个新的容器。

2. 排序物品:按照物品的大小(体积或重量)进行非递增排序。这样可以使得较大的物品更容易放入已有的容器中。

3. 初始化容器:准备一个空容器列表。

4. 遍历物品:对于每个物品,按照贪心策略进行处理。
   - 尝试放入已有容器:遍历容器列表,尝试将当前物品放入容器中。若找到合适的容器,将物品放入并更新容器的剩余空间。
   - 开启新容器:如果无法放入任何已有的容器,开启一个新的容器,并将当前物品放入其中。

5. 输出结果:返回使用的容器数和具体物品的分配情况。

这个贪心算法的思路是利用首次适应法来将物品放入容器中,尽可能地填满每个容器。但需要注意,贪心算法并不能保证得到最优解。最优装载问题是NP-hard问题,没有多项式时间的确定性算法可以找到最优解。因此,贪心算法只能提供一种近似解,并不一定是最优解。如果需要精确的最优解,可以考虑使用其他算法,如动态规划或回溯搜索。

 2.什么是NP-hard问题?

NP-hard(Non-deterministic Polynomial-time hard)问题是指一类计算问题,其在多项式时间内难以求解,但可以在多项式时间内验证一个解的正确性。

更具体地说,一个问题被称为NP-hard,如果在多项式时间内可以将任何NP问题规约(reduction)到它。规约是一种将一个问题转化为另一个问题的方法,保持问题的本质。如果一个问题可以被规约到NP-hard问题,那么该问题也被认为是NP-hard的。

NP-hard问题是计算复杂性理论中的重要概念,与NP问题密切相关。NP问题是指可以在多项式时间内验证一个解的正确性的问题。NP-hard问题的困难程度超过了NP问题,因为如果一个NP-hard问题可以在多项式时间内求解,那么所有的NP问题也可以在多项式时间内求解,即P = NP。然而,目前尚未找到多项式时间内求解NP-hard问题的算法,因此NP-hard问题被认为是难以求解的。

在实践中,解决NP-hard问题通常需要使用启发式算法、近似算法或其他形式的近似方法来获得次优解或近似解。NP-hard问题在各个领域中都有广泛的应用,例如旅行商问题、背包问题、图着色问题等。解决NP-hard问题是一个重要的研究方向,对于算法设计和计算复杂性理论有重要意义。

 

 5.算法实现

C语言:

#include <stdio.h>

// 贪心算法实现最优装载问题
int binPacking(int items[], int n, int binCapacity) {
    // 创建一个容器数组并初始化
    int bins[n];
    for (int i = 0; i < n; i++) {
        bins[i] = binCapacity;
    }

    // 遍历物品
    for (int i = 0; i < n; i++) {
        int j;
        // 尝试将当前物品放入已有的容器中
        for (j = 0; j < n; j++) {
            if (items[i] <= bins[j]) {
                // 如果物品可以放入容器中,则更新容器的剩余容量
                bins[j] -= items[i];
                break;
            }
        }
        // 如果无法放入任何已有容器,则开启一个新的容器
        if (j == n) {
            bins[i] = binCapacity - items[i];
        }
    }

    // 计算使用的容器数
    int usedBins = 0;
    for (int i = 0; i < n; i++) {
        if (bins[i] != binCapacity) {
            usedBins++;
        }
    }

    return usedBins;
}

int main() {
    int items[] = {2, 5, 4, 7, 1, 3, 8};
    int n = sizeof(items) / sizeof(items[0]);
    int binCapacity = 10;

    int usedBins = binPacking(items, n, binCapacity);

    printf("使用的容器数:%d\n", usedBins);

    return 0;
}

上述代码使用了一个简单的循环来遍历物品,并尝试将物品放入已有的容器中,如果无法放入任何已有容器,则开启一个新的容器。然后通过计算使用的容器数来得到最终的结果。注意,上述代码是一个简化的示例,并没有考虑物品的排序和更复杂的贪心策略。在实际应用中,可能需要根据具体问题进行适当的修改和调整。

C++实现:

#include <iostream>
#include <vector>

// 贪心算法实现最优装载问题
int binPacking(std::vector<int>& items, int binCapacity) {
    // 创建一个容器数组并初始化
    std::vector<int> bins;
    bins.push_back(binCapacity);

    // 遍历物品
    for (int i = 0; i < items.size(); i++) {
        bool placed = false;
        // 尝试将当前物品放入已有的容器中
        for (int j = 0; j < bins.size(); j++) {
            if (items[i] <= bins[j]) {
                // 如果物品可以放入容器中,则更新容器的剩余容量
                bins[j] -= items[i];
                placed = true;
                break;
            }
        }
        // 如果无法放入任何已有容器,则开启一个新的容器
        if (!placed) {
            bins.push_back(binCapacity - items[i]);
        }
    }

    return bins.size();
}

int main() {
    std::vector<int> items = {2, 5, 4, 7, 1, 3, 8};
    int binCapacity = 10;

    int usedBins = binPacking(items, binCapacity);

    std::cout << "使用的容器数:" << usedBins << std::endl;

    return 0;
}

上述代码使用了std::vector来表示容器和物品,从而实现动态数组的功能。其余的贪心算法实现与C语言版本相似,遍历物品并尝试将物品放入已有的容器或开启新的容器。最后通过计算使用的容器数来得到结果。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】-编译器-gcc/g++使用以及动态库和静态库的介绍(以及解决sudo失败的方法)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点…

iOS证书(.p12)和描述文件(.mobileprovision)申请

目录 iOS证书(.p12)和描述文件(.mobileprovision)申请文末扩展&#xff08;UDID获取、添加测试设备&#xff09; 说明&#xff1a;本文申请证书、描述文件转载自 uniapp官网   iOS证书(.p12)和描述文件(.mobileprovision)申请      官网会时不时更新&#xff0c;如有疑问&…

《Apollo 智能驾驶进阶课程》二、 高精地图

1. 高精地图与自动驾驶的关系 1.1 高精地图与自动驾驶 L3级别以上才需要高精地图 1.2 什么是高精地图 1.3 高精地图与导航地图 1.4 高精地图-基础模块 高精地图与定位模块的关系 现在主流的自动驾驶的定位方案有两种&#xff1a;一种是基于点云&#xff0c;另一种是基于C…

投票系统(前后端分离)

1.投票系统的介绍 投票系统是一种用于组织选举和投票的软件系统&#xff0c;它可以帮助政府、企业、组织和社区等各种机构进行公正、透明和高效的投票活动。投票系统的主要功能包括&#xff1a;选民身份验证、投票管理、计票和结果公布等。 选民身份验证是指投票系统可以通过…

SpringCloud Sleuth/Zipkin学习

SpringCloud Sleuth/Zipkin 文章目录 SpringCloud Sleuth/Zipkin1 Sleuth/Zipkin 简介2 Sleuth/ZipKin-搭建链路监控实例 1 Sleuth/Zipkin 简介 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用, 来协同产生最后的请求结果&…

电脑右键删除的文件如何恢复?提供了4种方法

电脑上不小心删除文件是很常见的一件事。比如在使用右键删除的情况下&#xff0c;但是&#xff0c;误删并不代表永远丧失这个文件&#xff0c;因为我们可以通过一些方法来恢复右键删除的文件。本文提供了4种方法&#xff0c;你可以根据具体的数据丢失情况选择合适的方法。 方法…

【Python】列表 List ③ ( 查询操作 / 修改操作 | 列表查询操作 List#index | 修改列表指定位置元素值 )

文章目录 一、列表查询操作1、List#index 函数简介2、代码示例 - 列表查询3、列表查询 ValueError 报错 二、修改列表指定索引元素1、语法简介2、代码示例 - 使用正向 / 反向索引修改指定元素 一、列表查询操作 1、List#index 函数简介 列表 List 查询功能 , 通过 List#index 函…

PyTorch 深度学习 || 专题一:神经网络基础

神经网络基础 神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向–深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法&#xff0c;同时也可以更好地帮助你理解深度学习技术。 神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器…

【JAVA】双向链表详解

【JAVA】双向链表详解 双向链表的定义双向链表的初步实现&#xff08;准备&#xff09;双向链表的操作一. 打印链表二. 得到链表长度三. 插入操作3.1 头插法3.2 尾插法3.3 任意位置插入 四. 删除操作4.1 删除第一次出现为key的节点&#xff08;3种情况&#xff09;4.2 删除所以…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(四)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

保姆级别ps bate版本下载

前言&#xff1a;最近的ps bete版本在抖音也是上了热搜&#xff0c;时不时就能刷到一个&#xff0c;相信大家也知道ai带来的魅力&#xff0c;真的很强&#xff0c;那我们就开始安装教程吧。 ​过程&#xff1a; 先打开链接&#xff1a;Adobe Creative Cloud | Details and pr…

使用外部工具横向移动

Smbexe、Psexec Psexec PsExec是一种轻巧的telnet代替品&#xff0c;可让您在其他系统上执行进程&#xff0c;并为控制台应用提供完整的交互性&#xff0c;无需手动安装客户端软件。 原理&#xff1a; 1、ipc$连接&#xff0c;释放Psexesvc.exe 2、OpenSCManager打开受害者…

如何使用ChatGPT自带插件

OpenAI的插件将ChatGPT连接到第三方应用程序。这些插件使ChatGPT能够与开发者定义的API进行交互&#xff0c;增强ChatGPT的能力&#xff0c;并使其能够执行广泛的操作。插件使ChatGPT能够做如下事情&#xff1a; 获取实时信息&#xff1b;例如&#xff0c;体育比分&#xff0c…

采样率(压缩比)对OMP算法的影响

前面详细分析了OMP重构算法原理以及实现&#xff0c;本篇主要分析采样率对OMP算法的影响。 OMP重构算法的流程为 以下分析采样率对OMP算法的影响。 先对一维信号重构进行分析&#xff0c;表1是OMP算法中采样率对重构的MSE和时间的对应表格&#xff1a; 表1&#xff1a;MP算法采…

04-Springbooot与Spring Cloud Alibaba搭建后端架构

1、创建Springbooot父工程 1.1、使用快速创建Springbooot工程的方式&#xff1a; 1.2、项目使用Maven进行管理 settings.xml&#xff0c;配好了阿里镜像 02-maven的安装配置_NikoWord的博客-CSDN博客 2、项目初始化配置 01-IDEA使用技巧_NikoWord的博客-CSDN博客 04-设置…

VS2010 C语言DLL项目hello world程序以及win32控制台程序调用dll示例

一、使用Visual Studio 2010编写C语言 DLL项目hello world程序 1.点击桌面 VS2010 图标&#xff0c;运行程序。(或者通过菜单栏打开程序) 2.点击【文件】 -> 【新建】 -> 【项目】 3.点击【VisualC】和【win32控制台应用程序】&#xff0c;设置好名称和存储位置&#xf…

白盒测试方法

为什么要进行白盒测试&#xff1f; 如果所有软件错误的根源都可以追溯到某个唯一原因&#xff0c;那么问题就简单了。然而&#xff0c;事实上一个bug 常常是由多个因素共同导致的&#xff0c;如下图所示。 黑盒查不到的问题 假设此时开发工作已结束&#xff0c;程序送交到测试…

飞腾FT2000实战开发-GPIO的配置

目录 环境&#xff1a; 飞腾GPIO介绍&#xff1a; 临时配置&#xff1a; 永久配置&#xff1a; 环境&#xff1a; CPU:FT2000&#xff08;64位&#xff0c;四核&#xff09; 操作系统&#xff1a;linux-4.4.131-20200710 内核&#xff1a;kylin4.0.2 飞腾GPIO介绍&#x…

JavaScript创建二维数组踩坑记录

需求&#xff1a;创建一个m*n且元素值为0的二维数组 碎碎念 1、 今天刷Leetcode时&#xff0c;遇见一个这样的需求&#xff0c;机智如我&#xff0c;定然不会通过双重for循环来创建&#xff0c;于是&#xff0c;我写了这样一行代码 const dimensionalArray new Array(m).fi…

Spring Boot 加载自定义配置文件

文章目录 一、为什么需要加载自定义配置文件二、使用PropertySource加载自定义配置文件&#xff08;一&#xff09;创建Spring Boot项目&#xff08;二&#xff09;创建自定义配置文件&#xff08;三&#xff09;创建自定义配置类&#xff08;四&#xff09;编写测试方法&#…