这个问题与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再加速,可能的总时间小于此一套速度。
答案 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)