NP难度这门课还是比较有意思的,老师布置了一道作业,写一个用拟人拟物法求解不等圆Packing问题的小程序。
问题描述:在一个已知的容器中希望能放下N个不同形状大小的物体,其中界限容器的封闭边境以及各个物体都是不可入的刚性实体,如果客观上放不下,我们要求做出放不下的判断;如果客观上放得下,则要求给出每个物体的位置和方向。
这就是所谓的Packing问题,我们将问题简化了,只考虑圆形的容器和物体,给定容器的半径、物体的数量、物体的半径,求解是否存在一种布局,使得容器和物体两两之间都不相交。Packing问题是一个NP难度问题,因为我们要确定不存在满足条件的布局,必须穷举所有的布局,这是不可能的。
拟物方法是解决Packing问题的比较经典的算法。我们将这N个圆形物体和容器想象成光滑弹性的气球,容器是固定不动的,当这N个物体放入容器后,就会受到挤压而在弹力的作用下开始运动,最终有可能各个物体和容器都恢复自己的大小和形状,问题就得到了解决。因此我们引入以下概念:
- 任一时刻,称N个物体的圆心坐标x1,y1,x2,y2……,xn,yn为系统在此刻的格局;
- 物体间的距离Lij,如果i、j物体相切,Lij=0;如果i、j物体相离,Lij>0;如果i、j物体相交,Lij<0,且|Lij| = Ri +