最大限度地减少在指定路径上行驶所花费的时间

时间:2016-07-04 06:40:22

标签: algorithm language-agnostic mathematical-optimization

这个问题与this one有关,它来源于优化一组点的路径。这里的情况如下:对象行进包括2D点列表的指定路径。 (可以使用更多的Ds,但由于每次转弯在技术上都是2D,因此求解两个维度。)在每个点上,此对象可以通过向量来改变其速度,该向量最大长度是预先确定的(分配给一个点)。路径尽头的速度无关紧要。问题是,如何确定在这条路上行走的最短时间?这个任务有什么有效的算法吗?贪婪算法最终可以使对象在特殊准备数据的情况下变慢,甚至不使对象能够转向下一个指定点。后向贪婪的算法也存在同样的错误,以最大速度到达终点并不总是好的。

示例:点向量为:{(0,0), (0,1), (1,1), (2,2)},最大长度向量为{2.0, 2.0, 3.0}。该点例如在(0,sqrt(2))从p1到p2,然后从(sqrt(2),0)从p2到p3,并且(s,s)在任何最大速度s从p3到p4。这可能是一个次优的解决方案,比如你从p1到p2减速0.01,允许从p2到p3加速一点,然后在p3到p4再加速,可能的总时间小于此一套速度。

1 个答案:

答案 0 :(得分:5)

这是一个凸优化问题,可由常见的非线性优化库解决。在SciPy:

import numpy as np
from scipy import optimize

points = np.array([[0., 0.], [0., 1.], [1., 1.], [2., 2.]])
movements = np.diff(points, axis=0)
lengths = np.linalg.norm(movements, axis=1)
directions = movements / lengths[:, np.newaxis]
max_acceleration = np.array([2., 2., 3.])

fun = lambda x: np.sum(lengths / x)
x0 = np.repeat(.5 * np.amin(max_acceleration), len(movements))
bounds = [(0., max_acceleration[0])] + [(0., None)] * (len(movements) - 1)
constraints = [
    dict(
        type='ineq',
        fun=lambda x, j: max_acceleration[j + 1] - np.linalg.norm(x[j] * directions[j] - x[j + 1] * directions[j + 1]),
        args=(i, )) for i in range(len(movements) - 1)
]
x = optimize.minimize(fun, x0, bounds=bounds, constraints=constraints).x
print(x)