拼图解决的组合优化

时间:2015-07-07 08:08:55

标签: optimization knapsack-problem

我的问题在下图中解释 http://i.stack.imgur.com/n6mZt.png

我有一些有限(但相当大)的这样的碎片需要以某种方式堆叠,以便REMAINING区域尽可能小。这些部件锁定在水平轴(时间)并具有固定的高度。它们只能堆叠。

剩余区域由堆栈的最大点定义,该最大点取决于已选择的块。示例图像中的最佳组合是[1 1 0]。 (其他约束条件不允许使用普通[0 0 0]情况)

我唯一的变量是每件作品的二进制文件(是或否)。目标比我描述的要复杂一点,但我现在最大的问题是如何制定表达方式

Max{Stacked_Pieces} - Stacked_Pieces_Profile

在目标函数中。这个表达式的结果当然是一个矢量(时间序列),但它会通过其他操作进一步减少到一个数字。

基本上我的问题是如何写

Max{A} - A, where A = 1xN vector

以与线性(或甚至二次)物镜兼容的方式。还是我处理非线性问题?

编辑:问题就像背包问题,主要区别在于没有背包可以填满。即背包的大小根据所选的部分而变化,并且总是等于堆叠的轮廓的顶部

谢谢大家!

1 个答案:

答案 0 :(得分:0)

根据我的理解,您基本上可以尝试将其解决为多次迭代中的正常背包问题,找到最小值。

现在,找到背包的高度是一个问题,这意味着你需要多次迭代。因为您需要解决背包问题以查看某个高度是否有效,所以需要多次迭代。

请注意,您确实知道高度的上限和下限。我不确定轮换是否适用,但您可以填写以下空白:

  • 最小值=最大值(最小件的最大高度,总尺寸/宽度)
  • 最大=总和(所有部分的高度)。

基本上解决它意味着找到适合所有棋子的最小高度[Min <= x <= Max]。最简单的方法是使用&#39; for&#39;循环,但你可以做得更好:

  1. 尝试min,max,half
  2. 如果半满 - >最大=一半;迭代(转到1)
  3. 如果一半不合适 - &gt; min = half;迭代(转到1)
  4. 至于解决背包问题,对于每次迭代,我都要检查是否仍然可以安装所有部件。如果可以加快速度,可以使用位掩码和AND / OR / XOR运算。

    基本上你可以这样做:

    • 抓住&#39; x&#39;。填写下一个块
    • 检查这是否会导致可能的解决方案
    • 找到可以填充的下一位

    请注意,您可能希望在C ++中使用内在函数来加快速度。现代CPU对此非常满意。

    至于代码:我已经制作了一些代码,解决了过去的寝室;我很确定如果你谷歌那么,你会找到一些快速解算器。

    祝你好运!