(R) Error: unused arguments (forbidden = expression(x2 > x1))

(R) Error: unused arguments (forbidden = expression(x2 > x1))

我正在使用 R 编程语言。我正在学习如何使用“mlrMBO”库来优化多 objective 函数(使用贝叶斯方法)。

在我的示例中,对于以下约束:

 x2 >x1 AND x4 >x3

我想优化我定义的以下(multi-objective)函数:

bayesian_function <- function(x1, x2, x3, x4) {
    var_1 <- sin(x1 + x2)
    var_2 <- cos(x1 - x2)
    var_3 <- x1 + x4
    var_4 <- x3 + x4 -7
        goal_1 = sum(var_1 + var_2 + var_3 + var_4)
    goal_2 = var_1 + var_2 - var_3 + var_4
    goal_3 = var_1 + var_2 - var_3 + 2*var_4

    return(c(goal_1, goal_2, goal_3))

}

为此,我尝试遵循必要的“mlrMBO”语法来针对给定的约束和“x1、x2、x3、x4”的允许范围优化此函数:

#load libraries
library(mlrMBO)
library(ParamHelpers)
library(smoof)

obj.fn = makeMultiObjectiveFunction(
  name = "My test function",
  fn = function(x1, x2, x3, x4) {
    var_1 <- sin(x1 + x2)
    var_2 <- cos(x1 - x2)
    var_3 <- x1 + x4
    var_4 <- x3 + x4 -7
        goal_1 = sum(var_1 + var_2 + var_3 + var_4)
    goal_2 = var_1 + var_2 - var_3 + var_4
    goal_3 = var_1 + var_2 - var_3 + 2*var_4

    return(c(goal_1, goal_2, goal_3))

},
#define acceptable ranges
par.set = makeNumericParamSet(
     makeNumericParam("x1", lower = 20, upper = 40),
     makeNumericParam("x2", lower = 30, upper = 45),
     makeNumericParam("x3", lower = 10, upper = 20),
     makeNumericParam("x4", lower = 10, upper = 50),
#define constraints
     forbidden = expression(x2 >x1),
     forbidden = expression(x4 >x3)
),

minimize=TRUE
)

#create control gird
 control=makeMBOControl(propose.points=1, final.method="best.predicted", final.evals=10)
 control=setMBOControlTermination(control, iters=10)
 control=setMBOControlInfill(control, crit=makeMBOInfillCritEI())

#perform optimization
lrn=makeMBOLearner(control, obj.fun)

此代码的第一部分 returns 出现以下错误并阻止我 运行 代码的其余部分:

Error in makeNumericParamSet(makeNumericParam("x1", lower = 20, upper = 40),  : 
  unused arguments (forbidden = expression(x2 > x1), forbidden = expression(x4 > x3))

似乎在定义约束(即“禁止”语句)时出现问题。我尝试阅读更多关于此功能的信息 https://www.rdocumentation.org/packages/ParamHelpers/versions/1.14/topics/makeParamSet ,但我似乎无法弄清楚我做错了什么。

谁能告诉我为什么会出现这个错误?

谢谢

更新:

根据@blorp6 提供的答案,我尝试将两个“禁止”语句组合成一行代码:

obj.fn = makeMultiObjectiveFunction(
    name = "My test function",
    fn = function(x1, x2, x3, x4) {
        var_1 <- sin(x1 + x2)
        var_2 <- cos(x1 - x2)
        var_3 <- x1 + x4
        var_4 <- x3 + x4 -7
        goal_1 = sum(var_1 + var_2 + var_3 + var_4)
        goal_2 = var_1 + var_2 - var_3 + var_4
        goal_3 = var_1 + var_2 - var_3 + 2*var_4
        
        return(c(goal_1, goal_2, goal_3))
        
    },
    #define acceptable ranges
    par.set = makeParamSet(
        makeNumericParam("x1", lower = 20, upper = 40),
        makeNumericParam("x2", lower = 30, upper = 45),
        makeNumericParam("x3", lower = 10, upper = 20),
        makeNumericParam("x4", lower = 10, upper = 50),
        #define constraints
        forbidden = expression(x2 >x1 & x4 >x3)
    ),
    
    minimize=TRUE
)

#create control gird
     control=makeMBOControl(propose.points=1, final.method="best.predicted", final.evals=10)
     control=setMBOControlTermination(control, iters=10)
     control=setMBOControlInfill(control, crit=makeMBOInfillCritEI())
    
    #perform optimization
    lrn=makeMBOLearner(control, obj.fun)

但这会产生一个新的错误:Error in fn(unlist(x), ...) : unused argument (unlist(x))

我的理解正确吗? 谢谢

您似乎将两个同名参数传递给 makeNumericParamSet(),它只接受名称 'forbidden' 的 1 个参数。我在 R 控制台中检查了 ?makeNumericParamSet,发现以 'par.set' 和 'forbidden' 作为参数的函数实际上是 makeParamSet,所以我尝试了这个:

尝试
#define acceptable ranges
  par.set = makeParamSet(
    makeNumericParam("x1", lower = 20, upper = 40),
    makeNumericParam("x2", lower = 30, upper = 45),
    makeNumericParam("x3", lower = 10, upper = 20),
    makeNumericParam("x4", lower = 10, upper = 50),
    #define constraints
    forbidden = expression(x2 > x1 & x4 > x3)
    #forbidden = expression(x4 >x3)
  )
结果
> par.set
      Type len Def   Constr Req Tunable Trafo
x1 numeric   -   - 20 to 40   -    TRUE     -
x2 numeric   -   - 30 to 45   -    TRUE     -
x3 numeric   -   - 10 to 20   -    TRUE     -
x4 numeric   -   - 10 to 50   -    TRUE     -
Forbidden region specified.