我想解决一个奇怪的箱子包装问题原始问题的链接是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/