【问题标题】:Minimize time spent when travelling a designated path尽量减少在指定路径上花费的时间
【发布时间】:2016-07-04 06:40:21
【问题描述】:

这个问题与this one 相关,它来自于在一组点上优化路径。这里的情况如下: 一个对象在一条由二维点列表组成的指定路径上移动。 (更多的 D 是可能的,但是由于每个转弯在技术上是 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 再加速一点,总时间可能少于这个一组速度。

【问题讨论】:

  • 你怎么知道 3D 中的一般转弯实际上是 2D?半螺旋等呢?
  • @willywonkadailyblah 此任务不关心循环,并且任何单个转弯都可以通过使用包含所有三个点以及上一个、当前和下一个点之间的两条线的 2D 平面来解释为 2D .所以在这里使用两个以上的维度是没有意义的,而确切的扩展任务可以根据需要使用尽可能多的维度。
  • 我不是指循环,我指的是不能表示为平面曲线的转弯形状,例如螺旋的一部分
  • @willywonkadailyblah 我有你,只是路径的形状与任务无关,对象仍然需要访问路径中的所有点,即使它的起点就在旁边完成。
  • 计算每个段的最大可行速度并不难,最小可行速度总是 > 0。看起来准确地找出这些界限之间的最佳速度非常困难,但是在一个小误差范围内获得数值近似是可行的。

标签: algorithm language-agnostic mathematical-optimization


【解决方案1】:

这是一个凸优化问题,可由常见的非线性优化库解决。在 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)

【讨论】:

  • @NelsonYeung 是的,这是这个问题定义的“加速”的非标准概念。
  • 嗯,我想知道optimize.minimize() 还生成了哪些其他值。要对此进行测试,起初它看起来像是实际的解决方案,尽管是数值而不是分析。无论如何,很难期望分析解决方案始终存在。
  • @Nelson 我认为您需要再次阅读该问题。两点之间的行程是直线,当你到达一个点时,加速度是瞬时的。路径应该由直线和非物理尖角组成。
猜你喜欢
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多