考虑一个具有V个顶点和n条路线(汽车)的图形。每条路径(汽车)都从一个顶点开始,并且仅遍历V个顶点一次(每条路径中没有任何回路)。
在每次迭代(即时间)中,每个顶点只能有一条路线(汽车)(车辆之间没有碰撞)。如果不可行(两辆汽车相互碰撞),则路线(汽车)会在该迭代中停留在其顶点(汽车在该顶点上等待)。我们如何找到所有路线(汽车)可以穿越图形的最小循环次数?
示例: An example with 5 vertices, and 2 routes
在此示例中,有5个顶点:蓝色,黑色,紫色,橙色,绿色 第一条路线是:蓝色,黑色,绿色,紫色,橙色(绿线) 第二条路线是:绿色,橙色,黑色,紫色,蓝色(黑线)
最小迭代次数:5
第一条路线是:蓝色,黑色,绿色,等待,紫色,橙色(绿线)
第二条路线是:绿色,橙色,黑色,紫色,蓝色,等待(黑线)
在此示例中,第一辆汽车在迭代#4上等待以禁止与第二辆汽车在Purple顶点上发生碰撞。
答案 0 :(得分:1)
您可以使用the A* algorithm。在该算法解决的问题中,节点将代表所有汽车的可能状态。因此,起始节点将代表汽车的初始状态,目标节点将代表所有汽车在其目的地的状态。
A *通过最小化以下功能来选择下一个节点 n :
f(n)= g(n)+ h(n)
如果没有可能发生的冲突,将只有一个节点 n 要添加到要考虑的节点集合中,但是如果要避免发生冲突,则会有选择(即,不同节点)可供选择,每次需要等待的是另一套不同的汽车。
g(n)是该特定节点的迭代次数。重要的是要意识到在该算法期间,要考虑的节点集可能并非全部在同一迭代中。
h(n)是一种启发式函数。出于这个问题的目的, h(n)应该为admissible,因此我们可以将其定义为每辆汽车仍需要(无碰撞)迭代的最大值。到达目的地。 h(n)给出了乐观的迭代计数,因为它假定不会再有其他冲突要处理。
与A *一样,您需要一个优先级队列(如最小堆)来存储节点。它仅从起始节点开始。然后,从中生成每个邻居节点(下一次迭代),并将其推入堆。如前所述,如果没有冲突,则只有一个邻居节点要推送。但是,如果每辆车的小动作会导致一个或多个碰撞,则可以考虑几个邻居并将其推到堆上。然后从堆中弹出一个节点,然后继续该过程。
将节点推入堆时,应向其添加一个附加信息:到达该节点的迭代次数。这是该节点的 g(n)的值。当到达目标节点时,这将是返回的解决方案。