层次分析法(The analytic hierarchy process,简称AHP)
(以下内容是根据B站清风老师数学建模整理的笔记,链接:数学建模)
-
主要适用问题: 评价类问题
-
评价类问题需要考虑的三个问题:
- 我们评价的目标是什么?
- 我们为了达到这个目标有哪几种可选的方案?
- 评价的准则或者说指标是什么?(可以根据题目中的背景资料、常识以及网上搜集到的参考资料进行结合)
-
权重表
当我们想要评价哪一个方案更好时,我们可以通过填写一张权重表来判断。
-
指标权重一列中的所有权重加起来等于1
-
为每一个方案针对各个指标进行打分
-
分别计算出各个方案的分数
-
方案总分数 = 指标1分数 × 权重1 + 指标2分数 × 权重2 … + 指标n分数 × 权重n
指标权重 方案1 方案2 方案… 指标1 权重1 指标1分数 指标2 权重2 指标2分数 指标3 权重3 指标3分数 指标… 权重… …
- 层次分析法的登场
-
如果只填上面的权重表,同一个人在不同时间填写得出的结果可能不相同,因此得到的结果是片面的
-
解决方案:指标之间进行两两比较,根据比较结果推算出权重
-
重要程度表(重要性有时候解释为满意度更方便理解):
标度 含义 1 表示两个因素相比,具有同样重要性 3 表示两个因素相比,一个因素比另一个因素稍微重要 5 表示两个因素相比,一个因素比另一个因素明显重要 7 表示两个因素相比,一个因素比另一个因素强烈重要 9 表示两个因素相比,一个因素比另一个因素极端重要 2,4,6,8 上述两相邻判断的中值 倒数 A和B相比如果标度是n,那么B和A相比就是1/n -
层次分析法的判断矩阵(有多少个指标,就要填多少张表):
指标 1 方案1 方案2 方案3 方案… 方案1 1 a b … 方案2 1/a 1 d … 方案3 1/b 1/d 1 … 方案… … … … … - 方阵中对应元素 a i j a_{ij} aij 表示与指标 j 相比,指标 i 的重要程度
- 当 i = j 时,两个指标相同,因此同等重要记为1,所以主对角线元素为1
- 当 a i j a_{ij} aij > 0,且满足 a i j a_{ij} aij × a i j a_{ij} aij = 1, 我们称满足这一条件的矩阵为 正互反矩阵
-
一致矩阵的特点:各行(各列)之间成倍速关系
-
一致矩阵计算权重:
权重归一化: 方案1 = 1 / (1 + 1/a + 1/b + …)
方案2 = (1/a) / (1 + 1/a + 1/b + …)
方案3 = (1/b) / (1 + 1/a + 1/b + …)
-
一致性检验
步骤:
- 计算一致性指标CI
C I = λ m a x − n n − 1 CI = \frac{λ_{max}-n}{n-1} CI=n−1λmax−n
- 查找对应的平均随机一致性指标RI
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
- 计算一致性比例CR
C R = C I R I CR = \frac{CI}{RI} CR=RICI
如果CR < 0.1, 则可认为判断矩阵的一致性可以接受;否则需要对判断矩阵进行修正
- 判断矩阵计算权重
- 使用各列的数据,分别计算权重
- 使用算术平均法(或者几何平均法、特征值法)求权重
总结:
层次分析法的步骤:
- 分析系统中各因素之间的关系,建立系统的递阶层次结构
- 目标层
- 准则层
- 方案层
- 对于同一层次的各元素关于上一层次中某一准则的重要性进行两两比较,构造两两比较矩阵(判断矩阵)
- 由判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验(检验权重通过才能用)
(以下是跟着视频敲的代码)
%% 输入判断矩阵
clear;clc
disp('请输入判断矩阵A: ')
A = input('请输入判断矩阵A=\n')
%% 方法1:算术平均法求权重
% 第一步: 将判断矩阵按照列归一化(每一元素除以所在列的和)
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 的缩写
A
SUM_A
Stand_A = A ./ SUM_A
% 这里我们直接将两个矩阵对应的元素相除即可
% 第二步:将归一化的各列相加(按行求和)
sum(Stand_A, 2)
% 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
disp('算术平均法求权重的结果为:');
disp(sum(Stand_A, 2) / n)
%% 方法2:几何平均法求权重
% 第一步: 将A的元素按照行相乘得到一个新的列向量
Product_A = prod(A, 2)
% prod函数和sum函数类似,一个用于乘,一个用于加
% 第二步:将新的向量的每个分类开n次方
Product_n_A = Product_A .^ (1/n)
% 第三步:将新的变量的每个分量进行归一化即可得到权重向量
% 将这个列向量中的每一个元素除以这一个向量的和即可
disp('几何平均法求权重的结果为:');
disp(Product_A ./ sum(Product_n_A));
%% 方法3:特征值法求权重
% 第一步: 求出矩阵A的最大特征值以及对应的特征向量
[V,D] = eig(A) %V是特征向量,D是由特征值构成的对角矩阵(处理对角线元素外,其余位置元素全为0)
Max_eig = max(max(D)) %这里也可以写成max(D(:))
D == Max_eig
[r, c] = find(D == Max_eig, 1)
% 第二步:对求出的特征向量进行归一化即可得到我们的权重
V(:,c)
disp('特征向量法求权重的结果为:');
disp(V(:,c) ./ sum(V(:,c)))
% 我们先根据上面找到的最大特征值的列数c找到对应的特征向量,然后进行标准化
%% 计算一致性比例CR
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, 因此该判断矩阵需要进行修改');
end