Optimx / Optim R包中的不等式约束

时间:2016-10-24 16:00:22

标签: r optimization

OptimOptimx可以在非线性优化问题中采用不等式约束吗?

我有一个非线性问题,其中有两种类型的约束:

  • 变量> = 0
  • 变量之和< = 1

2 个答案:

答案 0 :(得分:1)

您可以使用maxLik执行此操作。那里的不等式约束必须指定为$ Ax + B> 0 $其中x是参数。

例如,假设您有两个参数并且最大化指数帽:

f <- function(x) exp( - (x[1]-2)^2 - (x[2]-2)^2)
A <- matrix(c(1,1,-1,-1), 2, 2, byrow=TRUE)
B <- c(0,1)

你现在可以检查$ Ax + B&gt; 0 $相当于你的不等式条件(好吧,除了你写的&gt; =而不是&gt;但这对于数值解决方案并不重要)。

您可以使用BFGS或其他优化器。您需要ineqA和ineqB的列表用于约束:

a <- maxBFGS(f, start=c(0.2, 0.2), constraints=list(ineqA=A, ineqB=B))
summary(a)

--------------------------------------------
BFGS maximization 
Number of iterations: 50 
Return code: 0 
successful convergence  
Function value: 0.01104892 
Estimates:
      estimate   gradient
[1,] 0.4990966 0.03316674
[2,] 0.4990966 0.03316674

Constrained optimization based on constrOptim 
1  outer iterations, barrier value -0.0003790423 
--------------------------------------------

如您所见约束是绑定的,无约束的最大值将为(2,2)。

答案 1 :(得分:0)

optimx中使用L-BFGS-B,

  • 对于变量&gt; = 0,您可以将lower中的optimx参数设置为rep.int(0, n_variables)
  • 对于Sum(变量)&lt; = 1,我不知道用optimx编程的直接方法。我建议upper = rep.int(1, n_variables),修改你的目标函数,包括:如果Sum(变量)&gt; 1,objectiveValue = objectiveFunction +大惩罚,然后设置一个满足所有标准的起点Vars&gt; = 0,Sum(Vars)&lt; = 1,(和约束所暗示的Vars&lt; = 1)