概述
- 层次分析法是指将一个复杂的多目标决策问题作为一个系统,将目标分解为多个目标或准则,进而分解为多指标(或准则、约束)的若干层次,通过定性指标模糊量化方法算出层次单排序(权数)和总排序,以作为目标(多指标)、多方案优化决策的系统方法。
- 层次分析法是将决策问题按总目标、各层子目标、评价准则直至具体的备投方案的顺序分解为不同的层次结构,然后用求解判断矩阵特征向量的办法,求得每一层次的各元素对上一层次某元素的优先权重,最后再加权和的方法递阶归并各备择方案对总目标的最终权重,此最终权重最大者即为最优方案。
- 层次分析法比较适合于具有分层交错评价指标的目标系统,而且目标值又难于定量描述的决策问题。
基本步骤
1.建立层次结构模型
- 将问题包含的因素分层:最高层(解决问题的目的);中间层(选择为实现总目标而采取的各种措施、方案所必须遵循的准则。也可称策略层、约束层、准则层等);最低层(用于解决问题的各种措施、方案等)。把各种所要考虑的因素放在适当的层次内。用层次结构图清晰地表达这些因素的关系。
- 以干部选拔模型为具体实例展开论述。
-
对三个干部候选人y1、y2 、y3,按选拔干部的五个标准:品德、才能、资历、年龄和群众关系,构成如下层次分析模型: 假设有三个干部候选人y1、y2 、y3,按选拔干部的五个标准:品德,才能,资历,年龄和群众关系,构成如下层次分析模型:
选拔干部层次分析模型.png
2.构造成对比较矩阵
- 比较第i个元素与第j个元素相对于上一层某个因素的重要性时,使用数量化的相对权重来描述。设共有n个元素参与比较,则称为成对比较矩阵。
标度 | 含义 |
---|---|
i与同样重要性 | |
i比j稍微重要 | |
i比j明显重要 | |
i比j强烈重要 | |
i比j极端重要 | |
2,4,6,8 | 上述两相邻判断的中值 |
倒数 | A和B相比如果标度为3,则B和A相比就是1/3 |
- 选拔干部考虑5个条件:品德x1,才能x2,资历x3,年龄x4,群众关系x5。某决策人用成对比较法,得到成对比较矩阵如下:
3.一致性检验
- 一致矩阵
一致矩阵.jpg
如果A是完全一致的成对比较矩阵,应该有 - 实际上,在构造成对比较矩阵时并不一定能满足一致矩阵的要求。因此,退而要求成对比较矩阵具有一定的一致性,即可以允许成对比较矩阵存在一定程度的不一致性。
-
对一致矩阵,其绝对值最大的特征值等于该矩阵的维数。对成对比较矩阵的一致性要求转化为:其绝对值最大的特征值和该矩阵的维数相差不大。
一致性检验步骤.png - 上述对比矩阵A的绝对值最大的特征值为5.141,则查表值,故。
所以对比矩阵A的一致性可以接受。
4.权重的计算
- 上述对比矩阵A的绝对值最大的特征值所对应的特征向量为:
- 将该向量标准化,使得它的各分量都大于零,各分量之和等于 1。该特征向量标准化后为:
- 经过标准化后向量称为权向量。这里权向量反映了决策者选拔干部时,视品德条件最重要,其次是才能,再次是群众关系,年龄因素,最后才是资历。各因素的相对重要性由权向量的各分量所确定。
5.层次总排序及决策
- 要从三个候选人y1,y2,y3中选一个总体上最适合上述五个条件的候选人。对此,对三个候选人y1,y2,y3分别比较他们的品德(x1),才能(x2),资历(x3),年龄(x4),群众关系(x5)。
- 先成对比较三个候选人的品德,得成对比较阵
- 对B1进行一致性检验,然后求得B1的权向量
- 分别比较三个候选人的才能,资历,年龄,群众关系得成对比较阵:
- 相应的权向量为
- 由上述数据,我们可以得到如下的一张表格:
权重指标 | y1 | y2 | y3 | |
---|---|---|---|---|
x1 | 0.4734 | 0.0819 | 0.2363 | 0.6817 |
x2 | 0.2624 | 0.5954 | 0.2764 | 0.1283 |
x3 | 0.0572 | 0.4286 | 0.4286 | 0.1429 |
x4 | 0.0989 | 0.6337 | 0.1919 | 0.1743 |
x5 | 0.1091 | 0.3047 | 0.1667 | 0.5286 |
总分 | 0.3148 | 0.2459 | 0.4393 |
其中,总分的计算为,其中代表第j个指标的权重,代表第i个候选人的第j个指标的得分。
- 从三个候选人的得分情况看,y3的得分最高,故y3是第一干部候选人。
总结
使用层次分析法,
- 首先,要分析系统中各因素之间的关系,建立系统的递阶层次结构;
- 其次,对于同一层次的各元素关于上一层某一准则的重要性进行两两比较,构造两两比较矩阵;
- 接着,由判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验;
- 最后,计算各层元素对系统目标的合成权重,并进行排序。
参考文献
https://wiki.mbalib.com/wiki/%E5%B1%82%E6%AC%A1%E5%88%86%E6%9E%90%E6%B3%95
附python代码
import numpy as np
'''
@Description:
求解矩阵的权向量
@para:
成对比较矩阵
@return:
权向量
'''
def abhWeightVector(Mat):
sizeMat = Mat.shape[0]
#print(Mat)
#print(sizeMat)
# 计算矩阵A的特征值,特征向量
eigenvalueMat, eigenvectorMat = np.linalg.eig(Mat)
#print("特征值:", eigenvalueMat)
#print("特征向量:", eigenvectorMat)
# 将所有特征值取绝对值
absEigenvalueMat = map(abs, eigenvalueMat)
absEigenvalueMat = list(absEigenvalueMat)
#print(absEigenvalueMat)
# 绝对值最大的特征值
maxEigenvalueMat = max(absEigenvalueMat)
#print("绝对值最大的特征值:", maxEigenvalueMat)
# 绝对值最大的特征值的索引
maxEigenvalueIndexMat = absEigenvalueMat.index(maxEigenvalueMat)
#print(maxEigenvalueIndexMat)
# 绝对值最大的特征值对应的特征向量
maxEigenvectorMat = eigenvectorMat[:, maxEigenvalueIndexMat]
#print("绝对值最大的特征值对应的特征向量:", maxEigenvectorMat)
# 将上述特征向量标准化,即权向量
standardizeVectorMat = list(map(abs, maxEigenvectorMat)) / sum(list(map(abs, maxEigenvectorMat)))
#print(standardizeVectorMat)
# 计算不一致程度CI
CI = (maxEigenvalueMat - sizeMat) / (sizeMat - 1)
#print(CI)
# 平均随机一致性指标RI
listRI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45]
#计算随机一致性比率
CR = CI / listRI[sizeMat - 1]
#print(CR)
return standardizeVectorMat
MatA = np.array([[1, 2, 7, 5 ,5],
[1/2, 1, 4, 3, 3],
[1/7, 1/4, 1, 1/2, 1/2],
[1/5, 1/3, 2, 1, 1],
[1/5, 1/3, 3, 1, 1]])
standardizeVectorMatA = abhWeightVector(MatA)
print(standardizeVectorMatA)
MatB1 = np.array([[1, 1/3, 1/8],
[3, 1, 1/3],
[8, 3, 1]])
standardizeVectorMatB1 = abhWeightVector(MatB1)
print(standardizeVectorMatB1)
MatB2 = np.array([[1, 2, 5],
[1/2, 1, 2],
[1/5, 1/2, 1]])
standardizeVectorMatB2 = abhWeightVector(MatB2)
print(standardizeVectorMatB2)
MatB3 = np.array([[1, 1, 3],
[1, 1, 3],
[1/3, 1/3, 1]])
standardizeVectorMatB3 = abhWeightVector(MatB3)
print(standardizeVectorMatB3)
MatB4 = np.array([[1, 3, 4],
[1/3, 1, 1],
[1/4, 1, 1]])
standardizeVectorMatB4 = abhWeightVector(MatB4)
print(standardizeVectorMatB4)
MatB5 = np.array([[1, 4, 1/4],
[1, 1, 1/4],
[4, 1, 1]])
standardizeVectorMatB5 = abhWeightVector(MatB5)
print(standardizeVectorMatB5)
MatB = np.array([standardizeVectorMatB1,
standardizeVectorMatB2,
standardizeVectorMatB3,
standardizeVectorMatB4,
standardizeVectorMatB5])
print(MatB)
sumY1 = 0
sumY2 = 0
sumY3 = 0
for i in range(0, MatA.shape[0]):
sumY1 += standardizeVectorMatA[i] * MatB[i][0]
sumY2 += standardizeVectorMatA[i] * MatB[i][1]
sumY3 += standardizeVectorMatA[i] * MatB[i][2]
sumY = [sumY1, sumY2, sumY3]
print(sumY)
maxY = max(sumY)
theBestIndex = sumY.index(maxY)
print(theBestIndex)
网友评论