在有向图中沿最大代价路径查找顶点

2024-09-28 22:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个加权有向图:

enter image description here

我想沿着最大成本路径从头到尾查找顶点列表

在这个例子中,我应该得到:

'enableBrowserExtension' -> 'newWindow' -> 'newTab' -> 'startPage' -> 'typed' -> 'selectTab' -> 'clickTextField' -> 'changeField-frullatore' -> 'clickButton-VAI' -> 'submit' -> 'formSubmit' -> 'mouseClick' -> 'link'

我正在尝试使用以下代码找到here

import networkx as nx

def inverse_weight(graph, weight='weight'):
    copy_graph = graph.copy()
    for n, eds in copy_graph.adjacency():
        for ed, eattr in eds.items():
            copy_graph[n][ed][weight] = eattr[weight] * -1
    return copy_graph

def longest_path_and_length(graph, s, t, weight='weight'):
    i_w_graph = inverse_weight(graph, weight)
    path = nx.dijkstra_path(i_w_graph, s, t)
    length = nx.dijkstra_path_length(i_w_graph, s, t) * -1
    return path, length

if __name__ == '__main__':
    DG = nx.DiGraph()
    DG.add_edge('enableBrowserExtension', 'enableBrowserExtension', weight=3)
    DG.add_edge('enableBrowserExtension', 'newWindow', weight=1)
    DG.add_edge('newWindow', 'newTab', weight=1)
    DG.add_edge('newTab', 'startPage', weight=1)
    DG.add_edge('startPage', 'typed', weight=1)
    DG.add_edge('typed', 'selectTab', weight=2)
    DG.add_edge('selectTab', 'newTab', weight=1)
    DG.add_edge('newTab', 'typed', weight=1)
    DG.add_edge('typed', 'typed', weight=1)
    DG.add_edge('selectTab', 'clickTextField', weight=2)
    DG.add_edge('clickTextField', 'changeField', weight=1)
    DG.add_edge('changeField', 'clickButton', weight=1)
    DG.add_edge('clickButton', 'submit', weight=1)
    DG.add_edge('submit', 'formSubmit', weight=1)
    DG.add_edge('formSubmit', 'mouseClick', weight=1)
    DG.add_edge('mouseClick', 'link', weight=2)
    DG.add_edge('link', 'formSubmit', weight=1)
    DG.add_edge('formSubmit', 'selectTab', weight=1)
    DG.add_edge('selectTab', 'mouseClick', weight=1)
    DG.add_edge('mouseClick', 'clickLink', weight=1)
    DG.add_edge('clickLink', 'link', weight=1)
    DG.add_edge('link', 'mouseClick', weight=2)
    DG.add_edge('mouseClick', 'changeField', weight=1)
    DG.add_edge('changeField', 'mouseClick', weight=1)
    DG.add_edge('mouseClick', 'selectTab', weight=1)

    path, length = longest_path_and_length(DG, 'enableBrowserExtension', 'link')

但我得到了一个错误:

ValueError: ('Contradictory paths found:', 'negative weights?')

我还尝试了this java code,但它只返回整数形式的最大总开销,我想要路径上顶点的名称

有办法解决这个问题吗


Tags: pathaddlinklengthgraphdgweighttyped
1条回答
网友
1楼 · 发布于 2024-09-28 22:33:10

因为图中有正值循环,所以最大成本路径是无限的。您需要删除琐碎的循环,并对其他循环进行精细处理。也许您有一个未实现的需求,即没有节点被多次访问

无限循环的各种方式就是为什么会出现“矛盾路径”

相关问题 更多 >