/** creates the distributiondiving heuristic and includes it in SCIP */ SCIP_RETCODE SCIPincludeHeurDistributiondiving( SCIP* scip /**< SCIP data structure */ ) { SCIP_HEURDATA* heurdata; SCIP_HEUR* heur; SCIP_EVENTHDLRDATA* eventhdlrdata; /* create distributiondiving data */ heurdata = NULL; SCIP_CALL( SCIPallocMemory(scip, &heurdata) ); heurdata->memsize = 0; heurdata->rowmeans = NULL; heurdata->rowvariances = NULL; heurdata->rowinfinitiesdown = NULL; heurdata->rowinfinitiesup = NULL; heurdata->varfilterposs = NULL; heurdata->currentlbs = NULL; heurdata->currentubs = NULL; /* create event handler first to finish heuristic data */ eventhdlrdata = NULL; SCIP_CALL( SCIPallocMemory(scip, &eventhdlrdata) ); eventhdlrdata->heurdata = heurdata; heurdata->eventhdlr = NULL; SCIP_CALL( SCIPincludeEventhdlrBasic(scip, &heurdata->eventhdlr, EVENTHDLR_NAME, "event handler for dynamic acitivity distribution updating", eventExecDistribution, eventhdlrdata) ); assert( heurdata->eventhdlr != NULL); SCIP_CALL( SCIPsetEventhdlrFree(scip, heurdata->eventhdlr, eventFreeDistributiondiving) ); /* 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, heurExecDistributiondiving, heurdata) ); assert(heur != NULL); /* set non-NULL pointers to callback methods */ SCIP_CALL( SCIPsetHeurCopy(scip, heur, heurCopyDistributiondiving) ); SCIP_CALL( SCIPsetHeurFree(scip, heur, heurFreeDistributiondiving) ); SCIP_CALL( SCIPsetHeurInit(scip, heur, heurInitDistributiondiving) ); SCIP_CALL( SCIPsetHeurExit(scip, heur, heurExitDistributiondiving) ); SCIP_CALL( SCIPcreateDiveset(scip, NULL, heur, HEUR_NAME, DEFAULT_MINRELDEPTH, DEFAULT_MAXRELDEPTH, DEFAULT_MAXLPITERQUOT, DEFAULT_MAXDIVEUBQUOT, DEFAULT_MAXDIVEAVGQUOT, DEFAULT_MAXDIVEUBQUOTNOSOL, DEFAULT_MAXDIVEAVGQUOTNOSOL, DEFAULT_LPRESOLVEDOMCHGQUOT, DEFAULT_LPSOLVEFREQ, DEFAULT_MAXLPITEROFS, DEFAULT_BACKTRACK, DEFAULT_ONLYLPBRANCHCANDS, DIVESET_DIVETYPES, divesetGetScoreDistributiondiving) ); SCIP_CALL( SCIPaddCharParam(scip, "heuristics/" HEUR_NAME "/scoreparam", "the score;largest 'd'ifference, 'l'owest cumulative probability,'h'ighest c.p., 'v'otes lowest c.p., votes highest c.p.('w'), 'r'evolving", &heurdata->scoreparam, TRUE, DEFAULT_SCOREPARAM, "lvdhwr", NULL, NULL) ); return SCIP_OKAY; }
/** creates the pseudo cost branching rule and includes it in SCIP */ SCIP_RETCODE SCIPincludeBranchrulePscost( SCIP* scip /**< SCIP data structure */ ) { SCIP_BRANCHRULEDATA* branchruledata; SCIP_BRANCHRULE* branchrule; /* create pscost branching rule data */ SCIP_CALL( SCIPallocMemory(scip, &branchruledata) ); /* include allfullstrong branching rule */ SCIP_CALL( SCIPincludeBranchruleBasic(scip, &branchrule, BRANCHRULE_NAME, BRANCHRULE_DESC, BRANCHRULE_PRIORITY, BRANCHRULE_MAXDEPTH, BRANCHRULE_MAXBOUNDDIST, branchruledata) ); assert(branchrule != NULL); /* set non-fundamental callbacks via specific setter functions*/ SCIP_CALL( SCIPsetBranchruleCopy(scip, branchrule, branchCopyPscost) ); SCIP_CALL( SCIPsetBranchruleFree(scip, branchrule, branchFreePscost) ); SCIP_CALL( SCIPsetBranchruleExecLp(scip, branchrule, branchExeclpPscost) ); SCIP_CALL( SCIPsetBranchruleExecExt(scip, branchrule, branchExecextPscost) ); SCIP_CALL( SCIPaddCharParam(scip, "branching/"BRANCHRULE_NAME"/strategy", "strategy for utilizing pseudo-costs of external branching candidates (multiply as in pseudo costs 'u'pdate rule, or by 'd'omain reduction, or by domain reduction of 's'ibling, or by 'v'ariable score)", &branchruledata->strategy, FALSE, BRANCHRULE_STRATEGY_DEFAULT, BRANCHRULE_STRATEGIES, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/minscoreweight", "weight for minimum of scores of a branching candidate when building weighted sum of min/max/sum of scores", &branchruledata->scoreminweight, TRUE, BRANCHRULE_SCOREMINWEIGHT_DEFAULT, -SCIPinfinity(scip), SCIPinfinity(scip), NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/maxscoreweight", "weight for maximum of scores of a branching candidate when building weighted sum of min/max/sum of scores", &branchruledata->scoremaxweight, TRUE, BRANCHRULE_SCOREMAXWEIGHT_DEFAULT, -SCIPinfinity(scip), SCIPinfinity(scip), NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/sumscoreweight", "weight for sum of scores of a branching candidate when building weighted sum of min/max/sum of scores", &branchruledata->scoresumweight, TRUE, BRANCHRULE_SCORESUMWEIGHT_DEFAULT, -SCIPinfinity(scip), SCIPinfinity(scip), NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "branching/"BRANCHRULE_NAME"/nchildren", "number of children to create in n-ary branching", &branchruledata->nchildren, FALSE, BRANCHRULE_NCHILDREN_DEFAULT, 2, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "branching/"BRANCHRULE_NAME"/narymaxdepth", "maximal depth where to do n-ary branching, -1 to turn off", &branchruledata->narymaxdepth, FALSE, BRANCHRULE_NARYMAXDEPTH_DEFAULT, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/naryminwidth", "minimal domain width in children when doing n-ary branching, relative to global bounds", &branchruledata->naryminwidth, FALSE, BRANCHRULE_NARYMINWIDTH_DEFAULT, 0.0, 1.0, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "branching/"BRANCHRULE_NAME"/narywidthfactor", "factor of domain width in n-ary branching when creating nodes with increasing distance from branching value", &branchruledata->narywidthfactor, FALSE, BRANCHRULE_NARYWIDTHFAC_DEFAULT, 1.0, SCIP_REAL_MAX, NULL, NULL) ); return SCIP_OKAY; }
/** creates the closecuts separator and includes it in SCIP */ SCIP_RETCODE SCIPincludeSepaClosecuts( SCIP* scip /**< SCIP data structure */ ) { SCIP_SEPADATA* sepadata; /* create closecuts separator data */ SCIP_CALL( SCIPallocMemory(scip, &sepadata) ); sepadata->sepasol = NULL; sepadata->discardnode = -1; sepadata->nunsuccessful = 0; /* include separator */ SCIP_CALL( SCIPincludeSepa(scip, SEPA_NAME, SEPA_DESC, SEPA_PRIORITY, SEPA_FREQ, SEPA_MAXBOUNDDIST, SEPA_USESSUBSCIP, SEPA_DELAY, sepaCopyClosecuts, sepaFreeClosecuts, sepaInitClosecuts, sepaExitClosecuts, sepaInitsolClosecuts, sepaExitsolClosecuts, sepaExeclpClosecuts, sepaExecsolClosecuts, sepadata) ); /* add closecuts separator parameters */ SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/separelint", "generate close cuts w.r.t. relative interior point (best solution otherwise)?", &sepadata->separelint, TRUE, SCIP_DEFAULT_SEPARELINT, NULL, NULL) ); SCIP_CALL( SCIPaddRealParam(scip, "separating/closecuts/sepacombvalue", "convex combination value for close cuts", &sepadata->sepacombvalue, TRUE, SCIP_DEFAULT_SEPACOMBVALUE, 0.0, 1.0, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/separootonly", "generate close cuts in the root only?", &sepadata->separootonly, TRUE, SCIP_DEFAULT_SEPAROOTONLY, NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/closecuts/closethres", "threshold on number of generated cuts below which the ordinary separation is started", &sepadata->sepathreshold, TRUE, SCIP_DEFAULT_SEPATHRESHOLD, -1, INT_MAX, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/inclobjcutoff", "include an objective cutoff when computing the relative interior?", &sepadata->inclobjcutoff, TRUE, SCIP_DEFAULT_INCLOBJCUTOFF, NULL, NULL) ); SCIP_CALL( SCIPaddBoolParam(scip, "separating/closecuts/recomputerelint", "recompute relative interior point in each separation call?", &sepadata->recomputerelint, TRUE, SCIP_DEFAULT_RECOMPUTERELINT, NULL, NULL) ); SCIP_CALL( SCIPaddCharParam(scip, "separating/closecuts/relintnormtype", "type of norm to use when computing relative interior: 'o'ne norm, 's'upremum norm", &sepadata->relintnormtype, TRUE, SCIP_DEFAULT_RELINTNORMTYPE, "os", NULL, NULL) ); SCIP_CALL( SCIPaddIntParam(scip, "separating/closecuts/maxunsuccessful", "turn off separation in current node after unsuccessful calls (-1 never turn off)", &sepadata->maxunsuccessful, TRUE, SCIP_DEFAULT_MAXUNSUCCESSFUL, -1, INT_MAX, NULL, NULL) ); return SCIP_OKAY; }