2016-07-02 66 views
15

这只是我自己想出的东西,但它看起来像一个有趣的问题,它让我难倒了。加速点最快的路径

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

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

如果这太容易了,如果您添加了必须停止在终点的要求会怎么样? (即当你到达最后时,你必须小于加速度值。)

编辑:为了清楚,方向很重要。您在遍历图时维护速度矢量,加速度表示向其添加矢量,其大小限制在该点的加速度数上。这意味着在某些情况下,建立巨大的速度是有害的,因为你将太快以至于不能“转向”其他有价值的点/目的地。

+0

你将不得不提供更多细节。你的“加速”概念如何工作?它是否通过“加速度数”减少沿路径的所有边缘成本?如果你将“加速数”积累得远远超过了边缘成本?引入像“加速度”这样的概念表明,最好引入相应的摩擦/拖曳概念,否则可能会导致“未检查的速度”。到目前为止,我认为你的问题不足以让我们制定出适当的解决方案,但是我认为这很有趣。 – lightalchemist

+2

我怀疑有这个问题的分析解决方案。我首先解决一个更简单的问题:以给定顺序获得点的最快路线。 (这个搜索空间的维数等于中间点的数量,我看不到比退火更好的方法。)一旦你有了这个方法,你就可以创建一个修改后的Dijkstra。 – Beta

+0

@lightalchemist“加速度”,我的意思是“速度变化”。 (所以,边缘成本=欧几里德距离/速度,但只有当你在正确的方向行驶时才允许...所以)未检查的速度是好的(这是一个数学难题,而不是一个模拟...虽然我做了最初设想它是用来拾取燃料缓冲器的太空船,所以摩擦仍然不会成为现实。) –

回答

3

我认为你只需要使用每个点的加速度就可以使这个问题在一般情况下完成。想想看,像这样的输入:

enter image description here

如果最终点和点的其余部分之间的“巨大的距离”大到足以称霸最终解决方案的成本,找到一个最佳的解决方案归结为找到一种方法来从图表的开头尽可能多地提高速度。如果您只允许每个点传递一次,这将相当于哈密尔顿路径问题,这是NP完整的。

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

+1

我不认为这是哈密顿路径问题(它可能更难,并不容易),因为不能保证访问每个点都是最好的。加速的速度不仅仅是加速......所以如果你不得不改变方向来击中每一个点,那么你可能会比它移动得慢得多,如果你击中了4或5,与你的大致共线目的地。 –

+0

嗯......我想你可能需要明确指定模式,然后在模型中物理如何工作。当我读到它时,我了解到加速度是一个简单的“速度提升”,使得任何未来边缘的遍历都更便宜。 – hugomg

+0

好的,编辑问题使其更清晰。我一直认为这个方向很重要(所以如果你的速度足够高,它实际上不会是一个完整的图)。我认为我同意在你描述的问题中,在某些情况下它可以归结为哈密尔顿路径。 –

3

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

您必须在此搜索任何可用路径,因为图上的可用路径依赖于间接机制的过去状态,使用更少的速度允许更多选择。

+0

我不确定我是否理解你的所有答案......介意澄清一些看起来可能对我错误的事情? “指定沿该线路的最大速度以便能够从该节点转向任何其他”听起来像它失去了太多信息,因为你可能能够到达一些节点而不是其他节点,或者到达一些节点,但仅在速度范围阻止你到达其他人等等。在“如果从当前节点到下一个节点的路径以较低速度存在,并且从结束花费的时间较少”,那么选择规则将会是什么,你认为“较低速度”是什么意思?有时速度很好。 –

+0

关于“最大速度” - 它可以是每个节点,接近矢量的节点将允许更高的速度。 “较低速度”意味着如果你正在查询路径AB,确定在A转向B时可以达到什么样的速度,发现B有一条来自A的路径,但花费较少的时间到达B AND的速度较慢AB,这意味着你当前的路径滞后,可以被丢弃。 – Vesper

+0

但我想到了一个警告:如果你从A开始并能够访问A来加速,该怎么办?如果在A后面有一个节点,那么这个算法会失败。Imagine config:B --- A --- C,源码是A,目标是C,你可以在A处加速5个,在B处加速10个AC很长。正确的道路可能会导致ABAC,比如说,如果你从A到B旅行4,从B到A返回6,然后从A到C返回11,这将比从A直接到C的5快,比去ABC更快。 – Vesper