层次分析法及其应用案例
引言
所谓多准则决策(multi-criteria decision making),就是依据一系列与目标(goal)相关的准则(criteria)评估多个方案(alternatives)的优劣,然后据此决定行动的过程。一般来说,不同准则对于同一目标而言可能存在着重要程度的差异,而决策者对不同方案的偏好也可能会随评估准则的变化而改变;为了从这些差异和变化之间找到一个平衡点、得到最理想的结果,我们需要利用特定的方法和标度对它们进行测量和比较 (Thomas L. Saaty 2004) 。很多人可能会认为测量必须通过有单位的物理标度来实现,而这意味着理想的决策必须依据方案中可以被客观量化的属性(例如,衣服的肩宽、身宽、袖长等)来制定;但事实并非完全如此。无法或难以用物理标度测量的事物属性(例如,衣服的款式、舒适度、保暖性、新旧程度等等)在日常生活中比比皆是,而我们却仍能在大多数情况下凭借主观判断做出合理、准确的决策(例如,基于前述属性准则购买合适的衣服)。这种现象提示,使用主观的标度去测量、比较那些不具备客观标度的事物属性,同样能获得可靠决策支持。但是,如何才能严谨地、程序化地实现这个过程呢?
为了解决这个问题,美国运筹学家Saaty教授在二十世纪七八十年代提出了层次分析法(Analytic Hierarchy Process, AHP)。该方法的实现主要基于专家经验,并同时支持使用主观标度和客观标度对方案的优先度进行测量和比较,能被用于解决几乎所有类型的决策问题,因此在数十年来得到了非常广泛的应用 (Vaidya 和 Kumar 2006) 。
本文的主要目的是结合 Islam 和 bin Mohd Rasad (2006) 提供的一个对员工工作表现进行评分排序的案例,介绍层次分析法的应用步骤。此外,本文还将提供实现层次分析法相关计算的R语言程序,并通过前述案例所提供的数据验证计算结果以确保程序的正确性。
确认目标
在进行任何决策之前,都要结合具体的背景,提出清晰的目标,这也是应用层次分析法的第一个步骤。以下是目标案例的发生背景及其所需解决的目标。
2006年,马来西亚全国范围内有约1231家注册在案的保洁服务公司,行业的内竞争非常激烈 (Islam 和 bin Mohd Rasad 2006) 。为了获得更多的市场份额,这些公司必须竭尽全力为客户提供最优质的服务,而这在很大程度上取决于员工的工作表现。在此背景下,某保洁公司希望得到一个评价工具,用来对公司内约300名员工的工作表现进行评分。所得到的评分结果将被用来识别表现优秀的员工以便给予激励;同时,也将被用来识别表现欠佳的员工以便给予必要的指导。
构建层次结构模型
在确认目标之后,需要将目标分解成多项要素组成层次结构,以便能够从多个角度考虑目标的实现条件。
在该案例中,专家组围绕所需实现的目标(goal)展开了一系列讨论,最终确定了评价员工工作表现得分的多项要素(elements)。这些要素包括:6项大准则(criteria);由大准则衍生出的18项子准则(subcriteria);用于衡量待评价员工(在层次分析法中,他们被称作alternatives,即“方案”)在各子准则下表现优劣程度的5个强度等级(intensities)。其中,5个强度等级分别为出色(excellent,缩写为E)、优秀(good,缩写为G)、平均(average,缩写为A)、差强人意(satisfactory,缩写为S)、差(poor,缩写为P)。由目标及相关要素所构成的层次结构模型如 图 1 所示(其中,Cx代表大准则编号,Cxx代表子准则编号;为节省空间,图中未显示各子准则下的强度等级)。
评价要素间的相对重要性
在划分完层次结构后,需要对处于同一层次、且来源于同一目标或准则的要素进行两两对比以得出相对重要性;评价时所用的数值标度及其意义如下表所示 (Thomas L. Saaty 2008) :
重要性强度 | 定义 | 解释 |
---|---|---|
1 | 同等重要 | 两要素的贡献程度具同等重要性 |
3 | 稍微重要 | 经验与判断稍微偏好某一要素 |
5 | 颇为重要 | 经验与判断强烈偏好某一要素 |
7 | 极为重要 | 实际显示非常强烈偏好某一要素 |
9 | 绝对重要 | 有足够证据肯定绝对偏好某一要素 |
2, 4, 6, 8 | 上述相邻标度之中间值 | 介于两种判断之间 |
1.1-1.9 | 两者的重要性非常接近 | 尽管不明显,但仍能显示出相对重要性的差异 |
上述数值的倒数 | 对两个要素A、B,若前者相对后者的重要性强度为x,则后者相对前者的重要性强度为1/x | 这是一项合理的假定 |
经该案例中的专家讨论评价,准则C1-C6的相对重要性矩阵\(A\)如下所示。矩阵中元素\(a_{ij}\)的取值为第\(i\)行所代表的准则相对于第\(j\)列所代表的准则的重要性;且若元素\(a_{ij}\)的数值为\(x\),则\(a_{ji}\)的数值应为\(x\)的倒数;对角线上的元素代表各准则与自身相比的重要性,其取值永远为1。例如,矩阵\(A\)中元素\(a_{23}\)取值为7的意义是“C2相对于C3而言‘极为重要’”。
<- matrix(c(1, 8, 6, 7, 4, 7,
A 1/8, 1, 7, 6, 4, 7,
1/6, 1/7, 1, 7, 5, 6,
1/7, 1/6, 1/7, 1, 6, 8,
1/4, 1/4, 1/5, 1/6, 1, 8,
1/7, 1/7, 1/6, 1/8, 1/8, 1),
ncol = 6, byrow = T,
dimnames = list(c("C1", "C2", "C3", "C4", "C5", "C6"),
c("C1", "C2", "C3", "C4", "C5", "C6")))
::as.fractions(A) MASS
## C1 C2 C3 C4 C5 C6
## C1 1 8 6 7 4 7
## C2 1/8 1 7 6 4 7
## C3 1/6 1/7 1 7 5 6
## C4 1/7 1/6 1/7 1 6 8
## C5 1/4 1/4 1/5 1/6 1 8
## C6 1/7 1/7 1/6 1/8 1/8 1
类似地,该案例中强度等级E-P的相对重要性矩阵\(B\)如下所示。
<- matrix(c(1, 3, 5, 6, 8,
B 1/3, 1, 3, 5, 6,
1/5, 1/3, 1, 3, 5,
1/6, 1/5, 1/3, 1, 3,
1/8, 1/6, 1/5, 1/3, 1),
ncol = 5, byrow = T,
dimnames = list(c("E", "G", "A", "S", "P"),
c("E", "G", "A", "S", "P")))
::as.fractions(B) MASS
## E G A S P
## E 1 3 5 6 8
## G 1/3 1 3 5 6
## A 1/5 1/3 1 3 5
## S 1/6 1/5 1/3 1 3
## P 1/8 1/6 1/5 1/3 1
借助上述方法,还可以获得其他6组要素的重要性矩阵:C11-C13、C21-C23、C31-C33、C41-C43、C51-C53、C61-C63;具体结果见原文第9页 (Islam 和 bin Mohd Rasad 2006) ,此处不再赘述。
判断评价结果一致性
当相对重要性矩阵中所涉及的要素达到或超过3个时,判断中出现不一致性的可能就会明显增加。例如,对于三个要素X、Y、Z,若某人认为X比Y重要且Y比Z重要,那么可以推理出X比Z重要;但若此人认为Z比X重要,那么就出现了判断上的不一致。这种不一致在现实中是有可能出现的,因此层次分析法允许存在这样的情形;但这种情形不应该出现得过于频繁、明显,否则要素的权重将不存在一个有意义的解。为了判断相对重要性矩阵的一致性是否达到要求,需要计算其一致性比率并观察其值是否小于0.1 (Thomas L. Saaty 2004) ;如条件为真,则表明一致性符合要求。
一致性比率(Consistency Ratio, CR)为一致性指数(Consistency Index, CI)与随机指数(Random Index, RI)的比,即
\[ CR = \frac{CI}{RI} \]
记相对重要性矩阵的阶数为\(n\)、最大特征向量为\(\lambda_{max}\),则
\[ CI = \frac{\lambda_{max} - n}{n - 1} \]
而RI是一组取决于\(n\)的常数(Thomas L. Saaty 1994),两者对应关系见 表 2 。
n | RI |
---|---|
1 | 0.00 |
2 | 0.00 |
3 | 0.52 |
4 | 0.89 |
5 | 1.11 |
6 | 1.25 |
7 | 1.35 |
8 | 1.40 |
9 | 1.45 |
10 | 1.49 |
笔者编写的ahp_cr()
函数可以用于计算相对重要性矩阵的一致性;其代码如下:
<- function(x) {
ahp_cr # 输入必须满足以下条件
stopifnot(is.matrix(x), ncol(x) == nrow(x), # 是方阵
all(x > 0), all((x * t(x) == 1)), # 是正互反矩阵
identical(colnames(x), rownames(x))) # 如果有行名和列名,两者是相同的
# `eigen()`函数求出来的第一个特征值就是最大特征值
<- as.double(eigen(x)$values[1])
max_eigenvalue <- (max_eigenvalue - ncol(x)) / (ncol(x) - 1)
ci <- c(0, 0, 0.52, 0.89, 1.11, 1.25, 1.35, 1.40, 1.45, 1.49)[ncol(x)]
ri <- ci / ri
cr names(cr) <- "CR"
round(cr, 2)
}
通过以下方式调用该函数,即可分别计算矩阵\(A\)、\(B\)的一致性比率:
ahp_cr(A)
## CR
## 0.4
ahp_cr(B)
## CR
## 0.06
以上结果显示矩阵A(对应C1-C6大准则的相对重要性矩阵)不符合一致性要求,而矩阵B(对应E-P等级强度的相对重要性矩阵)符合。需要指出的是,笔者使用上述函数分别计算了该案例中C11-C13、C21-C23、C31-C33、C41-C43、C51-C53、C61-C63、E-P几组要素相对重要性矩阵的一致性比率,其结果与原始文献所提供的相一致 (Islam 和 bin Mohd Rasad 2006) ,提示该函数实现是正确的。然而,矩阵A的一致性比率提示C1-C6的相对重要性评价结果不符合要求,需要进行调整;但该原文却并未给出相关结果和解释,这可能是该文献的一处纰漏。
计算要素权重
根据前面对各组要素相对重要性的评价结果,可以计算出组中各要素对其所来源的目标或准则的影响权重,从而能使用数学形式表达决策依据。
对每个相对重要性矩阵,计算其最大特征值所对应的特征向量,并将该向量中的每个元素除以该向量的模,即可得到各要素的权重向量。特别地,在计算强度等级的权重时,还需将前述结果向量中的每个元素除以其中的最大值,得到理想形式(ideal mode)的权重 (Thomas L. Saaty 2004) 。
笔者所编写的ahp_weights()
函数可用于实现上述计算过程;其中idealised
参数用于指定是否返回理想权重。
<- function(x, idealised = F) {
ahp_weights # 输入必须满足以下条件
stopifnot(is.matrix(x), ncol(x) == nrow(x), # 是方阵
all(x > 0), all((x * t(x) == 1)), # 是正互反矩阵
identical(colnames(x), rownames(x))) # 如果有行名和列名,两者是相同的
# `eigen()`函数求出来的第一个特征向量就是最大特征值对应的特征向量
<- as.double(eigen(x)$vectors[, 1])
max_eigenvector <- max_eigenvector / sum(max_eigenvector)
weights if (idealised == T) {
# 计算强度等级的权重时,需要对结果进行缩放,得到理想化权重
<- weights / max(weights)
weights
}<- round(weights, 3)
weights names(weights) <- colnames(x)
weights }
例如,C1-C6的权重向量和E-P的权重向量分别为:
ahp_weights(A)
## C1 C2 C3 C4 C5 C6
## 0.480 0.240 0.135 0.077 0.049 0.019
ahp_weights(B, idealised = T)
## E G A S P
## 1.000 0.523 0.266 0.135 0.072
笔者使用上述函数分别计算了该案例中各要素的权重,其结果与原始文献所提供的相一致 (Islam 和 bin Mohd Rasad 2006) ,提示该函数实现是正确的。但需要指出的是,该研究在计算强度等级的权重时,未对结果进行理想化,这可能是该文献的另一处纰漏。
计算分数
根据层次结构模型以及前述计算所得的权重,员工工作表现得分可以表示为6大准则C1-C6的加权均值1:
1 前面提到,C1-C6的相对重要性矩阵的一致性并不符合要求,因此理论上不应使用由此计算出的权重;这里沿用该权重只是为了说明如何计算分数。
\[ \begin{align} 工作表现得分 = &0.480 \times C1 + 0.240 \times C2 + 0.135 \times C3 \\ &+ 0.077 \times C4 + 0.049 \times C5 + 0.019 \times C6 \end{align} \]
类似地,C1-C6分别可以表示成其下属子准则的加权均值:
\[ \begin{align} C1 &= 0.804 \times C11 + 0.122 \times C12 + 0.074 \times C13 \\ C2 &= 0.699 \times C21 + 0.237 \times C22 + 0.064 \times C23 \\ C3 &= 0.804 \times C31 + 0.122 \times C32 + 0.074 \times C33 \\ C4 &= 0.653 \times C41 + 0.285 \times C42 + 0.062 \times C43 \\ C5 &= 0.796 \times C51 + 0.125 \times C52 + 0.079 \times C53 \\ C6 &= 0.798 \times C61 + 0.138 \times C62 + 0.064 \times C63 \end{align} \]
而对各项子准则下的5个强度等级,又有:
\[ E = 1.000, G = 0.523, A = 0.266, S = 0.135, P = 0.072 \]
现假设有一名员工,其在各个子准则下的表现水平如下表所示:
C11 | C12 | C13 | C21 | C22 | C23 | C31 | C32 | C33 |
---|---|---|---|---|---|---|---|---|
G | P | G | E | S | A | G | P | G |
C41 | C42 | C43 | C51 | C52 | C53 | C61 | C62 | C63 |
---|---|---|---|---|---|---|---|---|
G | S | S | G | P | G | G | S | G |
将结果代入前面各式,可算得该员工在C1-C6的分数分别为0.468、0.748、0.468、0.388、0.467、0.469;而其最终综合的工作表现得分则为0.529。
结语
层次分析法还有许多相关内容没有在本文中得到介绍;以下将提及一些可能比较重要的方面,并给出有关参考文献供有兴趣的读者进一步了解。
关于层次分析法的测量标度。层次分析法有两种测量标度,一是绝对测量(absolute measurement)标度,二是相对测量(relative measurement)标度。本文所介绍的案例使用的是绝对标度,其尤其适用于待评价的方案数量较多的情形,并且能够保证每个方案所得的最终权重分数不会因为新方案的加入或原有方案的移除而改变;而另一方面,当决策问题所涉及的方案较少2或相关准则较为模糊、难以测量时,相对标度会是更加有效的测量方法。有关两种标度的对比及相对标度的应用案例可以参考有关文献 (Thomas L. Saaty 1986, 2004, 2008) 。
2 这并不是绝对的,有些技巧可以使相对标度能被用于方案较多的情形 (Thomas L. Saaty 1986, 2004) 。
关于层次结构的嵌套以及各层次所含的要素个数。本文所介绍的案例构建的层次结构模型较为规则,目标下有6个大准则,而每个大准则下又嵌套了3个子准则;但这种规则并不是必要的。例如, Thomas L. Saaty (2008) 所介绍的一个关于如何选择工作的案例中,5个大准则下只有2个嵌套了子准则,而另外3个则没有。另外,每个来源于同一目标或准则的层次所含的要素数量是根据实际情况而定的,但研究表明其数量不应该超过7个 (T. L. Saaty 和 Ozdemir 2003) ;这似乎也提示当备选方案多于7个时,可以考虑使用绝对标度而非相对标度。最后,每个子准则下的强度等级数量及各等级的相对重要性也应按实际情况而定 (Thomas L. Saaty 1986, 2004, 2008) ,并不一定像本案例所示的那样,所有子准则都共用一套强度等级。
关于群体决策时相对重要性矩阵的聚集方法。在进行群体决策时,每位专家都会根据自己的经验针对各组要素给出对应的相对重要性矩阵;在聚集不同专家对同一组要素给出的相对重要性矩阵时,只需对这些矩阵求几何均值即可 (Thomas L. Saaty 2004) 。例如,假设两位专家对某组要素进行判断所得的相对重要性矩阵分别为A1
和A2
,那么在R语言中只需计算sqrt(A1 * A2)
即可得到聚集后的矩阵;以该矩阵输入ahp_cr()
或ahp_weights()
函数,即可获得综合两位专家意见的结果。
关于层次分析法的R语言程序实现。笔者所提供的程序仅使用了R语言的基本运算和函数,不存在任何外部依赖,因此理论上较为稳定,不会因R语言版本升级而失效;然而,其所提供的功能亦较为有限。如果需要用到更多功能,可以下载并安装使用ahpsurvey
包;有关该包的详情请看此页。
最后,若想了解更多方法学方面的内容,可以参考 (Ishizaka 和 Labib 2011);而若想了解更多应用案例,则可以参考 (Vaidya 和 Kumar 2006) 。