參考資料:
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
由於不知道比賽是否會使用到這個演算法,因此這裡我只是學習核心原理和演算法,如果後面需要我再進行演算法的擴充套件和封裝等等。