32 #define HEUR_NAME "simplerounding" 33 #define HEUR_DESC "simple and fast LP rounding heuristic" 34 #define HEUR_DISPCHAR 'r' 35 #define HEUR_PRIORITY 0 37 #define HEUR_FREQOFS 0 38 #define HEUR_MAXDEPTH -1 39 #define HEUR_TIMING SCIP_HEURTIMING_DURINGLPLOOP | SCIP_HEURTIMING_DURINGPRICINGLOOP 40 #define HEUR_USESSUBSCIP FALSE 42 #define DEFAULT_ONCEPERNODE FALSE 70 int nunroundableimplints = 0;
73 for (c = 0; c < ncands; ++c)
81 oldsolval = candssol[c];
87 SCIPdebugMsg(scip,
"simple rounding heuristic: var <%s>, val=%g, rounddown=%u, roundup=%u\n",
91 if ( mayrounddown && mayroundup )
99 else if ( mayrounddown )
101 else if ( mayroundup )
105 ++nunroundableimplints;
122 if( nunroundableimplints > 0 )
153 SCIPdebugMsg(scip,
"found feasible rounded solution:\n");
199 if ( nlpcands > heurdata->nroundablevars )
204 assert( sol != NULL );
211 if( nlps == heurdata->lastlp )
213 heurdata->lastlp = nlps;
216 SCIPdebugMsg(scip,
"executing simple LP-rounding heuristic, fractionals: %d + %d\n", nlpcands, nfracimplvars);
247 ndiscretevars = nbinvars + nintvars + nimplvars;
254 for (v = 0; v < nbinvars + nintvars; ++v)
261 relaxcands[nrelaxcands] = vars[v];
262 relaxcandssol[nrelaxcands++] = val;
270 if ( nrelaxcands > heurdata->nroundablevars )
278 for( v = nbinvars + nintvars; v < ndiscretevars; ++v )
285 relaxcands[nrelaxcands] = vars[v];
286 relaxcandssol[nrelaxcands++] = val;
291 assert( sol != NULL );
297 SCIPdebugMsg(scip,
"executing simple rounding heuristic on relaxation solution: %d fractionals\n", nrelaxcands);
316 assert(
scip != NULL);
317 assert(heur != NULL);
332 assert(heur != NULL);
334 assert(
scip != NULL);
338 assert(heurdata != NULL);
354 assert(heurdata != NULL);
358 heurdata->lastlp = -1;
359 heurdata->nroundablevars = -1;
375 assert(heurdata != NULL);
391 assert(heurdata != NULL);
392 heurdata->lastlp = -1;
395 if( heurdata->oncepernode )
420 assert(result != NULL);
435 assert(heurdata != NULL);
452 for( i = 0; i < nbinintvars; ++i )
457 heurdata->nroundablevars = nroundablevars;
495 assert(heur != NULL);
506 "should the heuristic only be called once per node?",
enum SCIP_Result SCIP_RESULT
SCIP_RETCODE SCIPsetHeurExitsol(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEUREXITSOL((*heurexitsol)))
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_Real SCIPgetCutoffbound(SCIP *scip)
static SCIP_RETCODE performSimpleRounding(SCIP *scip, SCIP_SOL *sol, SCIP_VAR **cands, SCIP_Real *candssol, int ncands, SCIP_RESULT *result)
static SCIP_DECL_HEURCOPY(heurCopySimplerounding)
SCIP_RETCODE SCIPadjustImplicitSolVals(SCIP *scip, SCIP_SOL *sol, SCIP_Bool uselprows)
unsigned int SCIP_HEURTIMING
SCIP_RETCODE SCIPsetHeurExit(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEUREXIT((*heurexit)))
SCIP_Bool SCIPisGE(SCIP *scip, SCIP_Real val1, SCIP_Real val2)
SCIP_RETCODE SCIPgetVarsData(SCIP *scip, SCIP_VAR ***vars, int *nvars, int *nbinvars, int *nintvars, int *nimplvars, int *ncontvars)
static SCIP_RETCODE performLPSimpleRounding(SCIP *scip, SCIP_HEURDATA *heurdata, SCIP_HEURTIMING heurtiming, SCIP_RESULT *result)
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)
static SCIP_DECL_HEURFREE(heurFreeSimplerounding)
#define SCIP_HEURTIMING_DURINGPRICINGLOOP
#define SCIPfreeBufferArray(scip, ptr)
void SCIPheurSetData(SCIP_HEUR *heur, SCIP_HEURDATA *heurdata)
#define SCIPallocBlockMemory(scip, ptr)
SCIP_Real SCIPfeasCeil(SCIP *scip, SCIP_Real val)
SCIP_RETCODE SCIPincludeHeurSimplerounding(SCIP *scip)
SCIP_Real SCIPfeasFloor(SCIP *scip, SCIP_Real val)
static SCIP_DECL_HEUREXEC(heurExecSimplerounding)
static SCIP_DECL_HEUREXIT(heurExitSimplerounding)
SCIP_RETCODE SCIPsetHeurInitsol(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURINITSOL((*heurinitsol)))
const char * SCIPheurGetName(SCIP_HEUR *heur)
SCIP_RETCODE SCIPsetHeurFree(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURFREE((*heurfree)))
#define SCIP_HEURTIMING_AFTERLPNODE
const char * SCIPvarGetName(SCIP_VAR *var)
SCIP_Bool SCIPhasCurrentNodeLP(SCIP *scip)
#define SCIPallocBufferArray(scip, ptr, num)
SCIP_RETCODE SCIPsetSolVal(SCIP *scip, SCIP_SOL *sol, SCIP_VAR *var, SCIP_Real val)
static SCIP_DECL_HEURINITSOL(heurInitsolSimplerounding)
SCIP_LPSOLSTAT SCIPgetLPSolstat(SCIP *scip)
SCIP_RETCODE SCIPfreeSol(SCIP *scip, SCIP_SOL **sol)
SCIP_Real SCIPvarGetObj(SCIP_VAR *var)
static SCIP_DECL_HEUREXITSOL(heurExitsolSimplerounding)
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)
int SCIPgetNBinVars(SCIP *scip)
SCIP_Real SCIPgetLPObjval(SCIP *scip)
SCIP_Bool SCIPisRelaxSolValid(SCIP *scip)
#define DEFAULT_ONCEPERNODE
SCIP_RETCODE SCIPsetHeurInit(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURINIT((*heurinit)))
SCIP_VAR ** SCIPgetVars(SCIP *scip)
SCIP_VARSTATUS SCIPvarGetStatus(SCIP_VAR *var)
void SCIPheurSetTimingmask(SCIP_HEUR *heur, SCIP_HEURTIMING timingmask)
SCIP_RETCODE SCIPlinkRelaxSol(SCIP *scip, SCIP_SOL *sol)
Simple and fast LP rounding heuristic.
SCIP_Bool SCIPallColsInLP(SCIP *scip)
SCIP_VARTYPE SCIPvarGetType(SCIP_VAR *var)
SCIP_RETCODE SCIPsetHeurCopy(SCIP *scip, SCIP_HEUR *heur, SCIP_DECL_HEURCOPY((*heurcopy)))
SCIP_Bool SCIPisFeasIntegral(SCIP *scip, SCIP_Real val)
SCIP_HEURDATA * SCIPheurGetData(SCIP_HEUR *heur)
static SCIP_DECL_HEURINIT(heurInitSimplerounding)
SCIP_Longint SCIPgetNLPs(SCIP *scip)
SCIP_Bool SCIPvarMayRoundUp(SCIP_VAR *var)
SCIP_Bool SCIPvarMayRoundDown(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)
static SCIP_RETCODE performRelaxSimpleRounding(SCIP *scip, SCIP_HEURDATA *heurdata, SCIP_RESULT *result)
SCIP_Real SCIPgetRelaxSolVal(SCIP *scip, SCIP_VAR *var)
SCIP_RETCODE SCIPcreateSol(SCIP *scip, SCIP_SOL **sol, SCIP_HEUR *heur)
SCIP_RETCODE SCIPprintSol(SCIP *scip, SCIP_SOL *sol, FILE *file, SCIP_Bool printzeros)