[SCIP] LP objective value is lower than the node lower bound

Horváth Markó horvathmarko89 at gmail.com
Wed Mar 9 10:17:49 CET 2016


Dear all,

I'm again dealing with a branch-and-price procedure using SCIP-3.2.0 
(also SCIP-3.1.1 and SCIP-3.2.1) with SoPlex on Windows 7.
I'm using binary variables and some implicit integer variables in a 
minimization problem.
For the binary variables I use lazy upper bounds (since constraints 
ensure that their values will not exceed 1).
I've written my own pricer and my own branching rule.
The pricer generates new binary variables (with lazy upper bound) and 
the branching rule changes upper bounds via SCIPchgVarUbNode.

When I apply breadthfirst node selection I get the following result:
1) after the root node solved:
    - SCIPgetLPObjval = 32904.700
    - SCIPgetPrimalbound = 33088.400
    - my branching rule creates 4 children: nodes 2,3,4 and 5
2) at the first depth (nodes 2,3,4 and 5) everything is okay:
   2.1) after node 2 was completely solved with cut & price:
        - SCIPnodeGetLowerbound = 32904.700
        - SCIPgetDualbound = 32904.700
        - SCIPgetLPObjval = 32931.035
        - SCIPgetPrimalbound = 33088.400
        - my branching rule creates 4 children: nodes 6,7,8 and 9
   2.2) after node 3 was completely solved with cut & price:
        - SCIPnodeGetLowerbound = 32904.700
        - SCIPgetDualbound = 32904.700
        - SCIPgetLPObjval = 32909.886
        - SCIPgetPrimalbound = 33088.400
   2.3) after node 4 was completely solved with cut & price:
        - SCIPnodeGetLowerbound = 32904.700
        - SCIPgetDualbound = 32904.700
        - SCIPgetLPObjval = 32907.817
        - SCIPgetPrimalbound = 33088.400
   2.4) after node 5 was completely solved with cut & price:
        - SCIPnodeGetLowerbound = 32904.700
        - SCIPgetDualbound = 32904.700
        - SCIPgetLPObjval = 32934.992
        - SCIPgetPrimalbound = 33088.400
3) at node 6 something went wrong as I get:
    3.1) after node 6 was completely solved with cut & price:
        - SCIPnodeGetLowerbound = 32931.035
        - SCIPgetDualbound = 32907.817
        - SCIPgetLPObjval = 32930.200
        - SCIPgetPrimalbound = 33088.400

    SCIPnodeGetLowerbound and SCIPgetDualbound are what I expected, 
however SCIPgetLPObjval is incorrect, since it is lower (32930.200) than 
the node lower bound (32931.035).
    At first sight, I thought my pricer is wrong (it may add invalid 
columns to the problem), but I checked the initial LP of node 7:

    3.2) after the initial LP of node 7 was solved:
        - SCIPnodeGetLowerbound = 32931.035
        - SCIPgetDualbound = 32907.817
        - SCIPgetLPObjval = 32929.542
        - SCIPgetPrimalbound = 33088.400

    That is, the initial LP has lower optimal value (32929.542) than the 
node lower bound (32931.035).
    So, my pricer can not cause the problem since in this case it does 
not add any new column to the problem.
    To checked this, I wrote the last LP of node 2 (catching event 
SCIP_EVENTTYPE_LPSOLVED) and the first LP of node 7 (catching event 
SCIP_EVENTTYPE_FIRSTLPSOLVED).
    As I expected, the only difference between these files is that some 
variables have upper bound 0 in the second file and no upper bound in 
the first one.
    When I solve these LPs with a standalone solver I get that the 
optimum value of the first LP of node 7 is 32933.850, however (as I 
explained above) in my branch-and-price procedure SCIPgetLPObjval gives 
32929.542.

Another curiosity, that when I use dfs node selection (i.e, node 6 is 
selected after node 2 is solved) this problem does not occur, that is 
SCIPgetLPObjval >= SCIPnodeGetLowerbound always holds.

I would be grateful, if you could help me to find the source of this 
malfunction (if it is).

Best Regards,
Marko


More information about the Scip mailing list