使用多峰和非线性函数进行优化

时间:2019-04-05 05:27:23

标签: r optimization

我正在尝试使用多峰函数和非线性函数解决优化问题。

我有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

0 个答案:

没有答案