概述
- 層次分析法是指將一個復(fù)雜的多目標決策問題作為一個系統(tǒng)傀顾,將目標分解為多個目標或準則骗灶,進而分解為多指標(或準則友多、約束)的若干層次攀隔,通過定性指標模糊量化方法算出層次單排序(權(quán)數(shù))和總排序刻炒,以作為目標(多指標)决采、多方案優(yōu)化決策的系統(tǒng)方法。
- 層次分析法是將決策問題按總目標坟奥、各層子目標树瞭、評價準則直至具體的備投方案的順序分解為不同的層次結(jié)構(gòu),然后用求解判斷矩陣特征向量的辦法爱谁,求得每一層次的各元素對上一層次某元素的優(yōu)先權(quán)重晒喷,最后再加權(quán)和的方法遞階歸并各備擇方案對總目標的最終權(quán)重,此最終權(quán)重最大者即為最優(yōu)方案访敌。
- 層次分析法比較適合于具有分層交錯評價指標的目標系統(tǒng)凉敲,而且目標值又難于定量描述的決策問題。
基本步驟
1.建立層次結(jié)構(gòu)模型
- 將問題包含的因素分層:最高層(解決問題的目的);中間層(選擇為實現(xiàn)總目標而采取的各種措施爷抓、方案所必須遵循的準則势决。也可稱策略層、約束層蓝撇、準則層等)果复;最低層(用于解決問題的各種措施、方案等)唉地。把各種所要考慮的因素放在適當(dāng)?shù)膶哟蝺?nèi)据悔。用層次結(jié)構(gòu)圖清晰地表達這些因素的關(guān)系。
- 以干部選拔模型為具體實例展開論述耘沼。
-
對三個干部候選人y1极颓、y2 、y3群嗤,按選拔干部的五個標準:品德菠隆、才能、資歷狂秘、年齡和群眾關(guān)系骇径,構(gòu)成如下層次分析模型: 假設(shè)有三個干部候選人y1、y2 者春、y3破衔,按選拔干部的五個標準:品德,才能钱烟,資歷晰筛,年齡和群眾關(guān)系,構(gòu)成如下層次分析模型:
選拔干部層次分析模型.png
2.構(gòu)造成對比較矩陣
- 比較第i個元素與第j個元素相對于上一層某個因素的重要性時拴袭,使用數(shù)量化的相對權(quán)重
來描述读第。設(shè)共有n個元素參與比較,則
稱為成對比較矩陣拥刻。
標度 | 含義 |
---|---|
i與同樣重要性 | |
i比j稍微重要 | |
i比j明顯重要 | |
i比j強烈重要 | |
i比j極端重要 | |
2怜瞒,4,6般哼,8 | 上述兩相鄰判斷的中值 |
倒數(shù) | A和B相比如果標度為3吴汪,則B和A相比就是1/3 |
- 選拔干部考慮5個條件:品德x1,才能x2蒸眠,資歷x3漾橙,年齡x4,群眾關(guān)系x5黔宛。某決策人用成對比較法近刘,得到成對比較矩陣如下:
3.一致性檢驗
- 一致矩陣
一致矩陣.jpg
如果A是完全一致的成對比較矩陣擒贸,應(yīng)該有 - 實際上,在構(gòu)造成對比較矩陣時并不一定能滿足一致矩陣的要求觉渴。因此介劫,退而要求成對比較矩陣具有一定的一致性,即可以允許成對比較矩陣存在一定程度的不一致性案淋。
-
對一致矩陣座韵,其絕對值最大的特征值等于該矩陣的維數(shù)。對成對比較矩陣的一致性要求轉(zhuǎn)化為:其絕對值最大的特征值和該矩陣的維數(shù)相差不大踢京。
一致性檢驗步驟.png - 上述對比矩陣A的絕對值最大的特征值為5.141誉碴,則
查表值
,故
瓣距。
所以對比矩陣A的一致性可以接受黔帕。
4.權(quán)重的計算
- 上述對比矩陣A的絕對值最大的特征值所對應(yīng)的特征向量為:
- 將該向量標準化,使得它的各分量都大于零蹈丸,各分量之和等于 1成黄。該特征向量標準化后為:
- 經(jīng)過標準化后向量稱為權(quán)向量。這里權(quán)向量反映了決策者選拔干部時逻杖,視品德條件最重要奋岁,其次是才能,再次是群眾關(guān)系荸百,年齡因素闻伶,最后才是資歷。各因素的相對重要性由權(quán)向量的各分量所確定够话。
5.層次總排序及決策
- 要從三個候選人y1蓝翰,y2,y3中選一個總體上最適合上述五個條件的候選人更鲁。對此霎箍,對三個候選人y1奇钞,y2,y3分別比較他們的品德(x1)景埃,才能(x2)媒至,資歷(x3),年齡(x4)拒啰,群眾關(guān)系(x5)甲捏。
- 先成對比較三個候選人的品德,得成對比較陣
- 對B1進行一致性檢驗,然后求得B1的權(quán)向量
- 分別比較三個候選人的才能获三,資歷,年齡理疙,群眾關(guān)系得成對比較陣:
- 相應(yīng)的權(quán)向量為
- 由上述數(shù)據(jù)巷折,我們可以得到如下的一張表格:
權(quán)重指標 | y1 | y2 | y3 | |
---|---|---|---|---|
x1 | 0.4734 | 0.0819 | 0.2363 | 0.6817 |
x2 | 0.2624 | 0.5954 | 0.2764 | 0.1283 |
x3 | 0.0572 | 0.4286 | 0.4286 | 0.1429 |
x4 | 0.0989 | 0.6337 | 0.1919 | 0.1743 |
x5 | 0.1091 | 0.3047 | 0.1667 | 0.5286 |
總分 | 0.3148 | 0.2459 | 0.4393 |
其中芯丧,總分的計算為,其中
代表第j個指標的權(quán)重波附,
代表第i個候選人的第j個指標的得分艺晴。
- 從三個候選人的得分情況看,y3的得分最高叶雹,故y3是第一干部候選人财饥。
總結(jié)
使用層次分析法换吧,
- 首先折晦,要分析系統(tǒng)中各因素之間的關(guān)系,建立系統(tǒng)的遞階層次結(jié)構(gòu)沾瓦;
- 其次满着,對于同一層次的各元素關(guān)于上一層某一準則的重要性進行兩兩比較谦炒,構(gòu)造兩兩比較矩陣;
- 接著风喇,由判斷矩陣計算被比較元素對于該準則的相對權(quán)重宁改,并進行一致性檢驗;
- 最后魂莫,計算各層元素對系統(tǒng)目標的合成權(quán)重还蹲,并進行排序。
參考文獻
https://wiki.mbalib.com/wiki/%E5%B1%82%E6%AC%A1%E5%88%86%E6%9E%90%E6%B3%95
附python代碼
import numpy as np
'''
@Description:
求解矩陣的權(quán)向量
@para:
成對比較矩陣
@return:
權(quán)向量
'''
def abhWeightVector(Mat):
sizeMat = Mat.shape[0]
#print(Mat)
#print(sizeMat)
# 計算矩陣A的特征值耙考,特征向量
eigenvalueMat, eigenvectorMat = np.linalg.eig(Mat)
#print("特征值:", eigenvalueMat)
#print("特征向量:", eigenvectorMat)
# 將所有特征值取絕對值
absEigenvalueMat = map(abs, eigenvalueMat)
absEigenvalueMat = list(absEigenvalueMat)
#print(absEigenvalueMat)
# 絕對值最大的特征值
maxEigenvalueMat = max(absEigenvalueMat)
#print("絕對值最大的特征值:", maxEigenvalueMat)
# 絕對值最大的特征值的索引
maxEigenvalueIndexMat = absEigenvalueMat.index(maxEigenvalueMat)
#print(maxEigenvalueIndexMat)
# 絕對值最大的特征值對應(yīng)的特征向量
maxEigenvectorMat = eigenvectorMat[:, maxEigenvalueIndexMat]
#print("絕對值最大的特征值對應(yīng)的特征向量:", maxEigenvectorMat)
# 將上述特征向量標準化谜喊,即權(quán)向量
standardizeVectorMat = list(map(abs, maxEigenvectorMat)) / sum(list(map(abs, maxEigenvectorMat)))
#print(standardizeVectorMat)
# 計算不一致程度CI
CI = (maxEigenvalueMat - sizeMat) / (sizeMat - 1)
#print(CI)
# 平均隨機一致性指標RI
listRI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45]
#計算隨機一致性比率
CR = CI / listRI[sizeMat - 1]
#print(CR)
return standardizeVectorMat
MatA = np.array([[1, 2, 7, 5 ,5],
[1/2, 1, 4, 3, 3],
[1/7, 1/4, 1, 1/2, 1/2],
[1/5, 1/3, 2, 1, 1],
[1/5, 1/3, 3, 1, 1]])
standardizeVectorMatA = abhWeightVector(MatA)
print(standardizeVectorMatA)
MatB1 = np.array([[1, 1/3, 1/8],
[3, 1, 1/3],
[8, 3, 1]])
standardizeVectorMatB1 = abhWeightVector(MatB1)
print(standardizeVectorMatB1)
MatB2 = np.array([[1, 2, 5],
[1/2, 1, 2],
[1/5, 1/2, 1]])
standardizeVectorMatB2 = abhWeightVector(MatB2)
print(standardizeVectorMatB2)
MatB3 = np.array([[1, 1, 3],
[1, 1, 3],
[1/3, 1/3, 1]])
standardizeVectorMatB3 = abhWeightVector(MatB3)
print(standardizeVectorMatB3)
MatB4 = np.array([[1, 3, 4],
[1/3, 1, 1],
[1/4, 1, 1]])
standardizeVectorMatB4 = abhWeightVector(MatB4)
print(standardizeVectorMatB4)
MatB5 = np.array([[1, 4, 1/4],
[1, 1, 1/4],
[4, 1, 1]])
standardizeVectorMatB5 = abhWeightVector(MatB5)
print(standardizeVectorMatB5)
MatB = np.array([standardizeVectorMatB1,
standardizeVectorMatB2,
standardizeVectorMatB3,
standardizeVectorMatB4,
standardizeVectorMatB5])
print(MatB)
sumY1 = 0
sumY2 = 0
sumY3 = 0
for i in range(0, MatA.shape[0]):
sumY1 += standardizeVectorMatA[i] * MatB[i][0]
sumY2 += standardizeVectorMatA[i] * MatB[i][1]
sumY3 += standardizeVectorMatA[i] * MatB[i][2]
sumY = [sumY1, sumY2, sumY3]
print(sumY)
maxY = max(sumY)
theBestIndex = sumY.index(maxY)
print(theBestIndex)