如何解决是否有可能使networkx dijkstra避开某些边缘?
我遇到一个有向(或无向)非加权图的问题,我需要从s-t找到简单路径。唯一的麻烦是,我需要避免某些标记为红色的节点。
我找到了python NetworkX图形库,并发现它非常合适。我想使用networkx.dijkstra_path()(或者可能也可以使用的bfs函数)来找到最短路径
在这段代码中,我构建了一个非常简单的图形,并找到了从s = 0到t = 4的路径:
import networkx
G = networkx.Graph()
for i in range(5):
G.add_node(i)
# from zero
G.add_edge(0,1)
G.add_edge(0,3)
# from 1
G.add_edge(1,2)
# from 2
G.add_edge(2,4)
# from 3
G.add_edge(3,4)
path = networkx.dijkstra_path(G,4)
此网络具有以下节点: [0,1,2,3,4] 这些优势: [(0,1),(0,3),(1、2),(2,4),(3,4)] dijkstra为我们提供了0-4的路径: [0,3,4] 图形看起来像这样(用matplotlib制作):
[
但是现在我想说节点3是红色的。这样我们就需要避免它。这将成为最短的路径[0,1,2,4]。有什么方法可以阻塞节点3,以便dijkstra可以避免吗?
解决方法
我不知道有任何内置功能可以做到这一点。但是,您可以尝试以下步骤以获得所需的结果:
-
添加一个节点属性,在创建图时将基于该属性过滤节点。
-
过滤节点并创建一个子图。
-
在新子图上调用Dijkstra函数
import networkx G = networkx.Graph() #Add an attribute color for i in range(5): if i==3: G.add_node(i,color='red') else: G.add_node(i,color='blue') # Add edges G.add_edge(0,1) G.add_edge(0,3) G.add_edge(1,2) G.add_edge(2,4) G.add_edge(3,4) # Functin to get filtered subgraph def get_filtered_graph(G,ignore_attribute,ignore_val): # Filter the nodes based on the node attribute and value # In this case it is red color filtered_nodes = [x for x,y in G.nodes(data=True) if y[ignore_attribute]!=ignore_val] # Create the subgraph H = G.subgraph(filtered_nodes) return H ignore_attribute ='color' ignore_val = 'red' path = networkx.dijkstra_path(get_filtered_graph(G,filter_attribute,filter_val),4) print(path) # [0,1,2,4]
参考:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。