# Difficulty in solving a MINLP

**URL:** <https://discourse.julialang.org/t/difficulty-in-solving-a-minlp/31555>\
**Category:** Optimization (Mathematical)\
**Created:** [November 26, 2019, 11:51pm UTC](https://discourse.julialang.org/t/difficulty-in-solving-a-minlp/31555 "2019-11-26T23:51:06Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![muriloasouza](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/muriloasouza/32/4650_2.png) [@muriloasouza](https://discourse.julialang.org/u/muriloasouza)\
**Post date:** [November 26, 2019, 11:51pm UTC](https://discourse.julialang.org/t/difficulty-in-solving-a-minlp/31555/1 "2019-11-26T23:51:06Z")

</div>

Hello all, i’m trying to solve a MINLP using Couenne. These are my variables and constraints:

```julia
Constraints: 1040
Variables: 1048 (8 integer)
Auxiliaries: 3530 (13 integer)

```

It had a lot more, but i substituted some `@NLconstraint` for `@NLexpression`, and it’s still taking a long time to solve (it has been running for a bit more than 4 hours now, and still didn’t found a solution).  
Based on the numbers of variables and constraints i got there, do you guys expect this to be this hard to solve?

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [November 27, 2019, 12:39am UTC](https://discourse.julialang.org/t/difficulty-in-solving-a-minlp/31555/2 "2019-11-27T00:39:15Z")

</div>

MINLPs are one of the hardest problem classes to solve. Problem difficulty can depend on the size, but also what types of nonlinearity you have and how you formulated the model.

It’s hard to offer advice without code.

---

<div class="post-metadata">

**Author:** ![muriloasouza](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/muriloasouza/32/4650_2.png) [@muriloasouza](https://discourse.julialang.org/u/muriloasouza)\
**Post date:** [November 27, 2019, 12:56am UTC](https://discourse.julialang.org/t/difficulty-in-solving-a-minlp/31555/3 "2019-11-27T00:56:43Z")

</div>

Sure thing. I’m going to post the `@NLexpression` version:

```julia
#u -> A 65x1 previously calculated float vector
#Yh_real and Yh_imag -> 65x65x15 previously calculated float arrays

Nt = 65;
fq = 100;
barramin = 27; 
barramax = 30;
hsmin = 3;
hsmax = 15;
hmax = 15;

Xcf = zeros(Nt,1);
Cf = zeros(Nt,1);
   for i = 1:Nt
       if i >= barramin && i <= barramax
       Xcf[i] = u[i]^2/Qmod;
       Cf[i] = 1/(2*pi*60*Xcf[i]);
       end
   end

   m = Model(solver=CouenneNLSolver())

   @variable(m, a[i = barramin:barramax], Bin)
   @variable(m, hsmin <= hs[i=barramin:barramax] <= hsmax, Int)
   @variable(m, Vh_filtro_real[i = 1:Nt,h = 3:2:hmax])
   @variable(m, Vh_filtro_imag[i = 1:Nt,h = 3:2:hmax])
   @variable(m, DHTv3_filtro[i = 1:Nt] <= DHTv3_max)
   @variable(m, DHTvI_filtro[i = 1:Nt] <= DHTvI_max)
   Yh_filtro_real = Dict();
   Yh_filtro_imag = Dict();

@objective(m, Min, sum(a[i] for i = barramin:barramax))

@NLexpression(m, y5_real[i = barramin:barramax, h = 3:2:hmax], (Xcf[i]/(fq*(2*hs[i]+1)))/((Xcf[i]/(fq*(2*hs[i]+1)))^2+(h*Xcf[i]/((2*hs[i]+1)^2)-Xcf[i]/h)^2))
@NLexpression(m, y5_imag[i = barramin:barramax, h = 3:2:hmax], (-h*Xcf[i]/((2*hs[i]+1)^2)+Xcf[i]/h)/((Xcf[i]/(fq*(2*hs[i]+1)))^2+(h*Xcf[i]/((2*hs[i]+1)^2)-Xcf[i]/h)^2))

   for h = 3:2:hmax, L = 1:Nt, C = 1:Nt
        if L == C && (L >= barramin && L <= barramax)
            Yh_filtro_real[L, C, h] = @NLexpression(m, Yh_real[L,C,h]+a[L]*y5_real[L,h]);
            Yh_filtro_imag[L, C, h] = @NLexpression(m, Yh_imag[L,C,h]+a[L]*y5_imag[L,h]);
        else
            Yh_filtro_real[L, C, h] = @NLexpression(m, Yh_real[L,C,h]);
            Yh_filtro_imag[L, C, h] = @NLexpression(m, Yh_imag[L,C,h]);
        end
   end

  for h = 3:2:hmax, L = 1:Nt
   @NLconstraint(m, sum(Yh_filtro_real[L,C,h]*Vh_filtro_real[C,h]-Yh_filtro_imag[L,C,h]*Vh_filtro_imag[C,h] for C = 1:Nt) == Ih_real[L,h])
   @NLconstraint(m, sum(Yh_filtro_imag[L,C,h]*Vh_filtro_real[C,h]+Yh_filtro_real[L,C,h]*Vh_filtro_imag[C,h] for C = 1:Nt) == Ih_imag[L,h])
  end

@NLexpression(m, Vh_filtro[i = 1:Nt,h = 3:2:hmax], sqrt(1e-20+Vh_filtro_real[i,h]^2+Vh_filtro_imag[i,h]^2))

@NLconstraint(m, con5[i = 1:Nt], DHTv3_filtro[i] == sqrt(1e-20+sum(Vh_filtro[i,h]^2 for h = 3:2:hmax if rem(h,3) == 0))/u[i]*100)
@NLconstraint(m, con6[i = 1:Nt], DHTvI_filtro[i] == sqrt(1e-20+sum(Vh_filtro[i,h]^2 for h = 3:2:hmax if rem(h,3) != 0))/u[i]*100)

status = solve(m)

```
