关于算法:滑翔伞比赛中最短的路径

Shortest path in paragliding race

我是滑翔伞飞行员。滑翔伞比赛被定义为一组虚拟浮标。飞行通过所有浮标的飞行员首先获胜。

用两个参数定义浮标:

  • 点的坐标
  • 半径

这在3D空间中定义了一个圆柱体,但为简单起见,让我们将问题保留在2D中。比赛可能看起来像这样(近似图):
race
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的范围内。