Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 寻找关于理解特定组合优化问题的建议_Algorithm_Optimization_Combinatorics_Knapsack Problem_Bin Packing - Fatal编程技术网

Algorithm 寻找关于理解特定组合优化问题的建议

Algorithm 寻找关于理解特定组合优化问题的建议,algorithm,optimization,combinatorics,knapsack-problem,bin-packing,Algorithm,Optimization,Combinatorics,Knapsack Problem,Bin Packing,给定一组项目(大小介于1到100之间)和多个箱子(1到15)。每个项目都有一个箱子子集,可以将项目分配给这些箱子,以及哪个箱子最好、哪个箱子次好等的优先顺序。项目也有一个自然顺序,下面用命名表示,例如,项目1在项目2之前。每个箱子的容量在1到5之间(每个物品的重量相同,即1) 一个示例输入可以是三个箱子和六个物品(-表示箱子不在物品的可用集合中,即不能与之打包): |bin1 bin2 bin3 | bin1 bin2 bin3 ------------------------

给定一组项目(大小介于1到100之间)和多个箱子(1到15)。每个项目都有一个箱子子集,可以将项目分配给这些箱子,以及哪个箱子最好、哪个箱子次好等的优先顺序。项目也有一个自然顺序,下面用命名表示,例如,项目1在项目2之前。每个箱子的容量在1到5之间(每个物品的重量相同,即1)

一个示例输入可以是三个箱子和六个物品(-表示箱子不在物品的可用集合中,即不能与之打包):

|bin1 bin2 bin3 | bin1 bin2 bin3 ------------------------ ---------------------------- 项目1 | 1 2-容量| 4 4 5 项目2 |-1 2 项目3 | 2 1 3 项目4 | 1 2 3 项目5 | 1-2 项目6 | 1 2 3 目标是(当发生冲突时,每个目标完全覆盖任何较低的目标,例如,无论使用了多少个箱子或忽略了首选项,打包五件物品总是比打包四件好):

  • 最大化包装的物品数量
  • 按其自然顺序包装物品,例如,如果箱子总容量为一个,有两个物品,则将包装物品1,而不包装物品2
  • 尽量减少使用的垃圾箱数量
  • 根据其箱子偏好和自然顺序包装每个项目,即第一个偏好中的项目1和第二个偏好中的项目2优于第二个偏好中的项目1和第一个偏好中的项目2
  • 在两种解决方案无法通过这些目标区分的情况下,任何一种解决方案的排名都可以接受,例如,作为实施的副作用或只是任意打破联系
  • 因此,上述输入将打包为:

    | bin1 bin2 bin3 ------------------------ item1 | x item2 | x item3 | x item4 | x item5 | x item6 | x |bin1 bin2 bin3 ------------------------ 项目1 | x 项目2 | x 项目3 | x 项目4 | x 项目5 | x 项目6 | x 接下来的问题是阅读/回顾什么来帮助我想出解决这个问题的算法思想,第一段中的输入大小和几秒钟的时间限制,即不是暴力(或者至少是我迄今为止构思的任何暴力)我使用的是Ruby和C语言,但在woods步履蹒跚的这个阶段,这种语言并没有太大关系

    如果有任何阅读建议,关于算法组合的想法,或者只是关于澄清问题陈述的想法,我将不胜感激

    更新1

    不太清楚的是,虽然有许多算法涵盖了这一过程的各个部分,但我的困难在于找到(或可能识别)同时处理所有标准的信息,尤其是在存在容量过剩、项目到仓位集和项目偏好冲突时最小化使用的仓位数量,希望在下面的示例中更清楚地显示:

    | bin1 bin2 bin3 | bin1 bin2 bin3 ------------------------ ---------------------------- item1 | 1 2 3 capacity | 3 2 3 item2 | 1 2 3 item3 | - 1 2 |bin1 bin2 bin3 | bin1 bin2 bin3 ------------------------ ---------------------------- 项目1 | 1 2 3容量| 3 2 3 项目2 | 1 2 3 项目3 |-1 2 虽然bin1是最首选的,但项目3根本不能放在其中,而bin2是所有项目的第二首选,但它只能容纳三个项目中的两个。因此,正确的赋值集(x)实际上是最不受欢迎的仓位:

    | bin1 bin2 bin3 ------------------------ item1 | x item2 | x item3 | x |bin1 bin2 bin3 ------------------------ 项目1 | x 项目2 | x 项目3 | x 更新2 我用目标之间的关系重新编写了描述,并删除了bin优先级变量,因为它只会降低找到答案的可能性,并且可以在我正在工作的系统中的其他地方找到答案。

    这让我想起了过去将医学院毕业生安排在住院医师计划中的做法。如果你像对待学生一样对待物品,像对待排名表一样对待他们的垃圾箱偏好,像对待医院一样对待垃圾箱,会怎么样

    基本上,你会浏览物品列表,然后针对每个物品,找到它最喜欢的箱子。检查垃圾箱:您是否有空间放置此物品,如果没有,您是否更喜欢它,而不是您当前拥有的任何物品? 如果没有,请将此箱子从项目列表中划掉,然后移到项目的下一个选项。
    如果是,请将此项目放入垃圾箱,并将替换的项目(如果有)放回不匹配的池中

    您的问题与派驻服务匹配之间的区别在于,您不会预先修复bin的首选项。取而代之的是,您将使用一个规则,该规则优先选择使垃圾箱最接近100%满的项目


    我唯一担心的是,这种修改可能会使算法不稳定。但这是一个如此简单的算法,可能值得尝试。

    这是一个二部匹配问题,可以在多项式时间内解决


    假设有n个项目和b个箱子,每个箱子的大小为s。您添加的约束的顺序实际上大大简化了问题


    他们的具体意思是,我们应该总是选择项目1,2,…,m作为最大的m。这个问题似乎很适合整数规划方案,因此,如果您的实例很小,最快的解决方案可能就是闭上眼睛,首先使用IP解算器。如果这还不能很快解决问题,你可以尝试使用更专业的算法。谢谢,这是一个很好的观点,只是为了以防万一。可以。在第二段中,您至少指定了三个不同的目标:1)最大化包装的物品数量,2)最大化箱子利用率,以及3)最小化使用的箱子数量。您可以对这些目标进行排序,也可以在它们之间进行权衡。你不能真的抛开三个可能相互冲突的目标,就这样算了。@Yuri:这当然是一个进步,但仍有差距。假设你有两种可能的方法 | bin1 bin2 bin3 ------------------------ item1 | x item2 | x item3 | x
    f(i, j, 0)     = max(f(i, j-1, k)) over all 0 <= k <= s
    f(i, j, k > 0) = f(i-1, j, k-1) + q(i, j)
    
    f(0, 0, 0) = 0
    f(i, 0, k) = -infinity for all other i and k