53#define PRICER_NAME "coloring"
54#define PRICER_DESC "pricer for coloring"
55#define PRICER_PRIORITY 5000000
56#define PRICER_DELAY TRUE
59#define MAXDNOM 10000LL
65#define DEFAULT_MAXVARSROUND 1
66#define DEFAULT_USETCLIQUE TRUE
67#define DEFAULT_USEGREEDY TRUE
68#define DEFAULT_ONLYBEST FALSE
69#define DEFAULT_MAXROUNDSROOT -1
70#define DEFAULT_MAXROUNDSNODE -1
71#define DEFAULT_MAXTCLIQUENODES INT_MAX
93 int** improvingstablesets;
94 int improvingstablesetssize;
123 for (
i = 0;
i < tcliqueGetNNodes(graph);
i++)
154 values[
i] = weights[
i];
170 int* maxstablesetnodes,
171 int* nmaxstablesetnodes
188 nnodes = tcliqueGetNNodes(graph);
189 *nmaxstablesetnodes = 0;
202 values[
i] = ( colored[
i] ==
TRUE ? degrees[
i] : degrees[
i]+
nnodes );
209 maxstablesetnodes[0] = sortednodes[0];
210 (*nmaxstablesetnodes) = 1;
215 for ( j = 0; j < (*nmaxstablesetnodes); j++ )
217 if ( tcliqueIsEdge(graph, sortednodes[
i], maxstablesetnodes[j]) )
223 if ( indnode ==
TRUE )
226 maxstablesetnodes[*nmaxstablesetnodes] = sortednodes[
i];
227 (*nmaxstablesetnodes) = (*nmaxstablesetnodes)+1;
251 maxsum += pricerdata->pi[
i];
258 maxscale = (INT_MAX -
nnodes - 1) / maxsum;
261 &pricerdata->scalefactor, &scalesuccess) );
264 if ( ! scalesuccess )
265 pricerdata->scalefactor = maxscale;
283 scaledval = val * scalefactor;
285 upval =
EPSCEIL(scaledval, 0.0);
311 assert(pricerdata->nstablesetsfound >= 0);
312 assert(pricerdata->scalefactor > 0);
315 *stopsolving =
FALSE;
322 pricerdata->actindex = (pricerdata->actindex+1)%(pricerdata->maxvarsround);
325 pricerdata->nstablesetnodes[pricerdata->actindex] = ncliquenodes;
326 for (
i = 0;
i < ncliquenodes;
i++ )
327 pricerdata->improvingstablesets[pricerdata->actindex][
i] = cliquenodes[
i];
333 if ( ! pricerdata->onlybest && pricerdata->actindex+1 >= pricerdata->maxvarsround )
368 if ( pricerdata !=
NULL )
395 pricerdata->bbnode =
NULL;
419 for (
i = 0;
i < pricerdata->maxvarsround;
i++ )
447 int* maxstablesetnodes;
448 int nmaxstablesetnodes;
469 if ( pricerdata->noderounds > 0 )
470 pricerdata->noderounds--;
474 if ( pricerdata->bbnode ==
NULL )
476 pricerdata->noderounds = pricerdata->maxroundsroot;
481 pricerdata->noderounds = pricerdata->maxroundsnode;
487 if ( pricerdata->noderounds == 0 )
493 *lowerbound = pricerdata->lowerbound;
504 nnodes = tcliqueGetNNodes(graph);
516 pricerdata->nstablesetsfound = 0;
518 if ( pricerdata->usegreedy )
527 maxstablesetnodes[0] = sortednodes[0];
528 nmaxstablesetnodes = 1;
529 maxstablesetweightreal = pricerdata->pi[sortednodes[0]];
535 for ( j = 0; j < nmaxstablesetnodes; j++ )
537 if ( tcliqueIsEdge(graph, sortednodes[
i], maxstablesetnodes[j]) )
546 maxstablesetnodes[nmaxstablesetnodes] = sortednodes[
i];
547 nmaxstablesetnodes = nmaxstablesetnodes+1;
548 maxstablesetweightreal = maxstablesetweightreal + pricerdata->pi[sortednodes[
i]];
553 SCIPdebugMessage(
"value of the greedy-heuristik: %f \n", maxstablesetweightreal);
560 pricerdata->nstablesetnodes[pricerdata->nstablesetsfound] = nmaxstablesetnodes;
561 for (
i = 0;
i < nmaxstablesetnodes;
i++ )
563 pricerdata->improvingstablesets[pricerdata->nstablesetsfound][
i] = maxstablesetnodes[
i];
565 pricerdata->nstablesetsfound += 1;
577 for (
i = 0;
i < nmaxstablesetnodes;
i++ )
587 SCIPdebugMessage(
"%d vars created via greedy\n", pricerdata->nstablesetsfound);
593 if ( pricerdata->nstablesetsfound == 0 && pricerdata->usetclique )
609 pricerdata->pi[
i] =
MAX(
MIN(dualsol, 1.0), 0.0);
619 pricerdata->actindex = -1;
620 for (
i = 0;
i < pricerdata->maxvarsround;
i++ )
621 pricerdata->nstablesetnodes[
i] = 0;
625 &(nmaxstablesetnodes), &maxstablesetweight, 0,
632 if ( pricerdata->onlybest && pricerdata->maxvarsround == 1 )
634 pricerdata->nstablesetnodes[0] = nmaxstablesetnodes;
635 for (
i = 0;
i < nmaxstablesetnodes;
i++ )
636 pricerdata->improvingstablesets[0][
i] = maxstablesetnodes[
i];
642 for (
i = 0;
i < pricerdata->maxvarsround;
i++ )
644 if ( pricerdata->nstablesetnodes[
i] > 0 )
646 maxstablesetweightreal = 0;
647 for ( j = 0; j < pricerdata->nstablesetnodes[
i]; j++ )
648 maxstablesetweightreal += pricerdata->pi[pricerdata->improvingstablesets[
i][j]];
650 if ( maxredcost < maxstablesetweightreal )
651 maxredcost = maxstablesetweightreal;
659 pricerdata->nstablesetnodes[
i], &setnumber) );
662 if ( setnumber >= 0 )
673 pricerdata->nstablesetsfound += 1;
676 for ( j = 0; j < pricerdata->nstablesetnodes[
i]; j++ )
680 pricerdata->constraints[pricerdata->improvingstablesets[
i][j]],
var) );
691 assert( maxredcost > 0.0 );
708 int* maxstablesetnodes;
709 int nmaxstablesetnodes;
716 int* nstablesetelements;
741 nmaxstablesetnodes = 0;
747 for (
i = 0;
i < nstablesets;
i++ )
753 for ( j = 0; j < nstablesetelements[
i]; j++ )
755 colored[stablesets[
i][j]] =
TRUE;
776 for (
i = 0;
i < nmaxstablesetnodes;
i++ )
781 colored[maxstablesetnodes[
i]] =
TRUE;
803 if( pricerdata->maxvarsround == pricerdata->oldmaxvarsround )
806 if ( pricerdata->maxvarsround <= 1 )
807 pricerdata->maxvarsround = 2;
809 if ( pricerdata->maxvarsround == pricerdata->oldmaxvarsround && pricerdata->nstablesetnodes !=
NULL )
813 if ( pricerdata -> oldmaxvarsround > 0 )
816 for (
i = 0;
i < pricerdata->oldmaxvarsround;
i++ )
828 for (
i = 0;
i < pricerdata->maxvarsround;
i++ )
833 SCIPdebugMessage(
"maxvarsround changed from %d to %d\n", pricerdata->oldmaxvarsround, pricerdata->maxvarsround);
835 pricerdata->oldmaxvarsround = pricerdata->maxvarsround;
854 pricerdata->scip =
scip;
856 pricerdata->maxvarsround = 0;
857 pricerdata->oldmaxvarsround = 0;
863 pricerRedcostColoring, pricerFarkasColoring, pricerdata) );
873 "pricers/coloring/maxvarsround",
874 "maximum number of variables that the coloring variable pricer creates each round",
878 "pricers/coloring/usetclique",
879 "should the tclique-algorithm be used to solve the pricing-problem to optimality? WARNING: computed (optimal) solutions are not necessarily optimal if this is set to FALSE.",
883 "pricers/coloring/usegreedy",
884 "should a greedy method be used to compute improving stable sets before potential use of tclique",
888 "pricers/coloring/onlybest",
889 "should the best variables be addded to the problem instead of adding the first found variables?",
893 "pricers/coloring/maxroundsroot",
894 "maximum number of pricing rounds in the root node (-1: no limit)",
898 "pricers/coloring/maxroundsnode",
899 "maximum number of pricing rounds in each node (except root node)(-1: no limit)",
903 "pricers/coloring/maxtcliquenodes",
904 "maximum number of B&B-nodes used in the tclique-algorithm",
#define DEFAULT_USETCLIQUE
#define DEFAULT_MAXROUNDSROOT
TCLIQUE_GRAPH * COLORconsGetCurrentGraph(SCIP *scip)
TCLIQUE_GRAPH * COLORconsGetComplementaryGraph(SCIP *scip)
constraint handler for storing the graph at each node of the tree
#define SCIP_STRINGEQ(name, reference, retcode)
SCIP_RETCODE SCIPaddCoefSetppc(SCIP *scip, SCIP_CONS *cons, SCIP_VAR *var)
SCIP_Real SCIPgetDualsolSetppc(SCIP *scip, SCIP_CONS *cons)
SCIP_RETCODE SCIPaddPricedVar(SCIP *scip, SCIP_VAR *var, SCIP_Real score)
int SCIPgetNVars(SCIP *scip)
SCIP_RETCODE SCIPupdateLocalLowerbound(SCIP *scip, SCIP_Real newbound)
SCIP_RETCODE SCIPcalcIntegralScalar(SCIP_Real *vals, int nvals, SCIP_Real mindelta, SCIP_Real maxdelta, SCIP_Longint maxdnom, SCIP_Real maxscale, SCIP_Real *intscalar, SCIP_Bool *success)
SCIP_Real SCIPrelDiff(SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPaddIntParam(SCIP *scip, const char *name, const char *desc, int *valueptr, SCIP_Bool isadvanced, int defaultvalue, int minvalue, int maxvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPsetIntParam(SCIP *scip, const char *name, int value)
SCIP_RETCODE SCIPaddBoolParam(SCIP *scip, const char *name, const char *desc, SCIP_Bool *valueptr, SCIP_Bool isadvanced, SCIP_Bool defaultvalue, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
SCIP_Real SCIPgetLPObjval(SCIP *scip)
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPallocBlockMemoryArray(scip, ptr, num)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_RETCODE SCIPsetPricerFree(SCIP *scip, SCIP_PRICER *pricer,)
void SCIPpricerSetData(SCIP_PRICER *pricer, SCIP_PRICERDATA *pricerdata)
SCIP_PRICERDATA * SCIPpricerGetData(SCIP_PRICER *pricer)
SCIP_RETCODE SCIPsetPricerCopy(SCIP *scip, SCIP_PRICER *pricer,)
const char * SCIPpricerGetName(SCIP_PRICER *pricer)
SCIP_RETCODE SCIPincludePricerBasic(SCIP *scip, SCIP_PRICER **pricerptr, const char *name, const char *desc, int priority, SCIP_Bool delay, SCIP_DECL_PRICERREDCOST((*pricerredcost)), SCIP_DECL_PRICERFARKAS((*pricerfarkas)), SCIP_PRICERDATA *pricerdata)
SCIP_RETCODE SCIPsetPricerExitsol(SCIP *scip, SCIP_PRICER *pricer,)
SCIP_RETCODE SCIPsetPricerInitsol(SCIP *scip, SCIP_PRICER *pricer,)
SCIP_Longint SCIPgetNNodes(SCIP *scip)
SCIP_Real SCIPinfinity(SCIP *scip)
SCIP_Bool SCIPisFeasZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_NODE * SCIPgetCurrentNode(SCIP *scip)
SCIP_NODE * SCIPgetRootNode(SCIP *scip)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
void SCIPvarMarkDeletable(SCIP_VAR *var)
SCIP_RETCODE SCIPcreateVar(SCIP *scip, SCIP_VAR **var, const char *name, SCIP_Real lb, SCIP_Real ub, SCIP_Real obj, SCIP_VARTYPE vartype, SCIP_Bool initial, SCIP_Bool removable, SCIP_DECL_VARDELORIG((*vardelorig)), SCIP_DECL_VARTRANS((*vartrans)), SCIP_DECL_VARDELTRANS((*vardeltrans)), SCIP_DECL_VARCOPY((*varcopy)), SCIP_VARDATA *vardata)
SCIP_RETCODE SCIPchgVarUbLazy(SCIP *scip, SCIP_VAR *var, SCIP_Real lazyub)
SCIP_Bool SCIPvarIsInLP(SCIP_VAR *var)
void SCIPsortDownRealInt(SCIP_Real *realarray, int *intarray, int len)
void SCIPsortDownInt(int *intarray, int len)
assert(minobj< SCIPgetCutoffbound(scip))
#define BMSclearMemoryArray(ptr, num)
SCIP_PARAMDATA * SCIPparamGetData(SCIP_PARAM *param)
static SCIP_RETCODE greedyStableSet(SCIP *scip, TCLIQUE_GRAPH *graph, SCIP_Bool *colored, int *maxstablesetnodes, int *nmaxstablesetnodes)
#define DEFAULT_MAXVARSROUND
static SCIP_RETCODE calculateScalingValue(SCIP_PRICERDATA *pricerdata, int nnodes)
static TCLIQUE_WEIGHT getScaledDualWeight(SCIP_Real val, SCIP_Real scalefactor, SCIP_Real mindelta)
SCIP_RETCODE SCIPincludePricerColoring(SCIP *scip)
#define DEFAULT_USEGREEDY
#define DEFAULT_MAXTCLIQUENODES
static SCIP_RETCODE sortNodes(SCIP *scip, SCIP_Real *weights, int nnodes, int *sortednodes)
static SCIP_Bool hasUncoloredNode(TCLIQUE_GRAPH *graph, SCIP_Bool *colored)
#define DEFAULT_MAXROUNDSNODE
variable pricer for the vertex coloring problem
SCIP_CONS ** COLORprobGetConstraints(SCIP *scip)
SCIP_RETCODE COLORprobAddNewStableSet(SCIP *scip, int *stablesetnodes, int nstablesetnodes, int *setindex)
int COLORprobGetNNodes(SCIP *scip)
SCIP_VAR * COLORprobGetVarForStableSet(SCIP *scip, int setindex)
void COLORprobGetStableSets(SCIP *scip, int ***stablesets, int **nelements, int *nstablesets)
SCIP_Bool COLORprobStableSetIsNew(SCIP *scip, int *stablesetnodes, int nstablesetnodes)
SCIP_RETCODE COLORprobAddVarForStableSet(SCIP *scip, int setindex, SCIP_VAR *var)
int COLORprobGetNStableSets(SCIP *scip)
file reader for vertex coloring instances
void tcliqueChangeWeight(TCLIQUE_GRAPH *tcliquegraph, int node, TCLIQUE_WEIGHT weight)
int * tcliqueGetDegrees(TCLIQUE_GRAPH *tcliquegraph)
enum TCLIQUE_Status TCLIQUE_STATUS
void tcliqueMaxClique(TCLIQUE_GETNNODES((*getnnodes)), TCLIQUE_GETWEIGHTS((*getweights)), TCLIQUE_ISEDGE((*isedge)), TCLIQUE_SELECTADJNODES((*selectadjnodes)), TCLIQUE_GRAPH *tcliquegraph, TCLIQUE_NEWSOL((*newsol)), TCLIQUE_DATA *tcliquedata, int *maxcliquenodes, int *nmaxcliquenodes, TCLIQUE_WEIGHT *maxcliqueweight, TCLIQUE_WEIGHT maxfirstnodeweight, TCLIQUE_WEIGHT minweight, int maxntreenodes, int backtrackfreq, int maxnzeroextensions, int fixednode, int *ntreenodes, TCLIQUE_STATUS *status)
struct TCLIQUE_Graph TCLIQUE_GRAPH
struct TCLIQUE_Data TCLIQUE_DATA
#define TCLIQUE_NEWSOL(x)
struct SCIP_Cons SCIP_CONS
struct SCIP_ParamData SCIP_PARAMDATA
#define SCIP_DECL_PARAMCHGD(x)
#define SCIP_DECL_PRICERFREE(x)
#define SCIP_DECL_PRICERREDCOST(x)
#define SCIP_DECL_PRICERFARKAS(x)
#define SCIP_DECL_PRICEREXITSOL(x)
#define SCIP_DECL_PRICERINITSOL(x)
struct SCIP_Pricer SCIP_PRICER
struct SCIP_PricerData SCIP_PRICERDATA
#define SCIP_DECL_PRICERCOPY(x)
enum SCIP_Retcode SCIP_RETCODE
struct SCIP_Node SCIP_NODE
struct SCIP_VarData SCIP_VARDATA