使用R语言rmoo包nsga3函数做多目标优化时遇参数错误求助
问题描述
尝试用R语言的rmoo包进行多目标优化,编写了适应度函数shiningFunction,调用nsga3函数时抛出未使用参数reference_dirs的错误。
原适应度函数
library(rmoo) shiningFunction <- function(x, nobj=3) { V_c <- x[1] f_n <- x[2] a_p <- x[3] KT <- 0.1655 - 0.002 *V_c + 0.21 *f_n - 1.8 *a_p + 0.02 *V_c * a_p FW <- 0.0025 - 0.064 *f_n - 0.054 *a_p + 0.0004 *V_c * f_n + 1.100 *f_n * a_p + 0.0004 * V_c * a_p - 0.005 * V_c * f_n * a_p R_a <- 0.6084 - 0.008 *V_c + 6.522 *f_n + 9.23 *a_p - 0.035 * V_c * f_n - 14.871 * f_n * a_p - 0.032 *V_c * f_n + 0.136 * V_c *f_n * a_p f <- matrix(c(KT, FW, R_a), nrow = 1) return(f) }
原调用代码
result <- nsga3(type = "real-valued", fitness = shiningFunction, lower = c(60,0.1,0.05), upper = c(140,0.3,0.3), popSize = 500, nObj = 3, n_partitions = 12, monitor = FALSE, maxiter = 2000)
错误信息
Error in (function (x, nobj = 3) : unused argument (reference_dirs = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.0833333333333333, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.166666666666667, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 0.333333333333333, 0.416666666666667, 0.416666666666667, 0.416666666666667, 0.416666666666667, 0.416666666666667, 0.416666666666667, 0.416666666666667, 0.416666666666667, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.583333333333333, 0.583333333333333, 0.58333333
解决方案
错误根源是rmoo的nsga3函数在调用适应度函数时,会自动传递reference_dirs参数,但你的shiningFunction没有定义这个参数,导致R报错“未使用的参数”。
修改适应度函数,添加...来接收所有额外的未使用参数,这样就能兼容nsga3的调用逻辑:
library(rmoo) shiningFunction <- function(x, nobj=3, ...) { # 添加...接收额外参数 V_c <- x[1] f_n <- x[2] a_p <- x[3] KT <- 0.1655 - 0.002 *V_c + 0.21 *f_n - 1.8 *a_p + 0.02 *V_c * a_p FW <- 0.0025 - 0.064 *f_n - 0.054 *a_p + 0.0004 *V_c * f_n + 1.100 *f_n * a_p + 0.0004 * V_c * a_p - 0.005 * V_c * f_n * a_p R_a <- 0.6084 - 0.008 *V_c + 6.522 *f_n + 9.23 *a_p - 0.035 * V_c * f_n - 14.871 * f_n * a_p - 0.032 *V_c * f_n + 0.136 * V_c *f_n * a_p f <- matrix(c(KT, FW, R_a), nrow = 1) return(f) }
之后再用原来的nsga3调用代码执行,就不会再报错了。
内容的提问来源于stack exchange,提问作者Indian
相关产品推荐
相关产品推荐

