矩形排料算法

来源:互联网 发布:cimatron e编程厉害吗 编辑:程序博客网 时间:2024/05/02 12:10

矩形排料相对于多边形排料来说要简单许多,但是再简单的东西想要做到完美都是件很难的事。这里提供的算法比目前国内的公开研究文献中99.9%的来说都要高效,我指的是最终效率。当然每个环节都要仔细考虑,细节非常重要。我还是按照三个层次来描述。

1.底层几何算法

   对于矩形来说,计算矩形之间的距离和重叠基本上没什么可说的,因为它太简单。这里我还是提几个可能被忽略的地方。1.尽可能的用空间换取时间的办法让实际运算时的时间更短。2.尽量用内联函数。

2.排样策略

   基本上我把它归为左底策略,对于矩形来说,左底策略还是相当有效的,当然这只是基本策略,还有很多细节需要明确。

   如下图:

    假设R1和R2是已经按照某种规则放置进容器矩形的两个材料矩形。

    现在有一个新的待放置的矩形R.  定义A为矩形R的左下角。  对于每一个已经放置进容器的矩形,比如R1,对于矩形R来说新的可能的放置点是(我们先不考虑R2的存在):

     1. R靠紧容器矩形的左上角排放

     2. R靠紧容器矩形的左下角排放

     3. A点放置在R1的左上角

     4. A点放置在R1的右下角

     5. R的左上角对齐R1的右上角排放

显然,在上图中,2位置由于有R1存在不可行,3位置由于已经放置R2也不可行。所以可以选择的位置是1,4,5.   同理分析R2的加入后R可能增加的新的排放位置,分别是:

    6. A点对齐R2的左上角

    7.A点对齐R2的右下角

    8. R的左上角对齐R2的右上角(图中所示正是这个位置)

    好了,现在我们大概知道了有哪些可行的排放点。知道了这些点都是按照什么规则得来的。那么怎么在这些可行点中选择呢,就是说选择的标准是什么呢?如下图。

   

     上图中内圈的两个矩形是紧靠排放的,外圈的分别是两个矩形缩放一定比例后的矩形。阴影部分就是外圈的两个矩形的重叠面积,它基本上表示了两个矩形的紧密程度。 当然,对于靠紧容器矩形的也要和容器矩形做这种运算,而且应当赋予更重的权值,因为靠边更能利用空间。  最后你要累加这些重叠面积,它表示的就是这个位置的排放的总体紧密程度。

      对于图一所示的情形,位置1应该是比较好的排放点。 这取决于计算结果,还有一个因素就是排放点越靠近左边越好,这样,我们可以用  排放优先值= 重叠面积/排放点X坐标.  我们选择值最大的.     

      还有一个需要注意的是排放的位置要做左-上/下的滑动,而且可能是多次反复的。这样会使矩形更靠近边和角。 所以矩形的放置点一定要有一个间隙(可以很小,比如0.00001),这样矩形才能滑动而没有阻碍。

 

3.优化算法

   这基本上是调序的组合优化算法,你可以用任何一种智能优化算法来做. 但是我不推荐用遗传算法,遗传算法对于种群大小的设定取决于你的规模,当你的容器里要放置上千个矩形的时候,种群会变的很大,遗传和变异操作都会影响整个速度,而且你还要尝试各种遗传和变异因子,够你折腾的。

    另外一个关键点是:你需要做一个启发式的搜索。 就是说你要对这些待排放的矩形排序,规则有很多种,比如面积大小排序,周长,宽度,高度等。

    你需要组织一下搜索的策略。 实际情况中是这样的,用户需要在很短时间内找到一个较优解,然后在后续时间内慢慢搜索更好的解。

所以可以这样做:

    1.先在几种排序规则内做局部搜索,这样有可能在较短时间内找到较优解。

    2.然后在几种规则内用最好的那一个展开做全局搜索。 当然这个全局搜索不是绝对的,其大概的过程都是这样的   局部搜索--》在规定时间内未改进则跳出局部搜索--》进入另外一个局部搜索--》......

 

 

我想想...基本上就这些了。关键点都说到了。看起来很简单吧.  我可没蒙大家,我测试过的,和黑格排料软件整体上差距很小。不过我还没有花大时间研究矩形排料。应该还有不少提高的余地。

    祝你们好运!代码还是要大家自己写,记得编译选项的优化,尽量让速度更快。

 

原创粉丝点击