24 #include "scip/cons_linear.h" 31 #define PRICER_NAME "stp" 32 #define PRICER_DESC "pricer for stp" 33 #define PRICER_PRIORITY 1 34 #define PRICER_DELAY TRUE 73 SCIPdebugPrintf(
"pricerCopy \n");
74 assert(pricer != NULL);
75 assert(strcmp(SCIPpricerGetName(pricer),
PRICER_NAME) == 0);
84 SCIP_PRICERDATA* pricerdata;
85 SCIPdebugPrintf(
"pricerfree \n");
89 pricerdata = SCIPpricerGetData(pricer);
92 if ( pricerdata != NULL )
94 SCIPfreeMemory(
scip, &pricerdata);
97 SCIPpricerSetData(pricer, NULL);
106 SCIP_PRICERDATA* pricerdata;
107 SCIPdebugPrintf(
"pricer Init \n");
108 assert(
scip != NULL);
109 assert(pricer != NULL);
111 pricerdata = SCIPpricerGetData(pricer);
119 pricerdata->lowerbound = 0;
127 SCIP_PRICERDATA* pricerdata;
128 SCIPdebugPrintf(
"pricerinitsol \n");
129 assert(
scip != NULL);
130 assert(pricer != NULL);
132 pricerdata = SCIPpricerGetData(pricer);
133 assert(pricerdata != NULL);
136 if( !pricerdata->bigt )
156 SCIP_PRICERDATA* pricerdata;
158 assert(
scip != NULL);
159 assert(pricer != NULL);
161 pricerdata = SCIPpricerGetData(pricer);
162 assert(pricerdata != NULL);
165 SCIPfreeMemoryArray(
scip, &(pricerdata->mi));
166 SCIPfreeMemoryArray(
scip, &(pricerdata->pi));
167 SCIPfreeMemoryArray(
scip, &pricerdata->ncreatedvars);
181 SCIP_PRICERDATA* pricerdata;
182 SCIP_PROBDATA* probdata;
186 SCIP_Real* edgecosts;
187 char varname[SCIP_MAXSTRLEN];
188 SCIP_Real newlowerbound = -SCIPinfinity(scip);
195 assert(scip != NULL);
196 assert(pricer != NULL);
199 pricerdata = SCIPpricerGetData(pricer);
200 assert(pricerdata != NULL);
203 probdata = SCIPgetProbData(scip);
204 assert(probdata != NULL);
206 SCIPdebugMessage(
"solstat=%d\n", SCIPgetLPSolstat(scip));
208 if( !farkas && SCIPgetLPSolstat(scip) == SCIP_LPSOLSTAT_OPTIMAL )
209 newlowerbound = SCIPgetSolTransObj(scip, NULL);
211 SCIPdebug( SCIP_CALL( SCIPprintSol(scip, NULL, NULL,
FALSE) ) );
214 if ( pricerdata->lowerbound <= 4 )
216 char label[SCIP_MAXSTRLEN];
217 (void)SCIPsnprintf(label, SCIP_MAXSTRLEN,
"X%g.gml", pricerdata->lowerbound);
219 pricerdata->lowerbound++;
226 for( t = 0; t < pricerdata->realnterms; ++t )
230 pricerdata->mi[t] = SCIPgetDualfarkasLinear(scip, pricerdata->pathcons[t]);
234 pricerdata->mi[t] = SCIPgetDualsolLinear(scip, pricerdata->pathcons[t]);
235 assert(!SCIPisNegative(scip, pricerdata->mi[t]));
239 for( e = 0; e < pricerdata->nedges; ++e )
241 if( !pricerdata->bigt )
243 for( t = 0; t < pricerdata->realnterms; ++t )
247 pricerdata->pi[t * pricerdata->nedges + e] = SCIPgetDualfarkasLinear(
248 scip, pricerdata->edgecons[t * pricerdata->nedges + e]);
252 pricerdata->pi[t * pricerdata->nedges + e] = SCIPgetDualsolLinear(
253 scip, pricerdata->edgecons[t * pricerdata->nedges + e]);
261 pricerdata->pi[e] = SCIPgetDualfarkasLinear(
262 scip, pricerdata->edgecons[e]);
266 pricerdata->pi[e] = SCIPgetDualsolLinear(
267 scip, pricerdata->edgecons[e]);
272 SCIP_CALL( SCIPallocMemoryArray(scip, &path, graph->
knots) );
273 SCIP_CALL( SCIPallocMemoryArray(scip, &edgecosts, pricerdata->nedges) );
275 if( pricerdata->bigt )
277 for( e = 0; e < pricerdata->nedges; ++e )
279 edgecosts[e] = (-pricerdata->pi[e]);
283 for( t = 0; t < pricerdata->realnterms; ++t )
285 for( e = 0; e < pricerdata->nedges; ++e )
287 if( !pricerdata->bigt )
289 edgecosts[e] = (-pricerdata->pi[t * pricerdata->nedges + e]);
292 assert(!SCIPisNegative(scip, edgecosts[e]));
295 for( i = 0; i < graph->
knots; i++ )
302 tail = pricerdata->realterms[t];
303 while( tail != pricerdata->root )
305 redcost += edgecosts[path[tail].
edge];
306 tail = graph->
tail[path[tail].edge];
308 redcost -= pricerdata->mi[t];
310 if( !farkas && SCIPgetLPSolstat(scip) == SCIP_LPSOLSTAT_OPTIMAL )
312 newlowerbound += redcost;
315 if( SCIPisNegative(scip, redcost) )
319 sprintf(varname,
"PathVar%d_%d", t, pricerdata->ncreatedvars[t]);
320 ++(pricerdata->ncreatedvars[t]);
322 SCIP_CALL( SCIPcreateVarBasic(scip, &var, varname, 0.0, SCIPinfinity(scip), 0.0, SCIP_VARTYPE_CONTINUOUS) );
323 SCIP_CALL( SCIPaddPricedVar(scip, var, -redcost) );
324 tail = pricerdata->realterms[t];
325 while( tail != pricerdata->root )
328 if( !pricerdata->bigt )
330 SCIP_CALL( SCIPaddCoefLinear(scip, pricerdata->edgecons[t * pricerdata->nedges + path[tail].
edge], var, 1.0) );
334 SCIP_CALL( SCIPaddCoefLinear(scip, pricerdata->edgecons[path[tail].
edge], var, 1.0) );
337 tail = graph->
tail[path[tail].
edge];
339 SCIP_CALL( SCIPaddCoefLinear(scip, pricerdata->pathcons[t], var, 1.0) );
343 if( !farkas && SCIPgetLPSolstat(scip) == SCIP_LPSOLSTAT_OPTIMAL )
344 *lowerbound = newlowerbound;
346 SCIPfreeMemoryArray(scip, &edgecosts);
347 SCIPfreeMemoryArray(scip, &path);
359 *result = SCIP_SUCCESS;
382 SCIP_PRICERDATA* pricerdata;
384 SCIPdebugPrintf(
"include Pricer \n");
387 SCIP_CALL( SCIPallocMemory(scip, &pricerdata) );
388 pricerdata->scip =
scip;
393 pricerRedcostStp, pricerFarkasStp, pricerdata) );
394 assert(pricer != NULL);
397 SCIP_CALL( SCIPsetPricerCopy(scip, pricer, pricerCopyStp) );
398 SCIP_CALL( SCIPsetPricerFree(scip, pricer, pricerFreeStp) );
399 SCIP_CALL( SCIPsetPricerInit(scip, pricer, pricerInitStp) );
400 SCIP_CALL( SCIPsetPricerInitsol(scip, pricer, pricerInitsolStp) );
401 SCIP_CALL( SCIPsetPricerExitsol(scip, pricer, pricerExitsolStp) );
SCIP_RETCODE SCIPincludePricerStp(SCIP *scip)
SCIP_CONS ** SCIPprobdataGetEdgeConstraints(SCIP *scip)
int SCIPprobdataGetNEdges(SCIP *scip)
static SCIP_DECL_PRICEREXITSOL(pricerExitsolStp)
static SCIP_DECL_PRICERFARKAS(pricerFarkasStp)
GRAPH * SCIPprobdataGetGraph(SCIP_PROBDATA *probdata)
static SCIP_DECL_PRICERCOPY(pricerCopyStp)
int * SCIPprobdataGetRTerms(SCIP *scip)
SCIP_CONS ** SCIPprobdataGetPathConstraints(SCIP *scip)
int SCIPprobdataGetRNTerms(SCIP *scip)
SCIP_Bool SCIPprobdataIsBigt(SCIP *scip)
static SCIP_DECL_PRICERINIT(pricerInitStp)
SCIP_RETCODE SCIPprobdataPrintGraph(SCIP *scip, const char *filename, SCIP_SOL *sol, SCIP_Bool printsol)
static SCIP_RETCODE pricing(SCIP *scip, SCIP_PRICER *pricer, SCIP_Real *lowerbound, SCIP_Bool farkas)
static SCIP_DECL_PRICERFREE(pricerFreeStp)
int SCIPprobdataGetRoot(SCIP *scip)
includes various files containing graph methods used for Steiner problems
static SCIP_DECL_PRICERREDCOST(pricerRedcostStp)
void graph_path_exec(SCIP *, const GRAPH *, int, int, SCIP_Real *, PATH *)
static SCIP_DECL_PRICERINITSOL(pricerInitsolStp)