MATLAB數學建模必備算法--層次分析法AHP

其主要用於解決評價類問題(例如:選擇哪種方案最好、哪位運動員或者員工表現的更優秀)

一個很典型的層次分析法案例:

確定評價目標:

高考完後小明想要去旅遊,有三個目的地供他選擇:

  1. 蘇杭
  2. 北戴河
  3. 桂林

確定評價準則:

假如小明要選擇目的地,他同時考慮以下的條件,我們稱爲評價準則:

  1. 景色
  2. 花費
  3. 居住
  4. 飲食
  5. 交通

確定評價準則的判斷矩陣:

在這之前,我們要介紹一下重要程度表:

當兩個條件互相比較時,誰比誰重要,可以用這張表的數值(1~9)來進行打分。

1

我們要依次確定這個五個條件的權重以便小明選擇目的地,假如我們問小明:

博主	:”小明,你覺得這五個條件對你來說對於選擇目的地來說更重要啊?“
小明:”一次讓我來說的話可能不太好判斷,每個我感覺都挺重要啊。。。“

於是我們就會遇到這樣的問題,但條件很多時,我們就不好一下子直接說出哪一個條件對於目的地的選擇更加重要(或者說在小明心中的權重)。所以這個時候我們可以構造一個表格來兩兩比較:
在這裏插入圖片描述
觀察以上表格,分成三個部分:

  • 對角線以上

拿景色與花費做例子,景色相比與花費,小明覺得景色對於他來說要求不是那麼高,反而會更在意花費,所以景色相對於花費的值是1/2
2

  • 對角線

     由於表格的對角線是條件與自己相比,所以值爲1(同等重要)
    
  • 對角線以下
    既然對角線以上是景色比花費,那麼對角線就是花費比景色,正好相反
    3

所以我們看到,對角線以下的是對角線以上的倒數,由於有五個評價準則,所以一共要兩兩比較:
4次就可以填滿整張表。
下面是結果:
5
6
總結:上面的上面這個表是一個5 X 5的方陣,我們記爲A,對應的元素爲:
在這裏插入圖片描述

這個方陣有如下特點:

  1. aij的意思是i與指標𝑗相比,𝑖的程度
  2. 𝑖 = 𝑗時,兩個指標相同,因此同等重要記爲1,這就解釋了主對角線元素爲1。
  3. 𝑎ij> 0且滿足𝑎ij X 𝑎ji = 1 (我們稱滿足這一條件的矩陣爲正互反矩陣)
上面這個矩陣就是層次分析法中的判斷矩陣,得到了判斷矩陣,就可以計算出權重了

確定目標的判斷矩陣:

既然評價準則之間有判斷矩陣,在小明心中,對於景色來說,蘇杭,北戴河,桂林之間可能也有不同的分數,他可能覺得在景色方面,桂林更勝一籌,那麼桂林的分數就要比其它兩個的分數要高,那這樣單單就景色來說,蘇杭,北戴河,桂林之間就要兩兩之間進行比較,其它的條件也是同樣如此,於是我們可以類比以上的表格:

  • 景色:

7

  • 花費
    8
  • 居住
    9
  • 飲食
    10
  • 交通
    11

一致矩陣的概念

由於以上表格都是我們問,小明答,有很強的主觀意願,所以這張表表格很可能出錯,下面我們就來看一個錯誤的例子:
12
如上圖所示,出現了不一致的現象,那麼我們來看一個一致的矩陣:
13
我們觀察這個矩陣,它的各行各列成比例,我們稱這個矩陣爲一致矩陣,我們可以用數學符號來表達:
14
所以,綜上所述:各行(各列)之間成倍數關係的矩陣爲一致矩陣。

總結:

  • 矩陣中每個元素都大於0且對角線元素爲1的矩陣我們成爲正互反矩陣
  • 在層次分析法中,我們構造的判斷矩陣都是正互反矩陣
  • 若正互反矩陣滿足各行各列成比例,我們稱爲一致矩陣
所以,我們得到的判斷矩陣一定是正互反矩陣,由於跟實際情況中可變的因素有很多,所以我們的正互反矩陣在現實生活中很難滿足各行各列成比例,所以也就很難讓正互反矩陣成爲一致矩陣,但是我們可以對正互反矩陣進行一致性檢驗,讓它在一定的範圍誤差內,在此誤差內我們可以看作其滿足一致性矩陣的條件,所以我們在得到了判斷矩陣(正互反矩陣)後要進行一致性檢驗

對判斷矩陣進行一致性檢驗:

原理: 檢驗我們構造的判斷矩陣和一致矩陣是否有太大的差別。

一致性檢驗的步驟:
15

  1. 計算判斷矩陣的特徵值:

    如果特徵值中有虛數,則比較的是特徵值的模長。
    這個由於計算較爲繁瑣,我們可以交給MATLAB完成,使用eig命令既可以計算特徵值,也可以計算特徵向量。
    

    當最大特徵值等於矩陣階數的時候,我們的正互反矩陣才爲一致矩陣:
    16
    當最大特徵值與n相差越大時,我們得到的矩陣越不一致。

  2. 計算一致性指標CI
    17

  3. 查找對應的平均隨機一致性指標RI

17

注:在實際運用中,n很少超過10,如果指標的個數大於10,則可考慮建立 二級指標體系,或使用我們以後要學習的模糊綜合評價模型。

  1. 計算一致性比例CR
    18

  2. 對一致性比例CR進行判斷:

    如果CR<0.1,則判斷矩陣的一致性可以接受。
    如果CR>0.1,則要對判斷矩陣進行修正。

計算判斷矩陣的權重:

計算權重有三種方法:
19

算數平均法求權重:

