[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