31 #define MINLPITER 10000 48 assert(lperror !=
NULL);
49 assert(cutoff !=
NULL);
97 assert(worksol !=
NULL);
98 assert(!onlylpbranchcands || lpcandsscores !=
NULL);
99 assert(!onlylpbranchcands || lpcandroundup !=
NULL);
100 assert(enfosuccess !=
NULL);
101 assert(infeasible !=
NULL);
102 assert(nviollpcands !=
NULL);
106 if( !onlylpbranchcands )
123 for( c = 0; c < nlpcands; ++c )
125 assert(
SCIPgetSolVal(scip, worksol, lpcands[c]) == lpcandssol[c]);
128 if( storelpcandscores )
131 lpcandsfrac[c], &lpcandsscores[c], &lpcandroundup[c]) );
134 score = lpcandsscores[c];
138 if( score > bestscore )
149 *enfosuccess = (bestcandidx >= 0);
154 SCIPceil(scip, lpcandssol[bestcandidx]), lpcandroundup[bestcandidx]) );
156 SCIPfloor(scip, lpcandssol[bestcandidx]), ! lpcandroundup[bestcandidx]) );
225 int totalnbacktracks;
226 int totalnprobingnodes;
228 int previouscandssize;
229 int lpcandsscoressize;
245 assert(scip !=
NULL);
246 assert(heur !=
NULL);
247 assert(result !=
NULL);
248 assert(worksol !=
NULL);
277 maxdepth =
MAX(maxdepth, 30);
306 if( onlylpbranchcands && nlpcands == 0 )
331 searchbound =
MIN(searchubbound, searchavgbound);
334 searchbound =
SCIPceil(scip, searchbound);
338 if ( sos1conshdlr !=
NULL )
340 maxdivedepth =
MIN(maxdivedepth, maxdepth);
351 SCIPdebugMsg(scip,
"(node %" SCIP_LONGINT_FORMAT
") executing %s heuristic: depth=%d, %d fractionals, dualbound=%g, avgbound=%g, cutoffbound=%g, searchbound=%g\n",
358 previouscandssize =
MAX(1, lpsolvefreq);
366 startndivecands = nlpcands;
367 totalnbacktracks = 0;
368 totalnprobingnodes = 0;
375 if( onlylpbranchcands )
380 lpcandsscoressize = nlpcands;
384 lpcandroundup =
NULL;
385 lpcandsscores =
NULL;
386 lpcandsscoressize = 0;
406 int prevcandsinsertidx;
413 SCIPdebugMsg(scip,
"%s heuristic continues diving at depth %d, %d candidates left\n",
420 while( allroundable && c < nlpcands )
425 allroundable =
FALSE;
440 if( success && sos1conshdlr !=
NULL )
453 if( indconshdlr !=
NULL )
465 SCIPdebugMsg(scip,
" -> solution was feasible and good enough\n");
487 if( lpsolvefreq != 1 )
494 if( onlylpbranchcands && nlpcands > lpcandsscoressize )
496 assert(nlpcands > 0);
497 assert(lpcandsscores !=
NULL);
498 assert(lpcandroundup !=
NULL);
503 lpcandsscoressize = nlpcands;
510 lpcands, lpcandssol, lpcandsfrac, lpcandsscores, lpcandroundup, &nviollpcands, nlpcands,
511 &enfosuccess, &infeasible) );
517 prevcandsinsertidx = -1;
550 assert(nbdchanges > 0);
551 assert(bdchgvars !=
NULL);
552 assert(bdchgdirs !=
NULL);
553 assert(bdchgvals !=
NULL);
558 SCIPdebugMsg(scip,
"depth limit reached, we stop diving immediately.\n");
564 ++totalnprobingnodes;
567 for( d = 0; d < nbdchanges; ++d )
574 bdchgvar = bdchgvars[d];
575 bdchgvalue = bdchgvals[d];
576 bdchgdir = bdchgdirs[d];
578 assert(bdchgvar !=
NULL);
583 SCIPdebugMsg(scip,
" dive %d/%d, LP iter %" SCIP_LONGINT_FORMAT
"/%" SCIP_LONGINT_FORMAT
": var <%s>, oldbounds=[%g,%g],",
587 infeasbdchange =
FALSE;
595 infeasbdchange =
TRUE;
606 infeasbdchange =
TRUE;
617 (
SCIPisFeasEQ(scip, lblocal, ublocal) && nbdchanges < 2) )
618 infeasbdchange =
TRUE;
634 SCIPerrorMessage(
"Error: Unsupported bound change direction <%d> specified for diving, aborting\n",bdchgdirs[d]);
643 SCIPdebugMsg(scip,
"\nSelected variable <%s> domain already [%g,%g] as least as tight as desired bound change, diving aborted \n",
660 localdomreds += nbdchanges;
696 domreds += localdomreds;
703 ++prevcandsinsertidx;
706 assert(bdchgvar !=
NULL);
710 if( prevcandsinsertidx >= previouscandssize )
712 previouscandssize *= 2;
716 assert(previouscandssize > prevcandsinsertidx);
719 previouscands[prevcandsinsertidx] = bdchgvar;
720 previousvals[prevcandsinsertidx] = bdchgvalue;
731 lpcands, lpcandssol, lpcandsfrac, lpcandsscores, lpcandroundup, &nviollpcands, nlpcands,
732 &enfosuccess, &infeasible) );
768 gain =
MAX(gain, 0.0);
772 for( v = 0; v <= prevcandsinsertidx; ++v )
805 SCIPdebugMsg(scip,
" -> solution was feasible and good enough\n");
813 SCIPdebugMsg(scip,
"(node %" SCIP_LONGINT_FORMAT
") finished %s heuristic: %d fractionals, dive %d/%d, LP iter %" SCIP_LONGINT_FORMAT
"/%" SCIP_LONGINT_FORMAT
", objval=%g/%g, lpsolstat=%d, cutoff=%u\n",
823 if( onlylpbranchcands )
863 for( i = 0; i < nrows; i++ )
881 for( j = 0; j < nnonz; j++ )
914 assert(sourcescip !=
NULL);
915 assert(suffix !=
NULL);
916 assert(subscip !=
NULL);
917 assert(varmap !=
NULL);
918 assert(success !=
NULL);
enum SCIP_Result SCIP_RESULT
SCIP_RETCODE SCIPgetLPBranchCands(SCIP *scip, SCIP_VAR ***lpcands, SCIP_Real **lpcandssol, SCIP_Real **lpcandsfrac, int *nlpcands, int *npriolpcands, int *nfracimplvars)
int SCIPgetNIntVars(SCIP *scip)
SCIP_RETCODE SCIPlinkLPSol(SCIP *scip, SCIP_SOL *sol)
SCIP_Bool SCIPisFeasEQ(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPbacktrackProbing(SCIP *scip, int probingdepth)
SCIP_Longint SCIPgetNLPIterations(SCIP *scip)
SCIP_Bool SCIPisFeasLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
int SCIPgetProbingDepth(SCIP *scip)
SCIP_Real SCIPgetCutoffbound(SCIP *scip)
static SCIP_RETCODE createRows(SCIP *scip, SCIP *subscip, SCIP_HASHMAP *varmap)
SCIP_Bool SCIPdivesetUseBacktrack(SCIP_DIVESET *diveset)
SCIP_Longint SCIPgetNSolsFound(SCIP *scip)
SCIP_RETCODE SCIPcreateProb(SCIP *scip, const char *name, SCIP_DECL_PROBDELORIG((*probdelorig)), SCIP_DECL_PROBTRANS((*probtrans)), SCIP_DECL_PROBDELTRANS((*probdeltrans)), SCIP_DECL_PROBINITSOL((*probinitsol)), SCIP_DECL_PROBEXITSOL((*probexitsol)), SCIP_DECL_PROBCOPY((*probcopy)), SCIP_PROBDATA *probdata)
int SCIProwGetNNonz(SCIP_ROW *row)
SCIP_Real SCIPdivesetGetUbQuot(SCIP_DIVESET *diveset)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
int SCIPdivesetGetMaxLPIterOffset(SCIP_DIVESET *diveset)
const char * SCIProwGetName(SCIP_ROW *row)
SCIP_Real SCIPdivesetGetAvgQuotNoSol(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIPmakeSOS1sFeasible(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_SOL *sol, SCIP_Bool *changed, SCIP_Bool *success)
constraint handler for indicator constraints
int SCIPgetMaxDepth(SCIP *scip)
void SCIPgetDiveBoundChangeData(SCIP *scip, SCIP_VAR ***variables, SCIP_BRANCHDIR **directions, SCIP_Real **values, int *ndivebdchgs, SCIP_Bool preferred)
SCIP_Bool SCIPisFeasGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIProwGetLhs(SCIP_ROW *row)
SCIP_RETCODE SCIPcopyConsCompression(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, const char *suffix, SCIP_VAR **fixedvars, SCIP_Real *fixedvals, int nfixedvars, SCIP_Bool global, SCIP_Bool enablepricing, SCIP_Bool passmessagehdlr, SCIP_Bool *valid)
SCIP_Real SCIPinfinity(SCIP *scip)
int SCIPsnprintf(char *t, int len, const char *s,...)
int SCIPgetNSOS1Vars(SCIP_CONSHDLR *conshdlr)
enum SCIP_Retcode SCIP_RETCODE
SCIP_Real SCIPdivesetGetMaxRelDepth(SCIP_DIVESET *diveset)
methods commonly used by primal heuristics
SCIP_Real SCIPgetAvgLowerbound(SCIP *scip)
SCIP_Longint SCIPdivesetGetNLPIterations(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIPaddDiveBoundChange(SCIP *scip, SCIP_VAR *var, SCIP_BRANCHDIR dir, SCIP_Real value, SCIP_Bool preferred)
SCIP_RETCODE SCIPchgVarLbProbing(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
SCIP_Real SCIPdivesetGetMinRelDepth(SCIP_DIVESET *diveset)
void * SCIPhashmapGetImage(SCIP_HASHMAP *hashmap, void *origin)
#define SCIPfreeBufferArray(scip, ptr)
void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
SCIP_Bool SCIPdivesetUseOnlyLPBranchcands(SCIP_DIVESET *diveset)
SCIP_Real SCIPdivesetGetMaxLPIterQuot(SCIP_DIVESET *diveset)
const char * SCIPgetProbName(SCIP *scip)
SCIP_RETCODE SCIPupdateVarPseudocost(SCIP *scip, SCIP_VAR *var, SCIP_Real solvaldelta, SCIP_Real objdelta, SCIP_Real weight)
enum SCIP_BranchDir SCIP_BRANCHDIR
void SCIPclearDiveBoundChanges(SCIP *scip)
SCIP_Bool SCIPisLPSolBasic(SCIP *scip)
const char * SCIPheurGetName(SCIP_HEUR *heur)
SCIP_RETCODE SCIPaddCons(SCIP *scip, SCIP_CONS *cons)
SCIP_Bool SCIPisLT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPpropagateProbing(SCIP *scip, int maxproprounds, SCIP_Bool *cutoff, SCIP_Longint *ndomredsfound)
static SCIP_RETCODE solveLP(SCIP *scip, SCIP_DIVESET *diveset, SCIP_Longint maxnlpiterations, SCIP_Bool *lperror, SCIP_Bool *cutoff)
SCIP_Bool SCIProwIsLocal(SCIP_ROW *row)
SCIP_Real SCIPgetDualbound(SCIP *scip)
SCIP_RETCODE SCIPcopyVars(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, SCIP_VAR **fixedvars, SCIP_Real *fixedvals, int nfixedvars, SCIP_Bool global)
SCIP_RETCODE SCIPcopyCuts(SCIP *sourcescip, SCIP *targetscip, SCIP_HASHMAP *varmap, SCIP_HASHMAP *consmap, SCIP_Bool global, int *ncutsadded)
SCIP_Real SCIPdivesetGetAvgQuot(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIPendProbing(SCIP *scip)
const char * SCIPvarGetName(SCIP_VAR *var)
static SCIP_RETCODE selectNextDiving(SCIP *scip, SCIP_DIVESET *diveset, SCIP_SOL *worksol, SCIP_Bool onlylpbranchcands, SCIP_Bool storelpcandscores, SCIP_VAR **lpcands, SCIP_Real *lpcandssol, SCIP_Real *lpcandsfrac, SCIP_Real *lpcandsscores, SCIP_Bool *lpcandroundup, int *nviollpcands, int nlpcands, SCIP_Bool *enfosuccess, SCIP_Bool *infeasible)
void SCIPupdateDivesetLPStats(SCIP *scip, SCIP_DIVESET *diveset, SCIP_Longint niterstoadd)
SCIP_Real SCIPgetLowerbound(SCIP *scip)
SCIP_Bool SCIPisFeasGT(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPsolveProbingLP(SCIP *scip, int itlim, SCIP_Bool *lperror, SCIP_Bool *cutoff)
SCIP_Bool SCIPisFeasLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIProwGetRhs(SCIP_ROW *row)
SCIP_Real SCIPdivesetGetLPResolveDomChgQuot(SCIP_DIVESET *diveset)
SCIP_COL ** SCIProwGetCols(SCIP_ROW *row)
SCIP_Bool SCIPhasCurrentNodeLP(SCIP *scip)
SCIP_Longint SCIPgetLastDivenode(SCIP *scip)
SCIP_Longint SCIPgetNNodeLPIterations(SCIP *scip)
#define SCIPallocBufferArray(scip, ptr, num)
SCIP_Real * SCIProwGetVals(SCIP_ROW *row)
SCIP_RETCODE SCIPincludeDefaultPlugins(SCIP *scip)
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
SCIP_Real SCIPdivesetGetUbQuotNoSol(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIProundSol(SCIP *scip, SCIP_SOL *sol, SCIP_Bool *success)
int SCIPgetDepth(SCIP *scip)
SCIP_RETCODE SCIPgetDiveBoundChanges(SCIP *scip, SCIP_DIVESET *diveset, SCIP_SOL *sol, SCIP_Bool *success, SCIP_Bool *infeasible)
void SCIPenableVarHistory(SCIP *scip)
SCIP_Real SCIPgetSolOrigObj(SCIP *scip, SCIP_SOL *sol)
Constraint handler for linear constraints in their most general form, .
SCIP_RETCODE SCIPtrySol(SCIP *scip, SCIP_SOL *sol, SCIP_Bool printreason, SCIP_Bool completely, SCIP_Bool checkbounds, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool *stored)
#define SCIP_MAXTREEDEPTH
int SCIPgetNBinVars(SCIP *scip)
int SCIPgetNVars(SCIP *scip)
SCIP_RETCODE SCIPperformGenericDivingAlgorithm(SCIP *scip, SCIP_DIVESET *diveset, SCIP_SOL *worksol, SCIP_HEUR *heur, SCIP_RESULT *result, SCIP_Bool nodeinfeasible)
SCIP_Real SCIPgetAvgDualbound(SCIP *scip)
void SCIPdivesetSetWorkSolution(SCIP_DIVESET *diveset, SCIP_SOL *sol)
SCIP_RETCODE SCIPcreateConsLinear(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, SCIP_VAR **vars, SCIP_Real *vals, SCIP_Real lhs, SCIP_Real rhs, SCIP_Bool initial, SCIP_Bool separate, SCIP_Bool enforce, SCIP_Bool check, SCIP_Bool propagate, SCIP_Bool local, SCIP_Bool modifiable, SCIP_Bool dynamic, SCIP_Bool removable, SCIP_Bool stickingatnode)
SCIP_Real SCIProwGetConstant(SCIP_ROW *row)
SCIP_Bool SCIPisObjIntegral(SCIP *scip)
SCIP_Real SCIPgetLPObjval(SCIP *scip)
SCIP_VAR * SCIPcolGetVar(SCIP_COL *col)
SCIP_RETCODE SCIPreleaseCons(SCIP *scip, SCIP_CONS **cons)
SCIP_Real SCIPretransformObj(SCIP *scip, SCIP_Real obj)
SCIP_RETCODE SCIPcopyLargeNeighborhoodSearch(SCIP *sourcescip, SCIP *subscip, SCIP_HASHMAP *varmap, const char *suffix, SCIP_VAR **fixedvars, SCIP_Real *fixedvals, int nfixedvars, SCIP_Bool uselprows, SCIP_Bool copycuts, SCIP_Bool *success, SCIP_Bool *valid)
SCIP_Longint SCIPgetNBestSolsFound(SCIP *scip)
SCIP_Bool SCIPisStopped(SCIP *scip)
constraint handler for SOS type 1 constraints
SCIP_RETCODE SCIPmakeIndicatorsFeasible(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_SOL *sol, SCIP_Bool *changed)
SCIP_Longint SCIPdivesetGetSolSuccess(SCIP_DIVESET *diveset)
SCIP_RETCODE SCIPunlinkSol(SCIP *scip, SCIP_SOL *sol)
SCIP_Bool SCIPisZero(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPisLE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
SCIP_RETCODE SCIPnewProbingNode(SCIP *scip)
SCIP_RETCODE SCIPgetDivesetScore(SCIP *scip, SCIP_DIVESET *diveset, SCIP_DIVETYPE divetype, SCIP_VAR *divecand, SCIP_Real divecandsol, SCIP_Real divecandfrac, SCIP_Real *candscore, SCIP_Bool *roundup)
SCIP_RETCODE SCIPstartProbing(SCIP *scip)
public methods for primal heuristics
SCIP_RETCODE SCIPgetLPRowsData(SCIP *scip, SCIP_ROW ***rows, int *nrows)
SCIP_Real SCIPceil(SCIP *scip, SCIP_Real val)
#define SCIP_DIVETYPE_INTEGRALITY
SCIP_Longint SCIPgetNNodes(SCIP *scip)
SCIP_RETCODE SCIPchgVarUbProbing(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
int SCIPdivesetGetNCalls(SCIP_DIVESET *diveset)
void SCIPupdateDivesetStats(SCIP *scip, SCIP_DIVESET *diveset, int nprobingnodes, int nbacktracks, SCIP_Longint nsolsfound, SCIP_Longint nbestsolsfound, SCIP_Bool leavewassol)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
SCIP_Real SCIPfloor(SCIP *scip, SCIP_Real val)
SCIP_Bool SCIPvarMayRoundUp(SCIP_VAR *var)
SCIP_Bool SCIPvarMayRoundDown(SCIP_VAR *var)
int SCIPdivesetGetLPSolveFreq(SCIP_DIVESET *diveset)
#define SCIPreallocBufferArray(scip, ptr, num)
const char * SCIPdivesetGetName(SCIP_DIVESET *diveset)