我现在不建议这样做
请参阅下面的讨论。
原始想法
我会考虑使用迭代推拉方法。
- 猜测中心位置(最简单的方法是所有中心位置的平均位置)
- 计算到每个圆上最远点的向量。这些向量始终指向该圆的中心,并具有长度
distance_to_center_of_circle[i]+radius_of_circle[i]
,并且随着向量和的变化而形成。还要注意,当前位置所需的半径是这些长度的最大值。
- 提出(例如)从2开始1/5或1/10的向量和步长,然后重新计算新点的2信息
- 如果新点需要比旧点更小的圆,则将新点作为当前点,否则将差分,减小建议的步长(例如减半)
- 转到3
当它停止[+]收敛时,就完成了。
Nikie一直琢磨到......
按请求澄清第二步。称要测试的位置为\vec{P}
(矢量量)。[++] 将每个圆的中心称为\vec{p}_i
(也是矢量量),每个圆的半径为r_i
。形成总和\sum_i=1^n \hat{p_i - P}*|(p_i-P)|+r_i)
。[+++] 总和的每个元素指向从当前评估点到问号中心的方向,但长度比r_i
长。总和本身是一个矢量量。
需要包含来自P
的所有圆的半径R
是max(|p_i-P|_r_i)
。
病态案例
我不认为Nikie提出的特定案例是问题,但它让我想到了一种算法失败的情况。失败不是发散的问题,而是不能改进解决方案的问题,但仍然......
考虑四个半径均为1的圆,位于
(-4, 1)
(-5, 0)
(-4, 1)
( 5, 0)
起始位置为(-1, 0)
,对称设计使得所有距离都沿x轴。
正确的解法是半径为6的(0, 0)
,但步骤2计算出的向量大约为::疯狂计算:: (-.63, 0)
,指向错误方向导致无法找到朝向原点的改进。
现在,上述算法实际上会选择(-2, 0)
作为起始点,这会给出一个初始向量和为::疯狂计算:: 约+1.1。因此,在(3)上选择不良的步长大小会导致不太理想的解决方案。::叹气::
可能的解决方案:
- 在(3)中抛出一个随机分数(例如+1/5和-1/5之间),可能偏向于正面。
- 如果步骤被拒绝,则简单地返回步骤三,而不改变步长限制。
然而,此时它与纯随机漫步相比并没有更好,并且您没有易于知道何时收敛的条件。嗯。
[+] 或者按您的要求减速。
[++] 使用latex符号。
[+++] 这里\hat{}
表示指向与参数相同方向的归一化向量。