正互反矩阵一致性调整方法(徐泽水1999)

正互反矩阵一致性调整方法(徐泽水1999)

0. 参考论文:

徐泽水:A consistency improving method in the analytic hierarchy process 1999年

以下是对论文的实现。

1. 算法步骤:

主要算法步骤:

假设\(A = (a_{ij})_{n \times n }\) 是一个正互反判断矩阵,迭代步骤记为\(k\), 调整参数\(0 < \lambda <1\)

  1. \(A^{0} = A\)\(CR^* = 0.1,k =0\)

  2. 计算\(A^{k} = (a_{ij}^{k})_{n\times n}\) 的最大特征值\(\lambda_{max}(A^k)\)以及对应的特征向量\(w^{k} = (w_1^k,w_2^k,\cdots,w_n^k)\)

  3. 计算一致性指标\(CI^{k} = \dfrac{\lambda_{max}(A^k) -n}{n-1}\),以及一致性比率\(CR^{k} = \dfrac{CI^k}{RI}\)\(RI\)指标有Saaty给出。

  4. 如果\(CR^k < CR^*\),则转第6步,否则转第5步

  5. \(A^{k+1} = (a_{ij}^{k+1})\),其中

    \[a_{ij}^{k+1} =( a_{ij}^{k} )^{\lambda} ( \dfrac{w_i^k}{w_j^k})^{1-\lambda}\]

    \(k = k+1\),然后转到第二步

  6. 输出\(k, A^k,\lambda_{max}(A^k),CR^k,w^k\)

  7. 结束

2. 主要函数构建

  • consistency(): 求正互反判断矩阵的一致性指标,返回一个list
  • adjust_w() : 利用论文的方法进行调整,返回调整后符合一致性条件的一致性矩阵。

consistency = function(A){
  lambda = Re(eigen(A)$values[1]) # 矩阵A的最大特征值
  n  = nrow(A)
  RI = c(0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45);
  CI = (lambda-n) / (n-1);
  CR = CI / RI[n];
  eig_w = eigen(A)$vectors[,1] / sum( eigen(A)$vectors[,1]);
  return(list("eig_value"=lambda,"CI"=CI,"RI"=RI[n],"CR"=CR,'eig_w'=Re( eig_w )))
}


adjust_w <- function(A, lambda) {
  k <- 0
  n = nrow(A)
  m = ncol(A)
  stopifnot(n == m)
  
  temp_CR <- consistency(A)$CR
  temp_w <- consistency(A)$eig_w
  while (temp_CR >= 0.1 && k < 1000) {
    for (i in 1:n) {
      for (j in 1:n) {
          A[i, j] <- (A[i, j]^lambda) * (temp_w[i] / temp_w[j])^(1 - lambda)
      }
    }
    temp_CR <- consistency(A)$CR
    temp_w <- consistency(A)$eig_w
    k <- k + 1
  }
  return(A)
}

3. 测试

3.1 矩阵1 — 论文的example1


A = matrix(c(1,3,5,
                     1/3,1,1/2,
              1/5,2,1),nrow = 3,ncol = 3,byrow = T)
MASS::fractions(A)
#>      [,1] [,2] [,3]
#> [1,]   1    3    5 
#> [2,] 1/3    1  1/2 
#> [3,] 1/5    2    1
    
    
adjust_w(A,0.1)
#>           [,1]     [,2]      [,3]
#> [1,] 1.0000000 4.305116 3.4842265
#> [2,] 0.2322818 1.000000 0.7175194
#> [3,] 0.2870077 1.393691 1.0000000
adjust_w(A,0.3)
#>           [,1]     [,2]      [,3]
#> [1,] 1.0000000 3.973071 3.7754173
#> [2,] 0.2516945 1.000000 0.6621785
#> [3,] 0.2648714 1.510167 1.0000000
library(magrittr)
adjust_w(A,0.5) %>% consistency() %>% .$eig_w
#> [1] 0.6570714 0.1466217 0.1963069

