Метод nloptr COBYLA не распознает ограничения равенства в R - PullRequest
0 голосов
/ 19 января 2019

Я сейчас использую модель минимизации nloptr-COBYLA в R Я следовал интерфейсу 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."

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 22 января 2019

Документация гласит:

COBYLA поддерживает ограничения на равенство, превращая их в два ограничения на неравенство.Поскольку это не дает полного удовлетворения реализацией в NLOPT, она здесь не доступна.

Конечно, вы можете попытаться переформулировать

f(x) = 0

как

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