MATLAB数学建模必备算法--层次分析法AHP

其主要用于解决评价类问题(例如:选择哪种方案最好、哪位运动员或者员工表现的更优秀)

一个很典型的层次分析法案例:

确定评价目标:

高考完后小明想要去旅游,有三个目的地供他选择:

  1. 苏杭
  2. 北戴河
  3. 桂林

确定评价准则:

假如小明要选择目的地,他同时考虑以下的条件,我们称为评价准则:

  1. 景色
  2. 花费
  3. 居住
  4. 饮食
  5. 交通

确定评价准则的判断矩阵:

在这之前,我们要介绍一下重要程度表:

当两个条件互相比较时,谁比谁重要,可以用这张表的数值(1~9)来进行打分。

1

我们要依次确定这个五个条件的权重以便小明选择目的地,假如我们问小明:

博主	:”小明,你觉得这五个条件对你来说对于选择目的地来说更重要啊?“
小明:”一次让我来说的话可能不太好判断,每个我感觉都挺重要啊。。。“

于是我们就会遇到这样的问题,但条件很多时,我们就不好一下子直接说出哪一个条件对于目的地的选择更加重要(或者说在小明心中的权重)。所以这个时候我们可以构造一个表格来两两比较:
在这里插入图片描述
观察以上表格,分成三个部分:

  • 对角线以上

拿景色与花费做例子,景色相比与花费,小明觉得景色对于他来说要求不是那么高,反而会更在意花费,所以景色相对于花费的值是1/2
2

  • 对角线

     由于表格的对角线是条件与自己相比,所以值为1(同等重要)
    
  • 对角线以下
    既然对角线以上是景色比花费,那么对角线就是花费比景色,正好相反
    3

所以我们看到,对角线以下的是对角线以上的倒数,由于有五个评价准则,所以一共要两两比较:
4次就可以填满整张表。
下面是结果:
5
6
总结:上面的上面这个表是一个5 X 5的方阵,我们记为A,对应的元素为:
在这里插入图片描述

这个方阵有如下特点:

  1. aij的意思是i与指标𝑗相比,𝑖的程度
  2. 𝑖 = 𝑗时,两个指标相同,因此同等重要记为1,这就解释了主对角线元素为1。
  3. 𝑎ij> 0且满足𝑎ij X 𝑎ji = 1 (我们称满足这一条件的矩阵为正互反矩阵)
上面这个矩阵就是层次分析法中的判断矩阵,得到了判断矩阵,就可以计算出权重了

确定目标的判断矩阵:

既然评价准则之间有判断矩阵,在小明心中,对于景色来说,苏杭,北戴河,桂林之间可能也有不同的分数,他可能觉得在景色方面,桂林更胜一筹,那么桂林的分数就要比其它两个的分数要高,那这样单单就景色来说,苏杭,北戴河,桂林之间就要两两之间进行比较,其它的条件也是同样如此,于是我们可以类比以上的表格:

  • 景色:

7

  • 花费
    8
  • 居住
    9
  • 饮食
    10
  • 交通
    11

一致矩阵的概念

由于以上表格都是我们问,小明答,有很强的主观意愿,所以这张表表格很可能出错,下面我们就来看一个错误的例子:
12
如上图所示,出现了不一致的现象,那么我们来看一个一致的矩阵:
13
我们观察这个矩阵,它的各行各列成比例,我们称这个矩阵为一致矩阵,我们可以用数学符号来表达:
14
所以,综上所述:各行(各列)之间成倍数关系的矩阵为一致矩阵。

总结:

  • 矩阵中每个元素都大于0且对角线元素为1的矩阵我们成为正互反矩阵
  • 在层次分析法中,我们构造的判断矩阵都是正互反矩阵
  • 若正互反矩阵满足各行各列成比例,我们称为一致矩阵
所以,我们得到的判断矩阵一定是正互反矩阵,由于跟实际情况中可变的因素有很多,所以我们的正互反矩阵在现实生活中很难满足各行各列成比例,所以也就很难让正互反矩阵成为一致矩阵,但是我们可以对正互反矩阵进行一致性检验,让它在一定的范围误差内,在此误差内我们可以看作其满足一致性矩阵的条件,所以我们在得到了判断矩阵(正互反矩阵)后要进行一致性检验

对判断矩阵进行一致性检验:

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

一致性检验的步骤:
15

  1. 计算判断矩阵的特征值:

    如果特征值中有虚数,则比较的是特征值的模长。
    这个由于计算较为繁琐,我们可以交给MATLAB完成,使用eig命令既可以计算特征值,也可以计算特征向量。
    

    当最大特征值等于矩阵阶数的时候,我们的正互反矩阵才为一致矩阵:
    16
    当最大特征值与n相差越大时,我们得到的矩阵越不一致。

  2. 计算一致性指标CI
    17

  3. 查找对应的平均随机一致性指标RI

17

注:在实际运用中,n很少超过10,如果指标的个数大于10,则可考虑建立 二级指标体系,或使用我们以后要学习的模糊综合评价模型。

  1. 计算一致性比例CR
    18

  2. 对一致性比例CR进行判断:

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

计算判断矩阵的权重:

计算权重有三种方法:
19

算数平均法求权重:

步骤:
20

  1. 将判断矩阵按照列归一化(每一个元素除以其所在列的和)
    我们看一个例子:
    21
    第一列:
    22
    第二列:
    23
    第三列:
    24
    于是我们得到以下表格:
    25
  2. 将归一化的各行相加:

相加后我们得到以下表格:
26

  1. 除以n得到最后的权重

27

几何平均法求权重:

步骤:
28

  1. A的元素按照行相乘得到一个新的列向量

    在MATLAB中使用prod(A,2)命令即可以对一行进行相乘
    

A =

    1.0000    2.0000    5.0000
    0.5000    1.0000    2.0000
    0.2000    0.5000    1.0000

使用prod(A,2)命令:

>> prod(A,2)

ans =

   10.0000
    1.0000
    0.1000
  1. 将新的向量的每个分量开n次方
>> ans.^(1/3)

ans =

    2.1544
    1.0000
    0.4642
  1. 对该列向量进行归一化即可得到权重向量
    29

结果:
29

注: 权重和应为1,这里由于四舍五入所以会有可以忽略的差距。

特征值法求权重:

步骤:
30

1.在MATLAB中使用eig命令求特征值和特征向量:

A =

    1.0000    2.0000    5.0000
    0.5000    1.0000    2.0000
    0.2000    0.5000    1.0000

>> [v,r] = eig(A)

v =

  -0.8902 + 0.0000i  -0.8902 + 0.0000i  -0.8902 + 0.0000i
  -0.4132 + 0.0000i   0.2066 + 0.3578i   0.2066 - 0.3578i
  -0.1918 + 0.0000i   0.0959 - 0.1661i   0.0959 + 0.1661i


r =

   3.0055 + 0.0000i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.0028 + 0.1290i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0000 + 0.0000i  -0.0028 - 0.1290i

找出最大特征值为3.0055
2. 对求出的特征向量进行归一化即可得到我们的权重:
最大特征值对应的特征向量

  -0.8902 + 0.0000i  
  -0.4132 + 0.0000i  
  -0.1918 + 0.0000i 

归一化:

0.5954
0.2764
0.1283

三种方法计算的权重结果:

31
将计算结果填入权重表,得到:
32

计算评价准则的权重:

  • 得到评价准则的判断矩阵:

33

  • 用三种方法计算权重:
    34
  • 填入表格:

35

求出其它评价准则对应的权重:

36

汇总结果得到权重矩阵:

37

根据权重表格计算每个目标的得分:

38
类似我们求出:
39
40

结果:

因此最佳的旅游景点是桂林

总结:

1.建立层次结构:
41
2.构造准则层之间判断矩阵:
42

3.构造方案层之间判断矩阵:
43
4.对以上每个判断矩阵进行一致性检验(通过后才能计算权重):

44
5.通过检验后根据权重矩阵计算得分,并进行排序
三种方法计算权重:
45

注意事项:

  • 一致矩阵不需要进行一致性检验,只有非一致矩阵的判断矩阵才需要进行一致性检验
  • 在论文写作中,应该先进行一致性检验,通过检验后再计算权重,以上讲解的只是为了顺应计算过程。
  • 特征值可用MATLAB进行计算,如果特征值中有虚数,则比较的是特征值的模长。
  • 如果CR > 0.1 ,我们可以往一致矩阵上调整(这个就看你自己了,反正评委也不知道是吧~)
  • 平均随机一致性指标RI的表格中n最多是15

层次分析法的一些局限性:

  • 评价的准则层n不能太多(一般不超过十个),太多的话n(最多是15)会很大,判断矩阵和一致矩阵差异可能会很大。

46

代码(含有详细注释):

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

可以参考的矩阵:

将以下五个矩阵依次输入以上代码中就可以直接求出各种结果

评价准则:
[1, 1/2, 4, 3, 3;
 2, 1,   7, 5, 5;
 1/4, 1/7, 1, 1/2, 1/3;
 1/3, 1/5, 2, 1, 1;
 1/3, 1/5, 3, 1, 1]
景色:
[1,2,5;
1/2,1,2;
1/5,1/2,1;]
花费:
[1,1/3,1/8;
3,1,1/3;
8,3,1;]
居住:
[1,1,3;
1,1,3;
1/3,1/3,1;]
饮食:
[1,3,4;
1/3,1,1;
1/4,1,1;]
交通 
[1,1,1/4;
 1,1,1/4;
 4,4,1;]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章