[Cbc] Problem in using SOS and LotSize objects

John Forrest john.forrest at fastercoin.com
Sat Jun 28 11:24:04 EDT 2014


Marco,

My mistake (and laziness).  Each branching object should tighten the 
bounds.  This was being done on branching, but when I dug into code - 
not on final check of solution.  I have updated trunk and it now works.

John Forrest
On 28/06/14 11:59, mg wrote:
> Sorry for bothering you again, just one small doubt remaining.
> You said that in my lotsize example, the integrality of a variable was 
> overridden by the lotsize object.
> In cases like this, when one or more objects give branching 
> constraints on the same variable, is there a rule to solve these kind 
> of conflicts ?
> e.g. object with higher priority wins ?
>
> Thanks again
>
>
> 2014-06-28 12:30 GMT+02:00 mg <giunto.cardanico at gmail.com 
> <mailto:giunto.cardanico at gmail.com>>:
>
>     Thanks a lot John for the bug fixes and extensive explanation.
>
>
>
>
>     2014-06-28 10:14 GMT+02:00 John Forrest
>     <john.forrest at fastercoin.com <mailto:john.forrest at fastercoin.com>>:
>
>         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  <mailto:Cbc at list.coin-or.org>
>>         http://list.coin-or.org/mailman/listinfo/cbc
>
>
>         _______________________________________________
>         Cbc mailing list
>         Cbc at list.coin-or.org <mailto: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/33ef063b/attachment-0001.html>


More information about the Cbc mailing list