[Coin-symphony] How to enforce "at least one variable is zero"

Michael Hennebry hennebry at web.cs.ndsu.NoDak.edu
Fri Jan 4 02:03:27 EST 2008


On Thu, 3 Jan 2008, Mark Williams wrote:

> On 1/3/2008 2:36 PM, Michael Hennebry wrote:
> > On Thu, 3 Jan 2008, Mark Williams wrote:
> >
> >> I need a constraint of the form "at least one of these (real valued, >=0) variables is zero".


> >> I realize I can do this by creating a parallel set of boolean variables, constraining the sum of those variables to be one, and then adding constraints of the form Vi <= M - M*bi (for suitably large M). But this approach appears to run into severe difficulties (very high runtimes for relatively small problems).
> >
> > Not quite:
> > Vi <= Mi*bi
> > SUM (1-bi) >= 1
> >  i
>
> Im not sure what your point is. I see three differences:
>
> 1) Your bi's are the complement of my bi's.
> 2) You have a separate M for each V
> 3) Your constraint on the bi's is SUM(1-bi) >= 1, while mine is SUM(1-bi)==1
>
> 1) doesnt seem relevant

I just found them easier to think about.

> 2) turns out to be irrelevant for me - the Vi's all have the same range
>
> So are you saying that 3) is a significant difference?

I missed your equality.  I *think* that the difference is unimportant.
Perhaps someone else could chime in.

> > The trick is to pick the smallest M's that will work.

This is what I thought would be important.
I suspected that you were using a single large M.

> > If you work at it, you only need ceil(lg(n)) binaries,
> > where n is the number of variables.
> > I don't know that that would be an improvement.
> >
>
> I hadnt thought of that (except for the n==2 case). Its worth a try, thanks.

Another strategy is to try to branch on
sums of binaries selected on the fly.
Start with the smallest and keep going until you reach one-half.

-- 
Michael   hennebry at web.cs.ndsu.NoDak.edu
"I AM DEATH, NOT TAXES.  *I* TURN UP ONLY ONCE."  --  Death




More information about the Symphony mailing list