一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

目录

层次分析法(AHP):

解决评价列问题三个方面:

评价类问题权重表格:

一致矩阵

一致性检验(用到高代知识)

一致矩阵计算权重

若判断矩阵为一致矩阵:

矩阵为非一致矩阵

 方法1算术平均法求权重:

 方法二几何平均法求权重:

方法3特征值法求权重

 得出结果         

层次分析法做题步骤: 

层次分析法局限性

代码讲解

代码可以优化的地方

模型拓展​


层次分析法(AHP):

层次分析法主要用于解决评价类问题(例如:选择哪种方案更好、哪位员工、运动员等表现得更优秀【确定评价指标、形成评价体系】)

解决评价列问题三个方面:

  1. 我们评价的目标是什么?(分析题目)
  2. 我们为了达到这个目标有哪几种可选择方案?(分析题目)
  3. 评价的准则或指标是什么?(题目中的背景材料、常识、参考文献以及搜索)

评价类问题权重表格

  1. 分析问题得出评判问题的子标
  2. 分别给不同子标赋予权重(权重和要为1
  3. 给不同方案对应不同子标给予打分(不同方案对于每个子标打分和要为1) 

例如选择某个学校:

指标权重华科武大
学习氛围0.40.70.3
就业前景0.30.50.5
男女比例0.20.30.7
校园景色0.10.250.75

华科最终得分:0.515

0.7 * 0.4 * + 0.5 * 0.3 + 0.3 * 0.2 + 0.25 * 0.1

武大最终得分:0.485

0.3 * 0.4 + 0.5 * 0.3 + 0.7 * 0.2 + 0.75 * 0.1

 那如何得出指标权重?(层次分析法思想登场)

有多个指标的时候,我们一次性考虑五个指标之间的关系,往往考虑不周,为了更加准确的得出五个指标的权重,我们采用两两比较的方法,最终根据两两比较的结果推算出权重。这时就用到了下方的重要程度表(重要程度也可以理解为满意度)

重要程度表
标度含义
1表示两个个因素相比,具有同样重要性
3表示两个因素相比,一个因素比另一个因素稍微重要
5表示两个因素相比,一个因素比另一个因素明显重要
7表示两个因素相比,一个因素比另一个因素强烈重要
9表示两个因素相比,一个因素比另一个因素极端重要
2,4,6,8上述两相邻判断的中值
倒数A和B相比如果标度为3,那么B和A相比就是1/3

 例如选择某个旅游景点:

共五个指标【两两相比组合数C(5,2)】,后面会介绍具体如何填写这张表

指标
景色 花费居住饮食交通
景色 11/2433
花费21755
居住1/41/711/21/3
饮食1/31/5211
交通1/31/5311
标度含义
1同样重要性
3稍微重要
5明显重要
7强烈重要
9极端重要
2,4,6,8上述两相邻判断的中值
倒数A和B相比如果标度为3,那么B和A相比就是1/3

上述左表中的数据部分是一个5 * 5的方阵,我们计为A,对应元素为a_{ij}

方阵特点:

(1)a_{ij}表示的意义是,与指标j相比,i的重要程度。

(2)当i = j时,两个指标相同,因此同等重要记为1,这就解释了主对角线元素为1.

(3)a_{ij} > 0 且满足a_{ij} * a_{ji} = 1(我们称满足这一条件的矩阵为正互反矩阵)

 实际上这个矩阵就是层次分析法中的判断矩阵

 同样的我们可以得到如下表格

 

一个可能出现问题的地方:

此时引入一个概念——一致矩阵(绝对一致是不太好实现的,我们要把一致性控制在一个程度内)

一致矩阵

若矩阵中每个元素 a_{ij} > 0 且满足a_{ij} * a_{ji} = 1 ,则我们称该矩阵为正互反矩阵。 在层次分析法中,我们构造的判断矩阵均是正互反矩阵。 若正互反矩阵满足,则我们称其为一致矩阵。推导如下:

         

特点:各行(各列)成倍数关系【判断一致矩阵方法】,只要各行(各列)成倍数关系就是一致矩阵

例如下图:图中一致矩阵a_{11} = 2a_{12} , a_{21} = 2a_{22}以此类推都满足倍数关系

在使用判断矩阵求权重之前,必须对其进行一致性检验,若不一致程度太大,判断矩阵失效

下面给出两个矩阵,左表为不一致矩阵,右表为一致矩阵

可见这两者的区别有a13从5变成了4,呢么如何判断5和4的差距大不大呢?这是就需要用到一致性检验。

一致性检验(用到高代知识)

原理:检验我们构造的判断矩阵和一致矩阵是否有太大的差别

为一致性矩阵的充要条件:

引理1:

A为n阶方阵,且r(A) = 1,则A有一个特征值为tr(A),其余特征值均为0

因为一致矩阵有一个特征值为n,所以一致矩阵的秩一定为1

由引理可知:一致矩阵有一个特征值为n,其余特征值均为0.

另外,易知,特征值为n时,对应的特征向量为

 引理2:

n阶正互反矩阵A为一致矩阵时当且仅当最大特征值,且当正互反矩阵A非一致时,一定满足

如下图,我们设要检验的变量为a,由右表知当判断矩阵越不一致的时,最大特征值与n相差就越大(检验矩阵与一致矩阵相差大不大其实就是检验最大特征值与n相差大不大)

一致性检验步骤:

  1. 计算一致性指标CI
  2. 查找对应的平均随机一致性指标RI
    注:在实际应用中,n很少超过10,若指标个数超过10,则可以考虑建立二级指标体系
    n123456789101112131415
    RI000.520.891.121.261.361.411.461.491.521.541.561.581.59
  3. 计算一致性比例CR,如果CR<0.1,则可以认为矩阵的一致性可以接受;否则需要对判断矩阵进行修正(手动往倍数方面改)

至于一致性指标RI是怎么计算来的,为什么这样构造CI以及为什么一0.1为划分依据并不需要了解透彻,实际做题中不需要知道为什么。

一致矩阵计算权重

若判断矩阵为一致矩阵:

例如:

 有由此图可知,苏杭在景色方面重要程度为1,北戴河在景色方面重要程度为1/2,桂林在景色方面重要程度为1/4.

注意,权重处理一定要进行归一化理:

苏杭 = 1/(1+0.5+0.25)

北戴河= 0.5/(1+0.5+0.25)

桂林= 0.25/(1+0.5+0.25)

 因为是一致性矩阵,所以用第一列和用其他列计算结果是一样的

矩阵为非一致矩阵

 方法1算术平均法求权重:

  1. 将判断矩阵按照列归一化(每一个元素除以其所在列的和后得到的新的判断矩阵)
  2. 将归一化后的矩阵按行求和得到一个列向量
  3. 将第二部中的列向量中的每个元素除以n即可得到权重向量

数学描述 :

例如:

 

归一化:

苏杭 = 1/(1+0.5+0.2) = 0.5882

北戴河 = 0.5/(1+0.5+0.2) = 0.2941

桂林 = 0.2/(1+0.5+0.2) = 0.1177

同样的方法将整个表格归一化

 方法二几何平均法求权重:

步骤(和方法一步骤大致相同):

  1. 将A的元素按照行相乘得到一个新的列向量
  2. 将新的向量的每个分量开n次方
  3. 对该列向量进行归一化即可得到权重向量

 数学描述

 

方法3特征值法求权重

一致矩阵有一个特征值n,其余特征值均为0.

另外,我们很容易得到,特征值为n时,对应的特征向量刚好为(k!=0),这一特征向量刚好就是一致矩阵的第一列。

步骤

  1. 求出矩阵A的最大特征值以及对应的特征向量
  2. 对求出的特征向量进行归一化即可得到我们的权重

 

 得出结果         

计算 出各个表格的权重后,得到如下表格

通过Excel计算得出各个景点的的得分(F4锁定单元格)

层次分析法做题步骤: 

  1. 分析系统中个因素之间的关系,建立系统的递阶层次结构(层次结构图要放到论文里)
  2. 对于同一层次的各元素关于上一层次中某一准则的重要性两两比较,构造两两比较矩阵(判断矩阵)【任何评价类模型都具有主观性,现实中都是自己填写判断表】
  3. 由判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验(检验通过之后权重才能使用)【最好三种检验方法都算一下】

使用SmartArt画层次结构图 ,使用亿图图示画层次结构图

层次分析法局限性

(1)评价的决策层不能太多,太多的话n会很大,判断矩阵和一致矩阵差异可能会很大

(2)如果决策层中指标的数据是已知的,就不能用层次分析法了

代码讲解

%% 注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。
%% 在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。
%% 因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。
%% 而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。
%% 如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。


%% 输入判断矩阵
clear;clc
disp('请输入判断矩阵A: ')
%1、输入前可以判断A的维度是否大于1或是否为方阵 
%
% A = input('判断矩阵A=')
 A =[1 1 4 1/3 3;
 1 1 4 1/3 3;
 1/4 1/4 1 1/3 1/2;
 3 3 3 1 3;
 1/3 1/3 2 1/3 1]
% matlab矩阵有两种写法,可以直接写到一行:
% [1 1 4 1/3 3;1 1 4 1/3 3;1/4 1/4 1 1/3 1/2;3 3 3 1 3;1/3 1/3 2 1/3 1]
% 也可以写成多行:
[1 1 4 1/3 3;
 1 1 4 1/3 3;
 1/4 1/4 1 1/3 1/2;
 3 3 3 1 3;
 1/3 1/3 2 1/3 1]
% 两行之间以分号结尾(最后一行的分号可加可不加),同行元素之间以空格(或者逗号)分开。

%% 方法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的缩写
% 另外一种替代的方法如下:
    '''SUM_A = [];
    for i = 1:n   %循环哦,这一行后面不能加冒号(和Python不同),这里表示循环n次
        SUM_A = [SUM_A; Sum_A]
    end'''
clc;A
SUM_A
Stand_A = A ./ SUM_A
% 这里我们直接将两个矩阵对应的元素相除即可

% 第二步:将归一化的各列相加(按行求和)
sum(Stand_A,2)

% 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2) / n)
% 首先对标准化后的矩阵按照行求和,得到一个列向量
% 然后再将这个列向量的每个元素同时除以n即可(注意这里也可以用./哦)

