Loading

数学建模之层次分析法

参考资料:

https://www.bilibili.com/video/BV1kC4y1a7Ee?p=10

https://www.bilibili.com/video/BV1hK411G76S

一、使用步骤

1. 划分层次

首先先将问题划分成多个层次,一般为三层,包括:

  1. 目标层
  2. 指标层
  3. 方案层

这里用选择旅游地点的问题为例进行说明:

例如我们希望从南京、桂林和三亚三个城市中选择一个城市进行旅游,而我们考虑的因素包括

  1. 景色
  2. 吃住
  3. 价格
  4. 人文

这样我们可以从中抽象出如下图所示的三层模型:

image-20220126155210911

其中指标层为我们的考虑因素,而方案层则是我们的选择集合。

2. 对指标层进行评估

在这一步,我们需要对指标层的因素集合进行评估,即评出各个因素的权重,例如如果我们更多地看中旅游的吃住体验,则A2的权重就会比其他几项要大。

这里层次分析法要求我们创建一个评估矩阵,里面的值是我们将这些因素进行两两比较得到的,相当于让我们进行比较和打分,打分的依据如下表所示:

image-20220126155949666

例如我们对上面的各项指标层进行评估得到的评估矩阵如下所示:

image-20220126160037256

例如上面的(1,3)的值为2,则代表了景色这个因素较价格稍微重要,其他也是以此类推的。

在完成了指标层的矩阵之后,我们还需要对这个矩阵进行一致性检验,这是为了防止打分的时出现比较矛盾的情况,例如打分中出现:吃住比景色好,景色比价格好,而价格又比景色好这种矛盾的情况。

对评估矩阵进行一致性检验

首先我们需要先获取矩阵可以得到的各个因素权值,参考资料如下:

对于不一致(但在允许范围内)的成对比较阵A,Saaty等人建议用对应于最大特征根λ的特征向量作为权向量ω,即Aω=λω。

因此,我们可以先求出矩阵对应的所有特征根,然后挑出其中的最大特征根\(\lambda_{max}\),然后再取该特征根所对应的特征向量即可。

以上的方法是在当我们有matlab等矩阵计算工具时采用的最佳方法,而当工具比较简单时也可以采用简单的算术平均法几何平均法计算得到相对合理的值,计算过程如下表所示:

算术平均法

image-20220126161931950

几何平均法

image-20220126162146113

如果使用了以上两个方法计算权值ω的话,则我们可以通过Aω=λω这个公式反推得到λ,即先求Aω的值,结果是一个向量,然后用这个向量的各个分量分别去除以ω的各个分量后得到的集合求平均值,如下图所示:

image-20220126164709578 image-20220126164728305

得到了权值之后,我们可以计算一致性指标CI,计算公式如下:

image-20220126162521736

其中λ为前面的最大特征根\(\lambda_{max}\),n是矩阵的阶数。

然后我们还需要引入一个随机一致性指标RI,这个量是固定的,可以查表得到,例如前面各阶时的数据如下:

image-20220126162729547

最后我们计算一致性比率\(CR=\frac{CI}{RI}\),如果\(CR<0.1\),则认为不一致程度在允许的范围内,通过一致性检验。

3. 对方案层进行评估

即对于所有的方案,分别就指标层的每一个指标都进行一次两两的比较,比较过程和指标层评估的过程是一样的,最终生成多个评估矩阵,例如如果指标层有n个指标,则最终会有B1~Bn这n个评估矩阵产生。同理,我们得到这些评估矩阵后也还是需要分别获取它们的权重值及对它们进行相应的一致性检验。

3.1 就各个指标进行评估并检验一致性

以下是各个方案就景色这个因素的评估矩阵以及使用算术平均法得到相应的权值的过程表:

image-20220126163732642

其余因素的评估过程也是类似的,在此之后也还需进行一致性检验,这里不再赘述。

3.2 进行层次总排序的一致性检验

image-20220126165244622

4. 得到最终的结果

首先使用前面的数据建立出类似如下的表格:

image-20220126165502683

然后可以分别加权计算出三个地点的总得分,例如南京的得分计算为:0.12*0.18+0.51*0.59+0.06*0.23+0.30*.074≈0.56,其余两项的计算也是一样的,因而可以得到最终的排名和决策。

二、matlab相关编程

由某个评估矩阵计算相应权值和进行一致性检验的matlab代码如下:

disp('请输入准则层判断矩阵A(n阶)');
A=input('A=');
[n,n]=size(A);
[V,D]=eig(A);%求得特征向量和特征值

%求出最大特征值和它所对应的特征向量
tempNum=D(1,1);
pos=1;
for h=1:n
    if D(h,h)>tempNum
        tempNum=D(h,h);
        pos=h;
    end
end
% 得到特征向量 w=w/sum(w)为归一操作(即各分量和为1)
w=abs(V(:,pos));
w=w/sum(w);
% 得到最大特征根
t=D(pos,pos);
disp('准则层特征向量w=');disp(w);disp('准则层最大特征根t=');disp(t);

%以下是一致性检验
CI=(t-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 1.60 1.61 1.615 1.62 1.63];
CR=CI/RI(n);
if CR < 0.10
    disp('此矩阵的一致性可以接受!');
    disp('CI=');disp(CI);
    disp('CR=');disp(CR);
else disp('此矩阵的一致性验证失败,请重新进行评分!');
end

由于不知道比赛是否会使用到这个算法,因此这里我只是学习核心原理和算法,如果后面需要我再进行算法的扩展和封装等等。

posted @ 2022-01-26 17:08  CodeReaper  阅读(647)  评论(0编辑  收藏  举报