Bin Packing - 暴力递归解决方案 - 如何使其更快

2023-12-05

我有一个数组,其中包含不同大小的材料列表:{4,3,4,1,7,8}。但是,该箱子最多可容纳 10 号材料。我需要找出包装数组中所有元素所需的最小箱子数量。

对于上面的数组,你可以打包成 3 个 bin,并按如下方式划分它们:{4,4,1}, {3,7} , {8}。还有其他可能的布置也适合三个库存管,但不能用更少的数量来完成

我试图通过递归来解决这个问题,以便更好地理解它。

我在用thisDP 配方(pdf 文件第 20 页)

考虑输入 (n1;:::;nk),其中 n = Σnj 个项目
确定可以打包到单个 bin 中的 k 元组集(输入的子集)
即,所有 OPT(q1;:::;qk) = 1 的元组 (q1;:::;qk)
用 Q 表示该集合 对于每个 k 元组 q ,我们有 OPT(q) = 1
使用递推式计算剩余值: OPT(i1;:::;ik) = 1 + minOPT(i1 - q1;:::;ik - qk)

我已经编写了代码,对于小数据集来说它工作得很好。但如果将数组的大小增加到超过 6 个元素,它就会变得非常慢——求解包含 8 个元素的数组大约需要 25 秒你能告诉我算法是否有问题吗?我不需要替代解决方案 ---只需要知道为什么这么慢,以及如何改进

这是我用 C++ 编写的代码:

void recCutStock(Vector<int> & requests,  int numStocks)
{
 if (requests.size() == 0)
 {

     if(numStocks <= minSize)
    {
        minSize = numStocks;

    }
//   cout<<"GOT A RESULT : "<<numStocks<<endl;
        return ;
 }
 else
 {
    if(numStocks+1 < minSize) //minSize is a global variable initialized with a big val
    {
     Vector<int> temp ; Vector<Vector<int> > posBins;
     getBins(requests, temp, 0 , posBins); // 2-d array(stored in posBins) containing all possible single bin formations

    for(int i =0; i < posBins.size(); i++)
    {
        Vector<int> subResult;
        reqMinusPos(requests, subResult,  posBins[i]);  // subtracts the initial request array from the subArray
        //displayArr(subResult);


            recCutStock(subResult,  numStocks+1);


    }
    }
    else return;
 }

}

getBins函数如下:

void getBins(Vector<int> & requests, Vector<int> current, int index, Vector<Vector<int> > & bins)

{

if (index == requests.size())

{

if(sum(current,requests) <= stockLength && sum(current, requests)>0 )

        {
                bins.add(current);
            //  printBins(current,requests);
            }
            return ;
        }
        else
        {

        getBins(requests, current, index+1 , bins);
                current.add(index);
            getBins(requests, current, index+1 , bins);
        }
}

动态规划算法为 O(n^{2k}),其中 k 是不同项目的数量,n 是项目的总数。无论实施如何,这都可能非常慢。通常,在解决 NP 难题时,需要启发式方法来提高速度。

我建议您考虑 Coffman 等人的下一次适应递减高度 (NFDH) 和首次适应递减高度 (FFDH)。它们分别是 2 最优和 17/10 最优,并且运行时间为 O(n log n)。

我建议您首先尝试 NFDH:按降序排序,将结果存储在链接列表中,然后重复尝试从头开始插入项目(首先是最大值),直到填满垃圾箱或没有更多项目可以插入被插入。然后转到下一个垃圾箱,依此类推。

参考:

欧文·凯瑟、丹尼尔·莱米尔、标签云绘图:云可视化算法,社会信息组织的标签和元数据 (WWW 2007),2007 年。(有关相关讨论,请参阅第 5.1 节。)

