我使用模拟退火进行矩形嵌套问题。我能够取得好成绩,但我得到的解决方案是DISCRETE。甚至不能总是获得全局最优。
问题描述:
目标 - 通过更改放置零件的顺序,最小化无限薄板的长度(宽度恒定)。
我面临的问题:
我获得的输出结果是DISCRETE(只有15种可能的利用率%)而不是ANALOG(因为有11种!* 2 ^ 11可能的解决方案 - >我们希望结果是模拟的)
SA行进的路径 - MATLAB输出
我期望的结果使用与此问题相同的SA代码生成其他问题
从下图中可以看到我获得DISCRETE输出的原因。序列的长度可能很多55。
效率根据最大长度计算得出
如果我像这样改变计算利用率%的方式,我认为我可以解决问题。
效率根据边界切割长度计算得出
即使我想出如何解决问题,我也不知道如何找到边界切割区域以便找到效率。有人有办法找到红线下的区域吗?我需要避免使用Image Processing Toolbox
供参考: 矩形存储为每个矩形的原点左下角位置的x,y距离。我在另一个变量中有相应的长度,广度值。
答案 0 :(得分:0)
我弄明白了,如何使用Image Processing Toolbox
找不到边界切割区域 而不使用。我想发布这个作为其他有类似问题的人的答案。也欢迎更好的解决方案。
放置零件的逻辑:
将部分从Left-> Right
放置到Right most end
,然后转到Left end
并将下一部分放在上一部分上,移动Right
,依此类推。< / p>
寻找边界切割区域的解决方案:
我只创建一个单维矩阵,其长度等于工作表的宽度(在上面的屏幕截图中 - > 200)默认情况下,我将它们的值设置为zero
。
boundaryLength = zeros(sheetWidth+1,1);
% sheetWidth+1 because matlab starts from the index 1 while my range is from 0-200
每次我放置一个部分时,我都会指定值的范围,即从左下角位置的xDist
到右下角位置的xDist
到顶部的yDist
值线。
for i = 1:numberOfParts
boundaryLength(xDist(i)+1:xDist(i)+width(Index(i))) = yDist(i)+ height(Index(i));
end
% Index is the order in which i place the part.
% Here in the above screenshot, my index value is [8, 2, 4, 11, 7, 5, 6, 10, 1, 9, 3]
现在我已经找到了整个纸张宽度中每个像素的最大占用长度。要找到该区域,我需要找到向量boundaryLength
boundaryArea = sum(boundaryLength);
边界切割利用率示例: