ISM模型求解可達矩陣和元素分層,網上已有matlab代碼實現。但是由於最近碰到一個求解要素比較多的問題,四十多個要素。如果手動輸入這個矩陣的話,有一千多個數據,不清楚matlab是否有文件導入導出功能,所以照着matlab代碼嘗試寫了一段python,用pandas導入導出矩陣,比較方便,代碼如下:
1 import numpy as np 2 import pandas as pd 3 import numpy.matlib 4 #用pandas導入數據 5 file_path='C:/Users/84430/Desktop/指標.xlsx' 6 sheetName='Sheet5' 7 df=pd.read_excel(file_path,sheet_name=sheetName) 8 #處理一下,轉為arrary 9 df.set_index('F',inplace=True) 10 df.index.name=None 11 array=np.array(df) 12 #轉為矩陣 13 A=np.matrix(array) 14 #生成一個單位矩陣 15 I=np.matlib.identity(len(A)) 16 #計算A+I 17 new_matrix=A+I 18 old_matrix=new_matrix 19 m=0 20 step=1 21 while m==0: 22 old_matrix=new_matrix 23 new_matrix=old_matrix*new_matrix 24 for i in range(len(new_matrix)): 25 for j in range(len(new_matrix)): 26 if new_matrix[i,j]>=1: 27 new_matrix[i,j]=1 28 step+=1 29 print(step) 30 # 求解打印出可達矩陣並保存為文件 31 if (old_matrix==new_matrix).all(): 32 m=1 33 print(new_matrix,step) 34 pd_matrix=pd.DataFrame(new_matrix) 35 pd_matrix.to_csv('./可達矩陣和分級(45).csv') 36 # 元素分級 37 P=np.array(new_matrix) 38 39 zero=np.zeros(shape=(len(P),len(P))) 40 r=1 41 while not (P==zero).all(): 42 for i in range(0,len(P)): 43 R=[x+1 for (x,val) in enumerate(P[i,:]) if val==1] 44 A=[x+1 for (x,val) in enumerate(P[:,i]) if val==1] 45 C=set(R).intersection(set(A))#返回交集 46 if len(C)==len(R) and len(R)!=0 and len(A)!=0: 47 # 打印出分級結果 48 print('第'+str(r)+'級元素為'+str(i+1)) 49 P[i,i]=0 50 for x in range(0,len(P)): 51 if P[x,x]==0: 52 P[x,:]=0 53 P[:,x]=0 54 r+=1