@
目錄
數學建模常見的一些方法
1. 層次分析法(The analytic hierarchy process, 簡稱AHP)
- 建模比賽中最基礎的模型之一,其主要用於解決評價類問題(例如:選擇哪種方案最好、哪位運動員或者員工表現的更優秀)
- 通過相關的權重,算出分數,獲取最優解
1.1 直接問權重的弊端
在確定影響某因素的諸因子在該因素中所占的比重時,遇到的主要困難是這些比重常常不易定量化。此外,當影響某因素的因子較多時,直接考慮各因子對該因素有多大程度的影響時,常常會因考慮不周全、顧此失彼而使決策者提出與他實際認為的重要性程度不相一致的數據,甚至有可能提出一組隱含矛盾的數據。
——選自司守奎[kuí]老師的《數學建模算法與應用》
層次分析法
- 分析系統中各因素之間的關系,建立系統的遞階層次結構.
- 對於同一層次的各元素關於上一層次中某一准則的重要性進行兩兩比較,構造兩兩比較矩陣(判斷矩陣)
- 由判斷矩陣計算被比較元素對於該准則的相對權重,並進行一致性檢驗(檢驗通過權重才能用).
- 根據權重矩陣計算得分,並進行排序。
1.2 一致性檢驗的步驟
求出最大特征根λ
計算矩陣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 如何修正?
- 往一致矩陣上調整一致矩陣各行成倍數關系
1.3 三種方法計算權重
算術平均法
% 第一步:將判斷矩陣按照列歸一化(每一個元素除以其所在列的和)
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找到對應的特征向量,然后再進行標准化。
注:一致矩陣不需要進行一致性檢驗,只有非一致矩陣的判斷矩陣才需要進行一致性檢驗;在論文寫作中,應該先進行一致性檢驗,通過檢驗后再計算權重
1.4 層次分析法的一些局限性
- 評價的決策層不能太多,太多的話n會很大,判斷矩陣和一致矩陣差異可能會很大。