【问题标题】:Combinatorial optimization for puzzle solving解谜的组合优化
【发布时间】:2015-07-07 08:08:54
【问题描述】:

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

我有有限(但相当大)数量的此类碎片需要以某种方式堆叠,以使剩余区域尽可能小。这些碎片被锁定在水平轴(时间)上,并且具有固定的高度。它们只能堆叠。

剩余区域由堆栈的最大点定义,具体取决于已选择的部分。示例图像中的最佳组合是 [1 1 0]。 (琐碎的 [0 0 0] 情况不会被其他约束所允许)

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

Max{Stacked_Pieces} - Stacked_Pieces_Profile

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

基本上我的问题是如何写

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

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

编辑:这个问题就像一个背包问题,主要区别在于没有背包可以装满。即背包的大小根据所选的件而有所不同,并且始终等于堆叠轮廓的顶部

谢谢大家!

【问题讨论】:

标签: optimization knapsack-problem


【解决方案1】:

据我了解,您基本上可以尝试在多次迭代中将其作为一个普通的背包问题来解决,找到最小值。

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

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

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

基本上解决它意味着找到适合所有部分的最小高度 [Min

  1. 尝试最小、最大、一半
  2. 如果一半适合 -> 最大值 = 一半;迭代(转到 1)
  3. 如果一半不适合 -> min = half;迭代(转到 1)

至于解决背包问题,对于每次迭代,我都会检查所有部件是否仍然可以安装。如果可以的话,使用位掩码和 AND/OR/XOR 操作来加快速度。

基本上你可以这样做:

  • 抓取位“x”。填充下一个块
  • 检查这是否会导致可能的解决方案
  • 找到下一个可以填充的位

请注意,您可能希望在 C++ 中使用内部函数来加快速度。现代 CPU 在这方面做得很好。

至于代码:过去我编写了一些代码来解决混乱立方体;我很确定,如果你用谷歌搜索,你会找到一些快速求解器。

祝你好运!

【讨论】:

  • 这种方法看起来很有希望。我还必须用大量数据重新检查它,但在较小的例子中,我用完整的枚举方法得到了相同的结果。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
相关资源
最近更新 更多