33 #define HEUR_NAME "indicator" 34 #define HEUR_DESC "indicator heuristic to create feasible solutions from values for indicator variables" 35 #define HEUR_DISPCHAR 'A' 36 #define HEUR_PRIORITY -20200 38 #define HEUR_FREQOFS 0 39 #define HEUR_MAXDEPTH -1 40 #define HEUR_TIMING SCIP_HEURTIMING_DURINGLPLOOP 41 #define HEUR_USESSUBSCIP FALSE 43 #define DEFAULT_ONEOPT TRUE 44 #define DEFAULT_IMPROVESOLS FALSE 83 assert( scip !=
NULL );
84 assert( heur !=
NULL );
85 assert( heurdata !=
NULL );
86 assert( nindconss == 0 || indconss !=
NULL );
87 assert( solcand !=
NULL );
88 assert( nfoundsols !=
NULL );
95 for (i = 0; i < nindconss; ++i)
104 assert( binvar !=
NULL );
119 for (c = 0; c < nindconss; ++c)
128 assert( binvar !=
NULL );
191 SCIPdebugMsg(scip,
"Finished one-opt (tried variables: %d, found sols: %d).\n", cnt, *nfoundsols);
215 assert( scip !=
NULL );
216 assert( heur !=
NULL );
217 assert( heurdata !=
NULL );
218 assert( nindconss == 0 || indconss !=
NULL );
219 assert( solcand !=
NULL );
220 assert( nfoundsols !=
NULL );
222 SCIPdebugMsg(scip,
"Trying to generate feasible solution with indicators from solution candidate ...\n");
237 for (c = 0; c < nindconss; ++c)
246 assert( binvar !=
NULL );
270 SCIPdebugMsg(scip,
"Solution candidate reaches cutoff (in propagation).\n");
288 SCIPdebugMsg(scip,
"Solution candidate reaches cutoff (in LP solving).\n");
304 #ifdef SCIP_MORE_DEBUG 311 SCIPdebugMsg(scip,
"Solution is feasible and stored.\n");
324 if ( stored && heurdata->oneopt )
327 assert( *nfoundsols > 0 );
344 assert( heur !=
NULL );
359 assert( heur !=
NULL );
364 assert( heurdata !=
NULL );
366 if ( heurdata->indicatorconshdlr ==
NULL )
369 if ( heurdata->indicatorconshdlr ==
NULL )
384 assert( heur !=
NULL );
389 assert( heurdata !=
NULL );
409 assert( heur !=
NULL );
411 assert( result !=
NULL );
420 assert( heurdata !=
NULL );
423 if ( heurdata->solcand !=
NULL )
425 assert( heurdata->nindconss > 0 );
426 assert( heurdata->indconss !=
NULL );
435 if ( nfoundsols > 0 )
446 if ( heurdata->improvesols )
454 if ( heurdata->indicatorconshdlr ==
NULL )
459 if ( bestsol == heurdata->lastsol )
461 heurdata->lastsol = bestsol;
473 if ( nindconss == 0 )
477 assert( indconss !=
NULL );
481 for (i = 0; i < nindconss; ++i)
490 assert( binvar !=
NULL );
504 if ( nfoundsols > 0 )
530 heurdata->nindconss = 0;
531 heurdata->indconss =
NULL;
532 heurdata->solcand =
NULL;
533 heurdata->lastsol =
NULL;
534 heurdata->indicatorconshdlr =
NULL;
541 assert( heur !=
NULL );
551 "whether the one-opt heuristic should be started",
556 "Try to improve other solutions by one-opt?",
574 assert( scip !=
NULL );
575 assert( heur !=
NULL );
577 assert( nindconss > 0 );
578 assert( indconss !=
NULL );
579 assert( solcand !=
NULL );
583 assert( heurdata !=
NULL );
586 if ( heurdata->indconss !=
NULL )
590 heurdata->nindconss = nindconss;
593 if ( heurdata->solcand !=
NULL )
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
SCIP_RETCODE SCIPheurPassIndicator(SCIP *scip, SCIP_HEUR *heur, int nindconss, SCIP_CONS **indconss, SCIP_Bool *solcand)
int SCIPgetNIntVars(SCIP *scip)
SCIP_RETCODE SCIPlinkLPSol(SCIP *scip, SCIP_SOL *sol)
SCIP_RETCODE SCIPincludeHeurIndicator(SCIP *scip)
static SCIP_DECL_HEURCOPY(heurCopyIndicator)
SCIP_RETCODE SCIPbacktrackProbing(SCIP *scip, int probingdepth)
SCIP_CONSHDLR * SCIPfindConshdlr(SCIP *scip, const char *name)
SCIP_Real SCIPvarGetLbLocal(SCIP_VAR *var)
constraint handler for indicator constraints
static SCIP_DECL_HEURINIT(heurInitIndicator)
SCIP_CONS ** SCIPconshdlrGetConss(SCIP_CONSHDLR *conshdlr)
int SCIPgetSubscipDepth(SCIP *scip)
enum SCIP_Retcode SCIP_RETCODE
struct SCIP_HeurData SCIP_HEURDATA
#define SCIPfreeBlockMemory(scip, ptr)
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 SCIPchgVarLbProbing(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
#define SCIPfreeBufferArray(scip, ptr)
void SCIPheurSetData(SCIP_HEUR *heur, SCIP_HEURDATA *heurdata)
#define SCIPallocBlockMemory(scip, ptr)
void SCIPwarningMessage(SCIP *scip, const char *formatstr,...)
SCIP_Bool SCIPconsIsActive(SCIP_CONS *cons)
static SCIP_DECL_HEURFREE(heurFreeIndicator)
#define SCIPduplicateBlockMemoryArray(scip, ptr, source, num)
const char * SCIPheurGetName(SCIP_HEUR *heur)
SCIP_RETCODE SCIPsetHeurFree(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURFREE((*heurfree)))
SCIP_RETCODE SCIPpropagateProbing(SCIP *scip, int maxproprounds, SCIP_Bool *cutoff, SCIP_Longint *ndomredsfound)
SCIP_RETCODE SCIPendProbing(SCIP *scip)
SCIP_HEUR * SCIPsolGetHeur(SCIP_SOL *sol)
SCIP_Real SCIPgetSolTransObj(SCIP *scip, SCIP_SOL *sol)
#define DEFAULT_IMPROVESOLS
handle partial solutions for linear problems with indicators and otherwise continuous variables ...
SCIP_RETCODE SCIPsolveProbingLP(SCIP *scip, int itlim, SCIP_Bool *lperror, SCIP_Bool *cutoff)
int SCIPconshdlrGetNConss(SCIP_CONSHDLR *conshdlr)
#define SCIPallocBufferArray(scip, ptr, num)
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
int SCIPgetDepth(SCIP *scip)
SCIP_RETCODE SCIPtrySolFree(SCIP *scip, SCIP_SOL **sol, SCIP_Bool printreason, SCIP_Bool completely, SCIP_Bool checkbounds, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool *stored)
#define BMScopyMemoryArray(ptr, source, num)
SCIP_Real SCIPgetSolOrigObj(SCIP *scip, SCIP_SOL *sol)
SCIP_VAR * SCIPgetBinaryVarIndicator(SCIP_CONS *cons)
#define SCIP_MAXTREEDEPTH
int SCIPgetNBinVars(SCIP *scip)
static SCIP_RETCODE tryOneOpt(SCIP *scip, SCIP_HEUR *heur, SCIP_HEURDATA *heurdata, int nindconss, SCIP_CONS **indconss, SCIP_Bool *solcand, int *nfoundsols)
SCIP_SOL * SCIPgetBestSol(SCIP *scip)
SCIP_RETCODE SCIPsetHeurInit(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURINIT((*heurinit)))
static SCIP_RETCODE trySolCandidate(SCIP *scip, SCIP_HEUR *heur, SCIP_HEURDATA *heurdata, int nindconss, SCIP_CONS **indconss, SCIP_Bool *solcand, int *nfoundsols)
SCIP_RETCODE SCIPsetHeurCopy(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURCOPY((*heurcopy)))
SCIP_Real SCIPvarGetUbLocal(SCIP_VAR *var)
#define SCIPfreeBlockMemoryArrayNull(scip, ptr, num)
SCIP_RETCODE SCIPnewProbingNode(SCIP *scip)
SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
SCIP_RETCODE SCIPstartProbing(SCIP *scip)
SCIP_HEURDATA * SCIPheurGetData(SCIP_HEUR *heur)
static SCIP_DECL_HEUREXEC(heurExecIndicator)
SCIP_RETCODE SCIPchgVarUbProbing(SCIP *scip, SCIP_VAR *var, SCIP_Real newbound)
SCIP_Real SCIPgetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var)
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_RETCODE SCIPcreateSol(SCIP *scip, SCIP_SOL **sol, SCIP_HEUR *heur)
SCIP_RETCODE SCIPprintSol(SCIP *scip, SCIP_SOL *sol, FILE *file, SCIP_Bool printzeros)