[Couenne] Possible bug in adding branching objects

Pietro Belotti belotti at lehigh.edu
Tue Jun 8 12:13:09 EDT 2010


Hi Pete,

that part didn't change over the years, and I think this is a correct  
behavior. You may find a more detailed explanation in the paper  
"Branching and bounds tightening techniques for non-convex MINLP"  
linked below:

http://www.optimization-online.org/DB_HTML/2008/08/2059.html
http://www.informaworld.com/smpp/content~db=all~content=a913750293~frm=titlelink?words=belotti&hash=633929582

As you know, Couenne uses a linear relaxation to find a lower bound to  
a nonlinear problem. Given a nonlinear constraint y=f(x), where f is  
nonlinear, a branching rule uses a disjunction (x <= a OR x >= a),  
where x is a variable and a is a constant, in order to partition the  
problem in two subproblems and obtain a tighter relaxation and better  
lower bounds. The branching rule is only necessary when the solution  
(x0,y0) to the linear relaxation is such that y0 != f(x0).

Branching rules, therefore, are only necessary with nonlinear  
constraints (and with integer variables). When f is linear, the  
constraint y=f(x) is directly added to the linear relaxation and is  
hence never violated, therefore there is no need to add x as a  
branching variable if it only appears as an argument of f and f is  
linear.

Considering your example, w_4 should not trigger a branching rule on  
w_3 as the linear equation linking them is always satisfied by the  
relaxation. In that case, only x_1 needs to be branched on, because  
the linear relaxation might have a solution (x_1,w_2,w_3,w_4) where  
w_2 != x_1 ^ 2.

I hope this answer your question.

Best,
Pietro

_________________________________________
Pietro Belotti, Lehigh University
Dept. of Industrial and Systems Engineering
200 W Packer Ave, Bethlehem PA 18015.
phone: 610-758-3865   fax: 610-758-4886
email: belotti at lehigh.edu
web:   http://www.lehigh.edu/~pib208


On 06/08/2010, Pete Janes <ppjanes at gmail.com> wrote:

> Hi Pietro,
>
> I notice that there might be a bug in the way Couenne adds new branching
> objects in main/BonCouenneSetup.cpp. Here, an object associated with an
> exprVar is added:
>
> continuousSolver_ -> addObjects (nobj, objects)
>
> if 1) it is an integer variable, or 2) it has at least another variable
> which is dependent on it. I think the problem lies with the way the
> dependency determined in problem/fillDependence.cpp as it does not consider
> a linear variable as a dependent. For example:
>
> w_3 = x_1 ^ 2
> w_4 = w_3 + w_2
>
> w_4 is clearly dependent on w_3, but the dependency graph does not include
> this relationship as w_4 is linear. This is seen in the code
> in problem/fillDependence.cpp:
>
> for (std::vector <exprVar *>::iterator i = variables_.begin ();
>        i != variables_.end (); ++i) {
>
>     if (((*i) -> Type () == AUX)                           // consider aux's
> only
> && ((*i) -> Image () -> Linearity () > LINEAR)) {  // and nonlinear
>     }
>
> This affects how the number of infeasibilities are counted, as
> checkInfeasibilities() is only called on branching variables. This means
> that some solution calculated by CLP may be accepted as a solution to the
> primal problem, when they are actually infeasible. I am using an old
> modified version of Couenne, but I have checked the latest source code. I am
> not sure why I didn't notice this problem before.
>
> Regards,
>
> Pete
>



----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.



More information about the Couenne mailing list