我的问题在下图中解释 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
以与线性(或甚至二次)物镜兼容的方式。还是我处理非线性问题?
编辑:问题就像背包问题,主要区别在于没有背包可以填满。即背包的大小根据所选的部分而变化,并且总是等于堆叠的轮廓的顶部
谢谢大家!
答案 0 :(得分:0)
根据我的理解,您基本上可以尝试将其解决为多次迭代中的正常背包问题,找到最小值。
现在,找到背包的高度是一个问题,这意味着你需要多次迭代。因为您需要解决背包问题以查看某个高度是否有效,所以需要多次迭代。
请注意,您确实知道高度的上限和下限。我不确定轮换是否适用,但您可以填写以下空白:
基本上解决它意味着找到适合所有棋子的最小高度[Min <= x <= Max]。最简单的方法是使用&#39; for&#39;循环,但你可以做得更好:
至于解决背包问题,对于每次迭代,我都要检查是否仍然可以安装所有部件。如果可以加快速度,可以使用位掩码和AND / OR / XOR运算。
基本上你可以这样做:
请注意,您可能希望在C ++中使用内在函数来加快速度。现代CPU对此非常满意。
至于代码:我已经制作了一些代码,解决了过去的寝室;我很确定如果你谷歌那么,你会找到一些快速解算器。
祝你好运!