数学建模(3)——层次分析法

256 阅读2分钟

正文

本文已参与「新人创作礼」活动,一起开启掘金创作之路。层次分析法(analytic hierarchy process),简称AHP。是建模比赛中比较基础的模型之一,其主要解决评价类的问题。如选择哪种方案最好,哪位员工表现最好等。

  层次分析法是一个较为 主观 的评价方法,其在赋权得到权重向量的时候,主观因素占比很大。因而在建模比赛中,常常与客观方法得到的权重向量方法进行综合,而得出一个综合的权重向量,进行后续操作。

matlab实现层次分析法

% 对判断矩阵进行一致性检验,而后计算权重。

a = input("请输入判断矩阵:"); % a为判断矩阵
[n,l] = size(a); % n为矩阵的维数

验证正互反矩阵
i=0;
j=0;
zhenghufan = true;
while zhenghufan=true
i = i+1;
while zhenghufan=true
	j = j+1;
	if a(i,j)*a(j,i) != 1
		zhenghufan = false;
	end
end
end

if min(min(a)) > 0 && zhenghufan == true 
    disp("判断矩阵为正互反矩阵。");
    GoOn = true;
else
    disp("判断矩阵不是正互反矩阵。")
    GoOn = false;
end

一致性检验
if GoOn


RI_all = [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];

[v,d] = eig(a);% v为a特征向量,d为a的特征值对角矩阵


if rank(a) ~= 1 % 如果判断矩阵不是一致性矩阵,则进行一致性检验。
    disp("进行一致性检验:");
    CI = (max(max(d))-n)/(n-1);
    CI
    RI = RI_all(n); % 查找对应的RI
    RI
    CR = CI/RI
    CR
    if CR < 0.1
    disp("CR<0.10,判断矩阵通过一致性检验。");
    else 
       disp("不通过一致性检验,判断矩阵需要修改。");
       GoOn = false;
    end
else
    disp("判断矩阵为一致矩阵。")
end
end

计算权重
%算数平均数权重
if GoOn
    guiyi = zeros(n,n);
    s = 0;
    for i = 1:n
        for j = 1:n
            s = a(i,j)/sum(a(:,j));
            guiyi(i,j) = s;
        end
    end

    disp ("判断矩阵算数平均数计算的权重:")
    suanshu = zeros(n,1);
    for i = 1:n
    suanshu(i) = sum(guiyi(i,:))/n;
    end
    suanshu
end

%几何平均数权重
if GoOn
    s = 1;
    xiangcheng = zeros(n,1);
    for i = 1:n
        for j = 1:n
            s = s*a(i,j);
        end
        xiangcheng(i) = s^(1/n);
    s = 1;
    end

    jihe = zeros(1,n);
    for i = 1:n
        jihe(i) = xiangcheng(i)/sum(xiangcheng);
    end
    disp ("判断矩阵几何平均数计算的权重:");
    jihe
end

% 特征值法权重

eigenvalue = diag(d);
[M,I] = max(eigenvalue);
disp ("最大特征值为:");
M
disp ("对应的特征向量为:");
v(:,I)
tezheng = zeros(1,n);
    for i = 1:n
        tezheng(i) = v(i,I)/sum(v(:,I));
    end
disp("判断矩阵特征值法的权重为:");
tezheng