一、算法简介
决策问题:面临多种方案,需要根据一定的标准选择某一种方案
归一化处理(让指标在同一数量级,且保证在同一指标下其差距不变):
给指标加上权重(加权)
科学地设定权重?
二、python代码
import numpy as np
#numpy Pandas matolotlib 这三个库需要掌握
A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])
n=A.shape[0]#获取A的行数,1则是获取列数
#求出最大特征值以及对应的特征向量
#np.linalg.eig用于计算方阵的特征值和特征向量
eig_val,eig_vec=np.linalg.eig(A)
max_eig=max(eig_val)#特征值的最大值
CI=(max_eig-n)/n
#RI最多支持n=15
RI=[0,0.0001,0.52,0.89,1.12,1.26,1.36,1.41,1.46,1.49,1.52,1.54,1.56,1.58,1.59]
CR=CI/RI[n-1]
print('一致性指标CI=',CI)
print('一致性比例CR=',CR)
if CR<0.10:print('A矩阵的一致性可以接受')#np.sum计算一维数组中所有元素的总和#通过axis控制对行或对列,行(1),列(0)#算术平均法求权重Asum=np.sum(A,axis=0)stand_A=A/Asum#归一化处理Asumr=np.sum(stand_A,axis=1)weight=Asumr/n#计算权重向量print(weight)#几何平均法求权重——————————————————————————————————#np.prod计算一维数组中所有元素的乘积prod_A=np.prod(A,axis=1)#对新的向量求1/n次方prod_n_A=np.power(prod_A,1/n)#归一化处理re_prod_A=prod_n_A/np.sum(prod_n_A)print(re_prod_A)#特征值法求权重——————————————————————————————max_index=np.argmax(eig_val)max_vector=eig_vec[:,max_index]weight=max_vector/np.sum(max_vector)#归一化处理print(weight)
else:print("矩阵需要修改")#修改函数