如何在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
相关产品推荐
相关产品推荐

