层次分析法简介
层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨蒂于20世纪70年代初,在为美国国防部研究"根据各个工业部门对国家福利的贡献大小而进行电力分配"课题时,应用网络系统理论和多目标综合评价方法,提出的一种层次权重决策分析方法。
层次分析法原理
层次分析法是指将一个复杂的多目标决策问题作为一个系统,将目标分解为多个目标或准则,进而分解为多指标(或准则、约束)的若干层次,通过定性指标模糊量化方法算出层次单排序(权数)和总排序,以作为目标(多指标)、多方案优化决策的系统方法。
层次分析法是将决策问题按总目标、各层子目标、评价准则直至具体的备投方案的顺序分解为不同的层次结构,然后用求解判断矩阵特征向量的办法,求得每一层次的各元素对上一层次某元素的优先权重,最后再加权和的方法递阶归并各备择方案对总目标的最终权重,此最终权重最大者即为最优方案。适合于具有分层交错评价指标的目标系统,而且目标值又难于定量描述的决策问题。 [1]
问题举例
- 选择电冰箱(根据不同品牌的价格、性能等因素做出决策)
- 选择旅游景点(根据景色、交通环境、饮食特色等因素做出决策)
层次分析法步骤
- 建立层次结构模型
- 构造判断(成对比较)矩阵
- 层次单排序及其一致性检验
- 层次总排序及其一致性检验
成对比较矩阵
比较第 i 个元素与第 j 个元素相对上一层某个因素的重要性时,使用数量化的相对权重aij来描述。设共有 n 个元素参与比较,则称为成对比较矩阵。
从心理学角度考虑,参与比较的元素n一般取0~9。
对应模型举例中的准则层元素。
一致性检验问题(略)
模型举例
python代码实现
import numpy as np
#一致性检验函数
def check(A):
eigen = np.linalg.eig(A)[0]
n = A.shape[0]
CI = (max(eigen) - n) / (n - 1)
RI = [0,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]
CI = float(CI)
CR = float(CR)
#若CI过小,为防止计算误差出现,取0即可
if abs(CI) < 0.0001:
CI = 0
if abs(CR) < 0.0001:
CR = 0
print('The CI is:{}'.format(CI))
print('The CR is:{}'.format(CR))
if CR < 0.1:
return 1
else:
return 0 #对CR进行判断,用于下面计算权重函数。
#计算权重函数
def count_p(A):
q = check(A)
n = A.shape[0]
while q:
weight1 = (np.sum(A/np.sum(A,axis = 0),axis = 1)) / n #算术平均权重
weight2 = pow(np.prod(A,axis = 1),1/n) / np.sum(pow(np.prod(A,axis = 0),1/n)) #几何平均权重
eigen,F_vector = np.linalg.eig(A)
for i in range(n):
if eigen[i] == np.max(eigen):
index_e = i
best = F_vector[:,index_e]
weight3 = best / np.sum(best) #特征值权重
print(weight1,'\n',weight2,'\n',weight3,'\n')
return weight1,weight2,weight3
else:
print('Consistency check not pass')
return 0,0,0
#数据获取与处理
tx = open('准则层矩阵与方案层矩阵.txt').readlines()
for i in range(len(tx)):
tx[i] = np.array(list(eval(tx[i])))
n0 = int((np.size(tx[i]))**0.5)
tx[i] = tx[i].reshape(n0,n0)
A0 = tx[0] #准则层矩阵
print(A0)
o_c1,o_c2,o_c3 = count_p(A0)
C_P = []
for Ai in tx[1:]:
print(Ai) #方案层矩阵
c_p1,c_p2,c_p3 = count_p(Ai)
C_P.append(list(c_p3))
c_p = np.array(C_P)
score = []
for i in range(len(c_p[0,:])):
score.append(sum(o_c3*c_p[:,i])) #计算权重
print(score)
准则层矩阵与方案层矩阵.txt
1,1/2,4,3,3,2,1,7,5,5,1/4,1/7,1,1/2,1/3,1/3,1/5,2,1,1,1/3,1/5,3,1,1
1,2,5,1/2,1,2,1/5,1/2,1
1,1/3,1/8,3,1,1/3,8,3,1
1,1,3,1,1,3,1/3,1/3,1
1,3,4,1/3,1,1,1/4,1,1
1,1,1/4,1,1,1/4,4,4,1