Networkx2.4 的新功能 求电阻距离
题记:
求图的两点间电阻距离是图论中的一类问题,Networkx2.4 内置了此功能,可以方便调用. 有关理论这里进行省略, 以后有时间进行补充. 这里针对具体图提供计算的方案.
import networkx as nx
G = nx.Graph()
elist=[(0,1),(1,2),(2,3),(0,3),(0,2)]
G.add_edges_from(elist)
nx.draw(G,with_labels=True,node_size=1300,font_size=10,edge_color='b',width=5.0)
S= nx.resistance_distance(G, 0, 2, weight=None, invert_weight=True)
print(S)
import numpy
resistancematrix = numpy.zeros(shape=(4,4))
for i in range(4):
for j in range(4):
if i ==j :
resistancematrix[i][j]= 0
else:
resistancematrix[i][j]=nx.resistance_distance(G, i, j, weight=None)
print(resistancematrix)
当然这里电阻距离矩阵是对称的(可思考),我们进行了重复计算, 读者可自行优化。 下面是Mathematica 利用 laplacian 广义逆求解的代码.
resistanceDistance[connectionData_] :=
Module[{Laplace =
Normal[(SparseArray[
Band[{1, 1}] -> (Plus @@ (-#1) &) /@ #1] + #1 &)[
SparseArray[
Thread[Flatten[({Reverse[#1], #1} &) /@ connectionData,
1] -> -1]]]]}, ({#1,
Det[Delete[
Transpose[
Delete[Laplace, {{#1[[1]]}, {#1[[2]]}}]], {{#1[[1]]}, {#1[[
2]]}}]]/
Det[Delete[
Transpose[Delete[Laplace, {#1[[1]]}]], {#1[[1]]}]]} &) /@
Subsets[Range[Length[Laplace]], {2}]]
当然我可以采用更简洁的代码体现Wolfram 语言的简洁性!
ResistanceMatrix[g_] :=
With[{\[CapitalGamma] = PseudoInverse[KirchhoffMatrix[g]]},
Outer[Plus, Diagonal[\[CapitalGamma]],
Diagonal[\[CapitalGamma]]] - \[CapitalGamma] -
Transpose[\[CapitalGamma]]]
演示示例:
g = GridGraph[{3, 3}]
ResistanceMatrix[g] // MatrixForm
可以计算电阻距离延伸的问题: 如求kirhoffindex。
kirhoffindex[g_] := 1/2*Total[ResistanceMatrix[g], Infinity]
kirhoffindex[g](*结果:69/2*)