圖論-floyd算法-python實現


  這里我寫了floyd算法以及求圖的中點,中心,直徑,需要的自取

1.算法:

import numpy as np
a = float("inf") #無窮大

w0 = [[0,1,a,1],\
      [a,0,1,a],\
      [a,a,0,1],\
      [a,a,a,0]]

length = len(w0)
r0_arr = np.zeros((length,length),dtype = "float32")
w0_arr = np.array(w0)

#算r0_arr
for i in range(length):
    for j in range(length):
        if w0_arr[i][j] == a:
            r0_arr[i][j] = 0
        elif w0_arr[i][j] == 0:
            r0_arr[i][j] = 0
        else:
            r0_arr[i][j] = j + 1

#floyd算法
for k in range(length):
    print("k = {}:".format(k))
    print("w{} = ".format(k))
    print(w0_arr)
    print("r{} = ".format(k))
    print(r0_arr)
    print("\n")
    for i in range(length):
        for j in range(length):
            if w0_arr[i][j] > w0_arr[i][k] + w0_arr[k][j]:
                w0_arr[i][j] = w0_arr[i][k] + w0_arr[k][j]
                r0_arr[i][j] = r0_arr[i][k]

print("k = {}:".format(length))
print("w{} = ".format(length))
print(w0_arr)
print("r{} = ".format(length))
print(r0_arr)
print("\n")   
       

'''
w0 = [[0,a,a,1.2,9.2,a,0.5],\
      [a,0,a,5,a,3.1,2],\
      [a,a,0,a,a,4,1.5],\
      [1.2,5,a,0,6.7,a,a],\
      [9.2,a,a,6.7,0,15.6,a],\
      [a,3.1,4,a,15.6,0,a],\
      [0.5,2,1.5,a,a,a,0]]
w0 = [[0,9,1,3,a,a],\
      [1,0,4,a,7,a],\
      [2,a,0,a,1,a],\
      [a,a,5,0,2,7],\
      [a,6,2,8,0,5],\
      [7,a,2,a,2,0]]
p143 127
'''

 

2.圖的中點,中心,直徑

import numpy as np
a = float("inf") #無窮大

w0 = [[0,a,a,1.2,9.2,a,0.5],\
      [a,0,a,5,a,3.1,2],\
      [a,a,0,a,a,4,1.5],\
      [1.2,5,a,0,6.7,a,a],\
      [9.2,a,a,6.7,0,15.6,a],\
      [a,3.1,4,a,15.6,0,a],\
      [0.5,2,1.5,a,a,a,0]]

length = len(w0)
r0_arr = np.zeros((length,length),dtype = "float32")
w0_arr = np.array(w0)

#算r0_arr
for i in range(length):
    for j in range(length):
        if w0_arr[i][j] == a:
            r0_arr[i][j] = 0
        elif w0_arr[i][j] == 0:
            r0_arr[i][j] = 0
        else:
            r0_arr[i][j] = j + 1

#floyd算法
for k in range(length):
    for i in range(length):
        for j in range(length):
            if w0_arr[i][j] > w0_arr[i][k] + w0_arr[k][j]:
                w0_arr[i][j] = w0_arr[i][k] + w0_arr[k][j]
                r0_arr[i][j] = r0_arr[i][k]

w_length = w0_arr #輸出的最終w

max_w = [] #存儲各行的最大值
sum_w = [] #存儲各行的和
for i in range(length):
    max_w.append(max(w_length[i]))
    sum_w.append(sum(w_length[i]))

print(max_w)
print(sum_w)

network_center = max_w.index(min(max_w)) + 1 #網的中心
network_point  = sum_w.index(min(sum_w)) + 1 #網的中點
network_diameter = max(max_w) #網的直徑
print("network_center:",network_center)
print("network_point:",network_point)
print("network_diameter:",network_diameter)
    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM