Cbc  2.10.7
CbcHeuristicDW.hpp
Go to the documentation of this file.
1 // $Id: CbcHeuristicDW.hpp 1899 2013-04-09 18:12:08Z stefan $
2 // Copyright (C) 2006, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 
6 #ifndef CbcHeuristicDW_H
7 #define CbcHeuristicDW_H
8 
9 #include "CbcHeuristic.hpp"
10 
16 class CbcHeuristicDW : public CbcHeuristic {
17 public:
18  // Default Constructor
20 
21  /* Constructor with model - assumed before cuts
22  */
23  CbcHeuristicDW(CbcModel &model, int keepContinuous = 0);
24 
25  /* Constructor with model - assumed before cuts
26  */
28  int callBack(CbcHeuristicDW *currentHeuristic,
29  CbcModel *thisModel,
30  int whereFrom),
31  int keepContinuous = 0);
32 
33  // Copy constructor
35 
36  // Destructor
38 
40  virtual CbcHeuristic *clone() const;
41 
44 
46  virtual void generateCpp(FILE *fp);
47 
49  virtual void resetModel(CbcModel *model);
50 
52  virtual void setModel(CbcModel *model);
58  virtual int solution(double &objectiveValue,
59  double *newSolution);
62  inline int numberBlocks() const
63  {
64  return numberBlocks_;
65  }
67  void passInSolution(const double *solution);
69  void passInContinuousSolution(const double *solution);
75  void setProposalActions(int fullDWEverySoOften);
77  double objectiveValueWhen(int whichDW) const;
79  int numberColumnsDW(int whichDW) const;
81  inline OsiSolverInterface *solver() const
82  {
83  return solver_;
84  }
86  OsiSolverInterface *DWModel(int whichDW) const;
88  inline double bestObjective() const
89  {
90  return bestObjective_;
91  }
93  inline const double *bestSolution() const
94  {
95  return bestSolution_;
96  }
98  inline const double *continuousSolution() const
99  {
100  return continuousSolution_;
101  }
103  inline const double *fixedDj() const
104  {
105  return fixedDj_;
106  }
108  inline const double *objectiveDW() const
109  {
110  return objectiveDW_;
111  }
113  inline int numberDWTimes() const
114  {
115  return numberDWTimes_;
116  }
118  inline const int *numberColumnsDW() const
119  {
120  return numberColumnsDW_;
121  }
123  inline void setNumberPasses(int value)
124  {
125  numberPasses_ = value;
126  }
128  inline void setNumberBadPasses(int value)
129  {
130  numberBadPasses_ = value;
131  }
133  inline void setNumberNeeded(int value)
134  {
135  nNeededBase_ = value;
136  }
138  inline int getNumberNeeded() const
139  {
140  return nNeededBase_;
141  }
143  inline void setCurrentNumberNeeded(int value)
144  {
145  nNeeded_ = value;
146  }
148  inline int getCurrentNumberNeeded() const
149  {
150  return nNeeded_;
151  }
153  inline void setNumberNodes(int value)
154  {
155  nNodesBase_ = value;
156  }
158  inline int getNumberNodes() const
159  {
160  return nNodesBase_;
161  }
163  inline void setCurrentNumberNodes(int value)
164  {
165  nNodes_ = value;
166  }
168  inline int getCurrentNumberNodes() const
169  {
170  return nNodes_;
171  }
173  inline void setTargetObjective(double value)
174  {
175  targetObjective_ = value;
176  }
178  inline void setHowOften(int value)
179  {
180  howOften_ = value;
181  }
183  inline const int *whichRowBlock() const
184  {
185  return whichRowBlock_;
186  }
188  inline const int *whichColumnBlock() const
189  {
190  return whichColumnBlock_;
191  }
193  inline double *initialLower() const
194  {
195  return saveLower_;
196  }
198  inline double *initialUpper() const
199  {
200  return saveUpper_;
201  }
203  inline int *intArrays() const
204  {
205  return intArray_;
206  }
208  inline double *doubleArrays() const
209  {
210  return doubleArray_;
211  }
213  inline int phase() const
214  {
215  return phase_;
216  }
218  inline int pass() const
219  {
220  return pass_;
221  }
223  inline const int *columnsInBlock() const
224  {
225  return columnsInBlock_;
226  }
228  inline const int *startColumnBlock() const
229  {
230  return startColumnBlock_;
231  }
233  inline const int *intsInBlock() const
234  {
235  return intsInBlock_;
236  }
238  double objectiveValue(const double *solution);
239 
240 private:
242  void gutsOfCopy(const CbcHeuristicDW &rhs);
244  void gutsOfDelete();
246  void setDefaults();
252  int addDW(const double *solution, int numberBlocksUsed,
253  const int *whichBlocks);
254 
255 protected:
256  typedef int (*heuristicCallBack)(CbcHeuristicDW *, CbcModel *, int);
257  // Data
280  int *intArray_;
282  double *doubleArray_;
284  OsiSolverInterface *solver_;
286  OsiSolverInterface *dwSolver_;
288  double *bestSolution_;
292  double *fixedDj_;
294  double *saveLower_;
296  double *saveUpper_;
298  double *random_;
300  double *weights_;
302  double *objectiveDW_;
310  int *dwBlock_;
324  unsigned int *fingerPrint_;
326  unsigned short *affinity_;
354  int phase_;
356  int pass_;
362  int nNeeded_;
364  int nNodes_;
367  // 0 - fine, 1 can't be better, 2 max node
369 };
370 
371 #endif
372 
373 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
374 */
This is unlike the other heuristics in that it is very very compute intensive.
const double * bestSolution() const
Best solution found so far.
int getNumberNeeded() const
Get number free integers needed (Base value)
int keepContinuous_
Action on decomposition - 1 keep continuous, 0 don't.
int numberColumnsDW(int whichDW) const
Number of columns in DW.
CbcHeuristicDW & operator=(const CbcHeuristicDW &rhs)
Assignment operator.
virtual void generateCpp(FILE *fp)
Create C++ lines to get to current state.
void findStructure()
Find structure.
void setCurrentNumberNeeded(int value)
Set number free integers needed (Current value)
double * weights_
Weights for each proposal.
int fullDWEverySoOften_
DW Proposal actions fullDWEverySoOften - 0 - off k - every k times solution gets better.
int nNeededBase_
Base number of integers needed.
const double * objectiveDW() const
Objective at which DW updated.
void setDefaults()
Set default values.
double * initialUpper() const
Initial Upper bounds.
int nNodes_
Base number of nodes needed.
double * fixedDj_
Reduced costs of fixed solution.
double * saveUpper_
Original Upper bounds.
OsiSolverInterface * solver() const
Solver.
double * doubleArrays() const
Local double arrays (each numberBlocks_ long)
int numberDW_
Number of DW proposals.
double objectiveValueWhen(int whichDW) const
Objective value when whichDw created.
CbcHeuristicDW(CbcModel &model, int callBack(CbcHeuristicDW *currentHeuristic, CbcModel *thisModel, int whereFrom), int keepContinuous=0)
int * intsInBlock_
Number of integer variables in each block.
int * rowsInBlock_
Which rows are in blocke.
int addDW(const double *solution, int numberBlocksUsed, const int *whichBlocks)
Add DW proposals.
void setCurrentNumberNodes(int value)
Set number nodes (could be done in callback) (Current value)
int numberBlocks_
Number of blocks.
void setupDWStructures()
Set up DW structure.
int * intArrays() const
Local integer arrays (each numberBlocks_ long)
double bestObjective_
Best objective value.
int nNeeded_
Base number of integers needed.
int numberBadPasses_
Number of passes without better solution.
int * intArray_
Local integer arrays (each numberBlocks_ long)
virtual CbcHeuristic * clone() const
Clone.
void passInSolution(const double *solution)
Pass in a solution.
double * random_
random numbers for master rows
int getCurrentNumberNodes() const
Get number nodes (could be done in callback) (Current value)
OsiSolverInterface * DWModel(int whichDW) const
DW model (user must delete)
const int * whichRowBlock() const
Block for every row.
const double * fixedDj() const
Reduced costs of fixed solution.
void gutsOfDelete()
Guts of delete.
int numberDWTimes() const
Number of times we have added to DW model.
int nNodesBase_
Base number of nodes needed.
const int * columnsInBlock() const
Which columns are in block.
double objectiveValue(const double *solution)
Objective value (could also check validity)
double * continuousSolution_
Continuous solution.
int maximumDW_
Current maximum number of DW proposals.
double * objectiveDW_
Objective at which DW updated.
int * dwBlock_
Block number for each proposal.
int * numberColumnsDW_
Number of columns in each DW.
void setNumberPasses(int value)
Set number of passes.
virtual int solution(double &objectiveValue, double *newSolution)=0
returns 0 if no solution, 1 if valid solution with better objective value than one passed in Sets sol...
void setNumberBadPasses(int value)
Set number of passes without better solution.
void passInContinuousSolution(const double *solution)
Pass in continuous solution.
void setHowOften(int value)
Sets how often to do it.
int sizeFingerPrint_
Number of unsigned ints needed for each block of fingerPrint.
const int * whichColumnBlock() const
Block for every column.
int numberDWTimes_
Number of times we have added to DW model.
int pass() const
Pass number.
const int * startColumnBlock() const
Starts for columnsInBlock.
OsiSolverInterface * dwSolver_
DW solver.
int(* heuristicCallBack)(CbcHeuristicDW *, CbcModel *, int)
virtual void setModel(CbcModel *model)
update model (This is needed if cliques update matrix etc)
heuristicCallBack functionPointer_
Call back whereFrom - 0 - after blocks found but before data setup 1 - after blocks sorted but before...
CbcHeuristicDW(const CbcHeuristicDW &)
int getNumberNodes() const
Get number nodes (could be done in callback) (Base value)
void setNumberNodes(int value)
Set number nodes (could be done in callback) (Base value)
int * startColumnBlock_
Starts for columnsInBlock.
int numberPasses_
Number of passes.
double * bestSolution_
Best solution found so far.
void setProposalActions(int fullDWEverySoOften)
DW Proposal actions fullDWEverySoOften - 0 - off k - every k times solution gets better.
int howOften_
How often to do (code can change)
int pass_
Pass number.
const int * numberColumnsDW() const
Number of columns in DW.
double targetObjective_
Target objective.
double lastObjective_
Objective value last time.
int phase_
Phase of solution.
void setNumberNeeded(int value)
Set number free integers needed (Base value)
int phase() const
Phase of solution.
int * whichRowBlock_
Block for every row.
const double * continuousSolution() const
Continuous solution.
int * columnsInBlock_
Which columns are in block.
int numberMasterRows_
Number of rows in master.
virtual void resetModel(CbcModel *model)
Resets stuff if model changes.
int numberMasterColumns_
Number of columns in master.
double * saveLower_
Original lower bounds.
double * initialLower() const
Initial Lower bounds.
int * backwardRow_
Points back to master rows.
int * startRowBlock_
Starts for rowsInBlock.
int * whichColumnBlock_
Block for every column.
void setTargetObjective(double value)
Set target objective.
OsiSolverInterface * solver_
Base solver.
unsigned int * fingerPrint_
Bits set for 1 integers in each block.
void gutsOfCopy(const CbcHeuristicDW &rhs)
Guts of copy.
const int * intsInBlock() const
Number of integer variables in each block.
CbcHeuristicDW(CbcModel &model, int keepContinuous=0)
virtual int solution(double &objectiveValue, double *newSolution)
returns 0 if no solution, 1 if valid solution.
unsigned short * affinity_
Affinity each block has for other (will be triangular?)
int numberBlocks() const
Return number of blocks <=0 - no usable structure.
int getCurrentNumberNeeded() const
Get number free integers needed (Current value)
double * doubleArray_
Local double arrays (each numberBlocks_ long)
double bestObjective() const
Best objective value.
Heuristic base class.
int whereFrom() const
virtual int solution(double &objectiveValue, double *newSolution)=0
returns 0 if no solution, 1 if valid solution with better objective value than one passed in Sets sol...
Simple Branch and bound class.
Definition: CbcModel.hpp:100