You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:43:13