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

本文介绍了使用拟人拟物法解决不等圆Packing问题,详细阐述了算法思路,包括初始化格局、计算弹性势能、判断局部最小值陷阱以及选择和重新放置“难民”物体的策略。通过三种不同的难民放置方案对比,得出在四角基础上增加容器中心位置的策略效果最佳。最后,提到了在MFC环境下编写程序时遇到的动态链接库问题及其解决方案。

摘要生成于 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.计算当前格局的总弹性势能,如果U=0退出算法;3.比较当前总势能和上一格局的总势能,如果势能上升了,h=h*t;4.计算每一个物体所受的合力向量,朝

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值