步驟:
20

  1. 將判斷矩陣按照列歸一化(每一個元素除以其所在列的和)
    我們看一個例子:
    21
    第一列:
    22
    第二列:
    23
    第三列:
    24
    於是我們得到以下表格:
    25
  2. 將歸一化的各行相加:

相加後我們得到以下表格:
26

  1. 除以n得到最後的權重

27

幾何平均法求權重:

步驟:
28

  1. A的元素按照行相乘得到一個新的列向量

    在MATLAB中使用prod(A,2)命令即可以對一行進行相乘
    

A =

    1.0000    2.0000    5.0000
    0.5000    1.0000    2.0000
    0.2000    0.5000    1.0000

使用prod(A,2)命令:

>> prod(A,2)

ans =

   10.0000
    1.0000
    0.1000
  1. 將新的向量的每個分量開n次方
>> ans.^(1/3)

ans =

    2.1544
    1.0000
    0.4642
  1. 對該列向量進行歸一化即可得到權重向量
    29

結果:
29

注: 權重和應爲1,這裏由於四捨五入所以會有可以忽略的差距。

特徵值法求權重:

步驟:
30

1.在MATLAB中使用eig命令求特徵值和特徵向量:

A =

    1.0000    2.0000    5.0000
    0.5000    1.0000    2.0000
    0.2000    0.5000    1.0000

>> [v,r] = eig(A)

v =

  -0.8902 + 0.0000i  -0.8902 + 0.0000i  -0.8902 + 0.0000i
  -0.4132 + 0.0000i   0.2066 + 0.3578i   0.2066 - 0.3578i
  -0.1918 + 0.0000i   0.0959 - 0.1661i   0.0959 + 0.1661i


r =

   3.0055 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.0028 + 0.1290i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i  -0.0028 - 0.1290i

找出最大特徵值爲3.0055
2. 對求出的特徵向量進行歸一化即可得到我們的權重:
最大特徵值對應的特徵向量

  -0.8902 + 0.0000i  
  -0.4132 + 0.0000i  
  -0.1918 + 0.0000i 

歸一化:

0.5954
0.2764
0.1283

三種方法計算的權重結果:

31
將計算結果填入權重表,得到:
32

計算評價準則的權重:

  • 得到評價準則的判斷矩陣:

33

  • 用三種方法計算權重:
    34
  • 填入表格:

35

求出其它評價準則對應的權重:

36

彙總結果得到權重矩陣:

37

根據權重表格計算每個目標的得分:

38
類似我們求出:
39
40

結果:

因此最佳的旅遊景點是桂林

總結:

1.建立層次結構:
41
2.構造準則層之間判斷矩陣:
42

3.構造方案層之間判斷矩陣:
43
4.對以上每個判斷矩陣進行一致性檢驗(通過後才能計算權重):

44
5.通過檢驗後根據權重矩陣計算得分,並進行排序
三種方法計算權重:
45

注意事項:

  • 一致矩陣不需要進行一致性檢驗,只有非一致矩陣的判斷矩陣才需要進行一致性檢驗
  • 在論文寫作中,應該先進行一致性檢驗,通過檢驗後再計算權重,以上講解的只是爲了順應計算過程。
  • 特徵值可用MATLAB進行計算,如果特徵值中有虛數,則比較的是特徵值的模長。
  • 如果CR > 0.1 ,我們可以往一致矩陣上調整(這個就看你自己了,反正評委也不知道是吧~)
  • 平均隨機一致性指標RI的表格中n最多是15

層次分析法的一些侷限性:

  • 評價的準則層n不能太多(一般不超過十個),太多的話n(最多是15)會很大,判斷矩陣和一致矩陣差異可能會很大。

46

代碼(含有詳細註釋):

disp('請輸入判斷矩陣A')
A=input('A=');
[n,n] = size(A);
% % % % % % % % % % % % %方法1 算術平均法求權重% % % % % % % % % % % % %
Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;

disp('算術平均法求權重的結果爲:');
disp(sum(Stand_A,2)./n)
% % % % % % % % % % % % %方法2 幾何平均法求權重% % % % % % % % % % % % %
Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n)
disp('幾何平均法求權重的結果爲:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
% % % % % % % % % % % % %方法3 特徵值法求權重% % % % % % % % % % % % %
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特徵值法求權重的結果爲:');
disp( V(:,c) ./ sum(V(:,c)) )
% % % % % % % % % % % % %下面是計算一致性比例CR的環節% % % % % % % % % % % % %
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 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];  %注意哦,這裏的RI最多支持 n = 15
% 這裏n=2時,一定是一致矩陣,所以CI = 0,我們爲了避免分母爲0,將這裏的第二個元素改爲了很接近0的正數
CR=CI/RI(n);
disp('一致性指標CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
    disp('因爲CR<0.10,所以該判斷矩陣A的一致性可以接受!');
else
    disp('注意:CR >= 0.10,因此該判斷矩陣A需要進行修改!');
end

可以參考的矩陣:

將以下五個矩陣依次輸入以上代碼中就可以直接求出各種結果

評價準則:
[1, 1/2, 4, 3, 3;
 2, 1,   7, 5, 5;
 1/4, 1/7, 1, 1/2, 1/3;
 1/3, 1/5, 2, 1, 1;
 1/3, 1/5, 3, 1, 1]
景色:
[1,2,5;
1/2,1,2;
1/5,1/2,1;]
花費:
[1,1/3,1/8;
3,1,1/3;
8,3,1;]
居住:
[1,1,3;
1,1,3;
1/3,1/3,1;]
飲食:
[1,3,4;
1/3,1,1;
1/4,1,1;]
交通 
[1,1,1/4;
 1,1,1/4;
 4,4,1;]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章