NetworkX:在图上构建简单的流程研究
NetworkX: structuring a simple flow study on a graph
如果你考虑下图:
from __future__ import division
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import inv
G = nx.Graph()
pos={1:(2,3),2:(0,0),3:(6,0)}
G.add_nodes_from(pos.keys())
nx.set_node_attributes(G, 'coord', pos)
PE={1:0,2:60,3:40}
nx.set_node_attributes(G,'PE',PE)
q={1:100,2:0,3:0}
nx.set_node_attributes(G,'q',q)
G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,3)
import math
lengths={}
inv_lengths={}
for edge in G.edges():
startnode=edge[0]
endnode=edge[1]
lengths[edge]=round(math.sqrt(((pos[endnode][1]-pos[startnode][1])**2)+
((pos[endnode][0]-pos[startnode][0])**2)),2)
inv_lengths[edge]=round(1/lengths[edge],3)
nx.set_edge_attributes(G, 'length', lengths)
nx.set_edge_attributes(G, 'inv_length', inv_lengths)
nx.draw(G,pos,node_size=1000,node_color='r',with_labels=True)
nx.draw_networkx_edge_labels(G,pos)
plt.show()
以及以下流程问题:
其中 1
是仅供应节点,而 2
和 3
是仅需求节点,为什么以下解决方案会产生通过每条边的奇怪流量值?似乎 q1=100
甚至都没有考虑,我希望 L2
有 flow=0
.
m=nx.laplacian_matrix(G,weight='inv_length')
a=m.todense()
flow={}
res2=np.dot(a,b) #No inverse is required: x=ab
res2=[round(item,3) for sublist in res2.tolist() for item in sublist]
print res2
for i,e in enumerate(G.edges()):
flow[e]=res2[i]
b=[]
for i,v in enumerate(PE.values()):
b.append(v)
res2=np.dot(a,b) #No inverse is required: x=ab
res2=[round(item,3) for sublist in res2.tolist() for item in sublist]
print res2
#res2=[-24.62, 19.96, 4.66]
我冒昧地以更简单的方式计算边长:
from scipy.spatial.distance import euclidean
lengths = {}
inv_lengths = {}
for edge in G.edges():
startnode = edge[0]
endnode = edge[1]
d = euclidean(pos[startnode], pos[endnode])
lengths[edge] = d
inv_lengths[edge] = 1/d
这就是我实现矩阵方程的方式 :
E = np.array([[0],
[60],
[40]], dtype=np.float64)
L1 = lengths[(1, 2)]
L2 = lengths[(2, 3)]
L3 = lengths[(1, 3)]
L = np.array([[1/L1 + 1/L3, -1/L1, -1/L3],
[ -1/L1, 1/L1 + 1/L2, -1/L2],
[ -1/L3, -1/L2, 1/L2 + 1/L3]], dtype=np.float64)
qLE = np.dot(L, E)
以上代码产生的结果(大致)与您的相同:
In [55]: np.set_printoptions(precision=2)
In [56]: qLE
Out[56]:
array([[-24.64],
[ 19.97],
[ 4.67]])
综上所述,我认为这不是编程问题。也许你应该修改流模型...
如果你考虑下图:
from __future__ import division
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import inv
G = nx.Graph()
pos={1:(2,3),2:(0,0),3:(6,0)}
G.add_nodes_from(pos.keys())
nx.set_node_attributes(G, 'coord', pos)
PE={1:0,2:60,3:40}
nx.set_node_attributes(G,'PE',PE)
q={1:100,2:0,3:0}
nx.set_node_attributes(G,'q',q)
G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,3)
import math
lengths={}
inv_lengths={}
for edge in G.edges():
startnode=edge[0]
endnode=edge[1]
lengths[edge]=round(math.sqrt(((pos[endnode][1]-pos[startnode][1])**2)+
((pos[endnode][0]-pos[startnode][0])**2)),2)
inv_lengths[edge]=round(1/lengths[edge],3)
nx.set_edge_attributes(G, 'length', lengths)
nx.set_edge_attributes(G, 'inv_length', inv_lengths)
nx.draw(G,pos,node_size=1000,node_color='r',with_labels=True)
nx.draw_networkx_edge_labels(G,pos)
plt.show()
以及以下流程问题:
其中 1
是仅供应节点,而 2
和 3
是仅需求节点,为什么以下解决方案会产生通过每条边的奇怪流量值?似乎 q1=100
甚至都没有考虑,我希望 L2
有 flow=0
.
m=nx.laplacian_matrix(G,weight='inv_length')
a=m.todense()
flow={}
res2=np.dot(a,b) #No inverse is required: x=ab
res2=[round(item,3) for sublist in res2.tolist() for item in sublist]
print res2
for i,e in enumerate(G.edges()):
flow[e]=res2[i]
b=[]
for i,v in enumerate(PE.values()):
b.append(v)
res2=np.dot(a,b) #No inverse is required: x=ab
res2=[round(item,3) for sublist in res2.tolist() for item in sublist]
print res2
#res2=[-24.62, 19.96, 4.66]
我冒昧地以更简单的方式计算边长:
from scipy.spatial.distance import euclidean
lengths = {}
inv_lengths = {}
for edge in G.edges():
startnode = edge[0]
endnode = edge[1]
d = euclidean(pos[startnode], pos[endnode])
lengths[edge] = d
inv_lengths[edge] = 1/d
这就是我实现矩阵方程的方式
E = np.array([[0],
[60],
[40]], dtype=np.float64)
L1 = lengths[(1, 2)]
L2 = lengths[(2, 3)]
L3 = lengths[(1, 3)]
L = np.array([[1/L1 + 1/L3, -1/L1, -1/L3],
[ -1/L1, 1/L1 + 1/L2, -1/L2],
[ -1/L3, -1/L2, 1/L2 + 1/L3]], dtype=np.float64)
qLE = np.dot(L, E)
以上代码产生的结果(大致)与您的相同:
In [55]: np.set_printoptions(precision=2)
In [56]: qLE
Out[56]:
array([[-24.64],
[ 19.97],
[ 4.67]])
综上所述,我认为这不是编程问题。也许你应该修改流模型...