예제 #1
0
    /**
     * 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]);
	}
      }
      */
    }
예제 #2
0
  /**
   * 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); 
    }
  }
예제 #3
0
    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 ++;
    }
예제 #4
0
//------------------------------------------------------------------------------
void
CPostEffectLoader::PreLoadEffects( GVector<CPostEffectPtr>& outEffects )
{
	Ast(outEffects.empty());

	for (TiXmlNode* node = xmlConfig->FirstChild(); node != NULL;
		node = node->NextSibling())
	{
		TiXmlElement* pElement = node->ToElement();
		if (pElement && pElement->ValueStr() == "PostEffect")
		{
			CPostEffectPtr effect = new CPostEffect();
			string name = pElement->Attribute("name");
			string reset = pElement->Attribute("reset");
			effect->SetName(name);
			effect->SetReset("true" == reset);
			outEffects.push_back(effect);
		}
	}
}
예제 #5
0
  /**
   * 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);
    }
  }