4.2基于投影的多属性决策方法(含4.3区间归一化)

#徐泽水《不确定多属性决策方法与应用》112页 ## 第四章–属性权重为实数且属性值为区间数的多属性决策方法及应用 ### 4.2 基于投影的多属性决策方法

#####  第四章--属性权重为实数且属性值为区间数的多属性决策方法及应用
## 4.2 基于投影的多属性决策方法---徐泽水《不确定多属性决策方法与应用》112页 
## 4.2.2 实例分析

#####  第一步: 求出规范化矩阵
A = c(58.9,59,200,250,1.9,2.1,0.990,0.991,0.907,0.909,
      58.5,58.7,340,350,3.4,3.5,0.990,0.992,0.910,0.912,
      58.0,58.5,290,310,2.0,2.2,0.992,0.993,0.914,0.917) 
A = matrix(A,nrow = 3,byrow = T) # A为决策矩阵
A # 矩阵A的奇数列代表属性的下界 ,偶数列代表属性的上界
#>      [,1] [,2] [,3] [,4] [,5] [,6]  [,7]  [,8]  [,9] [,10]
#> [1,] 58.9 59.0  200  250  1.9  2.1 0.990 0.991 0.907 0.909
#> [2,] 58.5 58.7  340  350  3.4  3.5 0.990 0.992 0.910 0.912
#> [3,] 58.0 58.5  290  310  2.0  2.2 0.992 0.993 0.914 0.917


norm_matrix = function(A, shouyi = NULL, chengben = NULL) {
  m = ncol(A)/2
  n = nrow(A)
  #chengben = c(1,2,4,5);shouyi = NULL
  stopifnot( ncol(A)%%2 == 0 ) #检验输入的决策矩阵的列数是否为偶数
  stopifnot(!is.null(shouyi) | !is.null(chengben))
  if (is.null(chengben)) chengben = setdiff(1:m, shouyi)
  if (is.null(shouyi)) shouyi = setdiff(1:m, chengben)
  # 如果输入的shouyi与chengben向量交集不为空,且并集不是全集,则算法出错
  stopifnot(length(intersect(shouyi, chengben)) == 0, setequal(union(shouyi, chengben), 1:m))
  
  R = matrix(0, nrow = nrow(A),ncol = ncol(A))
  for(i in 1:n){
    for(j in 1:ncol(A) ){
      k = (j+1) %/% 2
      if( k %in% shouyi){
        if( (j%%2) == 0 ){# 第j列为收益类型 且为偶数
          R[i,j] = A[i,j] / sqrt(sum(A[,j-1]^2))
        }else{
          R[i,j] = A[i,j] / sqrt(sum(A[,j+1]^2))
        }
      }
      if(k %in% chengben){
        if( (j%%2) == 0 ){
          R[i,j] = (1/A[i,j-1]) / sqrt(sum((1/A[,j])^2))
        }else{
          R[i,j] = (1/A[i,j+1]) / sqrt(sum((1/A[,j])^2))
        }
      }
    }
  }

  return(R)
}
library(dplyr)
R = norm_matrix(A,chengben = c(1,3))
R
#>           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
#> [1,] 0.5720972 0.5757060 0.3772242 0.5106296 0.6079511 0.7334020 0.5761861
#> [2,] 0.5750210 0.5796425 0.6412812 0.7148814 0.3647707 0.4098423 0.5761861
#> [3,] 0.5769869 0.5846394 0.5469751 0.6331807 0.5803170 0.6967319 0.5773501
#>           [,8]      [,9]     [,10]
#> [1,] 0.5775443 0.5737618 0.5765018
#> [2,] 0.5781271 0.5756596 0.5784044
#> [3,] 0.5787098 0.5781900 0.5815755
R %>% round(.,4)
#>        [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]  [,10]
#> [1,] 0.5721 0.5757 0.3772 0.5106 0.6080 0.7334 0.5762 0.5775 0.5738 0.5765
#> [2,] 0.5750 0.5796 0.6413 0.7149 0.3648 0.4098 0.5762 0.5781 0.5757 0.5784
#> [3,] 0.5770 0.5846 0.5470 0.6332 0.5803 0.6967 0.5774 0.5787 0.5782 0.5816

