我有一个 directed weighted 图G =(V,E),其中 may have loops .
我正在尝试确定完成任务的最佳时间效率算法:t o find all simple path in G between source and target node with total weight of edges in this path less than certain value (为方便起见,我们将此值表示为PATH_WEIGHT_LIMIT)
所有重量均为正值,可以浮动 .
所以,我的函数的原型将是:
def find_paths(G, source, target, path_weight_limit)
结果路径可能重叠,很好 .
很像这里讨论的那些,例如:
-
算法,用于在加权定向循环图中查找从A到B的不同路径的NUMBER
-
在UNDERICTED图中查找所有简单路径(NP问题)
但我没有找到一个算法来解决我在上面提出的具体任务 to find all simple path in G (directed, weighted, cyclic) between source and target node with total weight of edges in this path less than certain value
我认为应该使用修改后的DFS算法,重点关注路径当前部分的权重 . 但我认为它没有效果,也许有更好的算法来解决这个问题 .
1 回答
回答你的问题
从理论上讲,每个节点的权重都为1,因此循环不会成为问题,因为权重会随着路径的增长而增加 . 但是......如果您的任何节点的成本/权重<= 0,那么您应该包括最大时间或深度以便停止寻路 .
如果你想要完美的路径,请使用Djikstra的算法 . 如果您不关心完美,请使用A * . 创建候选节点列表时,请在将它们添加到搜索列表之前对其进行验证 . 应从候选列表中删除总权重高于最大值的任何节点 .
所以这样的事情:
当您找到目标节点时,不要停止,而是将目标节点添加到列表中,并在完成路径查找时创建路径 . 路径查找节点的大多数实现如下所示:
跟踪路径非常简单:将目标节点添加到列表中,然后将
previous
添加到列表until previous = null
. 列表是你的路径 .寻路是一个非常强大的工具,但你可以在网上找到的大多数算法和指南都是介绍,甚至我找到的最好的指南,Amit Patel的A* Tutorial,都不是很深 .
许多寻路系统只能找到一条路径,因为它们过于专业化,所以我推广了算法 . 下面,您将找到一个深入的寻路指南,其中包含的信息比谷歌找到的更多 . 我加入它的原因是因为它允许您派生更强大的寻路算法,例如从多个起始位置开始查找多个路径和目标,甚至管理执行时间 . 它将帮助您实现算法 .
深入寻路指南
制作新寻路系统所需的一切
寻路的本质是这个算法: