我有一张图表,我经常需要知道所有最短路径(或更确切地说是它们的长度)。因为我不想重新计算它们,所以我将它们存储在一个简单的数组中,然后从那里检索它们。但是,由于图表可能也会随着时间的推移而改变,因此我必须在给定时间重新计算它们。
目前可能会发生以下变化:
向图表中添加节点和边缘
更改边长
添加图表的新边缘
删除边缘或删除节点
在所有情况下,所有节点将始终连接,并且所有边缘都具有正权重。该图也是无向的。操作顺序是这样的,所有节点将始终来自图的同一组件。如果在添加其他节点和边之前删除了节点或边缘,则图形永远不会分离。
现在我打算只进行更新,然后通过图形结构传播所有更改。但是我不确定如何正确处理这个问题。您将如何尝试实现缓存长度的这些更新。
修改:
正如你们中的一些人所指出的那样,在添加节点或更改链接时重新计算所有内容可能是必要的。例如,当所有距离通过更新改变时。但是,如果我只是通过图表传播更改并按照dijkstras的方式进行放松,我可能需要多次放松同一个节点,因为我可能不会选择最佳顺序。问题是如何订购放松步骤,所以我尽可能避免多次更新。
如果没有我想到的实际想法,我不确定这有多大意义,但我希望这可以澄清更多。
答案 0 :(得分:4)
D* family of search algorithms完全关注动态变化图中短路径的更新。该算法是针对移动机器人路径规划问题而开发的。虽然算法只返回从目标到当前机器人位置的最短路径,但您也可以使用其簿记和更新所有最短路径问题的规则。
答案 1 :(得分:0)
您可以轻松地处理删除边/节点的情况。只需跟踪节点之间的实际路径。然后,当删除边/节点时,浏览路径并查看哪些更改受影响。重新计算这些的最短路径。
在增加边缘重量的情况下,您可以使用相同的技术。
其他案件处理起来要困难得多。我不知道任何会加速重新计算的算法/数据结构。