[Cbc] Problem in using SOS and LotSize objects

John Forrest john.forrest at fastercoin.com
Sat Jun 28 04:14:08 EDT 2014


Marco,

I would strongly recommend going to Cbc/trunk as then I can quickly fix 
things for you.

There are three! ways of passing in  SOS to Cbc -
1) SOS indicated in an mps file going in via OsiClp.
2) SOS set in CbcModel.solver() by OsiSOS
3) SOS set in CbcModel by CbcSOS

1) and 3) were working but 2) was not being detected (now fixed) - so 
probably better to have

     objs[0]= new CbcSOS(&model,3,which,NULL,0,1);
     model.addObjects(1,objs);

in your code.

The Lotsizing example does work on stable - but I can see problems with 
stable.  Osi and OsiClp do not know about lotsizing so again you need to 
use model.addObjects(1,objs).

This worked on stable if I used model.branchAndBound().  I have fixed in 
trunk so that callCbc also works correctly.

However for safety you need to modify your code a bit - by playing 
around a bit with bounds I managed to get a solution with x1 at 6.33333, 
even though x1 was declared as integer.  This is because a lotsizing 
decision overrode the integer decision.  There is no elegant change to 
code to fix that problem, but the solution is trivial.  If you really 
want ranges of valid values in a lotsizing variable then do not declare 
it to be integer.  If you want a subset of points, then again do not 
declare it as integer but use something like -

     double points[7] =  {0.0,3.0,4.0,5.0,6.0,8.0,10.0};
     objs[0] = new CbcLotsize(&model,1,7,points);
     model.addObjects(1,objs);

If you want something even more complicated then it is easy to derive a 
MyLotsizing object which does exactly what you want.

I attach a (much) modified version of your code (adjusted for gcc).

I hope this helps.

John Forrest
On 27/06/14 15:50, mg wrote:
> Hi all,
> I'm trying to use SOS and LotSize/SemiContinuous objects without success.
>
> I have created a very simple program (attached) containing a small 
> problem with SOS and a small problem using LotSize objects...
>
> The SOS test problem is the following:
>
> max         3 * x0 + 2 * x1 + 4 * x2
> subject to
>             x0, x1, x2 binary
>             sos1(x0, x1, x2)
>
> and solving it, I get x0 = 1, x1= 1, x2 = 1 where I expected just one 
> single 1...
>
> The LotSize/SemiContinuous test problem is the following:
>
> min         2 * x0 + 3 * x1 + x2
> subject to
>             3 * x0 + 5 * x1 + 7 * x2 <= 42
>             4 * x0 + 3 * x1 + 2 * x2 <= 31
>             2 * x0 + 1 * x1 + 5 * x2 <= 23
>             x0, x1, x2 integers [0,4]
>             x1 semi-continuous can be 0 or [3,4]
>
> and solving it, I get x0 = 4, x1 = 2 where I expected x1 being 0,3 or 4
>
> Am I doing something wrong ?
>
> Thanks in advance,
> Marco
>
>
> _______________________________________________
> Cbc mailing list
> Cbc at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cbc

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/cbc/attachments/20140628/6472a0dc/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sctest.cpp
Type: text/x-c++src
Size: 3214 bytes
Desc: not available
URL: <http://list.coin-or.org/pipermail/cbc/attachments/20140628/6472a0dc/attachment-0001.bin>


More information about the Cbc mailing list