[Scip] cleanupcols at selective nodes
Sebastian Ruther
Sebastian.Ruther at uon.edu.au
Fri Dec 7 10:06:27 MET 2012
Hello again,
I have a question about cleaning up columns at nodes. In a nutshell:
I'm wondering why, when getting to a node, I'm not allowed to remove all
columns from the LP that are not part of the basis of the parent node. I
understand that physically deleting them is a bad idea but removing
them, i.e. transferring them to the varpricer, shouldn't be a problem?
What I ultimately want to do is:
My master problem is hard to solve. I can set lp/cleanupcols to TRUE,
which keeps the MP small. However, this results in calling varpricer
(and thus solving an LP) sometimes several hundred times before I get to
add variables in my own pricer. This takes too long.
The other extreme is to use lp/cleanupcols = FALSE, which means
varpricer is called less often but every lp solve call takes several
seconds, which in the end also takes too long as well.
So I would like to balance this and only remove columns from the lp once
a certain threshold on the number of variables is exceeded. The problem
is that it then only removes the columns it added at the current node,
which does not result in a sufficient reduction. In focusnodeToFork i
would like to call SCIPlpCleanupAll instead of SCIPlpCleanupNew but I
don't seem to be allowed to do so. It asserts when I do that.
Here is what I understand (think I understand):
I set lp/cleanupcols to TRUE and printed the number of columns every
time CPLEX is called. What I see is that when solveNodeInitialLP is
called for two siblings (say node 4 and 5), the LP starts with the same
number of columns. So the information which columns are in the LP must
be coming from the parent (here node 2). Lets say node 4 is executed
first, some others follow, and then node 5 is selected. In that case the
lpi holds an LP that may have all sorts of variables. In this setting,
SCIP goes through the variables and removes all but the ones that the
parent marked as necessary.
So technically it does exactly what I think would be necessary for my
strategy: removes all unimportant columns and adds those that the basis
requires ( SCIPtreeLoadLP can "add the missing columns and rows").
To come back to my question: Why can't I call SCIPlpCleanupAll instead
of SCIPlpCleanupNew?
Regards,
Sebastian
More information about the Scip
mailing list