@
目錄
- 數學模組化常見的一些方法
- 1. 層次分析法(The analytic hierarchy process, 簡稱AHP)
- 1.1 直接問權重的弊端
- 1.2 一緻性檢驗的步驟
- 1.3 三種方法計算權重
- 算術平均法
- 幾何平均法
- 特征值法
- 1.4 層次分析法的一些局限性
- 1. 層次分析法(The analytic hierarchy process, 簡稱AHP)
- 模組化比賽中最基礎的模型之一,其主要用于解決評價類問題(例如:選擇哪種方案最好、哪位運動員或者員工表現的更優秀)
- 通過相關的權重,算出分數,擷取最優解
在确定影響某因素的諸因子在該因素中所占的比重時,遇到的主要困難是這些比重常常不易定量化。此外,當影響某因素的因子較多時,直接考慮各因子對該因素有多大程度的影響時,常常會因考慮不周全、顧此失彼而使決策者提出與他實際認為的重要性程度不相一緻的資料,甚至有可能提出一組隐含沖突的資料。
——選自司守奎[kuí]老師的《數學模組化算法與應用》
層次分析法
- 分析系統中各因素之間的關系,建立系統的遞階層次結構.
- 對于同一層次的各元素關于上一層次中某一準則的重要性進行兩兩比較,構造兩兩比較矩陣(判斷矩陣)
- 由判斷矩陣計算被比較元素對于該準則的相對權重,并進行一緻性檢驗(檢驗通過權重才能用).
- 根據權重矩陣計算得分,并進行排序。
求出最大特征根λ
計算矩陣A的特征值D和特征向量V的函數是
eig(A)
clc
n = size(A,1)
[V,D] = eig(A) %V是特征向量, D是由特征值構成的對角矩陣(除了對角線元素外,其餘位置元素全為0)
Max_eig = max(max(D)) %也可以寫成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
V =
0.4058 + 0.0000i 0.0914 - 0.2754i 0.0914 + 0.2754i 0.7071 + 0.0000i -0.2298 + 0.0000i
0.4058 + 0.0000i 0.0914 - 0.2754i 0.0914 + 0.2754i -0.7071 + 0.0000i -0.2298 + 0.0000i
0.1299 + 0.0000i 0.0268 + 0.1349i 0.0268 - 0.1349i 0.0000 + 0.0000i -0.3457 + 0.0000i
0.7872 + 0.0000i -0.8930 + 0.0000i -0.8930 + 0.0000i -0.0000 + 0.0000i 0.6897 + 0.0000i
0.1847 + 0.0000i 0.1131 + 0.0490i 0.1131 - 0.0490i -0.0000 + 0.0000i 0.5470 + 0.0000i
D =
5.2924 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i -0.0843 + 1.2326i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i -0.0843 - 1.2326i 0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i -0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i -0.1238 + 0.0000i
如果CR > 0.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即可(注意這裡也可以用./哦)
% 第一步:将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))
% 第一步:求出矩陣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找到對應的特征向量,然後再進行标準化。
注:一緻矩陣不需要進行一緻性檢驗,隻有非一緻矩陣的判斷矩陣才需要進行一緻性檢驗;在論文寫作中,應該先進行一緻性檢驗,通過檢驗後再計算權重
- 評價的決策層不能太多,太多的話n會很大,判斷矩陣和一緻矩陣差異可能會很大。
參考連結