我想解决一个奇怪的箱子包装问题原始问题的链接是here
(很抱歉问了这么久,谢谢你的耐心)
我将按如下方式重新迭代该问题:
我正在尝试编写一个应用程序,生成分割面板的绘图。
我有N个隔间(二维矩形)(N这些n个隔间必须一个接一个地堆叠在一个柱式网格中,以便满足每个隔间的上述限制条件。
此外,每个列的宽度由该列中每个小室的最小宽度决定。
另外,每列的高度应该相同。这决定了小组的高度
我们可以在任何列中剩余的空白空间中添加备用隔间,也可以将任何隔间的高度/宽度增加到指定的最小值之外但是我们不能旋转任何一个隔间。

OBJECTIVE: TO MINIMIZE TOTAL PANEL WIDTH.

面板最大高度=2100毫米,最小宽度范围(350毫米至800毫米),最小高度范围(225毫米至2100毫米)
根据选择的答案,我制定了整数线性规划。然而,考虑到问题的组合性质,求解器似乎“挂”在n>20上。
我现在正在尝试实施一个变通的解决方案。
隔间按最小宽度降序排列。如果最小宽度相等,则按最小高度降序排序。
然后我使用First Fit decreasing heuristic来解决它这给出了总面板宽度的上限,以及当前列宽的列表。
现在我试图使面板宽度变小,并尝试在较小的面板中安装馈线(我能够有效地检查进纸器是否适合给定的列宽列表)
面板宽度可以通过以下方式减小:
一。取任意一列,换成下一列最小宽度的进料器如果列已经是最小宽度,请尝试将其删除并进行检查。
2取任意一列,换成一列更高的最小宽度进纸器,然后取下另一列。
三。不管怎样,如果有人能指出,我不知道会不会高兴。
我正确地执行了第一种方法下面是代码但是,我不能在代码中正确地使用另一种方法。
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;
        }
    }
}

任何帮助都将不胜感激。
谢谢

最佳答案

试试这个https://stackoverflow.com/a/21282418/2521214
交换X,Y轴
因为该解决方案最小化了页面高度(固定页面宽度)
如果不需要边框,请将其设置为零
这基本上就是你现在正在编写的代码

关于c++ - 装箱算法-实际变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19179495/

10-14 03:05