w = c(0.2189,0.2182,0.1725,0.2143,0.1761)
Y = t(apply(R, 1 , function(x){x* rep(w,each = 2)})) %>% round(.,4)
Y
#>        [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]  [,10]
#> [1,] 0.1252 0.1260 0.0823 0.1114 0.1049 0.1265 0.1235 0.1238 0.1010 0.1015
#> [2,] 0.1259 0.1269 0.1399 0.1560 0.0629 0.0707 0.1235 0.1239 0.1014 0.1019
#> [3,] 0.1263 0.1280 0.1193 0.1382 0.1001 0.1202 0.1237 0.1240 0.1018 0.1024

position_y = apply(Y, 2, function(x)max(x))
position_y
#>  [1] 0.1263 0.1280 0.1399 0.1560 0.1049 0.1265 0.1237 0.1240 0.1018 0.1024
apply(Y, 1,function(x)sum(x*position_y))/sqrt(sum(position_y^2))
#> [1] 0.3536778 0.3634614 0.3757275

4.3 区间归一化

** 注:书中的归一化有问题 **

rm(list = ls() )
#####  第一步: 求出规范化矩阵
A = c(1.5,1.9,9,9.5,8,9,10,12,12,13,8,9,2,3,1.2,1.3,
      2.7,3.1,5,6,9,9.5,4,5,4,5,7,8,9,10,1.1,1.2,
      1.8,2,8.5,9.1,7,8,8,9,9,10,8.5,9,5,6,1,1.3,
      2.5,2.8,5,6,9,10,6,7,6,8,7,7.5,8,9,0.8,0.9,
      2,2.5,4,5,8,9,5,6,5,7,8,9,5,6,0.6,0.7) 
A = matrix(A,nrow = 5,byrow = T) # A为决策矩阵
A # 矩阵A的奇数列代表属性的下界 ,偶数列代表属性的上界
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#> [1,]  1.5  1.9  9.0  9.5    8  9.0   10   12   12    13   8.0   9.0     2     3
#> [2,]  2.7  3.1  5.0  6.0    9  9.5    4    5    4     5   7.0   8.0     9    10
#> [3,]  1.8  2.0  8.5  9.1    7  8.0    8    9    9    10   8.5   9.0     5     6
#> [4,]  2.5  2.8  5.0  6.0    9 10.0    6    7    6     8   7.0   7.5     8     9
#> [5,]  2.0  2.5  4.0  5.0    8  9.0    5    6    5     7   8.0   9.0     5     6
#>      [,15] [,16]
#> [1,]   1.2   1.3
#> [2,]   1.1   1.2
#> [3,]   1.0   1.3
#> [4,]   0.8   0.9
#> [5,]   0.6   0.7

norm_matrix = function(A, shouyi = NULL, chengben = NULL) {
  m = ncol(A)/2
  n = nrow(A)
  #chengben = c(1,2,4,5);shouyi = NULL
  stopifnot( ncol(A)%%2 == 0 ) #检验输入的决策矩阵的列数是否为偶数
  stopifnot(!is.null(shouyi) | !is.null(chengben))
  if (is.null(chengben)) chengben = setdiff(1:m, shouyi)
  if (is.null(shouyi)) shouyi = setdiff(1:m, chengben)
  # 如果输入的shouyi与chengben向量交集不为空,且并集不是全集,则算法出错
  stopifnot(length(intersect(shouyi, chengben)) == 0, setequal(union(shouyi, chengben), 1:m))
  
  R = matrix(0, nrow = nrow(A),ncol = ncol(A))
  for(i in 1:n){
    for(j in 1:ncol(A) ){
      k = (j+1) %/% 2
      if( k %in% shouyi){
        if( (j%%2) == 0 ){# 第j列为收益类型 且为偶数
          R[i,j] = A[i,j] / sqrt(sum(A[,j-1]^2))
        }else{
          R[i,j] = A[i,j] / sqrt(sum(A[,j+1]^2))
        }
      }
      if(k %in% chengben){
        if( (j%%2) == 0 ){
          R[i,j] = (1/A[i,j-1]) / sqrt(sum((1/A[,j])^2))
        }else{
          R[i,j] = (1/A[i,j+1]) / sqrt(sum((1/A[,j])^2))
        }
      }
    }
  }

  return(R)
}

