Optim
或Optimx
可以在非线性优化问题中采用不等式约束吗?
我有一个非线性问题,其中有两种类型的约束:
答案 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,
lower
中的optimx
参数设置为rep.int(0, n_variables)
optimx
编程的直接方法。我建议upper = rep.int(1, n_variables)
,修改你的目标函数,包括:如果Sum(变量)&gt; 1,objectiveValue = objectiveFunction +大惩罚,然后设置一个满足所有标准的起点Vars&gt; = 0,Sum(Vars)&lt; = 1,(和约束所暗示的Vars&lt; = 1)