数学建模常用算法—层次分析法(AHP)

解决问题

建模比赛中最基础的模型之一,其主要用于解决评价类问题(例如:选择哪种方案最好、哪位运动员或者员工表现的更优秀),用于确定每个目标及其指标所占权重。

优点

AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因 素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作的重 要度的比较上面。在许多情况下,决策者可以直接使用AHP进行决策,极大 地提高了决策的有效性、可靠性和可行性,但其本质是一种思维方式,它把 复杂问题分解成多个组成因素,又将这些因素按支配关系分别形成递阶层次 结构,通过两两比较的方法确定决策方案相对重要度的总排序。整个过程体 现了人类决策思维的基本特征,即分解、判断、综合,克服了其他方法回避决策者主观判断的缺点。

缺点

层次分析法最大的缺点在于判断矩阵的确定依赖于专家,如果专家的判断存在主观性的话, 会对结果产生很大的影响。

一般步骤

1. 分析系统中各因素之间的关系,建立系统的递阶层次结构

以旅游目的地选择为例
数学建模常用算法—层次分析法(AHP)_第1张图片

2. 对于同一层次的各元素关于上一层次中某一准则的重要 性进行两两比较,构造两两比较矩阵(判断矩阵)

数学建模常用算法—层次分析法(AHP)_第2张图片

数学建模常用算法—层次分析法(AHP)_第3张图片
数学建模常用算法—层次分析法(AHP)_第4张图片

3. 对判断矩阵进行一致性检验(检验通过权重才能用)

1. 计算一致性指标CI

在这里插入图片描述

2. 查找对应的平均随机一致性指标RI
在这里插入图片描述

3. 计算一致性比例CR
在这里插入图片描述

如果CR < 0.1, 则可认为判断矩阵的一致性可以接受,否则需要对 判断矩阵进行修正。

4. 修正时往一致矩阵上调整,一致矩阵各行成倍数关系

4. 由判断矩阵计算被比较元素对于该准则的相对权重

三种方法计算权重:
(1)算术平均法(2)几何平均法(3)特征值法
数学建模常用算法—层次分析法(AHP)_第5张图片
数学建模常用算法—层次分析法(AHP)_第6张图片
数学建模常用算法—层次分析法(AHP)_第7张图片
比赛时建议三种方法都使用,最终权重为三种方法计算后的平均值。

在论文中建议加上以下这段话:
“ 以往的论文利用层次分析法解决实际问题时,都是采用其中某一种方法 求权重,而不同的计算方法可能会导致结果有所偏差。为了保证结果的稳健性,本文采用了三种方法分别求出了权重后计算平均值,再根据得 到的权重矩阵计算各方案的得分,并进行排序和综合分析,这样避免了采用单一方法所产生的偏差,得出的结论将更全面、更有效。”

5. 根据权重计算得分并排序

数学建模常用算法—层次分析法(AHP)_第8张图片

模型拓展

数学建模常用算法—层次分析法(AHP)_第9张图片

数学建模常用算法—层次分析法(AHP)_第10张图片

数学建模常用算法—层次分析法(AHP)_第11张图片

代码

disp('请输入判断矩阵A')
A=input('A=');
[n,n] = size(A);
% % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;

disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2)./n)
% % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n);
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
% % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )
% % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
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,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
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

你可能感兴趣的:(数学建模)