matlab - 矩形嵌套 - 使用模拟退火收敛到最优解

标签 matlab optimization geometry computational-geometry geometry-surface

我正在使用模拟退火 解决矩形嵌套问题。我能够得到很好的结果,但我得到的解决方案是离散的。即使是全局最优也不一定总能获得。

问题描述:

目标 - 通过改变放置零件的顺序来最小化无限薄板的长度(宽度不变)。

我面临的问题:

我得到的输出结果是离散的(只有 15 个可能的利用率 %)而不是模拟的(因为有 11!*2^11 个可能的解决方案 -> 我们希望结果是模拟的)

SA 行进的路径 - MATLAB 输出 enter image description here

我期望的结果 使用我用于此问题的相同 SA 代码针对不同的问题生成 enter image description here

从下图中可以看出我得到 DISCRETE 输出的原因。给出相同长度 55 的序列可能有很多可能性。

效率根据最大长度计算 enter image description here

我想如果我像这样改变计算利用率百分比的方式就可以解决问题。

效率根据边界切割长度计算 enter image description here

尽管我想出了解决问题的方法,但我不知道如何找到 Boundary Cut AREA 才能找到效率。有人有办法找到红线下的区域吗?我需要避免使用 Image Processing Toolbox

仅供引用: 矩形存储为左下角位置与每个矩形原点的 x,y 距离。我在另一个变量中有相应的长度,宽度值。

最佳答案

我想通了,如何找到 Boundary-Cut Area 而无需 使用 Image Processing Toolbox。我想将此发布为其他有类似问题的人的答案。也欢迎更好的解决方案。

零件放置逻辑:

Left-> Right放置零件,直到Right most end,然后转到Left end并将下一个零件放在上面上一部分,向右移动等。

寻找边界切割区域的解决方案:

我只是创建了一个单维矩阵,其长度等于工作表的宽度(在上面的屏幕截图中 -> 200)默认情况下,我将它们的值设置为

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

Boundary-Cut Utilization 举个例子: enter image description here

关于matlab - 矩形嵌套 - 使用模拟退火收敛到最优解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29231658/

相关文章:

matlab - 循环遍历matlab中文件夹中的文件

Matlab 墨西哥 "Missing dependent shared libraries"

如果大于 120 个三角形,Matlab 将停止在网格上正确插值颜色

git - 相当于 git-archive 直接到磁盘,没有任何 tar 处理

matlab - 寻找有关计算机视觉类(class)项目的想法

c - 移动字节并将剩余值转换为 int(对二进制补码感兴趣)

algorithm - 找到包含在固定大小的圆圈中的最多点

actionscript-3 - 如何将非直线分成偶数段?

html - 创建圆形 div 比使用图像更简单的方法?

algorithm - 将多边形顶点数组 "match"到另一个数组的最佳方法?