/** * Push solutions into the solution container * * @param sv solution vector * @param info informational parameter */ void pushSolutions (GVector < Solution > &sv, BNBBranchInfo * info = NULL) { while (!sv.empty ()) { Solution s; s = sv.back (); sv.pop_back (); if(!mSetFactory->discard (s, getRecord())){ setRecord(s.getValue()); } mSolutionContainer->push(s); } }
/** * MANDATORY, decompose rectangle * * @param s set, representing rectangle to decompose * * @param sv resulting two (or more) rectangles * * @param record the incumbent value * */ virtual void branch (Set & s, GVector < Set > & sv, GVector < Solution > & solv, Solution & incumbent, BNBBranchInfo * info, InfiniInt ql) { bool rv; Set asetv[MAX_BNB_CHILDREN]; FixedVector < Set > setv(asetv, MAX_BNB_CHILDREN); rv = false; sv.push_back(s); if(!mDiscarders.empty()) { int sz = mDiscarders.size(); for(int i = 0; i < sz; i++){ if(sv.empty()) break; while(!sv.empty()) { Set s = sv.back(); sv.pop_back(); mDiscarders[i]->discard(s, setv, solv, incumbent, info); } int sz = setv.size(); for(int i = 0; i < sz; i ++) { sv.push_back(setv[i]); } setv.clear(); //sv.insert(sv.end(), setv.begin(), setv.end()); } } //TODO make selection of sets to produce solutions int sz = sv.size(); for(int i = 0; i < sz; i ++) { Solution sol; if(makeSolution(sv[i], sol)) solv.push_back(sol); } /* if(mOptions & Options::DO_LOCAL_SEARCH) { int sz = solv.size(); for(int i = 0; i < sz; i++){ improveSolution(solv[i]); } } */ }
/** * Push sets into the set container * * @param sv set vector * @param info informational parameter */ void pushSets (GVector < Set > &sv, BNBBranchInfo * info = NULL) { while (!sv.empty ()) { Set s; s = sv.back (); sv.pop_back (); //BNB_ASSERT(!mSetFactory->isFinal(s)); if(!mSetFactory->discard (s, getRecord())) { mTaskQueue.push (s); } else if(info) { info->mDiscardedByRecord ++; } } if(info) { InfiniInt tmpi; tmpi = mTaskQueue.size(); info->mMaxCandidateProblems = BNBMAX(info->mMaxCandidateProblems, tmpi); } }