【问题标题】:How to optimize a non-linear objective function with non-linear constraints in R?如何在 R 中优化具有非线性约束的非线性目标函数?
【发布时间】:2017-01-13 10:20:23
【问题描述】:

说,有一个非线性目标函数:

Z= a1 + b1 * ln(x1) + a2 + b2 *ln(x2)  with the objective of maximizing Z

受以下限制-

x1 + x2 + x3 >=R1
x1 + x2 + x3 <=R2
a1 + b1 * ln(x1) >=R3

如何在 R 中优化目标函数?尝试使用 R 中可用的“Rsolnp”包,但不确定如何构建约束和将赋予包中函数“solnp”的目标函数。

谁能帮我解决这个问题?

【问题讨论】:

  • x3 是常量吗?
  • x1,x2 和 x3 是决策变量
  • 因为它没有出现在目标函数中而询问

标签: r optimization


【解决方案1】:

试试这个(你可能想使用其他算法,如 NLOPT_LD_MMA 指定 jacobian):

library(nloptr)
a1 <- b1 <- 1
a2 <- b2 <- 1
R1 <- R2 <- 1
R3 <- 25

eval_f1 <- function( x, a1, b1, a2, b2, R1, R2, R3){ 
  return(-a1 - b1 * log(x[1]) - a2 - b2 *log(x[2])) # maximize
}


eval_g1 <- function( x, a1, b1, a2, b2, R1, R2, R3) {
  return(rbind(x[1] + x[2] + x[3] - R1,
               -x[1] - x[2] - x[3] + R2,
               R3 - a1 - b1*log(x[1])))
}

nloptr(x0=c(1,1,1), 
        eval_f=eval_f1, 
        lb = c(1,1,1), 
        ub = c(5,5,5), 
        eval_g_ineq = eval_g1, 
        opts = list("algorithm"="NLOPT_LN_COBYLA"),
        a1 = a1,
        b1 = b1,
        a2 = a2,
        b2 = b2,
        R1 = R1,
        R2 = R2,
        R3 = R3)

#Call:
#nloptr(x0 = c(1, 1, 1), eval_f = eval_f1, lb = c(1, 1, 1), ub = c(5, 
#    5, 5), eval_g_ineq = eval_g1, opts = list(algorithm = "NLOPT_LN_COBYLA"),     
#a1 = a1, b1 = b1, a2 = a2, b2 = b2, R1 = R1, R2 = R2, R3 = R3)


#Minimization using NLopt version 2.4.0 

#NLopt solver status: 5 ( NLOPT_MAXEVAL_REACHED: Optimization stopped because #maxeval (above) was reached. )

#Number of Iterations....: 100 
#Termination conditions:  relative x-tolerance = 1e-04 (DEFAULT) 
#Number of inequality constraints:  3 
#Number of equality constraints:    0 
#Current value of objective function:  -5.08783644210816 
#Current value of controls: 5 4.385916 2.550764

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多