【问题标题】:Rectangular Nesting - Convergence to optimal solution using Simulated Annealing矩形嵌套 - 使用模拟退火收敛到最优解
【发布时间】:2015-03-25 12:54:09
【问题描述】:

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

问题描述:

目标 - 通过更改零件的放置顺序来最小化无限板的长度(宽度是恒定的)。

我面临的问题:

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

SA 走过的路径 - MATLAB 输出

我期望的结果使用我用于此问题的相同 SA 代码为不同的问题生成

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

效率根据最大长度计算

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

效率根据边界切割长度计算

即使我想出了解决问题的方法,但我不知道如何找到边界切割区域以找到效率。有人有办法找到红线下的区域吗?我需要避免使用Image Processing Toolbox

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

【问题讨论】:

    标签: matlab optimization geometry computational-geometry geometry-surface


    【解决方案1】:

    我想通了,如何使用Image Processing Toolbox 找到边界切割区域 没有。我想将其发布为其他有类似问题的人的答案。也欢迎更好的解决方案。

    零件放置逻辑:

    将零件从Left-> Right放置到Right most end,然后转到Left end并将下一个零件放在上一个零件上,移动Right等等。

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

    我只是创建一个长度等于工作表宽度的单维矩阵(在上面的屏幕截图中 -> 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);
    

    Boundary-Cut Utilization 举个例子:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      相关资源
      最近更新 更多