一、模型引出
1、問題的提出
層次分析法是評價決策類中一個比較常用的方法,很多留意美賽賽題的小伙伴們就會發(fā)現(xiàn),在美賽EF類題目的歷年O獎?wù)撐闹?,層次分析法出現(xiàn)的概率是非常高的。層次分析法呢一般是針對評價決策類的題目,讓我們評價或選擇一個可能更好、更優(yōu)的政策及方案,那這樣呢,我們就要先找到衡量政策和方案好壞的一些指標(biāo),然后呢再去量化這些指標(biāo),量化指標(biāo)之后,我們再去找到一個評價體系,綜合考慮所有的指標(biāo)來看哪一個政策更好。
這里呢,給大家舉一個例子,比如說某某微博要選一個明星,作為微博之星,現(xiàn)在呢有三個候選人ABC,那我們應(yīng)該選擇哪位明星呢,應(yīng)該要找哪幾個指標(biāo)來衡量,比如說呢這里我們考慮明星的粉絲數(shù),顏值,作品數(shù)量和作品質(zhì)量。我們來看ABC這三位明星的相關(guān)數(shù)據(jù)。
那這里呢我們就引出一個概念,怎么能讓這個指標(biāo)劃到同一個數(shù)量級,且保證同一指標(biāo)內(nèi)它的排名和這個差距不變,有一個方法呢叫做歸一化處理,我們把ABC3位明星的各項指標(biāo),進行歸一化處理,然后相加就可以得到三位明星對應(yīng)的得分,實際上呢除了這個歸一化處理,我們還要考慮一個因素,就是他每一個指標(biāo)在進行這個選擇的時候,它的重要程度是不同的,所以說呢我們怎么去判斷這個重要性呢,我們就要給這每個指標(biāo)加上一個權(quán)重,那在這里呢這個權(quán)重是我隨意設(shè)置的,他肯定是不夠科學(xué),那么我們?nèi)绾文軌蚩茖W(xué)的設(shè)定這個權(quán)重呢,其實呢這就是層次分析法的主要作用了。
?2、基本概念
?層次分析法呢簡稱AHP,它是對一些比較復(fù)雜,較為模糊的問題做出決策的簡易方法,它就適用于那些難以完全定量分析的問題,它是由美國的運籌學(xué)家薩吉教授,于上世紀(jì)70年代提出的一種方法,那這種方法呢它并不代表著我們絕對的客觀,而是說它在我們相對隨意的啊,去制定權(quán)重的情況下,又多了一份科學(xué)的東西,其實呢層次分析法,它并不是一個非常客觀的定弦方法,但是相比我們隨意的去設(shè)置權(quán)重,它還是更為科學(xué)的,那我們應(yīng)該怎樣去運用層次分析法呢。
二、模型原理?
?1、原理
在應(yīng)用層次分析法解決問題時,我們首先要把問題進行條理化,層次化,然后構(gòu)造出一個有層次的結(jié)構(gòu)模型,我們可以看一下圖片右下角,這個結(jié)構(gòu)模型呢分為三層,分別是目標(biāo)層,準(zhǔn)則層和方案層,那第一層呢也就是目標(biāo)層,它只有一個元素,它是分析問題的預(yù)定目標(biāo)或者說理想結(jié)果,那中間層呢,它包含了實現(xiàn)目標(biāo)所涉及的中間環(huán)節(jié),其實呢就是我們判斷一個方案好壞的,然后最底層呢叫做方案層,它就為實現(xiàn)目標(biāo)提供了可供選擇的措施和方案,好的那我們知道了層次分析法的一個結(jié)構(gòu)模型,我們應(yīng)該怎樣去解決題目呢。
2、基本步驟
首先它有一個基本步驟,第一個步驟呢叫做建立遞階層次結(jié)構(gòu)模型,也就是我們剛剛這個模型,那么剛剛那個選出微博之星的模型,已經(jīng)很清晰了,第一層呢就是選出微博之星,那這準(zhǔn)則層呢其實就是粉絲,還有作品質(zhì)量等等,那方案層呢就是ABC3個人,第二步就是構(gòu)造出各個層次所有的判斷矩陣,然后構(gòu)造出判斷矩陣之后,我們要進行一致性檢驗,那最后就是求出權(quán)重,然后把指標(biāo)按照權(quán)重進行綜合評分。那我們現(xiàn)在來套用這四個步驟來選擇微博之星。(詳細的課程教程請關(guān)注b站up數(shù)模加油站,進行學(xué)習(xí))
三、典型例題
1、建立遞階層次結(jié)構(gòu)模型及判斷矩陣
首先是建立遞階層次結(jié)構(gòu)模型,那層次模型呢就如這個圖所示,那這個層次結(jié)構(gòu)一目了然,接下來我們就要構(gòu)造出各層次中的判斷矩陣。
2、構(gòu)造判斷矩陣
什么叫做判斷矩陣呢,我們對所有的指標(biāo)進行兩兩比較,然后就能構(gòu)造出判斷矩陣,矩陣中的元素,我們用aij來代表,那aij是什么意思呢,aij代表的意思就是,第i個指標(biāo)相對于第j個指標(biāo)的重要程度,好的,現(xiàn)在呢我們來嘗試構(gòu)造判斷矩陣,我們依次對所有的指標(biāo)進行兩兩比較,就會得到完整的判斷矩陣啊,就是途中的一個表,那實際上呢我們在構(gòu)造判斷矩陣的過程中,每次都是兩兩比較,在兩兩比較的過程中呢,是不涉及其他的因素和指標(biāo)的,那如果比較的指標(biāo)比較多,就有可能會導(dǎo)致最后的結(jié)果出現(xiàn)矛盾,那應(yīng)該怎么辦呢,這個時候我們就引入了一個概念,叫做一致性檢驗。
3、一致性檢驗?
?(1)一致性檢驗原理
什么是一致性檢驗呢,一致性檢驗,就是來看看我們判斷矩陣中的各個指標(biāo),它的重要程度是否一致,比如說剛剛那種情況下,這個質(zhì)量它的重要程度是不是一會兒是重要的,一會兒又是不重要的,那它就是不一致的。(詳細的課程教程請關(guān)注b站up數(shù)模加油站,進行學(xué)習(xí))
?
(2)一致性檢驗的步驟?
(3)一致性檢驗計算?
我們來計算判斷矩陣的最大特征值,來求得CR和RI,當(dāng)前的判斷矩陣呢,我們發(fā)現(xiàn)CR大于0.1了,那這個時候呢我們就需要修改判斷矩陣,我們把剛剛那個錯誤調(diào)換過來,其實就是作品數(shù)量和作品質(zhì)量的一個重要程度的一個關(guān)系,經(jīng)計算呢,修改后的判斷矩陣CR是0.04,小于0.1,他就通過了一致性檢驗,通過一致性檢驗?zāi)鼐涂梢郧髾?quán)重了
4、求權(quán)重?
(1)算術(shù)平均法
求權(quán)重一共有三種方法,分別是算術(shù)平均法,幾何平均法以及特征值法,首先呢我們來看一下算術(shù)平均法怎么求權(quán)重,第一步是把判斷矩陣按照列進行歸一化,第二步將歸一化的各類相加,那就是按行進行求和,第三步是把相加后的向量,每個元素除以N,它就是得到的權(quán)重向量了。
(2)幾何平均法
?第二個我們來看幾何平均法求權(quán)重啊,幾何平均法是把判斷矩陣按照行相乘,得到一個新的列向量,然后將新的向量的每個分開N次方,然后對該向量的進行歸一化就可以得到權(quán)重向量。
(3)特征值法
?我們可以仿照一致矩陣求權(quán)重的求法,因為這個時候我們判斷矩陣一致性是可以接受的,所以就可以仿照這種求法,首先呢我們求出矩陣A的最大特征值,以及特征向量,然后我們再對特征向量進行歸一化,就可以得到我們的權(quán)重。
(4)求評分?
四、相關(guān)代碼?
?1、Matlab相關(guān)代碼
(1)一致性檢驗代碼?
%代碼一致性檢驗
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 1/2;1/5 1/2 2 1];
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
A = input('判斷矩陣A='); %輸入判斷矩陣
[n,n] = size(A); %獲取A的行和列
%求出最大特征值以及對應(yīng)的特征向量
[V,D] = eig(A); %V是特征向量 D是特征值構(gòu)成的對角矩陣
Max_eig = max(max(D)); %先求出每一列的最大值,再求最大值中的最大值
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 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
%這里n=2時,一定是一致矩陣,所以CI = 0,我們?yōu)榱吮苊夥帜笧?,將這里的第二個元素改為了很接近0的正數(shù)
CR=CI/RI(n);
disp('一致性指標(biāo)CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
disp('因為CR<0.10,所以該判斷矩陣A的一致性可以接受!');
else
disp('注意:CR >= 0.10,因此該判斷矩陣A需要進行修改!');
end
(2)求權(quán)重代碼?
1)算術(shù)平均法求權(quán)重?
%1.算術(shù)平均法計算權(quán)重
%輸入樣例:
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
A = input('判斷矩陣A='); %輸入判斷矩陣
ASum = sum(A,1); %將判斷矩陣每列求和
[n,n] = size(A); %獲取A的行和列,用于對ASum復(fù)制,對應(yīng)位相除歸一化
Ar = repmat(ASum,n,1); %復(fù)制Asum n行1列為Ar矩陣
Stand_A = A./Ar; %歸一化
ASumr = sum(Stand_A,2); %各列相加到同一行
disp(ASumr/n); %將相加后得到的向量每個元素除以n可以得到權(quán)重向量
2)幾何平均法求權(quán)重
%2.幾何平均法計算權(quán)重
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
clc;
A = input('判斷矩陣A='); %輸入判斷矩陣
[n,n] = size(A); %獲取A的行和列
prod_A = prod(A,2); %將A中每一行元素相乘得到一列向量
prod_n_A = prod_A.^(1/n); %將新的向量的每個分量開n次方等價求1/n次方
re_prod_A = prod_n_A./sum(prod_n_A);%歸一化處理
disp(re_prod_A); %展示權(quán)重結(jié)果
3)特征值法求權(quán)重
%3.特征值法計算權(quán)重
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
clc;
A = input('判斷矩陣A='); %輸入判斷矩陣
[n,n] = size(A); %獲取A的行和列
%求出最大特征值以及對應(yīng)的特征向量
[V,D] = eig(A); %V是特征向量 D是特征值構(gòu)成的對角矩陣
Max_eig = max(max(D)); %先求出每一列的最大值,再求最大值中的最大值
[r,c] = find(Max_eig == D,1);%使用find()函數(shù)找出最大特征值對應(yīng)的特征向量
%對特征向量進行歸一化得到所需權(quán)重
disp(V(:,c)./sum(V(:,c)));
2、Python相關(guān)代碼?
(1)一致性檢驗代碼?
import numpy as np
# 定義矩陣A
# A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 1/2], [1/5, 1/2, 2, 1]])
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
n = A.shape[0] ?# 獲取A的行
# 求出最大特征值以及對應(yīng)的特征向量
eig_val, eig_vec = np.linalg.eig(A) ?# eig_val是特征值, eig_vec是特征向量
Max_eig = max(eig_val) ?# 求特征值的最大值
CI = (Max_eig - n) / (n-1)
RI = [0, 0.0001, 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
# 這里n=2時,一定是一致矩陣,所以CI = 0,我們?yōu)榱吮苊夥帜笧?,將這里的第二個元素改為了很接近0的正數(shù)
CR = CI / RI[n]
print('一致性指標(biāo)CI=', CI)
print('一致性比例CR=', CR)
if CR < 0.10:
? ? print('因為CR<0.10,所以該判斷矩陣A的一致性可以接受!')
else:
? ? print('注意:CR >= 0.10,因此該判斷矩陣A需要進行修改!')
?(2)求權(quán)重代碼
1)算術(shù)平均法求權(quán)重?
import numpy as np
# 定義判斷矩陣A
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
# 計算每列的和
ASum = np.sum(A, axis=0)
# 獲取A的行和列
n, _ = A.shape
# 歸一化
Stand_A = A / ASum
# 各列相加到同一行
ASumr = np.sum(Stand_A, axis=1)
# 計算權(quán)重向量
weights = ASumr / n
print(weights)
2)幾何平均法求權(quán)重?
import numpy as np
# 定義判斷矩陣A
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
# 獲取A的行和列
n, _ = A.shape
# 將A中每一行元素相乘得到一列向量
prod_A = np.prod(A, axis=1)
# 將新的向量的每個分量開n次方等價求1/n次方
prod_n_A = np.power(prod_A, 1/n)
# 歸一化處理
re_prod_A = prod_n_A / np.sum(prod_n_A)
# 展示權(quán)重結(jié)果
print(re_prod_A)
3)特征值法求權(quán)重?
import numpy as np
# 定義判斷矩陣A
A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 2], [1/5, 1/2, 1/2, 1]])
# 獲取A的行和列
n, _ = A.shape
# 求出特征值和特征向量
eig_values, eig_vectors = np.linalg.eig(A)
# 找出最大特征值的索引
max_index = np.argmax(eig_values)
# 找出對應(yīng)的特征向量
max_vector = eig_vectors[:, max_index]
# 對特征向量進行歸一化處理,得到權(quán)重
weights = max_vector / np.sum(max_vector)
# 輸出權(quán)重
print(weights)
?文章來源地址http://www.zghlxwxcb.cn/news/detail-823076.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-823076.html
?
?
?
?
?
到了這里,關(guān)于【數(shù)學(xué)建模美賽 | 國賽必學(xué)模型算法精講】層次分析法——模型原理及Matlab+Python雙語言代碼演示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!