2.1 模糊互补判断矩阵的排序方法

徐泽水《不确定多属性决策方法与应用》59页

###  2.1 模糊互补判断矩阵的排序方法---徐泽水《不确定多属性决策方法与应用》59页 --2.1.6 实例分析
# 以及55页 例 2.1
B = c(0.5,0.7,0.6,0.8,
      0.3,0.5,0.4,0.6,
      0.4,0.6,0.5,0.7,
      0.2,0.4,0.3,0.5) 
B = matrix(B, nrow = 4,ncol = 4,byrow = T)
######## MTM 排序法---模糊互补判断矩阵的中转法
# MTM 函数直接输入模糊互补判断矩阵B,直接即可求出对应案例(即行,决策矩阵行代表案例,列代表属性)的权重向量w.
MTM = function(B){
  w = 0
  n = nrow(B)
  m = ncol(B)
  stopifnot(n==m)
  for(i in 1:n){
    w[i] =( sum(B[i,]) + n/2 -1) /(n*(n-1))
  }
  return(w)
}
MTM(B)
#> [1] 0.3000000 0.2333333 0.2666667 0.2000000

########## LVM 排序---- 模糊互补判断矩阵排序的最小方差法
# LVM函数直接输入模糊互补判断矩阵B,直接即可求出对应案例(即行,决策矩阵行代表案例,列代表属性)的权重向量w.
LVM = function(x){
  w =0
  n = nrow(B)
  m = ncol(B)
  stopifnot(n==m)
  for(i in 1:n){
    w[i] =( sum(B[i,]) + 1 - n/2 )/n 
  }
  return(w)
}
LVM(B)
#> [1] 0.4 0.2 0.3 0.1
### LDM 排序 -------模糊互补判断矩阵排序的最小偏差法
# LDM 函数 --本质是求解一个线性规划问题。
LDM = function(B){
  n = nrow(B)
  m =  ncol(B)
  stopifnot(n == m)
  w = matrix(runif(n, min = 0.1, max = 0.9),nrow = 1,byrow = T)# 随机初始化正向量w
  e = 0.0001 # 迭代精度,要求权向量的每一个分量都小于此精度,则迭代结束。
  k = 0 # 迭代次数
  repeat{
    eta = rep(0,n) # 初始化中间变量
    for(i in 1:n){
      for(j in 1:n){
        eta[i] = eta[i] + (B[i, j]/B[j, i]) * (w[j]/w[i]) - (B[j, i]/B[i, j]) * (w[i]/w[j])
      }
    }
    v = 0; w1 = rep(0,n);v_fenzi = 0; v_fenmu = 0 # 初始化中间变量
    if( all( abs(eta) < e) ) {
      break
    }else{
      l = which.max(abs(eta))
      for(j in 1:n){
        if(j != l) {
          v_fenzi = v_fenzi + B[l,j]/B[j,l] * w[j]/w[l]
          v_fenmu = v_fenmu + B[j,l]/B[l,j] * w[l]/w[j]
        }
      }
      v =  sqrt(v_fenzi/v_fenmu)
      for(i in 1:n){
        if(i != l){
          w1[i] = w[i]
        }else{
          w1[i] = v * w[l]
        }
      }
      k = k+1
      w = w1/sum(w1)
    }
  }
  return(w)  
}
LDM(B)
#> [1] 0.4302043 0.1799474 0.2748741 0.1149742

##### CEM -- 模糊互补判断矩阵排序的特征向量法
# CEM函数
CEM = function(B){
  # 第一步 ---通过转换公式,得出转换矩阵H
  n = nrow(B)
  H = matrix(0, ncol = n, nrow = n)
  for( i in 1:n){
    for(j in 1:n){
      H[i,j] = B[i,j]/B[j,i]
    }
  }
  # 第二步 -- 求转换矩阵H的最大特征值对应的特征向量,此特征向量即模糊互补判断矩阵的排序向量
  #### 直接调用系统函数求矩阵的特征值以及特征向量
  # w = Re(eigen(H)$vectors[,1] / sum(eigen(H)$vectors[,1]))
  # return(w)
  ####  数值方法求矩阵H的最大特征值对应的特征向量,
  max_eigen_w =  function(M) {
    n = nrow(M)
    m =  ncol(M)
    stopifnot(n == m)
    w = matrix(runif(n, min = 0.1, max = 0.9),nrow = 1,byrow = T)# 随机初始化正向量w
    q = max(w)
    w = w / q # 并初始化权向量
    # 进行迭代
    repeat{
      w = M %*% t(w)
      w = t(w)
      q1 = max(w)
      w = w/q1
      e = q1 - q # 迭代的精度
      if(abs(e) < 0.000001) {
        break
      }
      q = q1
    }
    return(w)
  }
  w = max_eigen_w(H)
  # 第三步 ---- 并对特征向量进行归一化处理
  w = w / sum(w)
  return(w)
}

CEM(B)
#>           [,1]      [,2]      [,3]      [,4]
#> [1,] 0.4303074 0.1798951 0.2747969 0.1150005


##### 检验模糊互补判断矩阵一致性
# 直接输入模糊互补判断矩阵可得CR指标,CR<0.1 ,一般检验通过
CEM_CR_test =  function(B, w = CEM(B)){
  # 第一步 -- 先要先求出权重向量w -- 即模糊互补矩阵对应的最大特征值的特征向量 ,直接进行默认参数设置。
  # 注意调用此函数之前,要调用CEM函数
  
  n = nrow(B)
  CI = 0
  for(i in 1:n) {
    for (j in 1:n) {
      if (i < j) {
        CI = CI + (B[i, j] / B[j, i]) * (w[j] / w[i]) + (B[j, i] / B[i, j]) * (w[i] / w[j]) -2
      }
    }
  }
  CI = CI /(n*(n-1))  
  RI = c(0,0,0.52,0.89,1.12,1.26,1.36,1.41,1.46,1.49,1.52,1.56,1.58,1.59)
  return( CI/RI[n]) 
}

CEM_CR_test(B)
#> [1] 0.0008969988


######  55 页 -----例2.1 
B = c(0.5,0.6,0.4,0.3,
      0.4,0.5,0.6,0.6,
      0.6,0.4,0.5,0.7,
      0.7,0.4,0.3,0.5) 
B = matrix(B, nrow = 4,ncol = 4,byrow = T)
CEM(B)
#>           [,1]      [,2]     [,3]      [,4]
#> [1,] 0.2043336 0.2697384 0.297326 0.2286019
CEM_CR_test(B)
#> [1] 0.1609257

次;