Bin Packing算法 - 实用变异

时间:2013-10-04 10:55:07

标签: c++ algorithm math optimization bin-packing

我正在尝试解决一个奇怪的装箱问题。原始问题的链接是here (对不起,长期以来的问题,感谢您的耐心等待)

我正在按如下方式重新解决问题: 我正在尝试编写一个为分区Panel生成绘图的应用程序。

我有N个小隔间(2D矩形)(N <= 40)。对于每个隔间,存在最小高度(minHeight [i])和最小宽度(minWidth [i])。面板本身也有一个MAXIMUM_HEIGHT约束。

这些N小隔间必须以列式网格的形式一个堆叠在另一个上面,以便满足每个隔间的上述限制。

此外,每列的宽度由该列中每个隔间的最大minWidth决定。

此外,每列的高度应相同。这决定了面板的高度

我们可以在任何列的左侧空白处添加备用隔间,或者我们可以将任何隔间的高度/宽度增加到指定的最小值以外。但是我们无法旋转任何隔间。

OBJECTIVE: TO MINIMIZE TOTAL PANEL WIDTH.

面板的MAXIMUM_HEIGHT = 2100mm,最小宽度范围(350mm至800mm),最小高度范围(225mm至2100mm)

根据所选答案,我制定了整数线性程序。然而,考虑到问题的组合性质,求解器似乎在“N”上“挂起”。 20。

我现在正在尝试实施一种解决方案。

小隔间按照minWidths的降序排序。如果minWidths相等,则它们按照minHeights的降序排序 然后我使用First Fit decreasing heuristic解决它。这给了我一个面板总宽度的上限和一个当前列宽的列表。

现在我尝试将面板宽度设置得更小,并尝试将喂料器安装在较小尺寸的面板上。 (我能够以有效的方式检查馈线是否适合给定的列宽列表)

可以通过以下方式缩小面板宽度:
1.取出任何色谱柱,将其替换为下一个较小的minWidth进料器的色谱柱。如果列已经是最小的minWidth,则尝试将其删除并检查 2.取出任何色谱柱,用更高的minWidth进料器的色谱柱替换,然后取出另一个色谱柱 如果有人能指出的话,任何其他方式,我不知道会不会感到高兴。

我已正确实施第一种方式。以下是代码。但是,我无法正确地将其他方式放入代码中。

for ( int i = 0; i < columnVector.size(); i++ ) {

    QVector< Notepad::MyColumns > newVec( columnVector );
    if ( newVec[i].quantity > 0
         && ( i > 0 || newVec[i].quantity > 1 ) ) {

        newVec[i].quantity--;

        if ( i < columnVector.size() - 1 )
            newVec[i+1].quantity++;

        float fitResult = tryToFit( newVec, feederVector );
        myPanelWidth = fitResult ? fitResult : myPanelWidth;    

        if ( fitResult ) { // if feeders fit, then start the iteration again.

            columnVector = newVec;
            i = -1;    
        }    
    }    
}

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

试试这个https://stackoverflow.com/a/21282418/2521214

  • 并交换x,y轴
  • 因为该解决方案可以最小化页面高度(固定页面宽度)
  • 如果您不想要边框,则将其设置为零

它基本上就是你现在的编码