E. G. Coffman, Jr.、M. R. Garey、D. S. Johnson 和 R. E. Tarjan。面向级别的二维打包算法的性能界限。 SIAM J. 计算机,9(4):808–826,1980。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bin Packing - 暴力递归解决方案 - 如何使其更快 的相关文章

  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi
  • 如何获得字符串的所有字谜

    我试图找到一个字符串的所有可能的字谜并仅使用递归将它们存储在数组中 我被困住了 这就是我所拥有的一切 int main const int MAX 10 string a ABCD string arr 10 permute arr a 0
  • Bellman-Ford 算法检测什么?负重还是负循环?

    如果给定一个图 现在我们要从源头计算最短路径 现在 如果一条边具有负权重 但在到达目的地时有边到后边返回到该边 我的意思是如果没有循环 那么我们就没有负循环 但是here http en wikipedia org wiki Bellman
  • 两个非嵌套循环的大 O 表示法

    对于两个非嵌套的 for 循环 大 O 表示法是什么 Example for int i 0 i
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • 如何在 PHP 中递归删除目录及其全部内容(文件+子目录)? [复制]

    这个问题在这里已经有答案了 如何在 PHP 中删除目录及其全部内容 文件和子目录 手册页中的用户贡献部分rmdir http www php net rmdir包含一个不错的实现 function rrmdir dir if is dir
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3
  • cordova 使用什么 js“引擎”?

    Cordova 使用什么 JS 引擎 它是特定于平台的还是跨所有平台的一个标准 意味着 iOS 的 safari 和 Android 的 chrome 以及 Windows 可能的 IE 标准 或者跨所有平台的 Cordova JS 引擎
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • Exposé 布局算法

    我正在制作一些项目 其布局类似于 Mac OS X 在 Expos 中对窗口所做的操作 它适应项目的长宽比和可用区域的长宽比 基本上 可用区域分为行和列 每个单元格 行和列的交集 中放置一个项目 这些项目必须保持其纵横比 此处width h
  • Python 给定 k 个分区的整数分区

    我正在尝试寻找或开发Python 的整数分区代码 仅供参考 整数分区将给定整数 n 表示为小于 n 的整数之和 例如 整数5可以表示为4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 我为此找到了许多解决方案 ht
  • 在 Java 中实现排列算法的技巧

    作为学校项目的一部分 我需要编写一个函数 该函数将接受整数 N 并返回数组 0 1 N 1 的每个排列的二维数组 该声明看起来像 public static int permutations int N 该算法描述于http www usn
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 使用主方法求解 T(n) = 2T(n/2) + n/log n 和 T(n) = 4T(n/2) + n/log n 之间的差异

    我最近偶然发现了一个资源 其中 2T n 2 n log ntypeMM 宣布复发无法解决 我接受它作为一个引理 直到今天 另一种资源被证明是矛盾的 在某种意义上 根据资源 下面的链接 其中的 Q7 和 Q18 是建议 分别在问题中的1和2
  • 高维最近邻搜索的最佳数据结构

    我实际上正在处理高维数据 50 000 100 000 个特征 并且必须对其执行最近邻搜索 我知道随着维度的增长 KD 树的性能很差 而且我还了解到 一般来说 所有空间分区数据结构都倾向于对高维数据执行详尽的搜索 此外 还有两个重要事实需要
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • php 删除特定文件夹及其所有内容

    我正在使用 php 删除包含已删除帖子图像的文件夹 我正在使用下面的代码 这是我在网上找到的并且做得很好 我想知道当一个文件夹中有其他文件夹时 如何只删除其中的特定文件夹 当我使用下面的代码时 如何才能做到这一点 使用 dev images
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包

