【问题标题】:Fastest Path with Acceleration at Points点处加速的最快路径
【发布时间】:2016-11-04 11:05:39
【问题描述】:

这只是我自己想出来的,但这似乎是一个有趣的问题,让我很难过。

您在二维空间中有一组点,一个点指定为“开始”,一个点指定为“结束”。每个点都有坐标(以米为单位从原点开始),还有一个“加速度数”(以米/秒为单位的 delta-V)。到达某个点(包括起点)后,您可以在任何方向上加速到该点的加速度数。边缘成本取决于您当前的速度,但您也必须朝着正确的方向前进。

是否有一种有效的算法可以找到到达终点的最快路径?我没有想出比“尝试每条路径并检查结果”更好的方法。 Djikstra 和其他简单算法不起作用,因为如果它们让您以不同的初始速度到达中间点,您不能轻易地说一条通往中间点的路径比另一条更好或更差。

如果这太简单了,如果您添加必须在终点停止的要求怎么办? (即到达终点时,你的加速度必须小于它的加速度值。)

编辑:要清楚,方向很重要。您在遍历图形时保持一个速度矢量,加速度意味着向它添加一个矢量,其大小以该点的加速度数为上限。这意味着在某些情况下,建立巨大的速度是有害的,因为您将太快而无法“引导”到其他有价值的点/您的目的地。

【问题讨论】:

  • 您必须提供更多详细信息。您的“加速”概念将如何发挥作用?它是否通过“加速数”减少了路径上的所有边缘成本?如果你积累的“加速数”远远超出边缘成本怎么办?引入诸如“加速度”之类的概念表明,引入相应的摩擦/阻力概念可能会很好,否则您最终可能会得到“不受控制的速度”。到目前为止,我认为您的问题还不够清楚,我们无法制定适当的解决方案,但我认为这很有趣吗。
  • 我怀疑这个问题是否有分析解决方案。我将首先解决一个更简单的问题:以给定顺序获取点的最快路线。 (那个搜索空间的维数等于中间点的数量,我看不出比退火更好的方法。)一旦你有了这个方法,你就可以创建一个修改后的 Dijkstra。
  • @lightalchemist “加速度”是指“速度变化”。 (所以,边缘成本 = 欧几里得距离/速度,但只有在您朝正确的方向行驶时才允许......所以)未经检查的速度很好(这意味着是一个数学难题,而不是模拟......虽然我做了最初设想它用于航天器拾取燃料缓存,因此摩擦仍然不是问题。)
  • 如果只能实现有限数量的不同可能加速度矢量,那么这与我在这里解决的 Vector Racetrack 游戏非常相似:stackoverflow.com/a/6598303/47984。简而言之,您可以使用 Dijkstra 解决它,但是在一个状态空间中,每个(位置、入口速度向量)组合都有一个顶点,而不仅仅是每个位置。
  • @j_random_hacker 我在想你会有无限可能的加速度向量,但我相信你可以把它分解成范围,范围内的每个点都比顶部的点差在那个范围内,所以你只需要考虑有限的很多。不过,它可能是一个非常大的有限数。

标签: algorithm math graph-theory shortest-path


【解决方案1】:

我认为你只使用每个点的加速度一次的要求使得这个问题在一般情况下是完整的。考虑如下所示的输入:

如果端点与其余点之间的“巨大距离”足以支配最终解决方案的成本,那么找到最佳解决方案将归结为找到一种方法来获得尽可能多的速度提升可能从图表的开始。如果你只允许每个点通过一次,这将相当于哈密顿路径问题,它是 NP 完全的。

也就是说,您的问题有一些额外的规则(距离是欧几里得,图表总是完整的),这可能最终使问题变得更容易。

【讨论】:

  • 我不认为这是哈密顿路径问题(它可能更难,而不是更容易),因为不能保证访问每个点都是最好的。加速度是速度,而不仅仅是加快速度......所以如果你必须改变方向来击中每个点,你可能会比你击中 4 或 5 的速度更慢目的地。
  • 嗯...我认为您可能需要清楚地指定模式,然后物理在您的模型中是如何工作的。当我读到它时,我明白加速是一种简单的“速度提升”,它使任何未来的边缘更便宜。
  • 好的,编辑问题使其更清晰。我一直认为方向很重要(所以如果你的速度足够高,它实际上不会是一个完整的图表)。我认为我同意在您描述的问题中,在某些情况下它可以归结为哈密顿路径。
【解决方案2】:

您可以尝试通过递归跟踪从末端到其他节点的路径来向后解决此问题,然后指定沿线的最大速度以便能够从该节点转向任何其他节点。剔除规则将是,如果从当前节点到下一个节点的路径存在的速度较低且从末端花费的时间较短,这将意味着默认情况下另一条路径更优化,因为它可以到达更多节点并且花费更少的时间。一旦路径到达起始节点,它应该根据开始时可达到的最大速度重新计算并存储。然后你用更少的时间收集路径。

你必须在这里搜索任何可用的路径,因为你的图表上的可用路径依赖于过去的状态和间接机制,使用较低的速度可以有更多的选择。

【讨论】:

  • 我不确定我是否理解您的所有回答...介意澄清一些看起来对我来说可能是错误的事情吗? “指定沿线的最大速度以能够从该节点转向任何其他节点”听起来好像丢失了太多信息,因为您可能能够到达某些节点而不是其他节点,或者只能在速度范围内到达某些节点阻止您到达其他节点等。在“剔除规则将是,如果从当前节点到下一个节点的路径存在的速度较慢且从末端花费的时间较短”,您所说的“速度较慢”是什么意思?有时速度很好。
  • 关于“最大速度” - 它可以是每个节点,更接近向量的节点将允许更高的速度。 “较少速度”意味着如果您正在查询路径 AB,请确定在 A 处转弯到达 B 时可以达到的速度,找出在 B 处有一条路径来自 A 但到达 B 的时间较短并且在AB,这意味着你当前的路径落后,可以丢弃。
  • 但是我想到了一个警告:如果您从 A 开始并且能够访问 A 以加速怎么办?如果 A 后面有一个节点,那么这个算法就会失败。想象一下配置:B --- A --- C,源是 A,目标是 C,你可以在 A 处加速 5,在 B 处加速 10,使用AC相当长。正确的路径最终可能是 ABAC,例如,如果您以 4 点从 A 到 B,以 6 点从 B 到 A,然后 11 从 A 到 C,这将比 5 点从 A 直接到 C 更快,并且比 ABC 更快。
  • 我不认为从A-B 慢一点总是更好,即使它需要更少的时间来做......如果A, B, C 是共线的,并且距离BC 为主导?那么当您击中B 时,您希望尽可能快地前进,因为驾驶能力不如建立速度重要。另一件事是,这不仅仅是成对的:我可能能够以使我到达 C 的速度输入 B,但不能到达 D,甚至这迫使我使用几乎所有我在D 的加速度抵消了横向动量,所以我必须在死机爬行时去E
  • 事实上,我将就您的问题提出类似的问题,因为某些数据组合使得即使对于单个路径计算最佳时间也是一个严重的问题。你是对的,至少从 A 到 B 的最大速度并不总是好的。请至少考虑这个答案有问题,也许您的问题确实不可优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多