北太天元實現(xiàn)層次分析法-以如何選購汽車為例

%北太天元 層次分析法 可以用來做經(jīng)濟建模
% 美國數(shù)學(xué)家 T.L.Saaty 于1970年代提出層次分析法?
% AHP (Analytic Hierarchy Process)
% 是指將與決策總是有關(guān)的元素分解成目標(biāo)、準(zhǔn)則、方案等層次,
% 在此基礎(chǔ)之上進行定性和定量分析的決策方法。
% 舉例: 我們要采購一輛汽車
% 影響我們采購的有3個因素
% 有3個因素:?價格, 油耗,大小
% 假設(shè)有3種汽車 x, y, z
%
% 目標(biāo)層A??????????????購買汽車的欲望
% 準(zhǔn)則層B?????價格(B1)???油耗(B2)???大小(B3)
% 方案層C?????汽車x(C1)??汽車y(C2)??汽車z(C3)
%% 輸入 判斷矩陣
% 準(zhǔn)則層權(quán)重矩陣
A = [?...
?????????1???1/9?????1/3
?????????9???1???????5
?????????3????1/5?????1
???];
%
個數(shù)_B = 3;
個數(shù)_C = 3;
B = cell(1,個數(shù)_B);
% 僅僅考慮價格,選擇汽車x,y,z 的判斷矩陣
B{1} = [ ...
???????1????2????9
?????????1/2??1????5
?????????1/9?1/5??1
?????????];
% 僅僅考慮油耗,選擇汽車x,y,z 的判斷矩陣
B{2} = [ ...
???????1????2????4
?????????1/2??1????2
?????????1/4?1/2??1
?????????];
% 僅僅考慮大小,選擇汽車x,y,z 的判斷矩陣
B{3} = [ ...
???????1????2????1
?????????1/2??1????1/2
?????????1????2????1
?????????];
%% 計算權(quán)重
[yes_A, 權(quán)重_A ] = 層次分析法求權(quán)重(A);
if( ~yes_A )
???error("A沒有通過一致性檢驗");
end
權(quán)重_B = zeros(個數(shù)_C, 個數(shù)_B);
for j=1:個數(shù)_B
???[yes_Bj, 權(quán)重_Bj ] = 層次分析法求權(quán)重( B{j} );
???if( ~yes_Bj )
??????error(['B' num2str(j) '沒有通過一致性檢驗']);
???end
???權(quán)重_B(:, j) = 權(quán)重_Bj;
end
%%總后計算選擇汽車x,y,z 的欲望值
欲望值 = 權(quán)重_B * 權(quán)重_A
% 北太天元 層次分析法的判斷矩陣是否通過一致性檢驗,并且求權(quán)重
% 輸入: A必須是方陣,而且方陣的階數(shù)n 滿足 2<=n<=20
% 輸出: 是否通過一種性檢驗 = true,如果輸入的矩陣通過一致性檢驗
% 輸出: 權(quán)重是一個列向量,是矩陣的對應(yīng)最大特征值的向量(按照和為1做了歸一化)
% 例:
% A = [ 1???2??5 ;
%??????1/2?1??5/2;
%??????1/5?2/5?1 ] ;
%?[是否, 權(quán)重]?=?層次分析法求權(quán)重(A);
function [是否通過一致性檢驗, 權(quán)重] = 層次分析法求權(quán)重(A);
%% 檢查參數(shù)是否符合要求
???if (nargin ~=1)
??????help 層次分析法求權(quán)重;
??????error("層次分析法求權(quán)重的輸入?yún)?shù)必須為1");
???end
???[m,n] = size(A);
???if (m~=n)
??????help 層次分析法求權(quán)重;
??????error("層次分析法求權(quán)重的輸入?yún)?shù)A必須是方陣");
???end
???if (n < 2?|| n>20)
??????help 層次分析法求權(quán)重;
??????error("層次分析法求權(quán)重的輸入?yún)?shù)A必須是方陣");
???end
%% 求權(quán)重
???[V,D] = eig(A); % V 的每一列是A的特征向量, 但是是用2范數(shù)歸一的
???最大特征值 = max(max(D));
???[~,c]=find(D == 最大特征值 , 1); % 獲得最大特征值所在的列 c
???%特征值法求權(quán)重
???權(quán)重 = V(:,c)/ sum(V(:,c));?% 除以 sum(V(:,c)) 的是為了讓權(quán)重的求和為1
???%% 一致性檢驗
???CI = (最大特征值 - 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 1.60 1.61 1.615 1.62 1.63];
???%注意,這里的RI最多支持 n = 20
???% 這里n=2時,用戶輸入兩種因素的判斷矩陣,
???%?A = [ 1?m; 1/m, 1] ;
???% 如果不是 A(1,2) = 1/A(2,1) 就是不一致的。
???% 因此檢查的要非常嚴(yán)格的, 因此 RI(2) = 0;
???CR=CI/RI(n);
??????if n>2
??????if CR<0.10
?????????是否通過一致性檢驗 = true;????????%因為CR<0.10,所以矩陣A通過一致性檢驗
??????else
?????????是否通過一致性檢驗 = false;????????%因為CR>=0.10,所以矩陣A沒有通過一致性檢驗
??????end
???else
??????% 當(dāng) n = 2, 即使 CI == 0,?仍然有 CI/RI(2) = 0/0 = Nan , 此事 Nan < 0.10 會返回false
??????% 而 CI == 0 的情形是一致的
?????????if abs(CI) < eps?
?????????是否通過一致性檢驗 = true;????????%因為abs(CI) 很小,所以矩陣A通過一致性檢驗
??????else
?????????是否通過一致性檢驗 = false;????????%因為abs(CI) 很大,所以矩陣A沒有通過一致性檢驗
??????end
???end
end