1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #多准则决策模型-TOPSIS评价方法 ##R语言实现-代码 MCDM = function (decision = NULL, weights = NULL, impacts = NULL) #决策矩阵,权重向量,影响因子 { if (missing(weights)) stop( "缺少'权重向量-weights'" ) if (missing(impacts)) stop( "缺少'影响因子-impacts'" ) if (! is .matrix(decision) | is .data.frame(decision)) stop( "'决策矩阵-decision'必须是矩阵或数据框" ) if (length(weights) ! = ncol(decision)) stop( "权重向量长度错误" ) if (length(impacts) ! = ncol(decision)) stop( "影响因子长度错误" ) if (! all (weights > 0 )) stop( "权重必须大于零" ) if (! is .character(impacts)) stop( "影响因子必须是字符型 '+'或'-' 符号" ) if (! all (impacts = = "+" | impacts = = "-" )) stop( "影响因子只能是字符型 '+'或'-' 符号" ) weights < - weights / sum (weights) N < - matrix(nrow = nrow(decision), ncol = ncol(decision)) #建一个空矩阵 for (i in 1 :nrow(decision)) { for (j in 1 :ncol(decision)) { N[i, j] < - decision[i, j] / sqrt( sum (decision[, j]^ 2 )) } } #决策矩阵标准化 W = diag(weights) #建权重对角矩阵 V = N % * % W #构造加权规范化矩阵 #确定理想方案和负理想方案 u < - as.integer(impacts = = "+" ) * apply (V, 2 , max ) + as.integer(impacts = = "-" ) * apply (V, 2 , min ) l < - as.integer(impacts = = "-" ) * apply (V, 2 , max ) + as.integer(impacts = = "+" ) * apply (V, 2 , min ) #构建理想方案和负理想方案距离公式 distance_u = function(x) { sqrt( sum ((x - u)^ 2 )) } distance_l = function(x) { sqrt( sum ((x - l)^ 2 )) } #计算相对接近度并排序 du < - apply (V, 1 , distance_u) dl < - apply (V, 1 , distance_l) score < - dl / (dl + du) outcome < - data.frame( "方案" = 1 :nrow(decision), 得分 = score, 排名 = rank( - score)) return (outcome) } Author(s) Mahmoud Mosalman Yazdi <m.mosalman@gmail.com> |