00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "BonCbcLpStrategy.hpp"
00011
00012
00013
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
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
00111 probing.setMaxProbe(10);
00112
00113 probing.setMaxLook(10);
00114
00115 probing.setMaxElements(200);
00116 probing.setMaxElementsRoot(300);
00117
00118
00119 CglGomory miG;
00120
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 }