3.3 基于方差最大化模型的多属性决策方法

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

##  3.3 基于方差最大化模型的多属性决策方法---徐泽水《不确定多属性决策方法与应用》84页 --3.3.2 实例分析
library(data.table)
library(dplyr)
A = c(18400,3,100,80,300,60,40,1.2,
      19600,4,120,100,400,80,40,1.3,
      29360,6,540,120,150,100,50,1.5) 

A= matrix(A,nrow = 3,ncol = 8,byrow = T) %>% data.table()
A # 原始决策矩阵
#>       V1 V2  V3  V4  V5  V6 V7  V8
#> 1: 18400  3 100  80 300  60 40 1.2
#> 2: 19600  4 120 100 400  80 40 1.3
#> 3: 29360  6 540 120 150 100 50 1.5

#### 第一步: 把原始决策矩阵A 利用适当的方法进行规范化为R,R为归一化后的矩阵
### norm_matrix()函数,根据书中收益型属性(按公式1.2)与成本型属性(按公式1.4)分别进行归一化
#####  注意这个与前面的norm_matrix 函数结果相同,只是代码显得更少了,保证了列名不变
norm_matrix = function(A, shouyi = NULL, chengben = NULL) {
  stopifnot(!is.null(shouyi) | !is.null(chengben))
  if (is.matrix(A)) A = data.table(A)
  m = ncol(A)
  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 =copy(A) # 重新赋值
  if (length(chengben) == 0) {
    R[, colnames(R)[shouyi] := lapply(.SD, function(x) x / max(x)), .SDcols = shouyi] # 收益型属性归一化 (书中1.2式)
  } else if (length(shouyi) == 0) {
    R[, colnames(R)[chengben] := lapply(.SD, function(x) min(x) / x  ), .SDcols = chengben]# 成本型属性归一化 (书中1.3式)
  } else{
    R[, colnames(R)[shouyi] := lapply(.SD, function(x) x / max(x)), .SDcols = shouyi] # 收益型属性归一化 (书中1.2式)
    R[, colnames(R)[chengben] := lapply(.SD, function(x) min(x) / x  ), .SDcols = chengben]# 成本型属性归一化 (书中1.3式)
  }
  return(setDF(R))
}
R = norm_matrix(A, chengben = c(1:3))
round(R,3)
#>      V1   V2    V3    V4    V5  V6  V7    V8
#> 1 1.000 1.00 1.000 0.667 0.750 0.6 0.8 0.800
#> 2 0.939 0.75 0.833 0.833 1.000 0.8 0.8 0.867
#> 3 0.627 0.50 0.185 1.000 0.375 1.0 1.0 1.000



#### 第二步 : 利用模型 M-3.11 求解线性规划
M_w = function(R,lower_c,upper_c){
  n = nrow(R)
  m = ncol(R)
  deta = matrix(0,nrow = n,ncol = m)
  for(i in 1:n){
    for(j in 1:m){
      for(k in 1:n){
        deta[i,j] = deta[i,j] + (R[i,j] - R[k,j])^2
      }
    }
  }
  
  library(Rglpk)
  obj = c(apply(deta, 2, sum)) # 设置目标函数
  mat = matrix(rep(1,m),nrow = 1) # 约束条件,权和向量为1 
  dir = c("==")
  rhs = c(1)
  types = c("C")
  bounds <- list(lower = list(ind = 1L:m, val = lower_c),
                 upper = list(ind = 1L:m, val = upper_c))
  return(Rglpk_solve_LP(obj, mat, dir, rhs, bounds, types,max =TRUE )$solution)
}
w = M_w(R,lower_c = c(0.1,0.12,0.11,0.12,0.07,0.2,0.18,0.09),
        upper_c = c(0.2,0.14,0.15,0.16,0.12,0.3,0.21,0.22))
w # 权重
#> [1] 0.10 0.12 0.12 0.12 0.07 0.20 0.18 0.09

##### 第三步: 求出各方案的综合属性值
z = apply(R, 1, function(x)sum(x*w))
z
#> [1] 0.8085000 0.8358776 0.7611425
#########第四步,#按降序排列,最大的为方案最优
round(z,4)%>% rank %>% order(.,decreasing=T)#按降序排列,最大的为最优
#> [1] 2 1 3

次;