R 优化问题上下界的更新

R 优化问题上下界的更新,r,optimization,nlp,R,Optimization,Nlp,我使用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] +

我使用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)
(2)2+4.4823*x[1)1+0.4762+0.4762+0.4762+0.4762+0.024*x[4+0.4762+0.4762+0.4762+0.024*x x[2;2+3+3.977.9767*x[2+3.977*x[2]x[2+3.977.x[2]x[2+3.977 7.x[3.x[2]x[2+3.x[2+3.977(x[2]x[2+3.977)x[2+3.x[2+3.977(3.x[2+3.977)x[3.977 7 7 7 7 7)x[2]x[2]x[2+3.x[2+3.返回(x[2+3.返回(2+3.返回(2]方方方方方方方方方(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],“梯度”=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.0241] 功能(x){
constr我强烈建议您为此使用OSQP。您可以。您可以在手册中找到更新问题向量的示例。我在这里重写了它:

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
库(矩阵)
#在表单中定义问题数据
#最小化(1/2)x’px+q’x

#受问题的影响l不清楚,但是如果问题是独立的,你可以在它周围建立一个循环,并使用不同的边界。这就是问题,问题不是独立的。每个时间步取决于前面的时间步。如果模型不是前瞻性的,你仍然可以使用一个循环,每次解决一个时间步。其他e你需要作为一个大问题来解决同时性。看起来你有一个二次目标。如果是凸的,我们可以非常有效地解决非常大的QP问题。嗨,欧文,我的问题是凸的,因为每台机器的成本函数(我正在研究工厂中一些机器的调试)是一个2阶多项式。问题是,上下限每一个时间步都会发生变化,下一步也取决于上一步(因为取决于一个单元关闭的时间,再次打开会变得更昂贵)。如果边界是“可变的”只要把它们变成线性不等式约束,QP解算器就能非常有效地处理这个问题。