User Tools

Site Tools

Dicopt: Infeasible Subproblems

Q: I have a MINLP problem to solve with nonlinearities at the continuous
variables. The model is convex at these variables.

When I use the Dicopt, none of the NLP's is feasible. I know that not all
combination of binary variables gives a feasible continuous problem, so I
incremented the number of Dicopt iterations (to 100), but without success.
All NLP subproblems were infeasible.

When I relaxed the binary variables, by considering y=b+s1-s2, 0⇐ y,s1,s2
⇐1, b in {0,1} and M*(s1+s2) at the objective function, I got a solution
with s1, s2 > 0.

I've tried several initial solutions, obtained through heuristics, but with
the same result.

Here are a few general hints:

Try to solve it with a different NLP subsolver, e.g. CONOPT instead of MINOS

Try to solve it with a different MINLP solver, e.g. SBB, BONMIN or one of the global codes.

A comment by Arne Drud: If you have access to the SBB solver you may try this. It uses branch and bound directly on the nonlinear model where DICOPT branches on a linear approximation. If the linear approximation is not a very good approximation to the overall model, DICOPT will not predict the binary variables very well and you may get the infeasible NLPs you experience. Unfortunately for you, DICOPT does not have a very good method when the NLPs are infeasible – it just cuts away this one binary point and tries again. If SBB experience an infeasible subproblem then it can prune a whole branch
of the B&B tree, so it loves infeasible NLPs.

A comment by Aldo Vecchietti: For the case when there are infeasible NLP subproblems, in the default version of DICOPT no linearizations are added but simply an integer cut, which is very weak. In order to add linearizations for infeasible NLPs, which may increase the chances of finding feasible subproblems, you may want to try adding the option: infeasder 1 in an options file for DICOPT. Also, rather than relaxing the integer variables with slacks, you might try relaxing a “critical” constraint for feasibility by adding a slack variable, and introducing it in the objective with a fairly large weight.