Circle Packing in Circle
这篇文章学习总结了两篇关于圆形容器内的圆填充问题的经典论文。
1.问题描述
CirclePacking in Circle问题可表示为能否以及如何将n个具有各自大小的圆形无覆盖五越界的包装在一个大的圆形容器中。
这是一个NP-Hard问题,前人的一些工作可以找到和最优解精度非常相似的一个解,不过非常耗时,计算上不可行。
所以需要使用一些替代算法。
先给出一些符号定义
1)
表示的是i,j两个圆(不包括容器圆)的嵌入深度,如果两圆交叉,则dij为正数,否则, =0.
2)表示圆i超出容器圆的深度,如果超出,则为正数,否则记为零。
3)上面三个式子,可理解为圆j受到的其它所有圆的挤压所蕴含的弹性势能,则是所有内部圆的弹性势能之和。
2.算法一 半物理半手工方法的结合
参考论文:
H Wang, W Huang, Q Zhang, D Xu. An improved algorithm for the packing of unequal circles within a larger containing circle. European Journal of Operational Research,in 2002.
2.1 物理方法
将上图完全考虑为一个物理问题,圆i受到 ,和容器圆的挤压,合力方向为其加速度方向,将沿合力方向产生位移。
根据胡克定律,弹力可看做近似与挤压强度即圆之间的嵌入深度成正比。
每次迭代都可以让每个圆沿合力方向进行一小段位移。终究会达到一个比较稳定的状态。
其公式如下:
2.2物理方法的缺陷
使用单纯的物理方法容易达到下图所示的困境:
左图局部最优而非全局最优,此时每个圆很难在移动。
2.3人工方法
所谓人工方法就是模拟人的思路解决上述问题。
上图中每个圆可以算出其弹性势能,弹性势能最大的,它最想接着动,这就需要外力帮他一把,帮他跳出陷阱,于是我们定义相对的弹性势能:
当算法局部最优的时候,我们选相对弹性势能最大的那个,强行地随机改变其坐标,进而使算法继续进行。这种方法作者称为(pain relief)
实践表明这么做也会有一个问题,那就是连续的多次局部最优解对应的相对弹性势能最大的那个圆经常是同一个圆。
因此,作者提出了一种优化,当当前选出的圆和上一次是同一个时,则换一种思路,选择RDP最小的那个圆,也就是最不想动的那个圆,强行改变它的位置,让算法继续。这种思路作者称为(resource surrender)
2.4算法详细步骤
注:表示上一次的势能,
是一个flag,表示局部最优时选择相对弹性势能最大的还是最小的
为上一次选择的点
表示系统收敛的程度或者说是学习速率。
3.算法二 Simulated annealing(模拟退火)与Tabu search(禁忌搜索)的结合
参考论文:
De-fu Zhang , An-sheng Deng. An effective hybrid algorithm for the problem of packing circles into a larger containing circle. Computers & Operations Research 32. In 2005.
3.1 定义
假设X是n个圆Circle Packing的一个配置,那么表示为,将X中的某一个圆的圆心沿着他受到的合力方向位移一段距离,其他圆位置不变的所有配置的集合。因为X中共有n个圆,所以中有n个元素。
3.2 SA方法
这个算法比较简单,直接上图:
其中,表示算法接受变差的解的能力,在我理解就是算法收敛程度,
表示学习速率
这种方法同样会出现局部最优的情况。在陷入僵局时也需要选择一个圆来改变其位置,强行使算法继续。本算法采用的是选取相对弹性势能最大的那个圆。
3.3 TS(禁忌搜索)
禁忌搜索就是在算法过程中维持一个列表,记录之前的系统信息。
具体到这个问题,算法中维护了一个列表,记录了每个点上一次被选为强行改变位置点的时间。如果当前选择的圆在前几次迭代中被选择过,则转而选取其他的圆。
这样做的目的是为了不使连续的局部最优解选取同一个相对弹性势能最大的圆圈。
3.4 算法步骤
4.小结
学习完上述两个算法之后,我发现二者的思路是非常相似的,只是在细节上有所不同。
大体思路都是按照弹性势能以及合力来更新每个圆的位置,在遇到局部最优解时选取一个圆,改变其位置,使算法继续,直到收敛到全局解。
区别在于:
算法二每次更新一个圆圈,算法一每次更新所有圆圈。
在连续的局部最优解选择了同一个圆时,算法一选择用相对弹性势能最小的来替代最大的;算法二选择用相对弹性势能次大的来代替最大的。