**萌新自用** 

1.概念

层次分析法(Analytic Hierarchy Process,AHP)是一种将定性与定量分析相结合的多准则决策方法,由美国运筹学家萨蒂(T.L. Saaty)于1970年代提出,广泛应用于数学建模竞赛中的评价类问题(如方案优选、人员评估等)。例如:选择最优景点,规划最佳路线,选最优人选等

AHP通过建立递阶层次结构模型(目标层、准则层、方案层),结合专家打分或经验判断构造两两比较矩阵(判断矩阵),计算各因素的相对权重,并进行一致性检验(CR<0.1时通过),最终得出各方案的总权重,以辅助决策。

说简单一点就是在主观基础上使用客观的评价方法,使结果更加具有说服力

eg:绝地求生有很多步枪,现在要选择步枪里面最好用的枪

步枪子弹伤害稳定性(满配)射速(m/s)子弹速度
Aug4055700890
M7624450720740
M4164065700880
ACE324365680720

 2.引入

1.直接相加法

如何给四把枪打分,直接相加肯定不行,因为子弹伤害非常重要但是他们的差距非常小,而最不重要的子弹速度差距却非常大

2.归一化处理

比如一个指标有三个数据a,b,c。

归一化处理就得到[a/(a+b+c),b/(a+b+c),c/(a+b+c)]

其中三个数相加应该等于1,这样的话消除了数据差异过大的问题,但是每一个数据的重要程度不一样,比如稳定性和伤害比较重要,而射速和子弹速度相对没那么重要

3.加权处理

因此要给每一个指标加上权重

这里权重是随意设置的,不够科学,因此要用更科学的方法给出合理的权重

3.层次分析法 

1.基本步骤

建立递阶层次结构模型

构造判断矩阵

判断矩阵的一致性检验

求权重后评价 

2.三种层次 --目标层、准则层、方案层

 

目标层:最佳步枪

准则层:

子弹伤害稳定性(满配)射速(m/s)子弹速度

方案层:

Aug
M762
M416
ACE32

3.构造判断矩阵

对指标的重要性两两比较,构造判断矩阵,其中a_{ij}的意义是第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

CI=\frac{\lambda _{max}-n}{n-1}

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

由于这里就是一致矩阵所以答案同上

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