%% 方法2:几何平均法求权重
% 第一步:将A的元素按照行相乘得到一个新的列向量
clc;A
Prduct_A = prod(A,2)
% prod函数和sum函数类似,一个用于乘,一个用于加  dim = 2 维度是行

% 第二步:将新的向量的每个分量开n次方
Prduct_n_A = Prduct_A .^ (1/n)
% 这里对每个元素进行乘方操作,因此要加.号哦。  ^符号表示乘方哦  这里是开n次方,所以我们等价求1/n次方

% 第三步:对该列向量进行归一化即可得到权重向量
% 将这个列向量中的每一个元素除以这一个向量的和即可
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))

%% 方法3:特征值法求权重
% 第一步:求出矩阵A的最大特征值以及其对应的特征向量
clc
[V,D] = eig(A)    %V是特征向量, D是由特征值构成的对角矩阵(除了对角线元素外,其余位置元素全为0)
Max_eig = max(max(D)) %也可以写成max(D(:))哦~【max(D)得到每一列的最大值】
% 那么怎么找到最大特征值所在的位置了? 需要用到find函数,它可以用来返回向量或者矩阵中不为0的元素的位置索引。
% 那么问题来了,我们要得到最大特征值的位置,就需要将包含所有特征值的这个对角矩阵D中,不等于最大特征值的位置全变为0
% 这时候可以用到矩阵与常数的大小判断运算
D == Max_eig
[r,c] = find(D == Max_eig , 1)%【D == Max_eig(判断语句),返回一个逻辑及矩阵,将最大特征值所在位置变为1,其余位置为0】
% 找到D中第一个与最大特征值相等的元素的位置,记录它的行和列。

