一、 算法引入
人们在进行社会、经济以及科学管理领域问题的系统分析中,面临的常常是一个由相互关联、相互制约的众多因素构成的复杂而往往缺少定量数据的系统。比如要在三个旅游景点选择其中二个作为目的地。而这三个旅游景点的消费水平、气候条件、饮食、交通等都会影响我们对它的选择。三个旅游景点中选取两个又有3种不同的组合方案。层次分析法为这类问题的决策和排序提供了一种新的、简洁而实用的建模方法。
不得不说的是,层次分析法因为其可以套用的场合较多,且有不易于给出令人信服的专家打分矩阵等算法本身缺陷,若在有些场合滥用层次分析法往往并不是一个好的选择。若要在数学建模中使用层次分析法,需先考虑其在此问题下是否合适。
二、 算法介绍
层次分析法(Analytic Hierarchy Process ,简称 AHP )是对一些较为复杂、较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题。它是美国运筹学家T. L. Saaty 教授于上世纪 70 年代初期提出的一种简便、灵活而又实用的多准则决策方法。
三、 算法步骤
1.步骤
(i)建立递阶层次结构模型;
(ii)构造出各层次中的所有判断矩阵;
(iii)层次单排序及一致性检验;
(iv)层次总排序及一致性检验。
2.步骤的具体实现
首先从层次结构模型说起
层次分析法是用来根据多种准则,或是说因素从候选方案中选出最优的一种数学方法
最顶层是我们的目标,比如说选择旅游目的地
中间层是判断候选方物或人优劣的因素或标准
选旅游目的地时有:景色 费用 居住 饮食
最后一层就是可供选择的事物,比如:青岛 九寨沟 黄山
在分层以后,为了选出最优候选,给目标层分配值1.000。然后将这一值作为权重,分配给不同因素,对应因素的权重大小代表该因素在整个选择过程中的重要性程度。
然后对于候选方案,每一个标准再将其权重值分配给所有的候选方案,每一方案获得权重值,来源于不同因素分得的权重值的和。
例如选工作时,待遇所占的比重为0.8, 有工作1,2,3候选,如果工作1的待遇最高,工作2的待遇次之,工作3最差,则可将0.8的值按0.4,0.3,0.1分给工作1,2,3,
这不就是一个简单的权重打分的过程吗?为什么还要层次分析呢。
这里就有两个关键问题:
1每个准则(因素)权重具体应该分配多少
2每一个候选方案在每一个因素下又应该获得多少权重
这里便进入层次分析法的第二个步骤,也是层次分析法的一个精华
构造比较矩阵判断矩阵(comparison matrix):
首先解决第一个问题:每个准则(因素)权重具体应该分配多少?
在递阶层次结构中,设上一层元素
C
为准则,所支配的下一层元素为
(1)如果
(2)如果问题复杂,
这时我们就可以得到判断矩阵,也就是每两个因素的权重比:
假设我们得到的例子中判断矩阵是:
有了判断矩阵,我们就可以得到各个因素的权重。在(1)式中,右乘 w 就有
如a,b,c的判断矩阵为
令 (A−3)w=0 ,就有 w=[0.60.30.1]
现在,我们先来看两个概念
(1)正互反矩阵的定义是:
(2)一致性矩阵的定义是:
如果说a比b重要2倍,b比c重要3倍,然后说c比a重要2倍,这就有问题了。这就是所谓的不一致现象。(2)就是出现了这一现象。那么,这时权重又如何确定。
学过线性代数的话,我们知道(3)中, n 是
于是引入了一致性检验。
定义一致性指标:
CI 接近于0,有满意的一致性
CI 越大,不一致越严重
定义随机一致性指标 RI :它的值与 n 的关系如下:
定义一致性比率 :
接下来解决第二个问题:每一个候选方案在每一个因素下又应该获得多少权重
这里则需要将不同候选方案,在不同因素下分别比较,具体的比较方法,还是使用比较矩阵,只不过之前准则层的比较矩阵比较的对象是因素,这里比较的是某一因素下,候选方案的优劣,
n
个因素则需构造出来
例如在工作环境的因素下,工作1与工作2相比为 :4:2,工作2与工作3=2:1 工作1:工作3=6:1.,这样构造一个矩阵,再用之前的一致性矩阵的方法就可以求出一个权重,然后相对应因素(这里是工作环境)所拥有的权值就可以按这个权重比例分配给不同候选物或人。
至此两个问题就都得到了解决
最终将每个候选物、人从不同因素获得的权值求和,就可以得到不同候选对于目标层的权值大小,继而可以根据值的大小,来选出优劣
四、 算法举例
挑选合适的工作。经双方恳谈,已有三个单位表示愿意录用某毕业生。该生根据已有信息建立了一个层次结构模型,如图 2 所示。
准则层的判断矩阵如表 4 所示。
方案层的判断矩阵如表 5 所示。
层次总排序的结果如表 6 所示。
根据层次总排序权值,该生最满意的工作为工作 1。根据层次总排序权值,该生最满意的工作为工作1。
根据层次总排序权值,该生最满意的工作为工作 1。
Matlab程序如下:
clc
clear
fid=fopen('txt3.txt','r');
n1=6;
n2=3;
a=[];
for i=1:n1
tmp=str2num(fget1(fid));
a=[a;tmp];%读取准则层
end
for i=1:n1
str1=char(['b',int2str(i),'=[];']);
str2=char(['b',int2str(i),'=[b',int2str(i),';tmp];']);
eval(str1);
for j=1:n2
tmp=str2num(fget1(fid));
eval(str2);%读取方案层的判断矩阵
end
end
纯文本文件txt3.txt中的数据格式如下:
1 1 1 4 1 1/2
1 1 2 4 1 1/2
1 1/2 1 5 3 1/2
1/4 1/4 1/5 1 1/3 1/3
1 1 1/3 3 1 1
2 2 2 3 3 1
1 1/4 1/2
4 1 3
2 1/3 1
1 1/4 1/5
4 1 1/2
5 2 1
1 3 1/3
1/3 1 1/7
3 7 1
1 1/3 5
3 1 7
1/5 1/7 1
1 1 7
1 1 7
1/7 1/7 1
1 7 9
1/7 1 1
1/9 1 1