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

 

你可能感兴趣的:(ISM模型:用python实现可达矩阵求解和层级划分)