ISM模型:用python實現可達矩陣求解和層級划分


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

 


免責聲明!

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



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