/** creates the reoptsols primal heuristic and includes it in SCIP */ SCIP_RETCODE SCIPincludeHeurReoptsols( SCIP* scip /**< SCIP data structure */ ) { SCIP_HEURDATA* heurdata; SCIP_HEUR* heur; /* create reoptsols primal heuristic data */ SCIP_CALL( SCIPallocMemory(scip, &heurdata) ); /* include primal heuristic */ SCIP_CALL( SCIPincludeHeurBasic(scip, &heur, HEUR_NAME, HEUR_DESC, HEUR_DISPCHAR, HEUR_PRIORITY, HEUR_FREQ, HEUR_FREQOFS, HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecReoptsols, heurdata) ); assert(heur != NULL); /* set non fundamental callbacks via setter functions */ SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyReoptsols) ); SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeReoptsols) ); SCIP_CALL( SCIPsetHeurInit(scip, heur, heurInitReoptsols) ); SCIP_CALL( SCIPsetHeurExit(scip, heur, heurExitReoptsols) ); SCIP_CALL( SCIPsetHeurInitsol(scip, heur, heurInitsolReoptsols) ); SCIP_CALL( SCIPsetHeurExitsol(scip, heur, heurExitsolReoptsols) ); /* parameters */ SCIP_CALL( SCIPaddIntParam(scip, "heuristics/" HEUR_NAME "/maxsols", "maximal number solutions which should be checked. (-1: all)", &heurdata->maxsols, TRUE, 1000, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "heuristics/" HEUR_NAME "/maxruns", "check solutions of the last k runs. (-1: all)", &heurdata->maxruns, TRUE, -1, -1, INT_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the oneopt primal heuristic and includes it in SCIP */ SCIP_RETCODE SCIPincludeHeurOneopt( SCIP* scip /**< SCIP data structure */ ) { SCIP_HEURDATA* heurdata; SCIP_HEUR* heur; /* create Oneopt primal heuristic data */ SCIP_CALL( SCIPallocMemory(scip, &heurdata) ); /* include primal heuristic */ SCIP_CALL( SCIPincludeHeurBasic(scip, &heur, HEUR_NAME, HEUR_DESC, HEUR_DISPCHAR, HEUR_PRIORITY, HEUR_FREQ, HEUR_FREQOFS, HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecOneopt, heurdata) ); assert(heur != NULL); /* set non-NULL pointers to callback methods */ SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyOneopt) ); SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeOneopt) ); SCIP_CALL( SCIPsetHeurInitsol(scip, heur, heurInitsolOneopt) ); SCIP_CALL( SCIPsetHeurExitsol(scip, heur, heurExitsolOneopt) ); SCIP_CALL( SCIPsetHeurInit(scip, heur, heurInitOneopt) ); /* add oneopt primal heuristic parameters */ SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/oneopt/weightedobj", "should the objective be weighted with the potential shifting value when sorting the shifting candidates?", &heurdata->weightedobj, TRUE, DEFAULT_WEIGHTEDOBJ, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/oneopt/duringroot", "should the heuristic be called before and during the root node?", &heurdata->duringroot, TRUE, DEFAULT_DURINGROOT, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/oneopt/forcelpconstruction", "should the construction of the LP be forced even if LP solving is deactivated?", &heurdata->forcelpconstruction, TRUE, DEFAULT_FORCELPCONSTRUCTION, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/oneopt/beforepresol", "should the heuristic be called before presolving?", &heurdata->beforepresol, TRUE, DEFAULT_BEFOREPRESOL, NULL, NULL) ); return SCIP_OKAY; }
/** creates the shifting heuristic with infeasibility recovering and includes it in SCIP */ SCIP_RETCODE SCIPincludeHeurShifting( SCIP* scip /**< SCIP data structure */ ) { SCIP_HEUR* heur; /* include primal heuristic */ SCIP_CALL( SCIPincludeHeurBasic(scip, &heur, HEUR_NAME, HEUR_DESC, HEUR_DISPCHAR, HEUR_PRIORITY, HEUR_FREQ, HEUR_FREQOFS, HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecShifting, NULL) ); assert(heur != NULL); /* set non-NULL pointers to callback methods */ SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyShifting) ); SCIP_CALL( SCIPsetHeurInit(scip, heur, heurInitShifting) ); SCIP_CALL( SCIPsetHeurExit(scip, heur, heurExitShifting) ); SCIP_CALL( SCIPsetHeurInitsol(scip, heur, heurInitsolShifting) ); return SCIP_OKAY; }
/** creates the zirounding primal heuristic and includes it in SCIP */ SCIP_RETCODE SCIPincludeHeurZirounding( SCIP* scip /**< SCIP data structure */ ) { SCIP_HEURDATA* heurdata; SCIP_HEUR* heur; /* create zirounding primal heuristic data */ SCIP_CALL( SCIPallocMemory(scip, &heurdata) ); /* include primal heuristic */ SCIP_CALL( SCIPincludeHeurBasic(scip, &heur, HEUR_NAME, HEUR_DESC, HEUR_DISPCHAR, HEUR_PRIORITY, HEUR_FREQ, HEUR_FREQOFS, HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecZirounding, heurdata) ); assert(heur != NULL); /* set non-NULL pointers to callback methods */ SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyZirounding) ); SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeZirounding) ); SCIP_CALL( SCIPsetHeurInit(scip, heur, heurInitZirounding) ); SCIP_CALL( SCIPsetHeurExit(scip, heur, heurExitZirounding) ); SCIP_CALL( SCIPsetHeurInitsol(scip, heur, heurInitsolZirounding) ); /* add zirounding primal heuristic parameters */ SCIP_CALL( SCIPaddIntParam(scip, "heuristics/zirounding/maxroundingloops", "determines maximum number of rounding loops", &heurdata->maxroundingloops, TRUE, DEFAULT_MAXROUNDINGLOOPS, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/zirounding/stopziround", "flag to determine if Zirounding is deactivated after a certain percentage of unsuccessful calls", &heurdata->stopziround, TRUE, DEFAULT_STOPZIROUND, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip,"heuristics/zirounding/stoppercentage", "if percentage of found solutions falls below this parameter, Zirounding will be deactivated", &heurdata->stoppercentage, TRUE, DEFAULT_STOPPERCENTAGE, 0.0, 1.0, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "heuristics/zirounding/minstopncalls", "determines the minimum number of calls before percentage-based deactivation of Zirounding is applied", &heurdata->minstopncalls, TRUE, DEFAULT_MINSTOPNCALLS, 1, INT_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the rand rounding heuristic and includes it in SCIP */ SCIP_RETCODE SCIPincludeHeurRandrounding( SCIP* scip /**< SCIP data structure */ ) { SCIP_HEURDATA* heurdata; SCIP_HEUR* heur; /* create heuristic data */ SCIP_CALL( SCIPallocMemory(scip, &heurdata) ); /* include primal heuristic */ SCIP_CALL( SCIPincludeHeurBasic(scip, &heur, HEUR_NAME, HEUR_DESC, HEUR_DISPCHAR, HEUR_PRIORITY, HEUR_FREQ, HEUR_FREQOFS, HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecRandrounding, heurdata) ); assert(heur != NULL); /* set non-NULL pointers to callback methods */ SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyRandrounding) ); SCIP_CALL( SCIPsetHeurInit(scip, heur, heurInitRandrounding) ); SCIP_CALL( SCIPsetHeurExit(scip, heur, heurExitRandrounding) ); SCIP_CALL( SCIPsetHeurInitsol(scip, heur, heurInitsolRandrounding) ); SCIP_CALL( SCIPsetHeurExitsol(scip, heur, heurExitsolRandrounding) ); SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeRandrounding) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/" HEUR_NAME "/oncepernode", "should the heuristic only be called once per node?", &heurdata->oncepernode, TRUE, DEFAULT_ONCEPERNODE, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/" HEUR_NAME "/usesimplerounding", "should the heuristic apply the variable lock strategy of simple rounding, if possible?", &heurdata->usesimplerounding, TRUE, DEFAULT_USESIMPLEROUNDING, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/" HEUR_NAME "/propagateonlyroot", "should the probing part of the heuristic be applied exclusively at the root node?", &heurdata->propagateonlyroot, TRUE, DEFAULT_PROPAGATEONLYROOT, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "heuristics/" HEUR_NAME "/maxproprounds", "limit of rounds for each propagation call", &heurdata->maxproprounds, TRUE, DEFAULT_MAXPROPROUNDS, -1, INT_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the rounding heuristic with infeasibility recovering and includes it in SCIP */ SCIP_RETCODE SCIPincludeHeurRounding( SCIP* scip /**< SCIP data structure */ ) { SCIP_HEURDATA* heurdata; SCIP_HEUR* heur; /* create Rounding primal heuristic data */ SCIP_CALL( SCIPallocMemory(scip, &heurdata) ); /* include primal heuristic */ SCIP_CALL( SCIPincludeHeurBasic(scip, &heur, HEUR_NAME, HEUR_DESC, HEUR_DISPCHAR, HEUR_PRIORITY, HEUR_FREQ, HEUR_FREQOFS, HEUR_MAXDEPTH, HEUR_TIMING, HEUR_USESSUBSCIP, heurExecRounding, heurdata) ); assert(heur != NULL); /* set non-NULL pointers to callback methods */ SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyRounding) ); SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeRounding) ); SCIP_CALL( SCIPsetHeurInit(scip, heur, heurInitRounding) ); SCIP_CALL( SCIPsetHeurExit(scip, heur, heurExitRounding) ); SCIP_CALL( SCIPsetHeurInitsol(scip, heur, heurInitsolRounding) ); SCIP_CALL( SCIPsetHeurExitsol(scip, heur, heurExitsolRounding) ); /* add rounding primal heuristic parameters */ SCIP_CALL( SCIPaddIntParam(scip, "heuristics/"HEUR_NAME"/successfactor", "number of calls per found solution that are considered as standard success, a higher factor causes the heuristic to be called more often", &heurdata->successfactor, TRUE, DEFAULT_SUCCESSFACTOR, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "heuristics/"HEUR_NAME"/oncepernode", "should the heuristic only be called once per node?", &heurdata->oncepernode, TRUE, DEFAULT_ONCEPERNODE, NULL, NULL) ); return SCIP_OKAY; }