数学建模——层次分析法(评价决策类)
**萌新自用**
1.概念
层次分析法(Analytic Hierarchy Process,AHP)是一种将定性与定量分析相结合的多准则决策方法,由美国运筹学家萨蒂(T.L. Saaty)于1970年代提出,广泛应用于数学建模竞赛中的评价类问题(如方案优选、人员评估等)。例如:选择最优景点,规划最佳路线,选最优人选等
AHP通过建立递阶层次结构模型(目标层、准则层、方案层),结合专家打分或经验判断构造两两比较矩阵(判断矩阵),计算各因素的相对权重,并进行一致性检验(CR<0.1时通过),最终得出各方案的总权重,以辅助决策。
说简单一点就是在主观基础上使用客观的评价方法,使结果更加具有说服力
eg:绝地求生有很多步枪,现在要选择步枪里面最好用的枪
| 步枪 | 子弹伤害 | 稳定性(满配) | 射速(m/s) | 子弹速度 |
| Aug | 40 | 55 | 700 | 890 |
| M762 | 44 | 50 | 720 | 740 |
| M416 | 40 | 65 | 700 | 880 |
| ACE32 | 43 | 65 | 680 | 720 |
2.引入
1.直接相加法
如何给四把枪打分,直接相加肯定不行,因为子弹伤害非常重要但是他们的差距非常小,而最不重要的子弹速度差距却非常大
2.归一化处理
比如一个指标有三个数据a,b,c。
归一化处理就得到
其中三个数相加应该等于1,这样的话消除了数据差异过大的问题,但是每一个数据的重要程度不一样,比如稳定性和伤害比较重要,而射速和子弹速度相对没那么重要

3.加权处理
因此要给每一个指标加上权重

这里权重是随意设置的,不够科学,因此要用更科学的方法给出合理的权重
3.层次分析法
1.基本步骤
建立递阶层次结构模型
构造判断矩阵
判断矩阵的一致性检验
求权重后评价
2.三种层次 --目标层、准则层、方案层

目标层:最佳步枪
准则层:
| 子弹伤害 | 稳定性(满配) | 射速(m/s) | 子弹速度 |
方案层:
| Aug |
| M762 |
| M416 |
| ACE32 |
3.构造判断矩阵
对指标的重要性两两比较,构造判断矩阵,其中的意义是第i个指标相对第j个指标的重要程度
判断矩阵重要程度参考表:

4.一致性检验
1.一致性检验原理
主观填完表格可能会产生矛盾,比如:
我认为稳定性 和射速相比 稳定性更重要,稳定性>射速
射速 与伤害相比 射速更重要,稳定性>射速>伤害
稳定性 与伤害相比 伤害更重要,伤害>稳定性
这里就有矛盾,所以需要检验这种矛盾,方法称作一致性检验
-
完全一致需满足:
aij⋅ajk=aik(∀i,j,k)例如:若“苹果比香蕉重要2倍,香蕉比橘子重要3倍”,则必须“苹果比橘子重要6倍”。
eg:
(也叫做正互反矩阵)
当元素很多时难免产生矛盾,只要我们构造的矩阵与一致矩阵没有太大差别也是可以认可的,这也叫做通过一致性检验

这里解释一下,因为秩=1,且只有一个特征值其余为0,因此这个特征值应该等于原矩阵对角线元素之和,而原矩阵对角线元素恰好是1,因此对角线元素之和就是元素个数n,因此tr(A)=n;

**补充特征向量**:
特征向量是这样一个特殊的非零向量:
它被矩阵乘了之后,方向不变,只是长度被拉伸(或压缩)了,这个拉伸倍数就是特征值。
所以这里应该就是通解,k任意值,特征向量里面每一个值都是原来第一行对应位置的倒数
2.一致性检验步骤
1.计算一致性指标CI
2.查找对应的平均随机一致性指标RI

3.计算一致比例CR

5.求权重
1.算术平均法

2.几何平均法

3.特征值法
(原理比较复杂,人打分时很难保证 a_{ik}=a_{ij}·a_{jk},然后λ_max 与 n 的差距给出 CI、CR,直接量化“打分有多不一致”,从而知道权重可靠性。)



6.代码
1.eig函数
eig 是 线性代数里求矩阵特征值和特征向量 的“万能按钮”。
A = [4 1; 2 3]; % 你的判断矩阵
[V, D] = eig(A); % V 的每一列是一个特征向量
% D 的对角元是特征值
% 最大特征值对应哪一列?
[~, idx] = max(diag(D));
w = V(:,idx); % 取出这一列
w = w ./ sum(w); % 归一化 → 权重向量
注意由于D是个对角矩阵,要找最大特征值就要先找每一列最大值化成一组向量,再在这一组向量里面找最大值,要用两次max
2.一致性检验
A=input('判断矩阵A=');%输入判断矩阵
%调用eig函数,找最大特征值和对应的特征向量
[n,n]=size(A);
[V,D]=eig(A);
Max_eig=max(max(D));
%计算CI和CR
CI = max((Max_eig - n)/(n - 1), 0); % 避免负值
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];
CR=CI/RI(n);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
disp('一致性检验通过!');
else
disp('一致性检验不通过!');
end
相关问题:


为什么会输出负数?

解决方法:
3.计算权重
1.算数平均法
%1.算数平均法
A=input('判断矩阵A:');
B=input('元素矩阵B:');
ASum=sum(A,1);%每一列求和
[n,n]=size(A);
Ar=repmat(ASum,n,1);%复制:行维度n次,列维度1次
Stand_A=A./Ar;
ASumr=sum(Stand_A,2);
disp('权重向量:');
disp(ASumr/n);
disp('最终评分:');
C=B*ASumr


2.几何平均法
%几何平均法
A=input('判断矩阵A:');
B=input('元素矩阵B:');
[n,n]=size(A);
prod_A=prod(A,2);%每一行的函数全部乘起来得到一个列向量
prod_n_A=prod_A.^(1/n);%给每一个数开n次方
re_prod_A=prod_n_A./sum(prod_n_A);%归一化处理
disp('权重向量:');
disp(re_prod_A);
disp('最终评分:');
C=B*re_prod_A
由于这里就是一致矩阵所以答案同上
3.特征值法
补充:find函数
[row, col] = find(条件, k)
用法:在矩阵中根据要找的数生成逻辑矩阵(找到对应位置是1,没找到是0),然后找前k个的横纵坐标
%特征值法
A=input('判断矩阵A:');
B=input('元素矩阵B:');
[n,n]=size(A);
[V,D]=eig(A);
Max_eig=max(max(D));
[r,c]=find(Max_eig==D,1);
Ans=V(:,c)./sum(V(:,c));
disp('权重向量:');
disp(Ans);
disp('最终评分:');
C=B*Ans
由于这里就是一致矩阵所以答案同上
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)