예제 #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
    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 ++;
    }
예제 #3
0
    void split(const typename Factory::Set &s, GVector<typename Factory::Set > &sv)
    {
      int n = s.mA.size();
      int I = s.mSplitI;
      FT mid = 0.5 * (s.mA[I] + s.mB[I]);
      typename Factory::Set  sl(n), sr(n);
      for(int i = 0; i < n; i ++) {
	sl.mA[i] = sr.mA[i] = s.mA[i];
	sl.mB[i] = sr.mB[i] = s.mB[i];
      }
      sl.mB[I] = mid;
      sr.mA[I] = mid;
      sl.mSplitI = BoxUtils::getLongestEdge(sl);
      sr.mSplitI = BoxUtils::getLongestEdge(sr);
      sv.push_back(sr);
      sv.push_back(sl);
    }
예제 #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);
		}
	}
}