Algorithm 在直接加权图中找到从节点A到节点B的所有简单路径,且权重之和小于某个值?

Algorithm 在直接加权图中找到从节点A到节点B的所有简单路径,且权重之和小于某个值?,algorithm,graph,graph-algorithm,graph-theory,path-finding,Algorithm,Graph,Graph Algorithm,Graph Theory,Path Finding,我有一个有向加权图G=(V,E),可能有循环 我试图确定完成任务的最佳时间效率算法:t查找源节点和目标节点之间的所有简单路径,该路径中的边总权重小于某个值(为方便起见,我们将该值表示为路径权重限制) 所有配重均为正,可以浮动 因此,我的功能原型将是: def find_paths(G, source, target, path_weight_limit) 结果路径可能重叠,这很好 与此处讨论的内容非常相似,例如: 加权有向循环图中A到B不同路径数的求法 在受限图中寻找所有简单路径(NP问题)

我有一个有向加权图G=(V,E),可能有循环

我试图确定完成任务的最佳时间效率算法:t查找源节点和目标节点之间的所有简单路径,该路径中的边总权重小于某个值(为方便起见,我们将该值表示为路径权重限制)

所有配重均为正,可以浮动

因此,我的功能原型将是:

def find_paths(G, source, target, path_weight_limit) 
结果路径可能重叠,这很好

与此处讨论的内容非常相似,例如:

  • 加权有向循环图中A到B不同路径数的求法
  • 在受限图中寻找所有简单路径(NP问题)
  • 但是我没有找到一个算法来解决我在上面提出的这个特殊任务来找到源节点和目标节点之间G(有向、加权、循环)中的所有简单路径,该路径中的边的总权重小于某个值

    我认为应该使用改进的DFS算法,重点关注路径当前部分的权重。但我认为这是无效的,也许有更好的算法来解决这个问题。

    回答你的问题
    理论上,每个节点的权重为1+,因此循环不会成为问题,因为权重随着路径的增长而增加。但是如果您的任何节点都有成本/权重,我认为简单的DFS或BFS就可以了。Dijkstra's或A*中的启发式方法没有多大帮助,因为不管怎样,您希望找到所有符合条件的路径。只需确保(a)如果当前路径包含循环或太长,则中止该路径;(b)在列表中收集路径,而不是仅返回第一条路径。@tobias_k“太长”是指当前总权重>路径权重限制吗?对于n顶点有向图,在最坏的情况下,这可以返回所有可能的n个顶点的序列作为路径:考虑由n个顶点组成的输入,每个顶点在两个顶点之间具有两个方向的权重,并且权重限制是N.AMIT帕特尔的A*教程。amazing@Andrei我找到的最好的之一。自从我上一次温塔以来,他对它做了一点改进。只要启发式是一致的并且没有高估,他就可以找到与Dijkstra算法相同的完美路径。主要区别在于Dijkstra的算法不是针对目标的,因此它平均地探索所有方向,而a*探索更接近目标的节点多于远离目标的方向。你可以把A想象成迪杰斯特拉的。
    Current node -> List of candidate nodes --(are they less?)-> List of next nodes
    merge(list of search nodes, list of next nodes)
    
    Node
    - Node previous
    - depth, cost
    - misc data (coordinates, hp, gold, terrain, entity)