/home/coin/SVN-release/OS-2.1.0/Bonmin/src/Algorithms/BonCbcLpStrategy.cpp

Go to the documentation of this file.
00001 // (C) Copyright Carnegie Mellon University 2006
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Authors :
00006 // Pierre Bonami, Carnegie Mellon University,
00007 //
00008 // Date : 03/15/2006
00009 
00010 #include "BonCbcLpStrategy.hpp"
00011 
00012 
00013 // Cut generators
00014 #include "CglGomory.hpp"
00015 #include "CglProbing.hpp"
00016 #include "CglKnapsackCover.hpp"
00017 #include "CglOddHole.hpp"
00018 #include "CglClique.hpp"
00019 #include "CglFlowCover.hpp"
00020 #include "CglMixedIntegerRounding2.hpp"
00021 #include "CglTwomir.hpp"
00022 #include "CglPreProcess.hpp"
00023 #include "CbcCutGenerator.hpp"
00024 
00025 // Node selection
00026 #include "CbcCompareActual.hpp"
00027 
00028 #include "CbcBranchActual.hpp"
00029 
00030 
00031 namespace Bonmin
00032 {
00033 
00034   CbcStrategyChooseCuts::CbcStrategyChooseCuts():
00035     CbcStrategyDefault(),
00036     genFlag_(63)
00037   {
00038     CoinFillN(gen_freqs_,6,-99);
00039   }
00040 
00041   CbcStrategyChooseCuts::CbcStrategyChooseCuts(const CbcStrategyChooseCuts &other):
00042     CbcStrategyDefault(other),
00043     genFlag_(other.genFlag_)
00044   {
00045     CoinCopyN(other.gen_freqs_,6,gen_freqs_);
00046   }
00047 
00048   CbcStrategyChooseCuts::CbcStrategyChooseCuts(BabSetupBase &s,
00049                                                const std::string &prefix):
00050     CbcStrategyDefault(),
00051     genFlag_(0)
00052   {
00053     setup(s, prefix);
00054   }
00055 
00056   void CbcStrategyChooseCuts::setup(BabSetupBase &s,
00057                                const std::string &prefix){ 
00058     s.options()->GetIntegerValue("number_strong_branch", numberStrong_, prefix);
00059     s.options()->GetIntegerValue("number_before_trust", numberBeforeTrust_, prefix);
00060 
00061     int k = 0;
00062     
00063     bool set = s.options()->GetIntegerValue("probing_cuts", gen_freqs_[k], prefix);
00064     if(set==0) gen_freqs_[k] = -99;
00065     k++;
00066 
00067     set = s.options()->GetIntegerValue("Gomory_cuts", gen_freqs_[k], prefix);
00068     if(set==0) gen_freqs_[k] = -99;
00069     k++;
00070     
00071     set = s.options()->GetIntegerValue("cover_cuts", gen_freqs_[k], prefix);
00072     if(set==0) gen_freqs_[k] = -99;
00073     k++;
00074     
00075     set = s.options()->GetIntegerValue("clique_cuts", gen_freqs_[k], prefix);
00076     if(set==0) gen_freqs_[k] = -99;
00077     k++;
00078     
00079     set = s.options()->GetIntegerValue("flow_cover_cuts", gen_freqs_[k], prefix);
00080     if(set==0) gen_freqs_[k] = -99;
00081     k++;
00082     
00083     set = s.options()->GetIntegerValue("mir_cuts", gen_freqs_[k], prefix);
00084     if(set==0) gen_freqs_[k] = -99;
00085     k++;
00086     
00087   }
00088 
00089 template<class X>
00090 bool has_cg(CbcModel &model, const X& gen){
00091   int numberGenerators = model.numberCutGenerators();
00092   for (int iGenerator=0;iGenerator<numberGenerators;iGenerator++) {
00093     CglCutGenerator * generator = model.cutGenerator(iGenerator)->generator();
00094     X * cgl = dynamic_cast<X *>(generator);
00095     if (cgl) {
00096       return true;
00097     }
00098   }
00099   return false;
00100 }
00101 
00102 #define ADD_CG(model, gen, setting, name) model.addCutGenerator(&gen,setting, name)
00103 
00104   void 
00105   CbcStrategyChooseCuts::setupCutGenerators(CbcModel &model){
00106     CglProbing probing;
00107     probing.setUsingObjective(true);
00108     probing.setMaxPass(1);
00109     probing.setMaxPassRoot(1);
00110     // Number of unsatisfied variables to look at
00111     probing.setMaxProbe(10);
00112     // How far to follow the consequences
00113     probing.setMaxLook(10);
00114     // Only look at rows with fewer than this number of elements
00115     probing.setMaxElements(200);
00116     probing.setMaxElementsRoot(300);
00117     //generator1.setRowCuts(3);
00118 
00119     CglGomory miG;
00120     // try larger limit
00121     miG.setLimit(300);
00122 
00123     CglKnapsackCover cover;
00124 
00125     CglClique clique;
00126     clique.setStarCliqueReport(false);
00127     clique.setRowCliqueReport(false);
00128 
00129     CglMixedIntegerRounding2 mixedGen;
00130     CglFlowCover flowGen;
00131     int k = 0;
00132 
00133     if(gen_freqs_[k]!= 0 && !has_cg(model, probing)){
00134       ADD_CG(model, probing, gen_freqs_[k], "Probing"); 
00135     }
00136     k++;
00137 
00138     if(gen_freqs_[k]!= 0 && !has_cg(model, miG)){
00139       ADD_CG(model, miG, gen_freqs_[k], "Gomory"); 
00140     }
00141     k++;
00142     
00143     if(gen_freqs_[k] != 0 && !has_cg(model, cover)){
00144       ADD_CG(model, cover, gen_freqs_[k], "Knapsack"); 
00145     }
00146     k++;
00147 
00148     if(gen_freqs_[k] != 0 && !has_cg(model, clique)){
00149       ADD_CG(model, clique, gen_freqs_[k], "Clique"); 
00150     }
00151     k++;
00152 
00153     if(gen_freqs_[k] != 0 && !has_cg(model, flowGen)){
00154       ADD_CG(model, flowGen, gen_freqs_[k], "FlowCover"); 
00155     }
00156     k++;
00157 
00158     if(gen_freqs_[k] != 0 && !has_cg(model, mixedGen)){
00159       ADD_CG(model, mixedGen, gen_freqs_[k], "MixedIntegerRounding2"); 
00160     }
00161   }
00162 
00163 }

Generated on Tue Mar 30 03:04:33 2010 by  doxygen 1.4.7