天天看點

數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序

數學模組化——層次分析法(Matlab)【評價類問題】

層次分析法

  • 建立遞階層次結構
  • 構造判斷矩陣
  • 一緻性檢驗
  • 計算總權重并排序

建立遞階層次結構

将決策問題分解為三個層次,最上層為目标層O,即…;最下層為方案層,即…;中間層為準則層,即…;(如圖一所示)

數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序

構造判斷矩陣

對于同一層次的各元素關于上一層次中某一準則的重要性進行兩兩比較,依據下表,構造出判斷矩陣(O-C,C1-A,C2-A,C3-A)。

數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序

構造出的判斷矩陣滿足下列兩個條件:

數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序

且滿足主對角線元素為1

一緻性檢驗

下面展示一些

内聯代碼片

// clear;clc
disp('請輸入判斷矩陣A: ')%輸入判斷矩陣
           

檢驗原因如下例所示:

數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序

通過Matlab的函數進行一緻性檢驗:

數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序
數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序

檢驗結果若是一緻,則可進入下一步。若不一緻,則将原判斷矩陣往一緻矩陣上調整,将矩陣改為各行成倍數關系。

下面展示一些

内聯代碼片

//[V,D] = eig(A)
Max_eig = max(max(D))
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
           

計算總權重并排序

通過Matlab,使用算術平均法、幾何平均法、特征值法求到歸一化後的

特征向量。(三種方法一起使用,但是最後還是使用特征值法的答案)。

下面展示一些

内聯代碼片

// %% 方法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的縮寫
% 另外一種替代的方法如下:
    SUM_A = [];
    for i = 1:n   %循環哦,這一行後面不能加冒号(和Python不同),這裡表示循環n次
        SUM_A = [SUM_A; Sum_A]
    end
clc;A
SUM_A
Stand_A = A ./ SUM_A
% 這裡我們直接将兩個矩陣對應的元素相除即可

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

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

%% 方法2:幾何平均法求權重
% 第一步:将A的元素按照行相乘得到一個新的列向量
clc;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的最大特征值以及其對應的特征向量
clc
[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找到對應的特征向量,然後再進行标準化。

           
數學模組化——層次分析法(Matlab)【評價類問題】建立遞階層次結構構造判斷矩陣一緻性檢驗計算總權重并排序

将A1-4按照大小順序排序,得到最終的權重。

編輯不易,大家觀看以後請點贊,如果我有哪裡寫錯了,請大家指點。

繼續閱讀