/** * 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); } }
void discard(typename Factory::Set& s, GVector<typename Factory::Set > &sv, GVector<typename Factory::Solution > &solv, FT record, BNBBranchInfo* info) { int n = s.mA.size(); int I = s.mSplitI; int m = s.mSegments.size(); if(m > 0) { for(int i = 0; i <= m; i ++) { typename Factory::Set sn(n); bool put = false; for(int j = 0; j < n; j ++) { sn.mA[j] = s.mA[j]; sn.mB[j] = s.mB[j]; } if(i == 0) { Segment<FT> seg = s.mSegments.at(i); if(s.mA[I] < seg.mA) { sn.mB[I] = seg.mA; put = true; } } else if(i == m) { Segment<FT> pseg = s.mSegments.at(i-1); if(s.mB[I] > pseg.mB) { sn.mA[I] = pseg.mB; put = true; } } else { Segment<FT> pseg = s.mSegments.at(i-1); Segment<FT> seg = s.mSegments.at(i); sn.mA[I] = pseg.mB; sn.mB[I] = seg.mA; put = true; } if(put) { sn.mSplitI = BoxUtils::getLongestEdge(sn); sv.push_back(sn); } } if(sv.size() == 1) { typename Factory::Set ss; ss = sv[0]; sv.pop_back(); split(ss, sv); } } else { split(s, sv); } if(!sv.empty()) info->mBranched ++; }
/** * 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); } }