美文网首页topsis
AHP层次分析法基础内容及python代码实现

AHP层次分析法基础内容及python代码实现

作者: 王一二_biu | 来源:发表于2020-03-02 17:36 被阅读0次

    概述

    • 层次分析法是指将一个复杂的多目标决策问题作为一个系统,将目标分解为多个目标或准则,进而分解为多指标(或准则、约束)的若干层次,通过定性指标模糊量化方法算出层次单排序(权数)和总排序,以作为目标(多指标)、多方案优化决策的系统方法。
    • 层次分析法是将决策问题按总目标、各层子目标、评价准则直至具体的备投方案的顺序分解为不同的层次结构,然后用求解判断矩阵特征向量的办法,求得每一层次的各元素对上一层次某元素的优先权重,最后再加权和的方法递阶归并各备择方案对总目标的最终权重,此最终权重最大者即为最优方案。
    • 层次分析法比较适合于具有分层交错评价指标的目标系统,而且目标值又难于定量描述的决策问题。

    基本步骤

    1.建立层次结构模型

    • 将问题包含的因素分层:最高层(解决问题的目的);中间层(选择为实现总目标而采取的各种措施、方案所必须遵循的准则。也可称策略层、约束层、准则层等);最低层(用于解决问题的各种措施、方案等)。把各种所要考虑的因素放在适当的层次内。用层次结构图清晰地表达这些因素的关系。
    • 以干部选拔模型为具体实例展开论述。
    • 对三个干部候选人y1、y2 、y3,按选拔干部的五个标准:品德、才能、资历、年龄和群众关系,构成如下层次分析模型: 假设有三个干部候选人y1、y2 、y3,按选拔干部的五个标准:品德,才能,资历,年龄和群众关系,构成如下层次分析模型:


      选拔干部层次分析模型.png

    2.构造成对比较矩阵

    • 比较第i个元素与第j个元素相对于上一层某个因素的重要性时,使用数量化的相对权重a_{ij}来描述。设共有n个元素参与比较,则A=(a_{ij})_{n×n}称为成对比较矩阵。
    标度 含义
    a_{ij}=1 i与同样重要性
    a_{ij}=3 i比j稍微重要
    a_{ij}=5 i比j明显重要
    a_{ij}=7 i比j强烈重要
    a_{ij}=9 i比j极端重要
    2,4,6,8 上述两相邻判断的中值
    倒数 A和B相比如果标度为3,则B和A相比就是1/3
    • 选拔干部考虑5个条件:品德x1,才能x2,资历x3,年龄x4,群众关系x5。某决策人用成对比较法,得到成对比较矩阵如下:
      A= \left( \begin{matrix} 1 & 2 & 7 & 5 & 5\\ 1/2 & 1 & 4 & 3 & 3 \\ 1/7 & 1/4 & 1 & 1/2 & 1/3 \\ 1/5 & 1/3 & 2 & 1 & 1 \\ 1/5 & 1/3 & 3 & 1 & 1 \end{matrix} \right)

    3.一致性检验

    • 一致矩阵
      一致矩阵.jpg
      如果A是完全一致的成对比较矩阵,应该有a_{ij}a_{jk}=a_{ik},1\leq i,j,k\leq n.
    • 实际上,在构造成对比较矩阵时并不一定能满足一致矩阵的要求。因此,退而要求成对比较矩阵具有一定的一致性,即可以允许成对比较矩阵存在一定程度的不一致性。
    • 对一致矩阵,其绝对值最大的特征值等于该矩阵的维数。对成对比较矩阵的一致性要求转化为:其绝对值最大的特征值和该矩阵的维数相差不大。


      一致性检验步骤.png
    • 上述对比矩阵A的绝对值最大的特征值为5.141,则CI=\frac{5.141-5}{5-1}=0.03525查表值RI=1.12,故RC=\frac{CI}{RI}=0.0315 \lt0.1
      所以对比矩阵A的一致性可以接受。

    4.权重的计算

    • 上述对比矩阵A的绝对值最大的特征值所对应的特征向量为: p= \begin{bmatrix} -0.8399 & -0.4655 & -0.1014 & -0.1738 & -0.1935 \end{bmatrix}
    • 将该向量标准化,使得它的各分量都大于零,各分量之和等于 1。该特征向量标准化后为: w= \begin{bmatrix} 0.4734 & 0.2624 & 0.0572 & 0.0980 & 0.1091 \end{bmatrix}
    • 经过标准化后向量称为权向量。这里权向量反映了决策者选拔干部时,视品德条件最重要,其次是才能,再次是群众关系,年龄因素,最后才是资历。各因素的相对重要性由权向量的各分量所确定。

    5.层次总排序及决策

    • 要从三个候选人y1,y2,y3中选一个总体上最适合上述五个条件的候选人。对此,对三个候选人y1,y2,y3分别比较他们的品德(x1),才能(x2),资历(x3),年龄(x4),群众关系(x5)。
    • 先成对比较三个候选人的品德,得成对比较阵
      B1= \left(\begin{matrix} 1 & 1/3 & 1/8 \\3 & 1 & 1/3 \\8 & 3 & 1 \end{matrix} \right)
    • 对B1进行一致性检验,然后求得B1的权向量w1=\begin{bmatrix} 0.0819 & 0.2363 & 0.6817\end{bmatrix}
    • 分别比较三个候选人的才能,资历,年龄,群众关系得成对比较阵:
      B2=\left(\begin{matrix} 1 & 2 & 5 \\ 1/2 & 1 & 2 \\ 1/5 & 1/2 & 1 \end{matrix}\right) B3=\left(\begin{matrix} 1 & 1 & 3 \\ 1 & 1 & 3 \\ 1/3 & 1/3 & 1 \end{matrix}\right)
      B4 =\left( \begin{matrix} 1 & 3 & 4 \\ 1/3 & 1/3 & 1\\8 & 3 & 1 \end{matrix}\right) B5=\left( \begin{matrix} 1 & 1/3 & 1/8 \\ 3 & 1 & 1/3 \\8 & 3 & 1 \end{matrix}\right)
    • 相应的权向量为
      w2 =\begin{bmatrix} 0.5954 & 0.2764 & 0.1283\end{bmatrix} w3 =\begin{bmatrix} 0.4286 & 0.4286 & 0.1429\end{bmatrix} w4=\begin{bmatrix} 0.6337 & 0.1919 & 0.1743\end{bmatrix} w5=\begin{bmatrix} 0.3047 & 0.1667 & 0.5286 \end{bmatrix}
    • 由上述数据,我们可以得到如下的一张表格:
    权重指标 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

    其中,总分的计算为\sum_{j=1}^5 x_j y_{ij},其中x_i代表第j个指标的权重,y_{ij}代表第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)
    

    相关文章

      网友评论

        本文标题:AHP层次分析法基础内容及python代码实现

        本文链接:https://www.haomeiwen.com/subject/lywgfhtx.html