电阻距离求解

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*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值