55#define HEUR_NAME "distributiondiving"
56#define HEUR_DESC "Diving heuristic that chooses fixings w.r.t. changes in the solution density"
57#define HEUR_DISPCHAR SCIP_HEURDISPCHAR_DIVING
58#define HEUR_PRIORITY -1003300
61#define HEUR_MAXDEPTH -1
62#define HEUR_TIMING SCIP_HEURTIMING_AFTERLPPLUNGE
63#define HEUR_USESSUBSCIP FALSE
64#define EVENT_DISTRIBUTION SCIP_EVENTTYPE_BOUNDCHANGED
65#define EVENTHDLR_NAME "eventhdlr_distributiondiving"
66#define DIVESET_DIVETYPES SCIP_DIVETYPE_INTEGRALITY
67#define DIVESET_ISPUBLIC FALSE
73#define DEFAULT_MINRELDEPTH 0.0
74#define DEFAULT_MAXRELDEPTH 1.0
75#define DEFAULT_MAXLPITERQUOT 0.05
76#define DEFAULT_MAXLPITEROFS 1000
77#define DEFAULT_MAXDIVEUBQUOT 0.8
79#define DEFAULT_MAXDIVEAVGQUOT 0.0
81#define DEFAULT_MAXDIVEUBQUOTNOSOL 0.1
82#define DEFAULT_MAXDIVEAVGQUOTNOSOL 0.0
83#define DEFAULT_BACKTRACK TRUE
84#define DEFAULT_LPRESOLVEDOMCHGQUOT 0.15
85#define DEFAULT_LPSOLVEFREQ 0
86#define DEFAULT_ONLYLPBRANCHCANDS TRUE
89#define SCOREPARAM_VALUES "lhwvd"
91#define SCOREPARAM_VALUESLEN 5
92#define DEFAULT_SCOREPARAM 'r'
93#define DEFAULT_RANDSEED 117
105 int* rowinfinitiesdown;
107 int* rowinfinitiesup;
119struct SCIP_EventhdlrData
140 if( maxindex < heurdata->memsize )
178 for( v = 0; v <
nvars; ++v )
231 assert(0 <= varindex && varindex < heurdata->varpossmemsize);
237 heurdata->currentlbs[varindex] = lblocal;
238 heurdata->currentubs[varindex] = ublocal;
257 int* rowinfinitiesdown,
282 *rowinfinitiesdown = 0;
283 *rowinfinitiesup = 0;
286 for(
c = 0;
c < nrowvals; ++
c )
329 ++(*rowinfinitiesdown);
331 ++(*rowinfinitiesup);
340 ++(*rowinfinitiesdown);
342 ++(*rowinfinitiesup);
348 *mu += colval * varmean;
351 squarecoeff =
SQR(colval);
352 *sigma2 += squarecoeff * varvariance;
405 assert(varub - varlb > 0.5);
410 squaredbounddiff = 0.0;
426 squaredbounddiffup = 0.0;
431 squaredbounddiffdown = 0.0;
440 for(
i = 0;
i < ncolrows; ++
i )
452 int rowinfinitiesdown;
479 rowmean =
heurdata->rowmeans[rowpos];
480 rowvariance =
heurdata->rowvariances[rowpos];
481 rowinfinitiesdown =
heurdata->rowinfinitiesdown[rowpos];
482 rowinfinitiesup =
heurdata->rowinfinitiesup[rowpos];
486 rowinfinitiesdown, rowinfinitiesup);
489 squaredcoeff =
SQR(rowval);
496 int rowinftiesdownafterbranch;
497 int rowinftiesupafterbranch;
500 changedrowmean = rowmean + rowval * (meanup - currentmean);
501 changedrowvariance = rowvariance + squaredcoeff * (squaredbounddiffup - squaredbounddiff);
502 changedrowvariance =
MAX(0.0, changedrowvariance);
504 rowinftiesdownafterbranch = rowinfinitiesdown;
505 rowinftiesupafterbranch = rowinfinitiesup;
509 rowinftiesupafterbranch--;
511 rowinftiesdownafterbranch--;
513 assert(rowinftiesupafterbranch >= 0);
514 assert(rowinftiesdownafterbranch >= 0);
516 rowinftiesupafterbranch);
519 newrowprobup = currentrowprob;
524 int rowinftiesdownafterbranch;
525 int rowinftiesupafterbranch;
527 changedrowmean = rowmean + rowval * (meandown - currentmean);
528 changedrowvariance = rowvariance + squaredcoeff * (squaredbounddiffdown - squaredbounddiff);
529 changedrowvariance =
MAX(0.0, changedrowvariance);
531 rowinftiesdownafterbranch = rowinfinitiesdown;
532 rowinftiesupafterbranch = rowinfinitiesup;
536 rowinftiesupafterbranch -= 1;
538 rowinftiesdownafterbranch -= 1;
540 assert(rowinftiesdownafterbranch >= 0);
541 assert(rowinftiesupafterbranch >= 0);
543 rowinftiesupafterbranch);
546 newrowprobdown = currentrowprob;
551 SCIPdebugMsg(
scip,
" Variable %s changes probability of row %s from %g to %g (branch up) or %g;\n",
553 SCIPdebugMsg(
scip,
" --> new variable score: %g (for branching up), %g (for branching down)\n",
554 *upscore, *downscore);
578 for( v =
heurdata->varpossmemsize - 1; v >= 0; --v )
626 assert(-1 <= varindex && varindex < heurdata->varpossmemsize);
631 varpos =
heurdata->varposs[varindex];
632 assert(varpos < heurdata->nupdatedvars);
653 heurdata->varposs[varindex] = varpos;
673 varpos =
heurdata->nupdatedvars - 1;
677 assert(0 <= varindex && varindex < heurdata->varpossmemsize);
722 oldlb =
heurdata->currentlbs[varindex];
723 oldub =
heurdata->currentubs[varindex];
747 for(
r = 0;
r < ncolrows; ++
r )
765 coeffsquared =
SQR(coeff);
768 heurdata->rowmeans[rowpos] += coeff * (newmean - oldmean);
769 heurdata->rowvariances[rowpos] += coeffsquared * (newvariance - oldvariance);
777 ++
heurdata->rowinfinitiesup[rowpos];
779 --
heurdata->rowinfinitiesup[rowpos];
782 ++
heurdata->rowinfinitiesdown[rowpos];
784 --
heurdata->rowinfinitiesdown[rowpos];
786 else if( coeff < 0.0 )
789 ++
heurdata->rowinfinitiesdown[rowpos];
791 --
heurdata->rowinfinitiesdown[rowpos];
794 ++
heurdata->rowinfinitiesup[rowpos];
796 --
heurdata->rowinfinitiesup[rowpos];
932 if( varindex == - 1 )
944 assert(0 <= varindex && varindex < heurdata->varpossmemsize);
961 *
roundup = (upscore > downscore);
962 *score =
MAX(upscore, downscore);
1026 heurdata = eventhdlrdata->heurdata;
1039#define divesetAvailableDistributiondiving NULL
1064 eventhdlrdata =
NULL;
1066 eventhdlrdata->heurdata =
heurdata;
1070 "event handler for dynamic acitivity distribution updating",
1071 eventExecDistribution, eventhdlrdata) );
1097 "the score;largest 'd'ifference, 'l'owest cumulative probability,'h'ighest c.p., 'v'otes lowest c.p., votes highest c.p.('w'), 'r'evolving",
#define DEFAULT_SCOREPARAM
#define EVENT_DISTRIBUTION
#define SCOREPARAM_VALUES
probability based branching rule based on an article by J. Pryor and J.W. Chinneck
SCIP_RETCODE SCIPupdateDistributionScore(SCIP *scip, SCIP_Real currentprob, SCIP_Real newprobup, SCIP_Real newprobdown, SCIP_Real *upscore, SCIP_Real *downscore, char scoreparam)
SCIP_Real SCIProwCalcProbability(SCIP *scip, SCIP_ROW *row, SCIP_Real mu, SCIP_Real sigma2, int rowinfinitiesdown, int rowinfinitiesup)
void SCIPvarCalcDistributionParameters(SCIP *scip, SCIP_Real varlb, SCIP_Real varub, SCIP_VARTYPE vartype, SCIP_Real *mean, SCIP_Real *variance)
SCIP_STAGE SCIPgetStage(SCIP *scip)
int SCIPgetNIntVars(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
SCIP_VAR ** SCIPgetVars(SCIP *scip)
int SCIPgetNBinVars(SCIP *scip)
SCIP_RETCODE SCIPaddCharParam(SCIP *scip, const char *name, const char *desc, char *valueptr, SCIP_Bool isadvanced, char defaultvalue, const char *allowedvalues, SCIP_DECL_PARAMCHGD((*paramchgd)), SCIP_PARAMDATA *paramdata)
SCIP_RETCODE SCIPincludeHeurDistributiondiving(SCIP *scip)
SCIP_VAR * SCIPcolGetVar(SCIP_COL *col)
int SCIPcolGetNNonz(SCIP_COL *col)
SCIP_Real * SCIPcolGetVals(SCIP_COL *col)
SCIP_ROW ** SCIPcolGetRows(SCIP_COL *col)
SCIP_RETCODE SCIPcreateDiveset(SCIP *scip, SCIP_DIVESET **diveset, SCIP_HEUR *heur, const char *name, SCIP_Real minreldepth, SCIP_Real maxreldepth, SCIP_Real maxlpiterquot, SCIP_Real maxdiveubquot, SCIP_Real maxdiveavgquot, SCIP_Real maxdiveubquotnosol, SCIP_Real maxdiveavgquotnosol, SCIP_Real lpresolvedomchgquot, int lpsolvefreq, int maxlpiterofs, unsigned int initialseed, SCIP_Bool backtrack, SCIP_Bool onlylpbranchcands, SCIP_Bool ispublic, SCIP_Bool specificsos1score, SCIP_DECL_DIVESETGETSCORE((*divesetgetscore)),)
SCIP_RETCODE SCIPsetEventhdlrFree(SCIP *scip, SCIP_EVENTHDLR *eventhdlr,)
SCIP_RETCODE SCIPincludeEventhdlrBasic(SCIP *scip, SCIP_EVENTHDLR **eventhdlrptr, const char *name, const char *desc, SCIP_DECL_EVENTEXEC((*eventexec)), SCIP_EVENTHDLRDATA *eventhdlrdata)
SCIP_EVENTHDLRDATA * SCIPeventhdlrGetData(SCIP_EVENTHDLR *eventhdlr)
void SCIPeventhdlrSetData(SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTHDLRDATA *eventhdlrdata)
SCIP_RETCODE SCIPcatchVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int *filterpos)
SCIP_RETCODE SCIPdropVarEvent(SCIP *scip, SCIP_VAR *var, SCIP_EVENTTYPE eventtype, SCIP_EVENTHDLR *eventhdlr, SCIP_EVENTDATA *eventdata, int filterpos)
SCIP_VAR * SCIPeventGetVar(SCIP_EVENT *event)
SCIP_RETCODE SCIPsetHeurFree(SCIP *scip, SCIP_HEUR *heur,)
SCIP_HEURDATA * SCIPheurGetData(SCIP_HEUR *heur)
SCIP_RETCODE SCIPincludeHeurBasic(SCIP *scip, SCIP_HEUR **heur, const char *name, const char *desc, char dispchar, int priority, int freq, int freqofs, int maxdepth, SCIP_HEURTIMING timingmask, SCIP_Bool usessubscip, SCIP_DECL_HEUREXEC((*heurexec)), SCIP_HEURDATA *heurdata)
SCIP_RETCODE SCIPsetHeurCopy(SCIP *scip, SCIP_HEUR *heur,)
SCIP_Longint SCIPheurGetNCalls(SCIP_HEUR *heur)
int SCIPheurGetNDivesets(SCIP_HEUR *heur)
SCIP_RETCODE SCIPsetHeurExit(SCIP *scip, SCIP_HEUR *heur,)
SCIP_RETCODE SCIPsetHeurInit(SCIP *scip, SCIP_HEUR *heur,)
const char * SCIPheurGetName(SCIP_HEUR *heur)
SCIP_DIVESET ** SCIPheurGetDivesets(SCIP_HEUR *heur)
SCIP_Bool SCIPhasCurrentNodeLP(SCIP *scip)
int SCIPgetNLPRows(SCIP *scip)
#define SCIPallocBufferArray(scip, ptr, num)
#define SCIPreallocBufferArray(scip, ptr, num)
#define SCIPfreeBufferArray(scip, ptr)
#define SCIPfreeBlockMemory(scip, ptr)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_Bool SCIPinProbing(SCIP *scip)
int SCIProwGetNNonz(SCIP_ROW *row)
SCIP_COL ** SCIProwGetCols(SCIP_ROW *row)
SCIP_RETCODE SCIPprintRow(SCIP *scip, SCIP_ROW *row, FILE *file)
const char * SCIProwGetName(SCIP_ROW *row)
int SCIProwGetIndex(SCIP_ROW *row)
SCIP_Real SCIProwGetConstant(SCIP_ROW *row)
SCIP_Real * SCIProwGetVals(SCIP_ROW *row)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisIntegral(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPfeasCeil(SCIP *scip, SCIP_Real val)
SCIP_Real SCIPfeasFloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisInfinity(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasNegative(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Bool SCIPisNegative(SCIP *scip, SCIP_Real val)
SCIP_COL * SCIPvarGetCol(SCIP_VAR *var)
SCIP_Bool SCIPvarIsActive(SCIP_VAR *var)
SCIP_Bool SCIPvarIsBinary(SCIP_VAR *var)
SCIP_VARSTATUS SCIPvarGetStatus(SCIP_VAR *var)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
int SCIPvarGetProbindex(SCIP_VAR *var)
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_HEUR * SCIPdivesetGetHeur(SCIP_DIVESET *diveset)
#define DEFAULT_ONLYLPBRANCHCANDS
#define DEFAULT_MAXDIVEUBQUOT
#define DEFAULT_LPRESOLVEDOMCHGQUOT
#define DEFAULT_MAXLPITERQUOT
#define DEFAULT_MAXDIVEAVGQUOT
#define DEFAULT_LPSOLVEFREQ
#define DEFAULT_BACKTRACK
#define DEFAULT_MAXDIVEUBQUOTNOSOL
#define DEFAULT_MAXRELDEPTH
#define DEFAULT_MAXLPITEROFS
#define DEFAULT_MAXDIVEAVGQUOTNOSOL
#define DIVESET_DIVETYPES
#define DEFAULT_MINRELDEPTH
static SCIP_DIVESET * diveset
SCIPperformGenericDivingAlgorithm(scip, diveset, heurdata->sol, heur, result, nodeinfeasible, lpiterlimit, -1, -1.0, SCIP_DIVECONTEXT_ADAPTIVE))
#define divesetAvailableDistributiondiving
SCIPheurSetData(heur, NULL)
static SCIP_RETCODE calcBranchScore(SCIP *scip, SCIP_HEURDATA *heurdata, SCIP_VAR *var, SCIP_Real lpsolval, SCIP_Real *upscore, SCIP_Real *downscore, char scoreparam)
static void rowCalculateGauss(SCIP *scip, SCIP_HEURDATA *heurdata, SCIP_ROW *row, SCIP_Real *mu, SCIP_Real *sigma2, int *rowinfinitiesdown, int *rowinfinitiesup)
#define SCOREPARAM_VALUESLEN
static void heurdataUpdateCurrentBounds(SCIP *scip, SCIP_HEURDATA *heurdata, SCIP_VAR *var)
static SCIP_RETCODE varProcessBoundChanges(SCIP *scip, SCIP_HEURDATA *heurdata, SCIP_VAR *var)
static SCIP_VAR * heurdataPopBoundChangeVar(SCIP_HEURDATA *heurdata)
SCIPfreeSol(scip, &heurdata->sol))
static SCIP_RETCODE heurdataEnsureArraySize(SCIP *scip, SCIP_HEURDATA *heurdata, int maxindex)
static SCIP_RETCODE heurdataFreeArrays(SCIP *scip, SCIP_HEURDATA *heurdata)
static void heurdataAddBoundChangeVar(SCIP_HEURDATA *heurdata, SCIP_VAR *var)
SCIPcreateSol(scip, &heurdata->sol, heur))
Diving heuristic that chooses fixings w.r.t. changes in the solution density after Pryor and Chinneck...
assert(minobj< SCIPgetCutoffbound(scip))
methods commonly used by primal heuristics
memory allocation routines
public methods for managing events
public methods for primal heuristics
public methods for LP management
public methods for message output
public methods for problem variables
public methods for event handler plugins and event handlers
public methods for primal heuristic plugins and divesets
public methods for the LP relaxation, rows and columns
public methods for memory management
public methods for message handling
public methods for numerical tolerances
public methods for SCIP parameter handling
public methods for global and local (sub)problems
public methods for the probing mode
public methods for solutions
struct SCIP_Eventhdlr SCIP_EVENTHDLR
struct SCIP_EventhdlrData SCIP_EVENTHDLRDATA
#define SCIP_DECL_EVENTEXEC(x)
#define SCIP_DECL_EVENTFREE(x)
#define SCIP_DECL_HEURCOPY(x)
struct SCIP_HeurData SCIP_HEURDATA
struct SCIP_Heur SCIP_HEUR
#define SCIP_DECL_HEURINIT(x)
struct SCIP_Diveset SCIP_DIVESET
#define SCIP_DECL_HEUREXIT(x)
#define SCIP_DECL_HEURFREE(x)
#define SCIP_DECL_DIVESETGETSCORE(x)
#define SCIP_DECL_HEUREXEC(x)
@ SCIP_DIVECONTEXT_SINGLE
enum SCIP_Retcode SCIP_RETCODE
enum SCIP_Vartype SCIP_VARTYPE