層次分析法


解決評價類問題常用方法之一
適用於指標數據未知且評價的決策層不多的情況.

一、確定評價指標

根據題目中的背景材料、常識以及網上搜集到的參考資料進行結合,從中篩選出最合適的指標。(優先在別人發表的論文中尋找指標)

二、畫出層次結構圖

三、確定每個指標所占的權重

1.對於同一層次的各元素關於上一層次中某一准則的重要性進行兩兩比較,構造兩兩比較矩陣(判斷矩陣)

ps:矩陣中填的數值通過題目提示及組員之間討論自行得出。

2.一致性檢驗

得出的判斷矩陣必須通過一致性檢驗,若不通過則進行相應的調整直到通過。


3.計算權重

計算出每個指標的權重以及各個景點在各個指標中的得分(通過代碼進行計算)。



4.匯總結果得到權重矩陣

5.計算各個方案的得分

使用excel計算
要點:F4鎖住單元格

代碼實現

點擊查看代碼
%% 如果判斷矩陣本身就是一個一致矩陣,那么就沒有必要進行一致性檢驗。

%% 輸入判斷矩陣
clear;clc
disp('請輸入判斷矩陣A: ')
% A = input('判斷矩陣A=')
%每個元素為1-9以及它們的倒數
A =[1 1 4 1/3 3;
 1 1 4 1/3 3;
 1/4 1/4 1 1/3 1/2;
 3 3 3 1 3;
 1/3 1/3 2 1/3 1]
% matlab矩陣有兩種寫法,可以直接寫到一行:
% [1 1 4 1/3 3;1 1 4 1/3 3;1/4 1/4 1 1/3 1/2;3 3 3 1 3;1/3 1/3 2 1/3 1]
% 也可以寫成多行:
[1 1 4 1/3 3;
 1 1 4 1/3 3;
 1/4 1/4 1 1/3 1/2;
 3 3 3 1 3;
 1/3 1/3 2 1/3 1]
% 兩行之間以分號結尾(最后一行的分號可加可不加),同行元素之間以空格(或者逗號)分開。

%% 方法1:算術平均法求權重
% 第一步:將判斷矩陣按照列歸一化(每一個元素除以其所在列的和)
Sum_A = sum(A)

[n,n] = size(A)  % 也可以寫成n = size(A,1)
% 因為我們的判斷矩陣A是一個方陣,所以這里的r和c相同,我們可以就用同一個字母n表示
SUM_A = repmat(Sum_A,n,1)   %repeat matrix的縮寫
Stand_A = A ./ SUM_A
% 這里我們直接將兩個矩陣對應的元素相除即可

% 第二步:將歸一化的各列相加(按行求和)
sum(Stand_A,2)

% 第三步:將相加后得到的向量中每個元素除以n即可得到權重向量
disp('算術平均法求權重的結果為:');
disp(sum(Stand_A,2) / n)
% 首先對標准化后的矩陣按照行求和,得到一個列向量
% 然后再將這個列向量的每個元素同時除以n即可(注意這里也可以用./哦)

%% 方法2:幾何平均法求權重
% 第一步:將A的元素按照行相乘得到一個新的列向量
Prduct_A = prod(A,2)
% prod函數和sum函數類似,一個用於乘,一個用於加  dim = 2 維度是行

% 第二步:將新的向量的每個分量開n次方
Prduct_n_A = Prduct_A .^ (1/n)
% 這里對每個元素進行乘方操作,因此要加.號哦。  ^符號表示乘方哦  這里是開n次方,所以我們等價求1/n次方

% 第三步:對該列向量進行歸一化即可得到權重向量
% 將這個列向量中的每一個元素除以這一個向量的和即可
disp('幾何平均法求權重的結果為:');
disp(Prduct_n_A ./ sum(Prduct_n_A))

%% 方法3:特征值法求權重
% 第一步:求出矩陣A的最大特征值以及其對應的特征向量

[V,D] = eig(A)    %V是特征向量, D是由特征值構成的對角矩陣(除了對角線元素外,其余位置元素全為0)
Max_eig = max(max(D)) %也可以寫成max(D(:))哦~
% 那么怎么找到最大特征值所在的位置了? 需要用到find函數,它可以用來返回向量或者矩陣中不為0的元素的位置索引。
% 那么問題來了,我們要得到最大特征值的位置,就需要將包含所有特征值的這個對角矩陣D中,不等於最大特征值的位置全變為0
% 這時候可以用到矩陣與常數的大小判斷運算
D == Max_eig
[r,c] = find(D == Max_eig , 1)
% 找到D中第一個與最大特征值相等的元素的位置,記錄它的行和列。

% 第二步:對求出的特征向量進行歸一化即可得到我們的權重
V(:,c)
disp('特征值法求權重的結果為:');
disp( V(:,c) ./ sum(V(:,c)) )
% 我們先根據上面找到的最大特征值的列數c找到對應的特征向量,然后再進行標准化。

%% 計算一致性比例CR

CI = (Max_eig - 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];  %注意哦,這里的RI最多支持 n = 15
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


免責聲明!

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



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