【问题标题】:Updating lower and upper bounds in Optimization Problems更新优化问题的下限和上限
【发布时间】: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


【解决方案1】:

我强烈建议您为此使用 OSQP。你可以download it from CRAN。您可以在手册中找到更新问题向量的示例。我这里重写了:

library(Matrix)

# Define problem data in the form
# minimize      (1/2) x' P x + q' x
# subject to    l <= A x <= u
#
P <- Matrix(c(11., 0., 0., 0.), 2, 2, sparse = TRUE)
q <- c(3., 4.)
A <- Matrix(c(-1., 0., -1., 2., 3., 0., -1., -3., 5., 4.), 5, 2, sparse = TRUE)
u <- c(0., 0., -15., 100., 80)
l <- rep_len(-Inf, 5)
settings <- osqpSettings(verbose = FALSE)
model <- osqp(P, q, A, l, u, settings)

# Solve
res <- model$Solve()

# Get solution
x_opt <- res$x

# Define new vector
q_new <- c(10., 20.)

# Update model and solve again
model$Update(q = q_new)
res <- model$Solve()

# Get new solution
x_opt_new <- res$x

声明:我是 OSQP 的作者之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多