我现在在R中运行nloptr-COBYLA最小化模型 我遵循了nloptr接口,并从目标最小化收敛中获得了解决方案。但是该解决方案不能满足约束条件。 有没有人可以在代码中发现我的错误?...
代码
eval_f<-function(x){
-(CCC-a1*x[1]^(0.9)-a2*x[2]^(0.9)-a3*x[3]^(0.9)-b1*x[4]^(0.9)
-b2*x[5]^(0.9)-b3*x[6]^(0.9)-c1*x[7]^(0.9)-c2*x[8]^(0.9)-c3*x[9]^(0.9))
}
eval_g_ineq<-function(x){
h<-numeric(8)
h[1]<-x[2]-x[1]
h[2]<-x[3]-x[2]
h[3]<-x[5]-x[4]
h[4]<-x[6]-x[5]
h[5]<-x[8]-x[7]
h[6]<-x[9]-x[8]
h[7]<-sum(wp$use)*x[1]+sum(wm$use)*x[2]+sum(wo$use)*x[3]+sum(sp$use)*x[4]+sum(sm$use)*x[5]+sum(so$use)*x[6]+sum(bp$use)*x[7]+sum(bm$use)*x[8]+sum(bo$use)*x[9]-1.1*cost+cost
h[8]<-(sum(wp$use)*x[1]+sum(wm$use)*x[2]+sum(wo$use)*x[3]+sum(sp$use)*x[4]+sum(sm$use)*x[5]+sum(so$use)*x[6]+sum(bp$use)*x[7]+sum(bm$use)*x[8]+sum(bo$use)*x[9]-1.1*cost+cost)
return(h)
}
x0<-c(100,100,100,100,100,100,100,100,100)
......
res<-cobyla(x0,eval_f, lower = lb, upper = NULL,hin = eval_g_ineq,control = list(xtol_rel = 1e-8, maxeval = 10000))
print(res)
在代码中,h [7]和h [8]是相等约束。 (在界面中,我们还可以看到“ COBYLA通过将相等约束转换为两个不相等约束来支持相等约束。”) 但是,如果我使用解计算h [7]条件,则它不满足该条件。为什么会发生?..
结果
> print(res)
$par
[1] 77.54717 77.71680 68.83032 81.49982 73.57022 56.21820 66.57751
[8] 64.44629 55.17281
$value
[1] -9820653
$iter
[1] 4620
$convergence
[1] 4
$message
[1] "NLOPT_XTOL_REACHED: Optimization stopped because xtol_rel or xtol_abs (above) was reached."
谢谢您的帮助
答案 0 :(得分:0)
COBYLA通过将相等约束转换为两个约束来支持它们 不平等约束。因为这不能完全满足 NLOPT中的实施,此处未提供。
您当然可以尝试重新制定
f(x) = 0
为
f(x) ≥ 0
-f(x) ≥ 0
答案 1 :(得分:0)
能否请您检查您的代码是否没有错字?您确实提到要在将相等性建模为两个不平等性的总和,但是似乎其中一个约束缺少“-”。 (这就是您粘贴的代码片段所显示的内容)。 重写代码段,如下所示:
get