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;
246 assert(scip != NULL);
247 assert(heur != NULL);
248 assert(result != NULL);
249 assert(worksol != NULL);
278 maxdepth =
MAX(maxdepth, 30);
307 if( onlylpbranchcands && nlpcands == 0 )
332 searchbound = MIN(searchubbound, searchavgbound);
335 searchbound =
SCIPceil(scip, searchbound);
339 if ( sos1conshdlr != NULL )
341 maxdivedepth = MIN(maxdivedepth, maxdepth);
352 SCIPdebugMsg(scip,
"(node %" SCIP_LONGINT_FORMAT
") executing %s heuristic: depth=%d, %d fractionals, dualbound=%g, avgbound=%g, cutoffbound=%g, searchbound=%g\n",
359 previouscandssize =
MAX(1, lpsolvefreq);
367 startndivecands = nlpcands;
368 totalnbacktracks = 0;
369 totalnprobingnodes = 0;
376 if( onlylpbranchcands )
381 lpcandsscoressize = nlpcands;
385 lpcandroundup = NULL;
386 lpcandsscores = NULL;
387 lpcandsscoressize = 0;
408 int prevcandsinsertidx;
415 SCIPdebugMsg(scip,
"%s heuristic continues diving at depth %d, %d candidates left\n",
422 while( allroundable && c < nlpcands )
427 allroundable =
FALSE;
442 if( success && sos1conshdlr != NULL )
455 if( indconshdlr != NULL )
467 SCIPdebugMsg(scip,
" -> solution was feasible and good enough\n");
469 leafsol = (nlpcands == 0);
490 if( lpsolvefreq != 1 )
497 if( onlylpbranchcands && nlpcands > lpcandsscoressize )
499 assert(nlpcands > 0);
500 assert(lpcandsscores != NULL);
501 assert(lpcandroundup != NULL);
506 lpcandsscoressize = nlpcands;
513 lpcands, lpcandssol, lpcandsfrac, lpcandsscores, lpcandroundup, &nviollpcands, nlpcands,
514 &enfosuccess, &infeasible) );
520 prevcandsinsertidx = -1;
553 assert(nbdchanges > 0);
554 assert(bdchgvars != NULL);
555 assert(bdchgdirs != NULL);
556 assert(bdchgvals != NULL);
561 SCIPdebugMsg(scip,
"depth limit reached, we stop diving immediately.\n");
567 ++totalnprobingnodes;
570 for( d = 0; d < nbdchanges; ++d )
577 bdchgvar = bdchgvars[d];
578 bdchgvalue = bdchgvals[d];
579 bdchgdir = bdchgdirs[d];
581 assert(bdchgvar != NULL);
586 SCIPdebugMsg(scip,
" dive %d/%d, LP iter %" SCIP_LONGINT_FORMAT
"/%" SCIP_LONGINT_FORMAT
": var <%s>, oldbounds=[%g,%g],",
590 infeasbdchange =
FALSE;
598 infeasbdchange =
TRUE;
609 infeasbdchange =
TRUE;
620 (
SCIPisFeasEQ(scip, lblocal, ublocal) && nbdchanges < 2) )
621 infeasbdchange =
TRUE;
637 SCIPerrorMessage(
"Error: Unsupported bound change direction <%d> specified for diving, aborting\n",bdchgdirs[d]);
646 SCIPdebugMsg(scip,
"\nSelected variable <%s> domain already [%g,%g] as least as tight as desired bound change, diving aborted \n",
663 localdomreds += nbdchanges;
699 domreds += localdomreds;
706 ++prevcandsinsertidx;
709 assert(bdchgvar != NULL);
713 if( prevcandsinsertidx >= previouscandssize )
715 previouscandssize *= 2;
719 assert(previouscandssize > prevcandsinsertidx);
722 previouscands[prevcandsinsertidx] = bdchgvar;
723 previousvals[prevcandsinsertidx] = bdchgvalue;
734 lpcands, lpcandssol, lpcandsfrac, lpcandsscores, lpcandroundup, &nviollpcands, nlpcands,
735 &enfosuccess, &infeasible) );
772 gain =
MAX(gain, 0.0);
776 for( v = 0; v <= prevcandsinsertidx; ++v )
808 SCIPdebugMsg(scip,
" -> solution was feasible and good enough\n");
817 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",
827 if( onlylpbranchcands )
867 for( i = 0; i < nrows; i++ )
885 for( j = 0; j < nnonz; j++ )
918 assert(sourcescip != NULL);
919 assert(suffix != NULL);
920 assert(subscip != NULL);
921 assert(varmap != NULL);
922 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_RETCODE SCIPcopyParamSettings(SCIP *sourcescip, SCIP *targetscip)
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)