花了一通宵,總算整明白了,網上的學習資源太復雜,太難了,我就寫了篇容易理解的博客,有地方有問題的可以留言。(明天啊呸今天還有課嗚嗚嗚)
層次分析法的概述
層次分析法(Analytic Hierarchy Process,簡稱 AHP)是美國運籌學家 T. L. Saaty 教授於上世紀 70 年代初期提出的一種簡便、靈活而又實用的多准則決策方法,是一種系統分析方法。
AHP是一種定性和定量相結合的、系統化的、層次化的分析方法,是一種將決策者對復雜系統的決策思維過程模型化、數量化的過程。
層次分析法的基本原理
根據問題的性質和要達到的總目標,將問題分解為不同的組成因素。從而將問題轉換為最低層相對於最高層(總目標)的相對重要尺度的確定或相對優劣次序的排定。
簡單的說,就是設置一個尺度,最后計算,誰的最后的值更大就就更好,更優。
層次分析法的應用
- 適用題型:
- 面臨多個方案選擇一個最佳方案
- 給多個對象進行評價,比較出一個最優對象
層次分析法的步驟和方法
第一步:建立層次結構模型
舉例如下:

- 最高層(目標層):決策的目的,要解決的問題
- 中間層(准則層):考慮的因素,准則
- 最低層(方案層):決策備選方案
第二步:構造判斷矩陣
如果一次性將所有因素的尺度都寫出來,這樣比較就會比較困難。所以我們采用兩兩相互比較。
心理學家人為成對比較的因素不宜超過9個,即每層不要超過9個因素。如下表所示:

比如,如果我們想決定A的因素的影響比B的因素影響絕對地強,那么我們設置尺度為9,反之,如果B的因素的影響比A的因素影響絕對地強,那么我們就設置1/9。
於是,我們可以通過尺度來構造矩陣,舉例如下:

第三步:層次單排序一致性檢驗
看上面的那個例子圖片。C1與C2之間尺度為1/2,C1與C3之間尺度為4。那么我們可以很明顯的推出來C2與C3之間的尺度為8。但是,出現了一個問題。矩陣中C2與C3的尺度為7。這樣的矩陣稱作不一致矩陣。反之,如果矩陣中所有的元素都滿足關系式子,這樣的矩陣稱作一致矩陣。
在層次分析法中,允許采用不一致矩陣來解決問題。但是如果差別很小的話,可以直接使用不一致矩陣來解決我們的問題。如果差別很大的話,那么該不一致矩陣就會不適用了。這個差別要大到哪種程度呢?這是一個我們要考慮的問題。
這里就用到一致性檢驗了。我們可以通過一致性檢驗來檢測我們的矩陣是否可以使用。這個部分要用到什么特征向量,特征值,最大特征根之類的。沒學過線性代數,反正我看不懂,相信你也看不懂。不過沒關系,我發現Matlib有個函數可以直接通過矩陣來求這些東西。所以,這些東西我們先不考慮,然后先學后面的知識!
創始人Saaty 教授規定了一個公式來定義一致性指標:

n代表幾階矩陣,λ表示最大特征根(這個后面會直接用matlib的函數得出,所以請不要焦慮,繼續往后面看),CI可以把它當作一個整體看待(是不是整體我也不清楚),它能反應不一致得嚴重性。
但是嚴重性要在多少以內到多少我們才能用呢?嚴重性要超過多少我們不能用這個矩陣呢?這時候引入了下一個公式:

這個CI不用說了,就是我們之前求的那個一致性指標,RI叫隨機一致性指標,這個值需要查表獲取,具體這個值怎么來的,我建議不要考慮,過程很復雜。只用知道我們用這兩個值能夠得出一致性比率CR。且規定,當CR小於0.1時,就能通過一致性檢驗。反之,則不能。
注意:在使用層次分析法中一定要進行一致性檢驗。
RI查詢表如下:
階數 | RI |
---|---|
1 | 0 |
2 | 0 |
3 | 0.52 |
4 | 0.89 |
5 | 1.12 |
6 | 1.26 |
7 | 1.36 |
8 | 1.41 |
9 | 1.46 |
更高階矩陣請查詢:https://wenku.baidu.com/view/18b3870575232f60ddccda38376baf1ffd4fe37f.html
第四步:層次多排序一致性檢驗
這一步還要對層次分析法進行進一步的檢驗。不過檢驗的對象不是第二步所構建的矩陣了。這一步需要對每一個中間層列出最低層相關的矩陣。這樣的矩陣記為B1,B2,... Bm。並且對每一個矩陣求出它的CI和RI,然后使用下列式子計算它的層次總排序一致性比率:

同樣的,如果求出CR小於0.1,它就通過了一致性檢驗,反之就沒有通過。其中a1,a2到am表示中間各層的權值。
使用層次分析法時,單排序和多排序都要檢驗。
應用層次分析法的數學建模案例
例子如下:






python代碼
我發現這個特征值不是線性代數里面的特征值,不能使用用線性代數里面的求特征值的方法求。這是python代碼的求法:
import numpy as np
RI = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12,6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49, 11: 1.51}
def ahp(data):
data = np.array(data)
m = len(data)
# 計算特征向量
weight = (data / data.sum(axis=0)).sum(axis=1) / m
# 計算特征值
Lambda = sum((weight * data).sum(axis=1) / (m * weight))
# 判斷一致性
CI = (Lambda - m) / (m - 1)
CR = CI / RI[m]
if CR < 0.1:
print(f'最大特征值:lambda = {Lambda}')
print(f'特征向量:weight = {weight}')
print(f'\nCI = {round(CI,2)}, RI = {RI[m]} \nCR = CI/RI = {round(CR,2)} < 0.1,通過一致性檢驗')
return weight
else:
print(f'\nCI = {round(CI,2)}, RI = {RI[m]} \nCR = CI/RI = {round(CR,2)} >= 0.1,不滿足一致性')
A =[[1,4,2,8,2],[1/4,1,1/2,2,1/2],[1/2,2,1,4,1],[1/8,1/2,1/4,1,1/4],[1/2,2,1,4,1]]
ahp(A)