層次分析法


層次分析法簡介

層次分析法,簡稱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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM