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