[SCIP] pseudo-solution objectives in the presence of pricers
Marc Pfetsch
pfetsch at mathematik.tu-darmstadt.de
Thu Jan 21 11:43:19 CET 2021
Hi James,
I am not sure whether I can help, but let me try ...
> fixandinfer (and my variant) work by creating a pseudo-solution in a
> probing node.
Why are you creating a pseudo-solution? Can't you use your relaxation to
create a "real" solution?
> When this pseudo-solution is proposed as a new primal solution we get
> (unless I am mistaken) the following sequence of calls:
>
> SCIPtryCurrentSol ->
> SCIPprimalTryCurrentSol ->
> SCIPprimalLinkCurrentSol ->
> SCIPsolLinkCurrentSol ->
> SCIPsolLinkPseudoSol ->
> SCIPlpGetPseudoObjval
>
> When we get to SCIPlpGetPseudoObjVal the following is executed
>
> if( lp->pseudoobjvalinf > 0 || set->nactivepricers > 0 )
> return -SCIPsetInfinity(set);
>
> Presumably the idea here is that because there are active pricers then
> more variables might come along and so (since we are in the transformed
> problem) it makes sense to return -infinity as a bound.
Yes, that seems to be the idea. In your case lp->pseudoobjvalinf is 0?
> The problem is
> that we can have, restricted to the currently existing variables, a
> feasible solution which SCIP indeed judges to be feasible.
>
> So what happens is that SCIP informs me that the problem is unbounded
> since it has found a solution that is (1) feasible and (2) with
> unbounded objective.
O.k. but this is strange. The solution should have been tested for
feasibility. I would think that this is a bug, but I am not sure where.
It might be that some constraint handler is not handling unbounded
pseudo-solutions correctly.
> I am currently getting round this problem by just copying over solution
> values to a brand new solution:
>
> /* have to copy pseudo solution since there are active pricers */
> SCIP_CALL( SCIPallocBufferArray(scip, &vals, nvars) );
> SCIP_CALL( SCIPgetSolVals(scip, NULL, nvars, vars, vals) );
> SCIP_CALL( SCIPcreateSol(scip, &sol, heur) );
> SCIP_CALL( SCIPsetSolVals(scip, sol, nvars, vars, vals) );
> SCIPfreeBufferArray(scip, &vals);
>
> SCIP_CALL( SCIPtrySolFree(scip, &sol, FALSE, FALSE, FALSE, FALSE,
> FALSE, &success) );
>
> Is there a better workaround?
I guess that is workaround works because you are moving away from a
pseudo-solution. So here again, the question would be whether you want
to directly create such a solution from the start.
But in any case, the workaround is not so bad, I think.
> Btw, my variant differs from fixandinfer only in that the best variable
> to fix is that one whose pseudo-value (ie best with respect to
> objective) is closest to its current LP solution value. This actually
> works pretty well for my problem (each variable is binary, with negative
> objective and there is a collection of set packing constraints; each
> variable is in exactly one of these, so there are lots of easy
> propagations).
I think that it is easy to implement this, even for a "real" solution as
suggested above, since the pseudo-solution just evaluates the bounds of
the variables.
Best
Marc
More information about the Scip
mailing list