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 FALSE 44 #define DEFAULT_IMPROVESOLS FALSE 84 assert( scip != NULL );
85 assert( heur != NULL );
86 assert( heurdata != NULL );
87 assert( nindconss == 0 || indconss != NULL );
88 assert( solcand != NULL );
89 assert( nfoundsols != NULL );
105 assert( binvar != NULL );
123 for (c = 0; c < nindconss; ++c)
132 assert( binvar != NULL );
195 SCIPdebugMsg(scip,
"Finished one-opt (tried variables: %d, found sols: %d).\n", cnt, *nfoundsols);
219 assert( scip != NULL );
220 assert( heur != NULL );
221 assert( heurdata != NULL );
222 assert( nindconss == 0 || indconss != NULL );
223 assert( solcand != NULL );
224 assert( nfoundsols != NULL );
226 SCIPdebugMsg(scip,
"Trying to generate feasible solution with indicators from solution candidate (obj: %f) ...\n", heurdata->obj);
241 for (c = 0; c < nindconss; ++c)
250 assert( binvar != NULL );
274 SCIPdebugMsg(scip,
"Solution candidate reaches cutoff (in propagation).\n");
292 SCIPdebugMsg(scip,
"Solution candidate reaches cutoff (in LP solving).\n");
308 #ifdef SCIP_MORE_DEBUG 315 SCIPdebugMsg(scip,
"Solution is feasible and stored.\n");
328 if ( stored && heurdata->oneopt )
331 assert( *nfoundsols > 0 );
347 assert(
scip != NULL );
348 assert( heur != NULL );
363 assert( heur != NULL );
364 assert(
scip != NULL );
368 assert( heurdata != NULL );
370 if ( heurdata->indicatorconshdlr == NULL )
373 if ( heurdata->indicatorconshdlr == NULL )
388 assert( heur != NULL );
389 assert(
scip != NULL );
393 assert( heurdata != NULL );
413 assert( heur != NULL );
414 assert(
scip != NULL );
415 assert( result != NULL );
424 assert( heurdata != NULL );
427 if ( heurdata->solcand != NULL )
429 assert( heurdata->nindconss > 0 );
430 assert( heurdata->indconss != NULL );
439 if ( nfoundsols > 0 )
450 if ( heurdata->improvesols )
458 if ( heurdata->indicatorconshdlr == NULL )
463 if ( bestsol == heurdata->lastsol )
465 heurdata->lastsol = bestsol;
477 if ( nindconss == 0 )
481 assert( indconss != NULL );
485 for (i = 0; i < nindconss; ++i)
494 assert( binvar != NULL );
508 if ( nfoundsols > 0 )
534 heurdata->nindconss = 0;
535 heurdata->indconss = NULL;
536 heurdata->solcand = NULL;
537 heurdata->lastsol = NULL;
538 heurdata->indicatorconshdlr = NULL;
546 assert( heur != NULL );
556 "whether the one-opt heuristic should be started",
561 "Try to improve other solutions by one-opt?",
580 assert( scip != NULL );
581 assert( heur != NULL );
583 assert( nindconss > 0 );
584 assert( indconss != NULL );
585 assert( solcand != NULL );
589 assert( heurdata != NULL );
591 if ( obj >= heurdata->obj )
595 if ( heurdata->indconss != NULL )
599 heurdata->nindconss = nindconss;
602 if ( heurdata->solcand != NULL )
#define SCIPfreeBlockMemoryArray(scip, ptr, num)
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_RETCODE SCIPheurPassIndicator(SCIP *scip, SCIP_HEUR *heur, int nindconss, SCIP_CONS **indconss, SCIP_Bool *solcand, SCIP_Real obj)
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)
SCIP_Real SCIPinfinity(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)))
SCIP_Bool SCIPisStopped(SCIP *scip)
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)