BonCbcLpStrategy.cpp
Go to the documentation of this file.
1 // (C) Copyright Carnegie Mellon University 2006
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // Authors :
6 // Pierre Bonami, Carnegie Mellon University,
7 //
8 // Date : 03/15/2006
9 
10 #include "BonCbcLpStrategy.hpp"
11 
12 
13 // Cut generators
14 #include "CglGomory.hpp"
15 #include "CglProbing.hpp"
16 #include "CglKnapsackCover.hpp"
17 #include "CglOddHole.hpp"
18 #include "CglClique.hpp"
19 #include "CglFlowCover.hpp"
20 #include "CglMixedIntegerRounding2.hpp"
21 #include "CglTwomir.hpp"
22 #include "CglPreProcess.hpp"
23 #include "CbcCutGenerator.hpp"
24 
25 // Node selection
26 #include "CbcCompareActual.hpp"
27 
28 #include "CbcBranchActual.hpp"
29 
30 
31 namespace Bonmin
32 {
33 
35  CbcStrategyDefault(),
36  genFlag_(63)
37  {
38  CoinFillN(gen_freqs_,6,-99);
39  }
40 
42  CbcStrategyDefault(other),
43  genFlag_(other.genFlag_)
44  {
45  CoinCopyN(other.gen_freqs_,6,gen_freqs_);
46  }
47 
49  const std::string &prefix):
50  CbcStrategyDefault(),
51  genFlag_(0)
52  {
53  setup(s, prefix);
54  }
55 
57  const std::string &prefix){
58  s.options()->GetIntegerValue("number_strong_branch", numberStrong_, prefix);
59  s.options()->GetIntegerValue("number_before_trust", numberBeforeTrust_, prefix);
60 
61  int k = 0;
62 
63  bool set = s.options()->GetIntegerValue("probing_cuts", gen_freqs_[k], prefix);
64  if(set==0) gen_freqs_[k] = -99;
65  k++;
66 
67  set = s.options()->GetIntegerValue("Gomory_cuts", gen_freqs_[k], prefix);
68  if(set==0) gen_freqs_[k] = -99;
69  k++;
70 
71  set = s.options()->GetIntegerValue("cover_cuts", gen_freqs_[k], prefix);
72  if(set==0) gen_freqs_[k] = -99;
73  k++;
74 
75  set = s.options()->GetIntegerValue("clique_cuts", gen_freqs_[k], prefix);
76  if(set==0) gen_freqs_[k] = -99;
77  k++;
78 
79  set = s.options()->GetIntegerValue("flow_cover_cuts", gen_freqs_[k], prefix);
80  if(set==0) gen_freqs_[k] = -99;
81  k++;
82 
83  set = s.options()->GetIntegerValue("mir_cuts", gen_freqs_[k], prefix);
84  if(set==0) gen_freqs_[k] = -99;
85  k++;
86 
87  }
88 
89 template<class X>
90 bool has_cg(CbcModel &model, const X& gen){
91  int numberGenerators = model.numberCutGenerators();
92  for (int iGenerator=0;iGenerator<numberGenerators;iGenerator++) {
93  CglCutGenerator * generator = model.cutGenerator(iGenerator)->generator();
94  X * cgl = dynamic_cast<X *>(generator);
95  if (cgl) {
96  return true;
97  }
98  }
99  return false;
100 }
101 
102 #define ADD_CG(model, gen, setting, name) model.addCutGenerator(&gen,setting, name)
103 
104  void
106  CglProbing probing;
107  probing.setUsingObjective(true);
108  probing.setMaxPass(1);
109  probing.setMaxPassRoot(1);
110  // Number of unsatisfied variables to look at
111  probing.setMaxProbe(10);
112  // How far to follow the consequences
113  probing.setMaxLook(10);
114  // Only look at rows with fewer than this number of elements
115  probing.setMaxElements(200);
116  probing.setMaxElementsRoot(300);
117  //generator1.setRowCuts(3);
118 
119  CglGomory miG;
120  // try larger limit
121  miG.setLimit(300);
122 
123  CglKnapsackCover cover;
124 
125  CglClique clique;
126  clique.setStarCliqueReport(false);
127  clique.setRowCliqueReport(false);
128 
129  CglMixedIntegerRounding2 mixedGen;
130  CglFlowCover flowGen;
131  int k = 0;
132 
133  if(gen_freqs_[k]!= 0 && !has_cg(model, probing)){
134  ADD_CG(model, probing, gen_freqs_[k], "Probing");
135  }
136  k++;
137 
138  if(gen_freqs_[k]!= 0 && !has_cg(model, miG)){
139  ADD_CG(model, miG, gen_freqs_[k], "Gomory");
140  }
141  k++;
142 
143  if(gen_freqs_[k] != 0 && !has_cg(model, cover)){
144  ADD_CG(model, cover, gen_freqs_[k], "Knapsack");
145  }
146  k++;
147 
148  if(gen_freqs_[k] != 0 && !has_cg(model, clique)){
149  ADD_CG(model, clique, gen_freqs_[k], "Clique");
150  }
151  k++;
152 
153  if(gen_freqs_[k] != 0 && !has_cg(model, flowGen)){
154  ADD_CG(model, flowGen, gen_freqs_[k], "FlowCover");
155  }
156  k++;
157 
158  if(gen_freqs_[k] != 0 && !has_cg(model, mixedGen)){
159  ADD_CG(model, mixedGen, gen_freqs_[k], "MixedIntegerRounding2");
160  }
161  }
162 
163 }
A class to setup default strategy for Cbc specifying which cut generators to use. ...
void setup(BabSetupBase &s, const std::string &prefix)
Setup strategy.
CbcStrategyChooseCuts()
Default constructor.
A class to have all elements necessary to setup a branch-and-bound.
int gen_freqs_[6]
Generators frequencies.
void fint fint * k
void fint fint fint fint fint fint fint fint fint fint real real real real real real real real * s
virtual void setupCutGenerators(CbcModel &model)
Setup cut generators.
bool has_cg(CbcModel &model, const X &gen)
#define ADD_CG(model, gen, setting, name)
Ipopt::SmartPtr< Ipopt::OptionsList > options()
Acces list of Options.
static char prefix[100]
Definition: BM_lp.cpp:26