層次分析法


花了一通宵,總算整明白了,網上的學習資源太復雜,太難了,我就寫了篇容易理解的博客,有地方有問題的可以留言。(明天啊呸今天還有課嗚嗚嗚)

層次分析法的概述

層次分析法(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)


免責聲明!

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



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