3.2 测试矩阵2 — 论文的example2


####  测试2 ,此矩阵来自徐泽水  example 2 ------ CR初始值为0.1690869
A = matrix(c(1  ,5  ,3  , 7 ,6  ,6  ,1/3, 1/4,
             1/5,1  ,1/3, 5 ,3  ,3  ,1/5, 1/7,
             1/3,3  ,1  , 6, 3 ,4  ,6  ,1/5,
             1/7,1/5,1/6, 1 ,1/3,1/4,1/7,1/8,
             1/6,1/3,1/3, 3 ,1  ,1/2,1/5,1/6,
             1/6,1/3,1/4, 4 ,2  ,1  ,1/5,1/6,
             3,5,1/6,7,5, 5 ,1  ,1/2,
             4,7,5,8,6,6,2,1),nrow = 8,byrow = T)
consistency(A)
#> $eig_value
#> [1] 9.668887
#> 
#> $CI
#> [1] 0.2384125
#> 
#> $RI
#> [1] 1.41
#> 
#> $CR
#> [1] 0.1690869
#> 
#> $eig_w
#> [1] 0.17301747 0.05397572 0.18811030 0.01750791 0.03104374 0.03632220 0.16683367 0.33318898

adjust_w(A,0.5) %>% round(.,3)
#>       [,1]  [,2]  [,3]   [,4]  [,5]  [,6]  [,7]  [,8]
#> [1,] 1.000 4.003 1.661  8.317 5.783 5.346 0.588 0.360
#> [2,] 0.250 1.000 0.309  3.926 2.284 2.111 0.254 0.152
#> [3,] 0.602 3.233 1.000  8.029 4.264 4.551 2.601 0.336
#> [4,] 0.120 0.255 0.125  1.000 0.434 0.347 0.122 0.081
#> [5,] 0.173 0.438 0.235  2.306 1.000 0.654 0.193 0.125
#> [6,] 0.187 0.474 0.220  2.881 1.530 1.000 0.209 0.135
#> [7,] 1.701 3.931 0.384  8.167 5.184 4.792 1.000 0.500
#> [8,] 2.775 6.573 2.976 12.339 8.025 7.419 1.999 1.000
adjust_w(A,0.5) %>% round(.,3) %>% consistency()
#> $eig_value
#> [1] 8.364962
#> 
#> $CI
#> [1] 0.05213748
#> 
#> $RI
#> [1] 1.41
#> 
#> $CR
#> [1] 0.03697694
#> 
#> $eig_w
#> [1] 0.17351165 0.05651054 0.17591319 0.01796455 0.03219959 0.03799057 0.16954713 0.33636278


adjust_w(A,0.98) %>% round(.,3)
#>       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
#> [1,] 1.000 4.524 2.339 7.523 5.888 5.686 0.425 0.292
#> [2,] 0.221 1.000 0.326 4.516 2.671 2.580 0.222 0.147
#> [3,] 0.428 3.067 1.000 6.749 3.460 4.188 4.155 0.249
#> [4,] 0.133 0.221 0.148 1.000 0.373 0.287 0.134 0.104
#> [5,] 0.170 0.374 0.289 2.681 1.000 0.561 0.197 0.147
#> [6,] 0.176 0.388 0.239 3.479 1.784 1.000 0.204 0.153
#> [7,] 2.354 4.497 0.241 7.479 5.073 4.899 1.000 0.501
#> [8,] 3.419 6.786 4.024 9.625 6.783 6.551 1.996 1.000

adjust_w(A,0.98) %>% round(.,3) %>% consistency()
#> $eig_value
#> [1] 8.959504
#> 
#> $CI
#> [1] 0.137072
#> 
#> $RI
#> [1] 1.41
#> 
#> $CR
#> [1] 0.09721419
#> 
#> $eig_w
#> [1] 0.17313861 0.05608879 0.17879317 0.01785944 0.03188025 0.03766898 0.16967291 0.33489784

4. 总结


次;