正互反矩阵一致性调整方法(徐泽水1999)
1. 算法步骤:
主要算法步骤:
假设\(A = (a_{ij})_{n \times n }\) 是一个正互反判断矩阵,迭代步骤记为\(k\), 调整参数\(0 < \lambda <1\)
令\(A^{0} = A\), \(CR^* = 0.1,k =0\)
计算\(A^{k} = (a_{ij}^{k})_{n\times n}\) 的最大特征值\(\lambda_{max}(A^k)\)以及对应的特征向量\(w^{k} = (w_1^k,w_2^k,\cdots,w_n^k)\)
计算一致性指标\(CI^{k} = \dfrac{\lambda_{max}(A^k) -n}{n-1}\),以及一致性比率\(CR^{k} = \dfrac{CI^k}{RI}\),\(RI\)指标有Saaty给出。
如果\(CR^k < CR^*\),则转第6步,否则转第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\),然后转到第二步
输出\(k, A^k,\lambda_{max}(A^k),CR^k,w^k\)
结束
2. 主要函数构建
consistency():
求正互反判断矩阵的一致性指标,返回一个listadjust_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