Shortest path in paragliding race
我是滑翔伞飞行员。滑翔伞比赛被定义为一组虚拟浮标。飞行通过所有浮标的飞行员首先获胜。
用两个参数定义浮标:
- 点的坐标
- 半径
这在3D空间中定义了一个圆柱体,但为简单起见,让我们将问题保留在2D中。比赛可能看起来像这样(近似图):
A = 1000m; B = 3000m; C = 2000m; D = 500m
飞行员应该在A圈内开始飞行,然后在B和C圈内飞行(或者至少"触摸"它),然后在D圈内结束。
如何计算最佳(最短)路径?
结果应该是构成最短路径一部分的所有线段的坐标。
如果先验地知道该路径是ABCD,并且只有确切的点是未知的,则总距离(平方)可以写为4个变量的函数。
点i的一个参数化当然是
1 2 | x(t_i) = x0_i + r_i * cos(t_i) y(t_i) = y0_i + r_i * sin(t_i) |
路径长度的平方是
1 | D^2 = sum_{i = 1, n-1} (x(t_{i+i}) - x(t_i))^2 + (y(t_{i+i}) - y(t_i))^2 |
您要求解的四个变量是t_1,... t_4。替换后,D ^ 2的最终表达式在正弦和余弦上是一个有毛的二次方。您正在竭力减少数量。
这不太可能接受分析解决方案。
您还可以尝试对圆进行有理二次参数化,但最终将得到有理四次。没有太多(什么?)更简单。
令人高兴的是,甚至这些毛茸茸的函数也可以通过标准的数值非线性优化算法(例如,有人在评论中建议)将梯度下降最小化。
在一般情况下,您不能保证此类算法找到的最小值是全局的。但是在这里看来,至少对于大多数问题实例,解决方案空间可能是凸的,这使得局部最小值也变为全局值。
还可能存在一些好的启发式方法,可以为数值迭代选择起点。例如,沿着圆心选取路径。对于每个圆,请选择其与路径的两个相交之间的中点。
使用类似的逻辑,您可以将每个t_i的值限制在始终小于\\\\ pi的范围内。