【问题标题】:nloptr COBYLA method does not recognize equality constraints in Rnloptr COBYLA 方法无法识别 R 中的等式约束
【发布时间】:2019-06-13 10:31:35
【问题描述】:

我现在在 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."

感谢您的帮助

【问题讨论】:

  • 我认为您必须将其建模为两个不等式。
  • 嗨@ErwinKalvelagen。你能详细说明一下吗?我认为 h[7]

标签: r optimization mathematical-optimization nlopt


【解决方案1】:

documentation 说:

COBYLA 通过将等式约束转换为两个来支持等式约束 不平等约束。因为这并不能完全满足 NLOPT 中的实现,这里没有提供。

当然你也可以尝试改写

f(x) = 0

作为

f(x) ≥ 0
-f(x) ≥ 0  

【讨论】:

    【解决方案2】:

    能否请您检查您的代码是否有任何拼写错误?您确实提到您正在尝试将相等性建模为两个不等式的总和,但是,其中一个约束似乎缺少“-”。 (至少这就是您粘贴的代码 sn-p 显示的内容)。 重写代码sn-p如下:

     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)
    

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 2016-10-23
      • 2016-02-09
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      相关资源
      最近更新 更多