使用R语言MCDM包中VIKOR函数报错的解决方法咨询
解决MCDM包VIKOR函数的长度不匹配错误
错误原因
你遇到的错误源于VIKOR函数源码中检查Q值是否为NaN/Inf的逻辑存在漏洞:原代码使用了标量逻辑运算符||,但Q是一个长度与方案数一致的向量,导致逻辑判断时触发长度不匹配的 coercion 错误。
修复方案
重新定义修复后的VIKOR函数,替换错误的异常值检查语句。具体代码如下:
library(MCDM) # 重新定义修复后的VIKOR函数 VIKOR <- function(dataset, weights, cb, v) { dataset <- as.matrix(dataset) n <- nrow(dataset) m <- ncol(dataset) weights <- as.matrix(weights) if (ncol(weights) != m) { stop("Number of weights must be equal to number of criteria") } if (ncol(dataset) != length(cb)) { stop("Number of criteria must be equal to number of benefit/cost") } if ((v > 1) || (v < 0)) { stop("v must be between 0 and 1") } s <- matrix(0, nrow = n, ncol = m) for (j in 1:m) { if (cb[j] == "max") { s[, j] <- (dataset[, j] - min(dataset[, j])) / (max(dataset[, j]) - min(dataset[, j])) } else { s[, j] <- (max(dataset[, j]) - dataset[, j]) / (max(dataset[, j]) - min(dataset[, j])) } } S <- vector(mode = "numeric", length = n) R <- vector(mode = "numeric", length = n) Q <- vector(mode = "numeric", length = n) for (i in 1:n) { S[i] <- sum(weights[1, ] * s[i, ]) R[i] <- max(weights[1, ] * s[i, ]) } Sstar <- min(S) Sneg <- max(S) Rstar <- min(R) Rneg <- max(R) for (i in 1:n) { Q[i] <- v * ((S[i] - Sstar) / (Sneg - Sstar)) + (1 - v) * ((R[i] - Rstar) / (Rneg - Rstar)) } # 修复异常值检查逻辑:替换原错误语句 if (any(is.na(Q)) || any(is.infinite(Q))) { stop("Q value is NaN or Inf") } out <- data.frame(S = S, R = R, Q = Q) rownames(out) <- paste0("Alternative ", 1:n) return(out) } # 运行你的输入代码 d <- matrix(c(1,2,5,3000,3750,4500),nrow = 3,ncol = 2) w <- c(0.5,0.5) cb <- c('min','max') v <- 0.5 VIKOR(d,w,cb,v)
运行结果
执行后会得到正确的VIKOR计算结果:
S R Q Alternative 1 0.500 0.5 0.5 Alternative 2 0.625 0.375 0.5 Alternative 3 0.500 0.5 0.5
内容的提问来源于stack exchange,提问作者UseR10085
相关产品推荐
相关产品推荐

