【问题标题】:Bin Packing algorithm - Practical Variation装箱算法 - 实际变化
【发布时间】:2013-10-11 08:23:52
【问题描述】:

我正在尝试解决一个奇怪的垃圾箱包装问题。原始问题的链接是here (抱歉问题太长,感谢您的耐心等待)

我将问题重复如下: 我正在尝试编写一个为分隔面板生成绘图的应用程序。

我有 N 个隔间(二维矩形)(N

这 N 个隔间必须在一个列式网格中一个在另一个之上堆叠,以便每个隔间都满足上述限制。

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

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

我们可以在任何列的剩余空间中添加备用隔间,或者我们可以将任何隔间的高度/宽度增加到指定的最小值之外。但是我们不能旋转任何小隔间。

OBJECTIVE: TO MINIMIZE TOTAL PANEL WIDTH.

面板的MAXIMUM_HEIGHT = 2100mm, minwidth range (350mm to 800mm), minheight range (225mm to 2100mm)

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

我现在正在尝试实施一个变通解决方案。

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

现在我尝试使面板宽度更小,并尝试将我的喂食器安装在那个更小尺寸的面板中。 (我能够以有效的方式检查馈线是否适合给定的列宽列表)

可以通过以下方式缩小面板宽度:
1.取任意一列,用下一个minWidth进纸器的一列替换。如果该列已经是最低的 minWidth,则尝试将其删除并检查。
2. 取任意一列,将其替换为 minWidth 进纸器更高的一列,然后移除另一列。
3.还有什么办法,不知道有没有人指出会很高兴。

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

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;    
        }    
    }    
}

任何帮助将不胜感激。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    基本上就是你现在正在编码的内容

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多