R = norm_matrix(A,chengben = c(1,2,4,5)) %>% round(.,2)
R 
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#> [1,] 0.46 0.70 0.26 0.32 0.39 0.49 0.21 0.31 0.20  0.27  0.42  0.52  0.12  0.21
#> [2,] 0.28 0.39 0.41 0.58 0.44 0.52 0.51 0.76 0.52  0.82  0.37  0.46  0.56  0.71
#> [3,] 0.44 0.58 0.27 0.34 0.34 0.43 0.28 0.38 0.26  0.37  0.45  0.52  0.31  0.43
#> [4,] 0.31 0.42 0.41 0.58 0.44 0.54 0.36 0.51 0.32  0.55  0.37  0.43  0.49  0.64
#> [5,] 0.35 0.52 0.49 0.73 0.39 0.49 0.42 0.61 0.37  0.66  0.42  0.52  0.31  0.43
#>      [,15] [,16]
#> [1,]  0.49  0.60
#> [2,]  0.44  0.56
#> [3,]  0.40  0.60
#> [4,]  0.32  0.42
#> [5,]  0.24  0.32
R %>% round(.,2)
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#> [1,] 0.46 0.70 0.26 0.32 0.39 0.49 0.21 0.31 0.20  0.27  0.42  0.52  0.12  0.21
#> [2,] 0.28 0.39 0.41 0.58 0.44 0.52 0.51 0.76 0.52  0.82  0.37  0.46  0.56  0.71
#> [3,] 0.44 0.58 0.27 0.34 0.34 0.43 0.28 0.38 0.26  0.37  0.45  0.52  0.31  0.43
#> [4,] 0.31 0.42 0.41 0.58 0.44 0.54 0.36 0.51 0.32  0.55  0.37  0.43  0.49  0.64
#> [5,] 0.35 0.52 0.49 0.73 0.39 0.49 0.42 0.61 0.37  0.66  0.42  0.52  0.31  0.43
#>      [,15] [,16]
#> [1,]  0.49  0.60
#> [2,]  0.44  0.56
#> [3,]  0.40  0.60
#> [4,]  0.32  0.42
#> [5,]  0.24  0.32


w = c(0.1,0.12,0.15,0.13,0.17,0.11,0.12,0.1)
Y = t(apply(R, 1 , function(x){x* rep(w,each = 2)})) %>% round(.,3)
Y
#>       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12]
#> [1,] 0.046 0.070 0.031 0.038 0.058 0.074 0.027 0.040 0.034 0.046 0.046 0.057
#> [2,] 0.028 0.039 0.049 0.070 0.066 0.078 0.066 0.099 0.088 0.139 0.041 0.051
#> [3,] 0.044 0.058 0.032 0.041 0.051 0.064 0.036 0.049 0.044 0.063 0.050 0.057
#> [4,] 0.031 0.042 0.049 0.070 0.066 0.081 0.047 0.066 0.054 0.094 0.041 0.047
#> [5,] 0.035 0.052 0.059 0.088 0.058 0.074 0.055 0.079 0.063 0.112 0.046 0.057
#>      [,13] [,14] [,15] [,16]
#> [1,] 0.014 0.025 0.049 0.060
#> [2,] 0.067 0.085 0.044 0.056
#> [3,] 0.037 0.052 0.040 0.060
#> [4,] 0.059 0.077 0.032 0.042
#> [5,] 0.037 0.052 0.024 0.032

norm_matrix(A,shouyi = c(3,6,7,8)) %>% round(.,2)
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#> [1,] 0.46 0.70 0.26 0.32 0.39 0.49 0.21 0.31 0.20  0.27  0.42  0.52  0.12  0.21
#> [2,] 0.28 0.39 0.41 0.58 0.44 0.52 0.51 0.76 0.52  0.82  0.37  0.46  0.56  0.71
#> [3,] 0.44 0.58 0.27 0.34 0.34 0.43 0.28 0.38 0.26  0.37  0.45  0.52  0.31  0.43
#> [4,] 0.31 0.42 0.41 0.58 0.44 0.54 0.36 0.51 0.32  0.55  0.37  0.43  0.49  0.64
#> [5,] 0.35 0.52 0.49 0.73 0.39 0.49 0.42 0.61 0.37  0.66  0.42  0.52  0.31  0.43
#>      [,15] [,16]
#> [1,]  0.49  0.60
#> [2,]  0.44  0.56
#> [3,]  0.40  0.60
#> [4,]  0.32  0.42
#> [5,]  0.24  0.32

次;