---
title: 正互反矩阵一致性调整方法(徐泽水1999)
date: '2019-05-03'
categories: uncertain
---
```{r setup, include=FALSE}
options(width = 600)
knitr::opts_chunk$set(autodep=TRUE,message = F,warning = F,comment = "#>",collapse = TRUE)
```
# 正互反矩阵一致性调整方法(徐泽水1999)
## 0. 参考论文:
徐泽水:[A consistency improving method in the analytic hierarchy process](http://www.sciencedirect.com/science/article/pii/S037722179800109X) 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() :` 利用论文的方法进行调整,返回调整后符合一致性条件的一致性矩阵。
```{r}
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
```{r}
A = matrix(c(1,3,5,
1/3,1,1/2,
1/5,2,1),nrow = 3,ncol = 3,byrow = T)
MASS::fractions(A)
adjust_w(A,0.1)
adjust_w(A,0.3)
library(magrittr)
adjust_w(A,0.5) %>% consistency() %>% .$eig_w
```
### 3.2 测试矩阵2 — 论文的example2
```{r}
#### 测试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)
adjust_w(A,0.5) %>% round(.,3)
adjust_w(A,0.5) %>% round(.,3) %>% consistency()
adjust_w(A,0.98) %>% round(.,3)
adjust_w(A,0.98) %>% round(.,3) %>% consistency()
```
## 4. 总结