层次分析法

层次分析法简介

层次分析法,简称AHP,是指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。该方法是美国运筹学家匹茨堡大学教授萨蒂于20世纪70年代初,在为美国国防部研究"根据各个工业部门对国家福利的贡献大小而进行电力分配"课题时,应用网络系统理论和多目标综合评价方法,提出的一种层次权重决策分析方法。

层次分析法原理

层次分析法是指将一个复杂的多目标决策问题作为一个系统,将目标分解为多个目标或准则,进而分解为多指标(或准则、约束)的若干层次,通过定性指标模糊量化方法算出层次单排序(权数)和总排序,以作为目标(多指标)、多方案优化决策的系统方法。
层次分析法是将决策问题按总目标、各层子目标、评价准则直至具体的备投方案的顺序分解为不同的层次结构,然后用求解判断矩阵特征向量的办法,求得每一层次的各元素对上一层次某元素的优先权重,最后再加权和的方法递阶归并各备择方案对总目标的最终权重,此最终权重最大者即为最优方案。适合于具有分层交错评价指标的目标系统,而且目标值又难于定量描述的决策问题。 [1]

问题举例

  1. 选择电冰箱(根据不同品牌的价格、性能等因素做出决策)
  2. 选择旅游景点(根据景色、交通环境、饮食特色等因素做出决策)

层次分析法步骤

  1. 建立层次结构模型
  2. 构造判断(成对比较)矩阵
  3. 层次单排序及其一致性检验
  4. 层次总排序及其一致性检验

成对比较矩阵

比较第 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
上一篇:【洛谷4739】[CERC2017] Donut Drone(线段树+倍增)


下一篇:ucgui 广告图片的8位色bmp以及gif文件 OSD层绘制说明