Difficulty in solving a MINLP

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

``````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?

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.

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

``````#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)
``````