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