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

如何在R语言rmoo包的nsga2函数中传入输入矩阵

解决rmoo包nsga2函数"data参数缺失"报错

你在使用rmoo包的nsga2函数时出现Error in tourLength(x, ...) : argument "data" is missing, with no default报错,原因是nsga2不会自动将调用时传入的data参数传递给fitness函数,导致自定义的tourLength函数找不到所需的data参数。以下是两种可行的解决方法:

方案一:用闭包封装data到fitness函数(推荐)

通过闭包将固定矩阵data绑定到fitness函数中,确保nsga2调用fitness时能正确获取data:

library(data.table)
library(rmoo)

# 定义输入矩阵
data <- c(0,1,3,5,7)
data <- matrix(data, ncol=5, nrow=5, byrow = TRUE) 

tourLength <- function(x, data) {
  x <- matrix(x, nrow = 1)
  data1 <- data*x[1] + data*x[2]
  sum(data1[,3])
}

# 创建绑定data的闭包函数
tspFitness <- function(data) {
  function(x) {
    1/tourLength(x, data)
  }
}

# 调用nsga2,传入绑定好data的fitness函数
result <- nsga2(type = "real-valued",
                fitness = tspFitness(data),
                lower = c(0.01,0.01),
                upper = c(1,1),
                popSize = 100,
                monitor = FALSE,
                maxiter = 10)

方案二:使用全局变量(简单但不推荐)

将data设为全局变量,让tourLength直接读取全局环境中的data:

library(data.table)
library(rmoo)

# 定义全局输入矩阵
data <- c(0,1,3,5,7)
data <- matrix(data, ncol=5, nrow=5, byrow = TRUE) 

# 修改tourLength,不再接收data参数
tourLength <- function(x) {
  x <- matrix(x, nrow = 1)
  data1 <- data*x[1] + data*x[2]
  sum(data1[,3])
}

tspFitness <- function(x) 1/tourLength(x)

# 调用nsga2,无需传入data参数
result <- nsga2(type = "real-valued",
                fitness = tspFitness,
                lower = c(0.01,0.01),
                upper = c(1,1),
                popSize = 100,
                monitor = FALSE,
                maxiter = 10)

报错原因说明

rmoo包的nsga2函数没有预设data参数,你在调用时传入的data=data不会被自动传递给fitness函数。nsga2执行时只会将决策变量x传入fitness函数,导致你的tspFitness中...无法捕获到data,最终tourLength因缺少参数报错。

内容的提问来源于stack exchange,提问作者eun lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:41:26