拟人拟物法求解不等圆Packing问题

本文介绍了使用拟人拟物法解决不等圆Packing问题的算法,通过将物体和容器想象为弹性气球,通过计算弹性势能和迭代寻找布局。当遇到局部最小值时,采用随机或策略性的方法重新放置“难民”物体来跳出陷阱。文中还讨论了如何判断局部最小值和选择放置难民的策略,并提供了实验数据和程序实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 + Rj - 圆心距离;
  • 物体间的弹性势能Uij,当Lij>=0时,Uij=0;当Lij<0时,Uij=Lij^2;
  • 物体和容器所构成系统的总弹性势能U,等于各个物体弹性势能之和;
  • 物体移动的步长h,物体向当前时刻所受合力方向移动的距离;
  • 梯度t,h梯度下降的速度。

很显然,U等于0代表着问题得到了解决。具体的拟物方法:1.初始化阶段,为物体随机产生一个格局;2.计算当前格局的总弹性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值