/** node selection method of node selector */ static SCIP_DECL_NODESELSELECT(nodeselSelectDfs) { /*lint --e{715}*/ assert(nodesel != NULL); assert(strcmp(SCIPnodeselGetName(nodesel), NODESEL_NAME) == 0); assert(scip != NULL); assert(selnode != NULL); *selnode = SCIPgetPrioChild(scip); if( *selnode == NULL ) { *selnode = SCIPgetPrioSibling(scip); if( *selnode == NULL ) { SCIPdebugMessage("select best leaf\n"); *selnode = SCIPgetBestLeaf(scip); } SCIPdebugMessage("select best sibling leaf\n"); } return SCIP_OKAY; }
/** node selection method of node selector */ static SCIP_DECL_NODESELSELECT(nodeselSelectBfs) { /*lint --e{715}*/ SCIP_NODESELDATA* nodeseldata; int minplungedepth; int maxplungedepth; int plungedepth; SCIP_Real maxplungequot; assert(nodesel != NULL); assert(strcmp(SCIPnodeselGetName(nodesel), NODESEL_NAME) == 0); assert(scip != NULL); assert(selnode != NULL); *selnode = NULL; /* get node selector user data */ nodeseldata = SCIPnodeselGetData(nodesel); assert(nodeseldata != NULL); /* calculate minimal and maximal plunging depth */ minplungedepth = nodeseldata->minplungedepth; maxplungedepth = nodeseldata->maxplungedepth; maxplungequot = nodeseldata->maxplungequot; if( minplungedepth == -1 ) { minplungedepth = SCIPgetMaxDepth(scip)/10; if( SCIPgetNStrongbranchLPIterations(scip) > 2*SCIPgetNNodeLPIterations(scip) ) minplungedepth += 10; if( maxplungedepth >= 0 ) minplungedepth = MIN(minplungedepth, maxplungedepth); } if( maxplungedepth == -1 ) maxplungedepth = SCIPgetMaxDepth(scip)/2; maxplungedepth = MAX(maxplungedepth, minplungedepth); /* check, if we exceeded the maximal plunging depth */ plungedepth = SCIPgetPlungeDepth(scip); if( plungedepth > maxplungedepth ) { /* we don't want to plunge again: select best node from the tree */ SCIPdebugMessage("plungedepth: [%d,%d], cur: %d -> abort plunging\n", minplungedepth, maxplungedepth, plungedepth); *selnode = SCIPgetBestNode(scip); SCIPdebugMessage(" -> best node : lower=%g\n", *selnode != NULL ? SCIPnodeGetLowerbound(*selnode) : SCIPinfinity(scip)); } else { SCIP_NODE* node; SCIP_Real maxbound; /* check, if plunging is forced at the current depth */ if( plungedepth < minplungedepth ) { maxbound = SCIPinfinity(scip); SCIPdebugMessage("plungedepth: [%d,%d], cur: %d => maxbound: infinity\n", minplungedepth, maxplungedepth, plungedepth); } else { SCIP_Real lowerbound; SCIP_Real cutoffbound; /* get global lower and cutoff bound */ lowerbound = SCIPgetLowerbound(scip); cutoffbound = SCIPgetCutoffbound(scip); /* if we didn't find a solution yet, the cutoff bound is usually very bad: * use only 20% of the gap as cutoff bound */ if( SCIPgetNSolsFound(scip) == 0 ) cutoffbound = lowerbound + 0.2 * (cutoffbound - lowerbound); /* calculate maximal plunging bound */ maxbound = lowerbound + maxplungequot * (cutoffbound - lowerbound); SCIPdebugMessage("plungedepth: [%d,%d], cur: %d, bounds: [%g,%g], maxbound: %g\n", minplungedepth, maxplungedepth, plungedepth, lowerbound, cutoffbound, maxbound); } /* we want to plunge again: prefer children over siblings, and siblings over leaves, * but only select a child or sibling, if its dual bound is small enough; * prefer using nodes with higher node selection priority assigned by the branching rule */ node = SCIPgetPrioChild(scip); if( node != NULL && SCIPnodeGetLowerbound(node) < maxbound ) { *selnode = node; SCIPdebugMessage(" -> selected prio child: lower=%g\n", SCIPnodeGetLowerbound(*selnode)); } else { node = SCIPgetBestChild(scip); if( node != NULL && SCIPnodeGetLowerbound(node) < maxbound ) { *selnode = node; SCIPdebugMessage(" -> selected best child: lower=%g\n", SCIPnodeGetLowerbound(*selnode)); } else { node = SCIPgetPrioSibling(scip); if( node != NULL && SCIPnodeGetLowerbound(node) < maxbound ) { *selnode = node; SCIPdebugMessage(" -> selected prio sibling: lower=%g\n", SCIPnodeGetLowerbound(*selnode)); } else { node = SCIPgetBestSibling(scip); if( node != NULL && SCIPnodeGetLowerbound(node) < maxbound ) { *selnode = node; SCIPdebugMessage(" -> selected best sibling: lower=%g\n", SCIPnodeGetLowerbound(*selnode)); } else { *selnode = SCIPgetBestNode(scip); SCIPdebugMessage(" -> selected best leaf: lower=%g\n", *selnode != NULL ? SCIPnodeGetLowerbound(*selnode) : SCIPinfinity(scip)); } } } } } return SCIP_OKAY; }