Пример #1
0
//===========================================================================//
int main(int argc, char** argv)
{
   try {
      //---
      //--- create the utility class for parsing parameters
      //---
      UtilParameters utilParam(argc, argv);
      bool doCut          = utilParam.GetSetting("doCut",          true);
      bool doPriceCut     = utilParam.GetSetting("doPriceCut",     false);
      bool doDirect       = utilParam.GetSetting("doDirect",       false);
      UtilTimer timer;
      double    timeSetupReal = 0.0;
      double    timeSetupCpu  = 0.0;
      double    timeSolveReal = 0.0;
      double    timeSolveCpu  = 0.0;
      //---
      //--- start overall timer
      //---
      timer.start();
      //---
      //--- create the user application (a DecompApp)
      //---
      MCF_DecompApp mmkp(utilParam);
      //---
      //--- create the algorithm (a DecompAlgo)
      //---
      DecompAlgo* algo = NULL;
      assert(doCut + doPriceCut == 1);

      //---
      //--- create the CPM algorithm object
      //---
      if (doCut) {
         algo = new DecompAlgoC(&mmkp, utilParam);
      }

      //---
      //--- create the PC algorithm object
      //---
      if (doPriceCut) {
         algo = new DecompAlgoPC(&mmkp, utilParam);
      }

      if (doCut && doDirect) {
         timer.stop();
         timeSetupCpu  = timer.getCpuTime();
         timeSetupReal = timer.getRealTime();
         //---
         //--- solve
         //---
         timer.start();
         algo->solveDirect();
         timer.stop();
         timeSolveCpu  = timer.getCpuTime();
         timeSolveReal = timer.getRealTime();
      } else {
         //---
         //--- create the driver AlpsDecomp model
         //---
         int             status = 0;
         AlpsDecompModel alpsModel(utilParam, algo);
         timer.stop();
         timeSetupCpu  = timer.getCpuTime();
         timeSetupReal = timer.getRealTime();
         //---
         //--- solve
         //---
         timer.start();
         status = alpsModel.solve();
         timer.stop();
         timeSolveCpu  = timer.getCpuTime();
         timeSolveReal = timer.getRealTime();
         //---
         //--- sanity check
         //---
         cout << setiosflags(ios::fixed | ios::showpoint);
         cout << "Status= "   << status
              << " BestLB=  " << setw(10)
              << UtilDblToStr(alpsModel.getGlobalLB(), 5)
              << " BestUB= " << setw(10)
              << UtilDblToStr(alpsModel.getGlobalUB(), 5)
              << " Nodes= " << setw(6)
              << alpsModel.getNumNodesProcessed()
              << " SetupCPU= "  << timeSetupCpu
              << " SolveCPU= "  << timeSolveCpu
              << " TotalCPU= "  << timeSetupCpu + timeSolveCpu
              << " SetupReal= " << timeSetupReal
              << " SolveReal= " << timeSolveReal
              << " TotalReal= " << timeSetupReal + timeSolveReal
              << endl;
         //---
         //--- free local memory
         //---
         delete algo;
      }
   } catch (CoinError& ex) {
      cerr << "COIN Exception [ " << ex.message() << " ]"
           << " at " << ex.fileName()  << ":L" << ex.lineNumber()
           << " in " << ex.className() << "::" << ex.methodName() << endl;
      return 1;
   }

   return 0;
}
Пример #2
0
//===========================================================================//
int main(int argc, char ** argv){
   try{

      //---
      //--- create the utility class for parsing parameters
      //---
      UtilParameters utilParam(argc, argv);  
            
      bool doGenRandom    = utilParam.GetSetting("doGenRandom",    false);
      int  randSeed       = utilParam.GetSetting("randSeed",       1    );
      int  randNumAtms    = utilParam.GetSetting("randNumAtms",    5    );
      int  randNumDates   = utilParam.GetSetting("randNumDates",   10   );
      
      bool doCut          = utilParam.GetSetting("doCut",          true);
      bool doPriceCut     = utilParam.GetSetting("doPriceCut",     false);
      bool doDirect       = utilParam.GetSetting("doDirect",       false);
      
      UtilTimer timer;
      double    timeSetupReal = 0.0;
      double    timeSetupCpu  = 0.0;
      double    timeSolveReal = 0.0;
      double    timeSolveCpu  = 0.0;

      //---
      //--- start overall timer
      //---
      timer.start();
      if(doGenRandom){
	 //---
	 //--- generate a random instance
	 //---
	 ATM_Instance instance;
	 instance.generateRandom(randNumAtms, randNumDates, randSeed);	 
      }
      else{
         //---
         //--- create the user application (a DecompApp)
         //---      
         ATM_DecompApp atm(utilParam); 
                  
         //---
         //--- create the algorithm (a DecompAlgo)
         //---
         DecompAlgo * algo = NULL;
         assert(doCut + doPriceCut == 1);

         //---
         //--- create the CPM algorithm object
         //---      
         if(doCut)
            algo = new DecompAlgoC(&atm, utilParam);
         
         //---
         //--- create the PC algorithm object
         //---
         if(doPriceCut)
            algo = new DecompAlgoPC(&atm, utilParam);
         
         
         if(doCut && doDirect){
            timer.stop();
            timeSetupCpu  = timer.getCpuTime();
            timeSetupReal = timer.getRealTime();

            //---
            //--- solve
            //---
            timer.start();      
            algo->solveDirect();
            timer.stop();
            timeSolveCpu  = timer.getCpuTime();
            timeSolveReal = timer.getRealTime();
         }
         else{            
            //---
            //--- create the driver AlpsDecomp model
            //---
	    int             status = 0;
            AlpsDecompModel alpsModel(utilParam, algo);
	    
	    timer.stop();
            timeSetupCpu  = timer.getCpuTime();
            timeSetupReal = timer.getRealTime();
	    
            //---
            //--- solve
            //---
            timer.start();      
            status = alpsModel.solve();
            timer.stop();
            timeSolveCpu  = timer.getCpuTime();
            timeSolveReal = timer.getRealTime();

            //TODO: move doDirect solve into alpsModel so access
            //  solution the same way?

            //---
            //--- sanity check
            //---
            cout << setiosflags(ios::fixed|ios::showpoint);
	    cout << "Status= " << status 
		 << " BestLB= " << setw(10) 
                 << UtilDblToStr(alpsModel.getGlobalLB(),2)
                 << " BestUB= " << setw(10)
                 << UtilDblToStr(alpsModel.getGlobalUB(),2)        
                 << " Nodes= " << setw(6) 
                 << alpsModel.getNumNodesProcessed()
                 << " SetupCPU= "  << timeSetupCpu
                 << " SolveCPU= "  << timeSolveCpu 
                 << " TotalCPU= "  << timeSetupCpu + timeSolveCpu
                 << " SetupReal= " << timeSetupReal
                 << " SolveReal= " << timeSolveReal
                 << " TotalReal= " << timeSetupReal + timeSolveReal
                 << endl;      

	    //---
	    //--- now, initialize direct solve with best
	    //---   solution to PC
	    //--- TODO: only useful if stop early on time or nodes   
	    //--- TODO: cbc currently doesn't use warm-start, only cpx
	    //---
	    //DecompAlgo * algoC = new DecompAlgoC(&atm, &utilParam);
	    //algoC->solveDirect(algo->getXhatIPBest());
	    //delete algoC;
         }
	 
         //---
         //--- free local memory
         //---
         delete algo;
      }
   }
   catch(CoinError & ex){
      cerr << "COIN Exception [ " << ex.message() << " ]"
           << " at " << ex.fileName()  << ":L" << ex.lineNumber()
           << " in " << ex.className() << "::" << ex.methodName() << endl;
   }
   return 0;
}
Пример #3
0
//===========================================================================//
int main(int argc, char ** argv){
  try{
      
    //---
    //--- create the utility class for parsing parameters
    //---
    UtilParameters utilParam(argc, argv);  
      
    bool useAlps    = utilParam.GetSetting("useAlps",      true); 
      
    bool doCut      = utilParam.GetSetting("doCut",        true);
    bool doPrice    = utilParam.GetSetting("doPrice",      false);
    bool doPriceCut = utilParam.GetSetting("doPriceCut",   false);
    bool doRelaxCut = utilParam.GetSetting("doRelaxCut",   false);

    bool doModelI   = utilParam.GetSetting("doModelI",     true);
    bool doModelJ   = utilParam.GetSetting("doModelJ",     false);
    bool doModelK   = utilParam.GetSetting("doModelK",     false);

    AlpsTimer timer;
    double    timeSetupReal = 0.0;
    double    timeSetupCpu  = 0.0;
    double    timeSolveReal = 0.0;
    double    timeSolveCpu  = 0.0;

    timer.start();

    //---
    //--- create the user application (a DecompApp)
    //---
    AP3_DecompApp ap3(utilParam); 
    ap3.createModel();
      
    //---
    //--- create the algorithm(s) (a DecompAlgo)
    //---
    DecompAlgoC2  * cut      = NULL;
    DecompAlgoPC2 * priceI   = NULL;
    DecompAlgoPC2 * priceJ   = NULL;
    DecompAlgoPC2 * priceK   = NULL;
    DecompAlgoPC2 * pcI      = NULL;
    DecompAlgoPC2 * pcJ      = NULL;
    DecompAlgoPC2 * pcK      = NULL;
    DecompAlgoRC  * rcI      = NULL;
    DecompAlgoRC  * rcJ      = NULL;
    DecompAlgoRC  * rcK      = NULL;

    if(doCut){	 
      cut = new DecompAlgoC2(&ap3, &utilParam);  
    }
    if(doPrice){
      CoinAssertHint(doModelI || doModelJ || doModelK,
		     "Error: must pick some base model to price");
      if(doModelI){
	 priceI = new DecompAlgoPC2(&ap3, &utilParam, "PRICE", true,
				    AP3_DecompApp::MODEL_I);
      }
      if(doModelJ){
	 priceJ = new DecompAlgoPC2(&ap3, &utilParam, "PRICE", true,
				    AP3_DecompApp::MODEL_J);
      }
      if(doModelK){
	 priceK = new DecompAlgoPC2(&ap3, &utilParam, "PRICE", true,
				    AP3_DecompApp::MODEL_K);
      }
    }
      
    if(doPriceCut){
      CoinAssertHint(doModelI || doModelJ || doModelK,
		     "Error: must pick some base model to price");
      if(doModelI){
	pcI = new DecompAlgoPC2(&ap3, &utilParam,
				AP3_DecompApp::MODEL_I);
      }
      if(doModelJ){
	pcJ = new DecompAlgoPC2(&ap3, &utilParam,
				AP3_DecompApp::MODEL_J);
      }
      if(doModelK){
	pcK = new DecompAlgoPC2(&ap3, &utilParam,
				AP3_DecompApp::MODEL_K);
      }
    }
    if(doRelaxCut){
      CoinAssertHint(doModelI || doModelJ || doModelK,
		     "Error: must pick some base model to price");
      if(doModelI){
	rcI = new DecompAlgoRC(&ap3, &utilParam,
			       AP3_DecompApp::MODEL_I);
      }
      if(doModelJ){
	rcJ = new DecompAlgoRC(&ap3, &utilParam,
			       AP3_DecompApp::MODEL_J);
      }
      if(doModelK){
	rcK = new DecompAlgoRC(&ap3, &utilParam,
			       AP3_DecompApp::MODEL_K);
      }
    }

    if(useAlps){
      //---
      //--- create the driver AlpsDecomp model
      //---
      AlpsDecompModel alpsModel(utilParam);
      if(cut) 
	alpsModel.addDecompAlgo(cut);
      if(priceI) 
	alpsModel.addDecompAlgo(priceI);
      if(priceJ) 
	alpsModel.addDecompAlgo(priceJ);
      if(priceK) 
	alpsModel.addDecompAlgo(priceK);
      if(pcI) 
	alpsModel.addDecompAlgo(pcI);
      if(pcJ) 
	alpsModel.addDecompAlgo(pcJ);         
      if(pcK) 
	alpsModel.addDecompAlgo(pcK);
      if(rcI) 
	alpsModel.addDecompAlgo(rcI);
      if(rcJ) 
	alpsModel.addDecompAlgo(rcJ);         
      if(rcK) 
	alpsModel.addDecompAlgo(rcK);         
      timer.stop();
      timeSetupCpu  = timer.getCpuTime();
      timeSetupReal = timer.getWallClock();

      timer.start();
      alpsModel.solve();
      timer.stop();
      timeSolveCpu  = timer.getCpuTime();
      timeSolveReal = timer.getWallClock();

      //---
      //--- sanity check
      //---
      cout << "Instance = " << ap3.getInstanceName()
	   << " Solution = " << alpsModel.getBestObj()
	   << " SetupCPU = " << timeSetupCpu
	   << " SolveCPU = " << timeSolveCpu << endl;

      double diff = alpsModel.getBestObj() - ap3.getKnownOptimalBound();
      CoinAssert(UtilIsZero(diff));


    }else{
      //---
      //--- just solve the bounding problem (root node)
      //---
    }

    if(cut)    delete cut;
    if(priceI) delete priceI;
    if(priceJ) delete priceJ;
    if(priceK) delete priceK;
    if(pcI)    delete pcI;
    if(pcJ)    delete pcJ;
    if(pcK)    delete pcK;
    if(rcI)    delete rcI;
    if(rcJ)    delete rcJ;
    if(rcK)    delete rcK;
  }
  catch(CoinError & ex){
    cerr << "COIN Exception:" << ex.message() << endl 
	 << " from method "   << ex.methodName() << endl
	 << " from class "    << ex.className() << endl; 
  }
}