#徐泽水《不确定多属性决策方法与应用》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