1、导入相关的包并且确定初始参数
#导入相关的包
import numpy as np
#设置初始参数值
MAXVER = 20
MAXQSIZE = 100
OK = 1
ERROR = -1
FALSE = 0
TRUE = 1
2、定义类
class MGraph:
def __init__(self):
self.verx = [''] * MAXVER #存放连接点 #变成长度为20的list
self.arcs = np.zeros((MAXVER, MAXVER), dtype=int) #邻接矩阵
self.vernum = 0 #存放顶点数
self.arcnum = 0 #存放弧数
3、定义长度为20的list
visited = [False] * MAXVER #长度为20的false
4、查找顶点在数组中的下标
def locate(G, ch): #查找顶点在数组中的下标
for i in range(G.vernum):
if ch == G.verx[i]:
return i #如果输入值在存放连接点的list中找到了,返回该点的位置。
return -1
5、定义创建有向图的函数
def CreateDG(G, v):
print("请输入有向图的顶点数和弧数,格式如(0 0):")
G.vernum, G.arcnum = map(int, input().split()) #将顶点与弧数赋值给vernum与arcnum
print("请输入顶点符号:")
for i in range(G.vernum): #顶点数的长度
G.verx[i] = input().strip() #输入顶点并将其赋值记录给verx
for i in range(G.vernum): #顶点的长度
for j in range(G.vernum): #顶点的长度
G.arcs[i][j] = 0 #将邻接矩阵赋值为0
print("请输入有连接的点,格式(A B):")
for i in range(G.arcnum): #弧的数量,有几个弧就有几个连接点
print("请输入第{}对值:".format(i + 1)) #请输入第几对的值
ch1, ch2 = input().split() #ch1位前向点,ch2位末尾点
k = locate(G, ch1) #locate为查找下标的函数,如果输入的ch1在存放顶点的数据集合中找到了,就返回该list中该点的序号,赋值给k
j = locate(G, ch2) #如果输入的ch2在存放顶点的数据集合中找到了,返回该list中该点的序号并赋值给j
G.arcs[j][k] = 1 #将记录下标的邻接矩阵中点存放为1
return OK
6、得到每一行非零项的个数
def GetNum(G, h, l): #得到每一行非零项的个数
Num = 0 #初始化num值
for i in range(h): #
if G.arcs[i][l] > 0: #如果邻接矩阵中不为0,就将num值加1
Num += 1
return Num #返回num值
7、定义创建转移矩阵的方法
def Create_Transfer_matrix(G): #创建转移矩阵
F = np.zeros((G.vernum, G.vernum), dtype=float) #转移矩阵为顶点数*顶点数的方阵
for i in range(G.vernum): #遍历行
for j in range(G.vernum): #遍历列
if GetNum(G, G.vernum, i) == 0: #vernum为顶点数,i为遍历行数 #####??如果该行的非零项个数为0
F[j][i] = 0 #将转移矩阵为中记录为0
else:
F[j][i] = 0.8 * (G.arcs[j][i] / (GetNum(G, G.vernum, i) * 1.0)) #?#如果该行非零项个数的不为0,那么该位置的转移矩阵为0.8*(该位置的)
print("\n转移矩阵为:")
print(F) #打印出转移矩阵
return F
8、迭代方法
def Iteration(M1, M2, M, num): #迭代法
M3 = np.zeros(num, dtype=float)
for i in range(num):
temp = 0
for j in range(num):
temp += M1[j] * M2[i][j]
M3[i] = temp + M[i]
return M3
9、定义矩阵相乘函数
def Mat_mul(M1, num): #矩阵相乘函数
M2 = np.zeros(num, dtype=float)
M3 = np.zeros(num, dtype=float)
for i in range(num):
M2[i] = 1.0 / num
for i in range(num):
temp = 0
for j in range(num):
temp += M1[i][j] * M2[j]
M3[i] = temp + M2[i] * 0.2
print(M3)
for j in range(num):
M2[j] *= 0.2
M = Iteration(M3, M1, M2, num)
while np.abs(M[0] - M3[0]) > 0.0000000001:
M3 = M
M = Iteration(M3, M1, M2, num)
for i in range(num):
M[i] = M[i] * 0.8 + 0.2 / num
print(M3 - 0.0000000001)
return M1
10、定义主函数并进行调用
def main():
G = MGraph()
CreateDG(G, 0)
F = Create_Transfer_matrix(G)
Mat_mul(F, G.vernum)
if __name__ == '__main__':
main()
11、运行结果,以jupyter为例