AHP:解析分層進程(analytic hierarchy process),層次分析法。
它為我們提供了一種強有力的工具,這種工具能夠在涉及多個目标的情況下做出決策。
例如:
(1)在選擇購買手機的過程中,你可能主要考慮手機的下列因素:
因:素1:價格
因素2:屏幕大小
因素3:手機的品牌
因素4:手機的存儲空間
因素5:手機處理器性能
(2)在選擇接受哪一份工作的時候,你可能主要考慮以下幾個目标:
目标1:對工作的興趣
目标2:工作的薪資水平
目标3:工作所帶來的生活質量
目标4:離家遠近
(3)在考察幹部的時候,要對多名幹部考察排序,組織部門要從“德、能、勤、績、廉”幾個方面對考察對象進行綜合評價,結果将作為幹部選聘的重要依據之一。
諸如此類的問題實質就是個多目标決策的問題。
然而,當多個目标對決策者都很重要的時候,決策者可能很難作出選擇。
例如,在求職的時候,一份工作可能薪資水平相對高,但是離家遠,工作帶來的生活質量不高;在考察幹部的時候,“德、勤、廉”評價都很好,但是被考察對象的能力一般,業績平平。在這樣的情況下,決策者就很難在多個目标或者因素中進行選擇。
在這樣的場景下,AHP為我們提供一種解決這類問題的科學方法。
AHP基本思路對被選對象在多個目标下計算綜合評分。根據每個對象的最終得分,确定最滿意的選擇。
綜合得分=目标權重*被評價對象在每個目标上的相對分值
例如:
顯然,工作2的綜合得分最高,理性的選擇下,應該接受工作2。
AHP計算程序通過上面的舉例,我們要計算出被評價對象的綜合得分,需要知道目标因素的權重值,同時需要知道每個工作在同一個目标下的相對得分值。
然而,這兩項數值如何得出呢?
我們試想,其實人的決策過程就是在每個對象針對每個目标的相對重要程度的判斷和比對,越重要您可能越在意,“因為它很重要,所以我必須要考慮”,“因為它對我很有意義,所以我非常珍惜”,“我更喜歡前者”......諸如此類的心理糾結過程正是表達出該目标相對其他目标更重要。
為此,我們可以将所有目标因素做兩個比較,形成一個成對比較矩陣。矩陣裡的數據做如下約定:
每一個被評價對象針對每一個目标依然可以采用這樣思路來進行“數字化”,把相對比較轉化為成對比較矩陣。
顯然,目标1如果相對目标2的重要性得分為3的話,目标2相對目标1的重要性得分就應該為1/3,它們之間互為倒數關系。因此,成對比較矩陣将是一個“反對稱矩陣”。
反對稱陣是否表征出一緻的重要性通過上面的思考和分析,我們知道表征重要性程度的矩陣一定是一個“反對稱陣”,那麼是不是隻要是反對稱矩陣就一定能正确表征出重要性程度呢?我們先看個例子:
假設有下面的表征重要性程度的成對比較矩陣:
不妨做如下推導,看看會得出什麼結論:
(1)該矩陣是成對比較“反對稱陣”;
(2)factor1=2*factor2,factor2=1/2*factor3
故:factor1= factor3
又:原矩陣中,factor1=3*factor3,顯然與之産生了矛盾。
這樣的矛盾,我們稱之為“數據不一緻性”,如果成對比較反對稱陣數據不一緻,将會導緻嚴重的問題。
通常在理論上通過“一緻性指數”在檢驗數據的一緻性。關于一緻性指數,後邊介紹。
權重的計算假設有n個目标,wi表示給定目标i的權重。同時給出的成對比較矩陣是完全一緻的。
我們先做如下計算:
根據《線性代數》有關線性方程求解的理論可知:
A是n階方陣,若存在數λ和非零向量X,使得:AX=λX,則:
(1)λ是A的一個特征值
(2)x是A的對應特征值λ的特征向量
顯然,我們可以得出以下結論:
(1)n是A的一個特征值
(2)w是A的對應于 n的特征向量
故此,要求出w隻需求出A的特征值和特征向量即可。
判斷矩陣一緻性的度量一緻性判斷矩陣A(反對稱可逆方陣)具有如下性質:
如果矩陣A是嚴格一緻的判斷方陣(一緻性判斷反對稱陣)那麼w就是與n對應的特征向量值。
遺憾的是,人們在評價的時候不總是人人都能做到一緻性判斷,往往給出的判斷都有一定程度的“矛盾”因此,在運用該矩陣理論求解得出的結論會有一定程度的偏差,但偏差程度如果在人們可接受的範圍,則我們依然認為解是有效的,即w有效。
如何在度量這種偏差的程度呢?查閱相關文獻資料可知,引入一個指标,即一緻性指數CI(consistency index),用它來度量偏差的大小,并且查閱到了平均随機一緻性指标,平均随機一緻性指标是幾百,幾千次,幾萬次重複進行随機判斷矩陣特征根計算之後取算術平均得到的。通過CI與RI(random index)對比值CR(consistency ratio)大小确定是否為可接受該偏差。
下面給出CI的計算式,以及RI值(random index):
顯然,如果所有條件均滿足的話(指理論的理想狀态),λ=n,CI=0。
如果λ越偏離n,則CI值就越偏離0,我們要追求盡可能接近λ=n的解,這樣CI才會越接近0,也就是結論就越對決策有效。
當CR<0.1時,我們認為判斷矩陣具有可以接受的一緻性。否則,就需要調整和修正判斷矩陣,使其滿足給阈值條件。
因為這樣才越接近理論,偉大的線性代數理論指導工程實踐。使得實踐有了理論保證,結論可靠。
MatLab求解特征值與特征向量(權重)例如:計算如下的判斷矩陣A的特征值和特征向量(權重)。
% matlab代碼
% A:判斷矩陣,反對稱方陣
A = [1, 5, 2, 4;
1/5, 1, 1/2, 1/2;
1/2, 2, 1, 2;
1/4, 2, 1/2, 1]
% x:特征向量
% y:對應的特征值
[x,y] = eig(A)
eigvalue = diag(y)
lmda = eigvalue(1)
eigvect = x(:,1)
% 歸一化處理
w = eigvect(:,1)/sum(eigvect(:,1))
% CI
CI = (lmda-size(A,1))/(size(A,1)-1)
顯然,CR<0.1,用判斷矩陣A不會表現出嚴重的不一緻性。結果可靠可接受。
求目标選擇的分數上述我們已經分析了多個目标的權重确定,然而僅有目标的權重還不能确定排序,還需要确定各個方案滿足各個目标的程度,即各個方案針對每一個目标的評分。要确定這些分數,我們需要構造每個方案在某一個目标下的成對比較矩陣。其分析與計算過程與上述分析計算過程是同理的,因此,隻需要套用上述原理即可求解出目标選擇分數。
例如:
對于所有的決策變量,工作1,工作2,工作3的成對比較矩陣為:
通過上述計算可得:
理性的您,是不是一定會選擇工作2呢?(為什麼,留給大家思考......)
附帶給出AHP的python實現
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 19 19:51:23 2022
@author: zgr
"""
def total(matrix, num_of_params):
'''
total function sums the column of matrix and returns a 1d-array
Args:
matrix: It is the pairwise comparison matrix after taking user input
num_of_params: Number of factors taken for comparison
'''
total = np.full((num_of_params), 0, dtype=float)
for i in range(num_of_params):
for j in range(num_of_params):
total[i] = total[i] matrix[j, i] # sum column individual
return(total)
def normalization(sum_of_column, matrix, num_of_params):
''''
normalization function computes the matrix with ouput from total function and returns matrix
Args:
sum_of_column: It is the sum of each column of pariwise comparison matrix and also a output from total function
matrix: It is the pariwise comparison matrix after taking user input
num_of_params: Number of factors taken for comparison
'''
norm = np.full((num_of_params, num_of_params), 1, dtype=float)
for i in range(num_of_params):
for j in range(num_of_params):
norm[i, j] = matrix[j, i]/sum_of_column[i]
norm_t = norm.transpose().round(4)
return (norm_t)
def weight(normalized_matrix, num_of_params):
'''weight function computes the weight of each factor
Args:
normalized_matrix: It is the matrix from normalization function which has normalized value computed from sum of column
num_of_params: Number of factors taken for comparison'''
w = []
for i in range(num_of_params):
wt = np.sum(normalized_matrix[[i]])/num_of_params
w.append(round(wt, 4))
return(w)
def consistency_check(total, weight, num_of_params):
'''consistency_check function checks the set of judgements to determine their reliability
total: It is the sum of each column of pariwise comparison matrix and also a output from total function
weight: Weight of each factors derived from the weight function
num_of_params: Number of factors taken for comparison
'''
lmda = 0
for i in range(num_of_params):
lmda = lmda total[i] * weight[i]
# Consistency Index
CI = (lmda-num_of_params)/(num_of_params-1)
for x in random_index:
if (x==str(num_of_params)):
RI = random_index[x]
# Consistency Ratio
CR = CI/RI
to_return = {
"lmda:":round(lmda,2),
"Consistency Index(CI): ": round(CI,4),
"Random Index(RI): ": RI,
"Consistency Ratio(CR=CI/RI): ": round(CR,4)
}
if(CR < 0.1):
to_return["Consistency(CR < 0.1): "] = True
else:
to_return["ConsistencyCR > 0.1: "] = False
return (to_return)
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!