我使用的是Python 3和Networkx 1.11。
我制作了一个加权图,边缘和一些节点上有权重,但是当我计算最短路径的权重时,不考虑节点的权重(下面的代码)。
任何人都知道如何确保节点权重?
谢谢! 萨姆
import networkx as nx
from matplotlib import pyplot as plt
# Set up a station map
all_stations = ['a','b','c','d','e']
interchange_stations = ['b']
routes = {'a':{'b':2}, 'c':{'b':2}, 'b':{'d':2}, 'd':{'e':2}}
print(routes)
# Make a network graph
G = nx.Graph()
# Add all the nodes (stations)
for station in all_stations:
weight = 0
if station in interchange_stations:
weight = 5
G.add_node(station, weight=weight)
print(G.nodes(data=True))
# Iterate through each line and add the time between stations
for name1, value in routes.items():
for name2, time in value.items():
if name1 == name2:
continue
G.add_edge(name1, name2, weight=time)
print(G.edges(data=True))
# Work out the minimium distance between all stops
route_times = nx.all_pairs_dijkstra_path_length(G)
# Work out the minimum path between all stops
route = nx.all_pairs_dijkstra_path(G)
print(route['a']['e']) # Returns: ['a', 'b', 'd', 'e']
print(route_times['a']['e']) # Returns: 6 (should be 2+2+2+5)
答案 0 :(得分:2)
在documentation for dijkstra_path中,我们有dijkstra_path(G, source, target, weight='weight')
,其中weight
可以是两个节点和边缘的函数。以下是提供的示例:
权重函数可用于包括节点权重。
def func(u, v, d):
node_u_wt = G.nodes[u].get('node_weight', 1)
node_v_wt = G.nodes[v].get('node_weight', 1)
edge_wt = d.get('weight', 1)
return node_u_wt/2 + node_v_wt/2 + edge_wt
在此示例中,我们采用边的起点和终点节点权重的平均值,并将其添加到边的权重。
这将包括每个中间节点的全部值和两个端节点的一半。
您可以将功能修改为node_u_wt + edge_wt
。然后,路径将包括每个边的权重和每个节点的权重,该节点是路径中遇到的边的基础。 (因此它将包括开始和每个中间节点的全部权重,但不包括最终节点。)
另一种解决方法是创建有向图H
,其中边u
到v
的边权重是u
和G
的权重之和v
或者,您可以使边缘的权重为var culturalApp = angular.module('culturalApp', ['ngRoute']);
culturalApp.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when("/", {
templateUrl: "index.php",
controller: "culturalController"
})
.when("/event/:eventId", {
templateUrl: "event.html",
controller: "eventController"
})
}])
culturalApp.controller('eventController', function($scope, $http,
$routeParams) {
$scope.eventId = $routeParams.eventId;
console.log($scope.eventId)
})
culturalApp.controller('culturalController', function($scope, $http,
$location, $anchorScroll) { ...
的权重与边缘权重的总和,只要您对是否包含基础或目标一致。因此无论在进入或离开节点时是否添加了该路径,该路径都会受到惩罚。您可能需要注意路径的最终权重是包括基节点还是目标节点。