參考資料:
https://www.bilibili.com/video/BV1kC4y1a7Ee?p=10
https://www.bilibili.com/video/BV1hK411G76S
一、使用步驟
1. 划分層次
首先先將問題划分成多個層次,一般為三層,包括:
- 目標層
- 指標層
- 方案層
這里用選擇旅游地點的問題為例進行說明:
例如我們希望從南京、桂林和三亞三個城市中選擇一個城市進行旅游,而我們考慮的因素包括
- 景色
- 吃住
- 價格
- 人文
這樣我們可以從中抽象出如下圖所示的三層模型:

其中指標層為我們的考慮因素,而方案層則是我們的選擇集合。
2. 對指標層進行評估
在這一步,我們需要對指標層的因素集合進行評估,即評出各個因素的權重,例如如果我們更多地看中旅游的吃住體驗,則A2的權重就會比其他幾項要大。
這里層次分析法要求我們創建一個評估矩陣,里面的值是我們將這些因素進行兩兩比較得到的,相當於讓我們進行比較和打分,打分的依據如下表所示:

例如我們對上面的各項指標層進行評估得到的評估矩陣如下所示:

例如上面的(1,3)
的值為2,則代表了景色這個因素較價格稍微重要,其他也是以此類推的。
在完成了指標層的矩陣之后,我們還需要對這個矩陣進行一致性檢驗,這是為了防止打分的時出現比較矛盾的情況,例如打分中出現:吃住比景色好,景色比價格好,而價格又比景色好這種矛盾的情況。
對評估矩陣進行一致性檢驗
首先我們需要先獲取矩陣可以得到的各個因素權值,參考資料如下:
對於不一致(但在允許范圍內)的成對比較陣A,Saaty等人建議用對應於最大特征根λ的特征向量作為權向量ω,即Aω=λω。
因此,我們可以先求出矩陣對應的所有特征根,然后挑出其中的最大特征根\(\lambda_{max}\),然后再取該特征根所對應的特征向量即可。
以上的方法是在當我們有matlab等矩陣計算工具時采用的最佳方法,而當工具比較簡單時也可以采用簡單的算術平均法和幾何平均法計算得到相對合理的值,計算過程如下表所示:
算術平均法

幾何平均法

如果使用了以上兩個方法計算權值ω的話,則我們可以通過Aω=λω這個公式反推得到λ,即先求Aω的值,結果是一個向量,然后用這個向量的各個分量分別去除以ω的各個分量后得到的集合求平均值,如下圖所示:
![]()
![]()
得到了權值之后,我們可以計算一致性指標CI
,計算公式如下:

其中λ為前面的最大特征根\(\lambda_{max}\),n是矩陣的階數。
然后我們還需要引入一個隨機一致性指標RI
,這個量是固定的,可以查表得到,例如前面各階時的數據如下:

最后我們計算一致性比率\(CR=\frac{CI}{RI}\),如果\(CR<0.1\),則認為不一致程度在允許的范圍內,通過一致性檢驗。
3. 對方案層進行評估
即對於所有的方案,分別就指標層的每一個指標都進行一次兩兩的比較,比較過程和指標層評估的過程是一樣的,最終生成多個評估矩陣,例如如果指標層有n個指標,則最終會有B1~Bn這n個評估矩陣產生。同理,我們得到這些評估矩陣后也還是需要分別獲取它們的權重值及對它們進行相應的一致性檢驗。
3.1 就各個指標進行評估並檢驗一致性
以下是各個方案就景色這個因素的評估矩陣以及使用算術平均法得到相應的權值的過程表:

其余因素的評估過程也是類似的,在此之后也還需進行一致性檢驗,這里不再贅述。
3.2 進行層次總排序的一致性檢驗

4. 得到最終的結果
首先使用前面的數據建立出類似如下的表格:

然后可以分別加權計算出三個地點的總得分,例如南京的得分計算為:0.12*0.18+0.51*0.59+0.06*0.23+0.30*.074≈0.56
,其余兩項的計算也是一樣的,因而可以得到最終的排名和決策。
二、matlab相關編程
由某個評估矩陣計算相應權值和進行一致性檢驗的matlab代碼如下:
disp('請輸入准則層判斷矩陣A(n階)');
A=input('A=');
[n,n]=size(A);
[V,D]=eig(A);%求得特征向量和特征值
%求出最大特征值和它所對應的特征向量
tempNum=D(1,1);
pos=1;
for h=1:n
if D(h,h)>tempNum
tempNum=D(h,h);
pos=h;
end
end
% 得到特征向量 w=w/sum(w)為歸一操作(即各分量和為1)
w=abs(V(:,pos));
w=w/sum(w);
% 得到最大特征根
t=D(pos,pos);
disp('准則層特征向量w=');disp(w);disp('准則層最大特征根t=');disp(t);
%以下是一致性檢驗
CI=(t-n)/(n-1);
RI=[0 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 1.60 1.61 1.615 1.62 1.63];
CR=CI/RI(n);
if CR < 0.10
disp('此矩陣的一致性可以接受!');
disp('CI=');disp(CI);
disp('CR=');disp(CR);
else disp('此矩陣的一致性驗證失敗,請重新進行評分!');
end
由於不知道比賽是否會使用到這個算法,因此這里我只是學習核心原理和算法,如果后面需要我再進行算法的擴展和封裝等等。