其主要用于解决评价类问题(例如:选择哪种方案最好、哪位运动员或者员工表现的更优秀)
一个很典型的层次分析法案例:
确定评价目标:
高考完后小明想要去旅游,有三个目的地供他选择:
- 苏杭
- 北戴河
- 桂林
确定评价准则:
假如小明要选择目的地,他同时考虑以下的条件,我们称为评价准则:
- 景色
- 花费
- 居住
- 饮食
- 交通
确定评价准则的判断矩阵:
在这之前,我们要介绍一下重要程度表:
当两个条件互相比较时,谁比谁重要,可以用这张表的数值(1~9)来进行打分。
我们要依次确定这个五个条件的权重以便小明选择目的地,假如我们问小明:
博主 :”小明,你觉得这五个条件对你来说对于选择目的地来说更重要啊?“
小明:”一次让我来说的话可能不太好判断,每个我感觉都挺重要啊。。。“
于是我们就会遇到这样的问题,但条件很多时,我们就不好一下子直接说出哪一个条件对于目的地的选择更加重要(或者说在小明心中的权重)。所以这个时候我们可以构造一个表格来两两比较:
观察以上表格,分成三个部分:
- 对角线以上
拿景色与花费做例子,景色相比与花费,小明觉得景色对于他来说要求不是那么高,反而会更在意花费,所以景色相对于花费的值是1/2
-
对角线
由于表格的对角线是条件与自己相比,所以值为1(同等重要)
-
对角线以下
既然对角线以上是景色比花费,那么对角线就是花费比景色,正好相反
所以我们看到,对角线以下的是对角线以上的倒数,由于有五个评价准则,所以一共要两两比较:
次就可以填满整张表。
下面是结果:
总结:上面的上面这个表是一个5 X 5的方阵,我们记为A
,对应的元素为:
这个方阵有如下特点:
aij
的意思是i
与指标𝑗
相比,𝑖
的程度- 当
𝑖 = 𝑗
时,两个指标相同,因此同等重要记为1,这就解释了主对角线元素为1。 𝑎ij> 0
且满足𝑎ij X 𝑎ji = 1
(我们称满足这一条件的矩阵为正互反矩阵)
上面这个矩阵就是层次分析法中的判断矩阵,得到了判断矩阵,就可以计算出权重了
确定目标的判断矩阵:
既然评价准则之间有判断矩阵,在小明心中,对于景色来说,苏杭,北戴河,桂林之间可能也有不同的分数,他可能觉得在景色方面,桂林更胜一筹,那么桂林的分数就要比其它两个的分数要高,那这样单单就景色来说,苏杭,北戴河,桂林之间就要两两之间进行比较,其它的条件也是同样如此,于是我们可以类比以上的表格:
- 景色:
- 花费
- 居住
- 饮食
- 交通
一致矩阵的概念
由于以上表格都是我们问,小明答,有很强的主观意愿,所以这张表表格很可能出错,下面我们就来看一个错误的例子:
如上图所示,出现了不一致的现象,那么我们来看一个一致的矩阵:
我们观察这个矩阵,它的各行各列成比例,我们称这个矩阵为一致矩阵,我们可以用数学符号来表达:
所以,综上所述:各行(各列)之间成倍数关系的矩阵为一致矩阵。
总结:
- 矩阵中每个元素都大于0且对角线元素为1的矩阵我们成为正互反矩阵
- 在层次分析法中,我们构造的判断矩阵都是正互反矩阵
- 若正互反矩阵满足各行各列成比例,我们称为一致矩阵
所以,我们得到的判断矩阵一定是正互反矩阵,由于跟实际情况中可变的因素有很多,所以我们的正互反矩阵在现实生活中很难满足各行各列成比例,所以也就很难让正互反矩阵成为一致矩阵,但是我们可以对正互反矩阵进行一致性检验,让它在一定的范围误差内,在此误差内我们可以看作其满足一致性矩阵的条件,所以我们在得到了判断矩阵(正互反矩阵)后要进行一致性检验
对判断矩阵进行一致性检验:
原理: 检验我们构造的判断矩阵和一致矩阵是否有太大的差别。
一致性检验的步骤:
-
计算判断矩阵的特征值:
如果特征值中有虚数,则比较的是特征值的模长。 这个由于计算较为繁琐,我们可以交给MATLAB完成,使用eig命令既可以计算特征值,也可以计算特征向量。
当最大特征值等于矩阵阶数的时候,我们的正互反矩阵才为一致矩阵:
当最大特征值与n相差越大时,我们得到的矩阵越不一致。 -
计算一致性指标
CI
:
-
查找对应的平均随机一致性指标
RI
:
注:在实际运用中,n很少超过10,如果指标的个数大于10,则可考虑建立 二级指标体系,或使用我们以后要学习的模糊综合评价模型。
-
计算一致性比例
CR
:
-
对一致性比例
CR
进行判断:如果
CR<0.1
,则判断矩阵的一致性可以接受。
如果CR>0.1
,则要对判断矩阵进行修正。
计算判断矩阵的权重:
计算权重有三种方法:
算数平均法求权重:
步骤:
- 将判断矩阵按照列归一化(每一个元素除以其所在列的和)
我们看一个例子:
第一列:
第二列:
第三列:
于是我们得到以下表格:
- 将归一化的各行相加:
相加后我们得到以下表格:
- 除以
n
得到最后的权重
几何平均法求权重:
步骤:
-
将
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)