随机推荐

  • 如何选择要在 TensorBoard 的嵌入选项卡中查看的检查点?

    简短的问题 如何选择在 TensorBoard 的嵌入选项卡中查看哪个检查点 问题的较长版本 我想用 TensorBoard 可视化词嵌入 为此 在阅读完官方教程 mirror 我添加了以下代码 embedding writer tf su
  • 调用托管属性的 getter 时出现 NPE

    我正在使用 Hibernate 学习 Spring 并使用 JSF 作为前端框架创建一个电影租赁应用程序 我的注册 bean 中有一个应用程序范围的托管属性 它是视图范围的 在里面register 方法将用户详细信息插入数据库中 我调用服务
  • C 代码中的内联汇编语句和适用于 ARM Cortex 架构的扩展 ASM

    我正在尝试编译以下两段代码ARM编译器5对于 Cortex A 微处理器 Part 1 static inline void cp15 write sctlr uint32 t value asm mcr p15 0 0 c1 c0 0 r
  • jQuery 与 ASP.NET WebForms - 禁用文本框

    另一个 jQuery 新手问题 我做错了什么 我有一些由 ASP NET 3 5 Webforms 呈现的 HTML 标记 如下所示
  • 更新 Android 联系人提供程序中的联系人图像

    我创建一个应用程序来读取 更新 删除联系人详细信息 这是更新 Contact Image 时出现的问题 当应用程序外部的设备添加新联系人时 没有图像 那么我们就无法更新联系人图片 我的更新代码是 ops add ContentProvide
  • 使用一个全局资源在 ASP.NET Web 表单中进行本地化

    我想要一些这样的资源文件 Mui resx Mui fr resx Mui es resx 我希望能够在我的代码隐藏中做这样的事情 Label1 Text Mui Hello 在我的 aspx 中是这样的 有人知道该怎么做吗 是否可以 对的
  • 如何从 VB.NET 打开 Outlook“新邮件”窗口

    我有一个场景 用户可以从网格中进行选择 已将文件上传到本地文件夹 当用户按 发送 时 应用程序应打开 Outlook 新邮件消息 窗口 其中选择的文件作为附件 用户选择的文件 来自网格 任何帮助将不胜感激 Imports System Di
  • 如何在 J2ME 中修改 XML 的值?

    假设有一个XML in my J2ME应用
  • CImg 的编译错误

    我是第一次使用 CImg 库 在使用仅包含 CImg h 的简单测试程序时出现编译错误 这是为什么 我怎样才能解决这个问题 程序代码 include headers CImg h using namespace cimg library i
  • Firebase 电子邮件验证不适用于 ActionCodeSetting

    我正在尝试实现对用户电子邮件的验证 使用电子邮件模板中的默认验证 URL 以及 ActionCodeSetting URL 动态链接 以将用户带回应用程序 我对 Firebase 的 ActionCodeSetting 电子邮件验证应该如何
  • 如何删除firestore集合数据库中的所有文档

    我使用 Firestore 数据库来存储和检索数据 每天晚上 Firestore 集合中都需要有新的数据集 文档 可用 那么有没有办法一次性完全删除集合中的所有现有文档 我尝试了那里的文档 它说我们需要一一删除 这是不可能的 因为文档ID是
  • 如何在 WinRT 中将字符串绘制到位图图像

    如何在图像中绘制字符串winRT 在 WinForms 中可以使用drawstring 里面的方法system drawing命名空间 但我在 WinRT API 中找不到其等效项 在 Windows 8 1 中 它们最终支持将 XAML
  • 如何在 PHP 中创建 Hashcash

    在网上搜索后 我找不到有关如何在 php 中创建哈希码的答案 我正在编写新闻通讯工具 但不想被列入黑名单 好吧 谁想要 我已经检查过我的反向 DNS SPF 和 spamhaus org 有人可以帮助我如何在 PHP 中创建 hashcas
  • Qt 5.8 和 Pdf.js 错误

    我的 pdf js 和 Qt 5 8 有问题 我尝试在此链接中执行相同的代码在 Qt5 8 中使用 pdf js在我的应用程序中 但他不工作我不知道为什么 qt向我显示这条关于JS的消息 js 未捕获类型错误 无法读取未定义的属性 PDFJ
  • Angular:更新服务并在控制器之间共享数据

    我正在使用服务从 API 获取一些数据 angular module myApp factory myService function q timeout var getMessages function var deferred q de
  • 如何在循环下的 markdown (knitr) 中包含多个plot3d

    我正在循环中使用plot3d rgl 绘制 3d 图表 knit rgl hooks 对于单个 3d 图形工作得很好 但在循环中使用时 markdown 文件不包含 3d 图形 另一种解决方案是包含多个rglwidget 价值观 你需要把它
  • 错误:将标头发送到客户端后无法设置标头

    我对 Node js 还很陌生 并且遇到了一些问题 我正在使用 Node js 4 10 和 Express 2 4 3 当我尝试访问时http 127 0 0 1 8888 auth facebook 我将被重定向到http 127 0
  • 为什么循环引用和递归会使我的程序失败?

    我写了这个简单的 Prolog 程序 man socrates mortal X man X immortal X immortal X 我问了它一些常见的问题 比如苏格拉底是不是一个人 或者苏格拉底是否是一个凡人 man socrates
  • C# 中的谓词是什么? [复制]

    这个问题在这里已经有答案了 我对使用谓词非常陌生 刚刚学会了如何编写 Predicate
  • Bin Packing - 暴力递归解决方案 - 如何使其更快

    我有一个数组 其中包含不同大小的材料列表 4 3 4 1 7 8 但是 该箱子最多可容纳 10 号材料 我需要找出包装数组中所有元素所需的最小箱子数量 对于上面的数组 你可以打包成 3 个 bin 并按如下方式划分它们 4 4 1 3 7