/** execution method of primal heuristic */ static SCIP_DECL_HEUREXEC(heurExecRandrounding) /*lint --e{715}*/ { /*lint --e{715}*/ SCIP_HEURDATA* heurdata; SCIP_Bool propagate; assert(strcmp(SCIPheurGetName(heur), HEUR_NAME) == 0); assert(result != NULL); assert(SCIPhasCurrentNodeLP(scip)); *result = SCIP_DIDNOTRUN; /* only call heuristic, if an optimal LP solution is at hand or if relaxation solution is available */ if( SCIPgetLPSolstat(scip) != SCIP_LPSOLSTAT_OPTIMAL && ! SCIPisRelaxSolValid(scip) ) return SCIP_OKAY; /* only call heuristic, if the LP objective value is smaller than the cutoff bound */ if( SCIPisGE(scip, SCIPgetLPObjval(scip), SCIPgetCutoffbound(scip)) ) return SCIP_OKAY; /* get heuristic data */ heurdata = SCIPheurGetData(heur); assert(heurdata != NULL); /* don't call heuristic, if we have already processed the current LP solution but no relaxation solution is available */ if ( SCIPgetNLPs(scip) == heurdata->lastlp && ! SCIPisRelaxSolValid(scip) ) return SCIP_OKAY; propagate = (!heurdata->propagateonlyroot || SCIPgetDepth(scip) == 0); /* try to round LP solution */ SCIP_CALL( performLPRandRounding(scip, heurdata, heurtiming, propagate, result) ); return SCIP_OKAY; }
/** execution method of primal heuristic */ static SCIP_DECL_HEUREXEC(heurExecGcgrens) { /*lint --e{715}*/ SCIP* masterprob; SCIP_HEURDATA* heurdata; /* heuristic's data */ SCIP_Longint nstallnodes; /* number of stalling nodes for the subproblem */ assert( heur != NULL ); assert( scip != NULL ); assert( result != NULL ); /* get master problem */ masterprob = GCGrelaxGetMasterprob(scip); assert( masterprob != NULL); /* get heuristic's data */ heurdata = SCIPheurGetData(heur); assert( heurdata != NULL ); *result = SCIP_DELAYED; /* do not execute the heuristic on invalid relaxation solutions * (which is the case if the node has been cut off) */ if( !SCIPisRelaxSolValid(scip) ) { SCIPdebugMessage("skipping GCG RENS: invalid relaxation solution\n"); return SCIP_OKAY; } /* only call heuristic, if an optimal LP solution is at hand */ if( SCIPgetStage(masterprob) > SCIP_STAGE_SOLVING || SCIPgetLPSolstat(masterprob) != SCIP_LPSOLSTAT_OPTIMAL ) return SCIP_OKAY; *result = SCIP_DIDNOTRUN; /* only continue with some fractional variables */ if( SCIPgetNExternBranchCands(scip) == 0 ) return SCIP_OKAY; /* calculate the maximal number of branching nodes until heuristic is aborted */ nstallnodes = (SCIP_Longint)(heurdata->nodesquot * SCIPgetNNodes(scip)); /* reward RENS if it succeeded often */ nstallnodes = (SCIP_Longint)(nstallnodes * 3.0 * (SCIPheurGetNBestSolsFound(heur)+1.0)/(SCIPheurGetNCalls(heur) + 1.0)); nstallnodes -= 100 * SCIPheurGetNCalls(heur); /* count the setup costs for the sub-SCIP as 100 nodes */ nstallnodes += heurdata->nodesofs; /* determine the node limit for the current process */ nstallnodes -= heurdata->usednodes; nstallnodes = MIN(nstallnodes, heurdata->maxnodes); /* check whether we have enough nodes left to call subproblem solving */ if( nstallnodes < heurdata->minnodes ) { SCIPdebugMessage("skipping RENS: nstallnodes=%"SCIP_LONGINT_FORMAT", minnodes=%"SCIP_LONGINT_FORMAT"\n", nstallnodes, heurdata->minnodes); return SCIP_OKAY; } if( SCIPisStopped(scip) ) return SCIP_OKAY; *result = SCIP_DIDNOTFIND; SCIP_CALL( SCIPapplyGcgrens(scip, heur, result, heurdata->minfixingrate, heurdata->minimprove, heurdata->maxnodes, nstallnodes, heurdata->binarybounds, heurdata->uselprows) ); return SCIP_OKAY; }