[Cbc] Unbounded MIP problem returned as infeasible by CBCSolver
Kish Shen
kisshen at cisco.com
Sat Mar 8 16:35:48 EST 2014
John,
Thanks for the fix. I am unfortunately running into a new problem:
One of our unit tests for our CBC interface code is now aborting with
the new CBC 2.8 that I downloaded, and I suspect it is related to the
fix for the unbounded problem -- for the following problem:
Minimize
obj: x0
Subject To
cons0: x0 + x1 >= 3
cons1: x0 - x1 = 0
cons2: x0 + x1 <= 3.5
Bounds
x0 Free
x1 Free
Integers
x0
which is infeasible, but my code now report this as aborted, because
isProvenInfeasible() now returns false for this problem:
>> if (model->isInitialSolveProvenOptimal()) {
>> if (model->isProvenInfeasible()) {
>> } // else assume MIP aborted
>> //<1>
I assume it previously returned true, and the change is related to the
previous fix?
Cheers,
Kish
On 06/03/2014 20:18, John Forrest wrote:
> Kish,
>
> Have changed so (model->isInitialSolveProvenOptimal()) returns false (as
> it should).
>
> Checked in to 2.8. Hope that fixes it.
>
> John
>
> On 06/03/14 19:32, Kish Shen wrote:
>> Hi John,
>>
>> Thank you very much for your reply.
>>
>> > However when I try model->isContinuousUnbounded() it returns true
>>
>> I reran my program and you are correct -- isContinuousUnbounded() does
>> return true for the problem. I am not sure what happened previously,
>> sorry for the misreporting.
>>
>> > (model->isProvenInfeasible()) returning true is a bug - the fix is
>> > modifying code in that function to
>> >
>> > if (!status_ && (bestObjective_ >= 1.0e30 && !secondaryStatus_))
>> >
>>
>> I made the above change in CbcModel.cpp, and isProvenInfeasible()
>> returns false as expected. Thanks! Will this change be put into the
>> Cbc 2.8 branch?
>>
>> However, my result status checking code now reports the problem slove
>> as aborted, because in my code:
>>
>>
>> if (model->isInitialSolveProvenOptimal()) {
>> if (model->isProvenInfeasible()) {
>> } // else assume MIP aborted
>> //<1>
>> ...
>> }
>> ...
>> if (model->isContinuousUnbounded()) {
>> // problem is infeasible or unbounded
>> ....
>> }
>>
>> so if isProvenInfeasible() is false, the problem is assumed to have
>> aborted, and isContinousUnbounded() is only called if
>> isInitialSolveProvenOptimal() is false.
>>
>> Should the isContinousUnbounded() test be moved into <1> above, or
>> should the test be performed at both places (i.e. at <1> and where it
>> is now)?
>>
>> Thanks and cheers,
>>
>> Kish
>>
>>
>>
>>
>> On 06/03/2014 10:08, John Forrest wrote:
>>> Kish,
>>>
>>> (model->isProvenInfeasible()) returning true is a bug - the fix is
>>> modifying code in that function to
>>>
>>> if (!status_ && (bestObjective_ >= 1.0e30 && !secondaryStatus_))
>>>
>>> However when I try model->isContinuousUnbounded() it returns true
>>>
>>> If I have
>>>
>>> printf("status %d secondary %d infeasible %s unbounded %s\n",
>>> model.status(),model.secondaryStatus(),model.isProvenInfeasible()
>>> ? "true" : "false",model.isContinuousUnbounded() ? "true" :
>>> "false");
>>>
>>> in my code I get
>>>
>>> status 0 secondary 7 infeasible false unbounded true
>>>
>>> with above fix and
>>>
>>> status 0 secondary 7 infeasible true unbounded true
>>>
>>> without fix.
>>>
>>> Can you check isContinuousUnbounded() and if it fails send me some code
>>> to reproduce?
>>>
>>> John Forrest
>>>
>>>
>>> On 06/03/14 01:17, Kish Shen wrote:
>>>> Hi,
>>>>
>>>> For the following (very simple) problem:
>>>>
>>>> Minimize
>>>> obj: x0
>>>> Subject To
>>>> cons0: x0 + x1 <= 3
>>>> cons1: X0 = X1 = 0
>>>> Bounds
>>>> x0 Free
>>>> x1 Free
>>>> Integers
>>>> x0
>>>> End
>>>>
>>>> which is unbounded, but when we use CBCSolver to solve this problem,
>>>> we get the result that the problem is infeasible, specifically,
>>>>
>>>> CbcModel* model;
>>>> .....
>>>> model->isProvenInfeasible() returns 1 (true)
>>>>
>>>> Here is the relevant code we use to determine the status of a problem
>>>> after calling CbcSolver (via CbcMain0 and CbcMain1) to solve the
>>>> problem:
>>>>
>>>>
>>>> if (model->isInitialSolveProvenOptimal()) {
>>>> if (model->isProvenInfeasible()) {
>>>> ....
>>>>
>>>> For the above problem, the above if .. succeeds, which I think should
>>>> only be the case if the problem is proven infeasible at the root node,
>>>> but the root node solve should be unbounded (and in fact if I solve
>>>> the linear problem with CLP, the result is indeed unbounded), but the
>>>> test
>>>>
>>>> We actually have code to test if the root node solve is unbounded (in
>>>> which case we classify the solve result as "Unknown", i.e. either
>>>> infeasible or unbounded, which was the result I expected for the above
>>>> problem), but
>>>>
>>>> model->isContinuousUnbounded() returns 0 for the above problem, rather
>>>> than 1 as I expected.
>>>>
>>>> Is there something I am doing wrong, or is there a problem?
>>>>
>>>> I am using Cbc 2.8, which was downloaded last month (14 Feb).
>>>>
>>>> Thanks in advance for any help.
>>>>
>>>> Cheers,
>>>>
>>>> Kish
>>>>
>>>>
>>>> _______________________________________________
>>>> Cbc mailing list
>>>> Cbc at list.coin-or.org
>>>> http://list.coin-or.org/mailman/listinfo/cbc
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Cbc mailing list
>>> Cbc at list.coin-or.org
>>> http://list.coin-or.org/mailman/listinfo/cbc
>>
>> _______________________________________________
>> Cbc mailing list
>> Cbc at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/cbc
>>
>>
>
> _______________________________________________
> Cbc mailing list
> Cbc at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cbc
More information about the Cbc
mailing list