【发布时间】:2018-05-16 07:58:40
【问题描述】:
我正在使用 NLoptr 包来解决 9 个变量成本函数的优化问题,程序如下:
function(x){return( list( "objective" = 0.0404*x[1]^2 + 4.4823*x[1] + 0.4762+0.024*x[2]^2 + 3.9767*x[2] + 0.3737+0.0246*x[3]^2 + 3.6992*x[3] + 0.9425+0.0214*x[4]^2 + 3.5896*x[4] + 0.7615+0.0266*x[5]^2 + 3.8197*x[5] + 0.2799+0.0262*x[6]^2 + 3.7884*x[6] + 0.307+0.0362*x[7]^2 + 4.4927*x[7] + 0.1549+0.0344*x[8]^2 + 4.4066*x[8] - 0.2472+0.0241*x[9]^2 + 4.227*x[9],"gradient" = c(2*0.0404*x[1]+4.4823, 2*0.024*x[2]+3.9767, 2*0.0246*x[3], 2*0.0214*x[4]+3.5896, 2*0.0266*x[5]+3.8197,2*0.0262*x[6]+3.7884,2*0.0362*x[7]+4.4927, 2*0.0344*x[8]+4.4066, 2*0.0241*x[9]+4.227)))}
function( x ) {
constr <- c(x[1] + x[2]+ x[3] + x[4]+x[5]+x[6]+x[7]+x[8]+x[9]-Balance)
grad <- c(1,1,1,1,1,1,1,1,1)
return( list( "constraints"=constr, "jacobian"=grad ) )
}
lb<-c(50,50,50,50,50,50,50,50,50)
ub<-c(0,0,0,0,0,0,0,0)
x_0<-c(25,25,25,25,25,25,25,25,25)
local_opts <- list( "algorithm" = "NLOPT_LD_MMA","xtol_rel" = 1.0e-9 )
opts <- list( "algorithm" = "NLOPT_LD_AUGLAG","xtol_rel" = 1.0e-9,"maxeval" = 10000, "local_opts" = local_opts )
res <- nloptr(x0=x_0, eval_f=eval_f,lb=lb,ub=ub,eval_g_eq=eval_g_eq,opts=opts)
代码运行良好,但问题是我需要在 168 小时内解决此优化问题,并且每个时间步的下限和上限都必须不同。以前有人实施过吗?
BR
【问题讨论】:
-
从问题中不清楚,但如果问题是独立的,您可以在它周围放置一个循环并使用不同的界限。
-
那是问题,问题不是独立的。每个时间步都依赖于之前的时间步。
-
如果模型不具有前瞻性,您仍然可以使用循环并一次求解一个时间步。否则你需要解决一个大问题来处理同时性。看起来你有一个二次目标。如果是凸的,我们可以非常有效地解决非常大的 QP 问题。
-
嗨 Erwin,我的问题是凸的,因为每台机器的成本函数(我正在研究工厂中一些机器的排料)是 2 阶多项式。问题是上下每个时间步的边界都会改变,并且下一步取决于前一个步骤(因为根据一个单元关闭的时间,再次打开会变得更加昂贵)。
-
如果边界是“可变的”,只需将它们设为线性不等式约束。 QP 求解器非常有效地处理这个问题。
标签: r optimization nlp