% 第二步:对求出的特征向量进行归一化即可得到我们的权重
V(:,c)
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )
% 我们先根据上面找到的最大特征值的列数c找到对应的特征向量,然后再进行标准化。

%% 计算一致性比例CR
clc
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【RI为已知表】
%当n=2时,该表一定是一致矩阵,但是因为RI为0.此时计算CR时分母为0,按照步骤一致性检验时会显示不通过,所以我们可以把RI表中的前两位改为很接近0的正数(0.00001)
CR=CI/RI(n);%RI(n)代表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

代码可以优化的地方

%输入之前可以先判断一下输入是否正确
disp('请输入判断矩阵A')
A=input('A=');% 这里输入的就是我们的判断矩阵,其为n阶方阵(行数和列数相同)

% 在开始下面正式的步骤之前,我们有必要检验下A是否因为粗心而输入有误
ERROR = 0;  % 默认输入是没有错误的

%(1)检查矩阵A的维数是否不大于1或不是方阵
[r,c]=size(A);
%size(A)函数是用来求矩阵的大小的,返回一个行向量,第一个元素是矩阵的行数,第二个元素是矩阵的列数
%[r,c]=size(A)  %将矩阵A的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c
if r ~= c  || r <= 1
    % 注意哦,不等号是 ~=  (~是键盘Tab上面那个键,要和Shift键同时按才会出来),别和C语言里面的!=搞混了
    % ||表示逻辑运算符‘或’(在键盘Enter上面,也要和Shift键一起按) 逻辑运算符且是 && (&读and,连接符号,是and的缩写。 )
    ERROR = 1;
