我正在尝试使用多峰函数和非线性函数解决优化问题。
我有30个逻辑(或更复杂的函数)(yi = Bi /(1 + exp((Ci-xi)/ Di)),计算了参数B,C,D)。
我想使用约束Σ yi
和Σ xi <= constant_value
来最大化xi > 0
。
现在,我可以使用经典方法(例如Nelder-Mead方法)来尝试执行此任务。
但是输出会受到初始值的强烈影响,这个问题困扰着我。
有人有好主意吗?谢谢您的指教。
下面是示例数据(虚拟,5后勤)和我的挑战。
# Parameter I got
structure(list(B = c(1.15, 0.92, 1.11, 0.98, 1.08),
C = c(231.93, 42.71, 38.17, 66.98, 41.42),
D = c(43.68, 31.59, 2.74, 12.3, 14.12)),
row.names = c(NA, -5L), class = "data.frame")
# constraint: sum(x) < 200 and each x > 0
library(alabama)
target_f <- function(x) {
(1.15 / (1 + exp((231.93 - x[1]) / 43.68))
+ 0.92 / (1 + exp((42.71 - x[2]) / 31.59))
+ 1.11 / (1 + exp((38.17 - x[3]) / 2.74))
+ 0.98 / (1 + exp((66.98 - x[4]) / 12.3))
+ 1.08 / (1 + exp((41.42 - x[5]) / 14.12))) * -1
}
hin_f <- function(x) {
each_cost_constraint <- x # all cost > 0
sum_cost_constraint <- 200 - rep(1, 5) %*% x # sum(cost) < 200
return(c(each_cost_constraint, sum_cost_constraint))
}
ans1 <- auglag(par = rep(30, 5),
fn = target_f, hin = hin_f,
control.outer = list(method="Nelder-Mead"))
ans2 <- auglag(par = rep(10, 5), # change init value
fn = target_f, hin = hin_f,
control.outer = list(method="Nelder-Mead"))
ans1$par; ans1$value
# [1] 0.03626264 73.66668803 49.99978616 0.02345608 76.26495797
# [1] -2.769805
ans2$par; ans2$value
# [1] 9.165090e-01 1.110287e+02 5.295453e-02 9.419732e-04 8.789126e+01
# [1] -1.876342