matlab-層次分析法


層次分析法(AHP)是把問題條理化、層次化,構造出一個有層次的結構模型的方法。

比如要選擇旅游地,有3個選擇方案,蘇杭、北戴河和桂林。選擇過程需要考慮多個因素,比如景色、費用、居住、飲食和旅途。

1.分為目標層(選擇旅游地),准則層(景色、費用、居住、飲食和旅途)和方案層(蘇杭、北戴河和桂林)。層次結構模型如圖所示:

 

2.構造判斷矩陣

 

標度是主觀判斷的,不同人造出來的矩陣可能不一樣。

准則層的矩陣:Ax = [ aij ]; x個n*n的矩陣,此時n=5表示准則層的數量,x表示准則層對目標層的影響,這里x=1。

舉例:a14 = 3表示主觀認為在選擇旅游地時,景色比美食稍重要。反之,a41 = 1/3表示美食比景色稍重要。

方案層的矩陣:Bx = [ aij ]; x個n*n的矩陣,此時n=3表示方案層的數量,x表示准則層對方案層的影響,這里x=5。

舉例:B1中,a13=5表示,在景色方面,蘇杭比桂林明顯重要。

也就是要構造x+1=6個矩陣。數據如下,是主觀假設給出的。

[ 
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
]
數據

3.一致性檢驗

構造判斷矩陣過程可能會構造錯誤,比如矩陣

1    9    1/3

9    1    5

3    1/5  1

a12 = 9 表示 因素1比因素2極端重要,a31=2表示因素3比因素1稍重要,則重要程度顯然是 因素3>因素1>因素2,而a23=5表示因素2比因素3明顯重要,矛盾

並且對於每一個n階矩陣會得到一個權重矩陣W,W是一個n*1的矩陣,即n個數,比如A矩陣得到的WA矩陣是

[0.26228;

0.47439;
0.054492;
0.098534;
0.1103;]

表示景色、費用、居住、飲食和旅途對於選擇旅游地(上一層)的權重比分別是0.26228、0.47439、0.054492、0.098534和0.1103。體現出影響因素的層次

比如B2得到的WB2矩陣是

[0.08199;
0.23645;
0.68156]

表示蘇杭、北戴河和桂林在景色方面的權重比分別是0.08199、0.23645和0.68156。

4.對權值計算做出決策

獲得了6個矩陣的權重比,分別是

WA=[0.26228;0.47439;0.054492;0.098534;0.1103];

WB1=[0.59489;0.27661;0.1285];

WB2=[0.08199;0.23645;0.68156];

WB3=[0.42857;0.42857;0.14286];

WB4=[0.63275;0.1924;0.17485];

WB5=[0.16667;0.16667;0.66667];

每一個旅游景點對於目標層Z的權重=准則層權重*方案層權重之和。

蘇杭的權重=0.26228*0.59489+0.47439*0.08199+0.054492*0.42857+0.098534*0.63275+0.1103*0.16667=0.29901

北戴河的權重=0.26228*0.27661+0.47439*0.23645+0.054492*0.42857+0.098534*0.1924+0.1103*0.16667=0.24541

桂林的權重=0.26228*0.1285+0.47439*0.68156+0.054492*0.14286+0.098534*0.17485+0.1103*0.66667=0.45558

最后0.29901+0.24541+0.45558=1;

桂林的比重最大,選擇去桂林!

代碼:

 

clc
clear all;
disp('請輸入判斷矩陣A(n階)');
A = input('A=');
[n,~]=size(A);%由於矩陣構造方法的原因,矩陣都是正方形的所以關於矩陣的大小只需要取一個參數
Asum=sum(A,1);%求每一列的和
Aprogress=A./(ones(n,1)*Asum);%計算每一列個元素在這一列占的比重
W=sum(Aprogress,2)./n;%每一行元素相加取平均值,需要注意這里W是個列項量且所有值加起來等於1
w=A*W;%如果A的矩陣是理想狀況的話這里W=w
lam=sum(w./W)/n;%通過這一步最大lam
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45];
CI=(lam-n)/(n-1);
CR=CI/RI(n);%計算誤差
if CR<0.10 %如果誤差小於0.1則可以接受
	disp('此矩陣的一致性可以接受!');
    fprintf('Cl=');disp(CI);
	fprintf('CR=');disp(CR);
	fprintf('W=');disp(W);
else
	disp('此矩陣的一致性不可以接受!');
end

 

對於不同階判斷矩陣是否滿足一致性,引入判斷矩陣的平均隨機一致性指標RI(rand index)。Saaty給出的RI的值是一連串系數,對應各階矩陣分別

1階和2階會提示不滿足一致性檢驗,但只要矩陣斜對稱就可以了。因為RI(1)和RI(2)都等於0,導致CR為NaN不能進入if語句。但是可以求出權重比W。

B站視頻看到的矩陣數據,但是RI數組和我不一樣。我的RI數組是在建模神書司守奎的算法大全上看的。

https://www.bilibili.com/video/av29474522/?p=2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM