lpSolve - 将 objective 函数优化为特定值
lpSolve - optimize objective function to specific value
我很好奇是否可以定义一个 objective 函数来优化到特定值,而不仅仅是 'min' 或 'max'。例如,我有一个函数,我想优化到 100 有一些限制(这里省略)。
Objective函数(待优化为100):
f(x) 3.62*x1+5.19*x2
实现我的目标的正确方法是什么?现在我只能将优化定义为 'min' 或 'max',这并不能解决我的目标。
完整代码:
fn.obj <- c(3.62, 5.19, 7.29, 7.76, 3.82, 4.86, 4.03, 8.81, 9.14)
require(lpSolveAPI)
model <- make.lp(0,9)
lp.control(model, sense="max", verbose="full")
set.objfn(model, fn.obj)#-8333550.82)
add.constraint(model, c(70,70,-30,70,-30,-30,-30,-30,70), ">=", 0)
add.constraint(model, c(-60,-60,40,-60,40,40,40,40,-60), ">=", 0)
add.constraint(model, c(-20,-20,80,-20,-20,80,80,-20,-20), ">=", 0)
add.constraint(model, c(30,30,-70,30,30,-70,-70,30,30), ">=", 0)
add.constraint(model, c(-30,-30,-30,-30,70,-30,-30,70,-30), ">=", 0)
add.constraint(model, c(40,40,40,40,-60,40,40,-60,40), ">=", 0)
set.bounds(model, lower=c(39232,72989,90872,63238,49579,9626,158297,300931,160556), upper=c(49041,91237,113591,79048,61974,12033,197872,376164,200696))
set.type(model, 1:9,type = "integer")
res<-solve(model)
get.variables(model)
get.objective(model)
结果:
> get.variables(model)
[1] 49041 91237 113591 79048 61974 12033 197872 376164 200696
> get.objective(model)
[1] 8333551
当需要最大化 objective 函数时,代码运行良好。但是如果我不想最大化而是优化我的 objective 函数怎么办? 7000. 所以具有相同的约束,我想为我的 fn.obj -> 1000.
找到可能的 x1,..,x9
如果您为 objective 值指定的值对应于可行的解决方案,您只需将其添加为约束即可实现。 1000 和 7000 似乎不对应于任何可行的解决方案,但假设我们希望 objective 等于 8000000 而不是 8333551。然后添加此约束并重新运行模型。
add.constraint(model, fn.obj, "=", 8000000)
我很好奇是否可以定义一个 objective 函数来优化到特定值,而不仅仅是 'min' 或 'max'。例如,我有一个函数,我想优化到 100 有一些限制(这里省略)。 Objective函数(待优化为100):
f(x) 3.62*x1+5.19*x2
实现我的目标的正确方法是什么?现在我只能将优化定义为 'min' 或 'max',这并不能解决我的目标。
完整代码:
fn.obj <- c(3.62, 5.19, 7.29, 7.76, 3.82, 4.86, 4.03, 8.81, 9.14)
require(lpSolveAPI)
model <- make.lp(0,9)
lp.control(model, sense="max", verbose="full")
set.objfn(model, fn.obj)#-8333550.82)
add.constraint(model, c(70,70,-30,70,-30,-30,-30,-30,70), ">=", 0)
add.constraint(model, c(-60,-60,40,-60,40,40,40,40,-60), ">=", 0)
add.constraint(model, c(-20,-20,80,-20,-20,80,80,-20,-20), ">=", 0)
add.constraint(model, c(30,30,-70,30,30,-70,-70,30,30), ">=", 0)
add.constraint(model, c(-30,-30,-30,-30,70,-30,-30,70,-30), ">=", 0)
add.constraint(model, c(40,40,40,40,-60,40,40,-60,40), ">=", 0)
set.bounds(model, lower=c(39232,72989,90872,63238,49579,9626,158297,300931,160556), upper=c(49041,91237,113591,79048,61974,12033,197872,376164,200696))
set.type(model, 1:9,type = "integer")
res<-solve(model)
get.variables(model)
get.objective(model)
结果:
> get.variables(model)
[1] 49041 91237 113591 79048 61974 12033 197872 376164 200696
> get.objective(model)
[1] 8333551
当需要最大化 objective 函数时,代码运行良好。但是如果我不想最大化而是优化我的 objective 函数怎么办? 7000. 所以具有相同的约束,我想为我的 fn.obj -> 1000.
找到可能的 x1,..,x9如果您为 objective 值指定的值对应于可行的解决方案,您只需将其添加为约束即可实现。 1000 和 7000 似乎不对应于任何可行的解决方案,但假设我们希望 objective 等于 8000000 而不是 8333551。然后添加此约束并重新运行模型。
add.constraint(model, fn.obj, "=", 8000000)