end
%(2)检验是否为正互反矩阵  a_ij > 0 且 a_ij * a_ji = 1
if ERROR == 0
    [n,n] = size(A);
    % 因为我们的判断矩阵A是一个非零方阵,所以这里的r和c相同,我们可以就用同一个字母n表示
    % 判断是否有元素小于0
    %    for i = 1:n
    %        for j = 1:n
    %            if A(i,j)<=0
    %                ERROR = 2;
    %            end
    %        end
    %    end
    if sum(sum(A <= 0)) > 0%用逻辑矩阵的方法更方便,逻辑矩阵中元素要么全为0,要么有若干个1
        ERROR = 2;
    end
end

%顺便检验n是否超过了15,因为RI向量为15维
if ERROR == 0
    if n > 15
        ERROR = 3;
    end
end

if ERROR == 0
    % 判断  a_ij * a_ji = 1 是否成立
    if sum(sum(A' .* A ~=  ones(n))) > 0
        ERROR = 4;
    end
    % A' 表示求出 A 的转置矩阵,即将a_ij和a_ji互换位置
    % ones(n)函数生成一个n*n的全为1的方阵, zeros(n)函数生成一个n*n的全为0的方阵
    % ones(m,n)函数生成一个m*n的全为1的矩阵
    % MATLAB在矩阵的运算中,“/”号和“*”号代表矩阵之间的乘法与除法,对应元素之间的乘除法需要使用“./”和“.*”
    % 如果a_ij * a_ji = 1 满足, 那么A和A'对应元素相乘应该为1
end


if ERROR == 0
    % % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
.....
    % % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
.....
    % % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
.....
    % % % % % % % % % % % % %计算一致性比例CR的环节% % % % % % % % % % % % %
.....

elseif ERROR == 1
    disp('请检查矩阵A的维数是否不大于1或不是方阵')
elseif ERROR == 2
    disp('请检查矩阵A中有元素小于等于0')
elseif ERROR == 3
    disp('A的维数n超过了15,请减少准则层的数量')
elseif ERROR == 4
    disp('请检查矩阵A中存在i、j不满足A_ij * A_ji = 1')
end

模型拓展

字太多了,不想写了

  • 13
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值