00001
00002
00003 #ifndef CbcBranchDynamic_H
00004 #define CbcBranchDynamic_H
00005
00006 #include "CbcBranchActual.hpp"
00007 #include "CoinPackedMatrix.hpp"
00008
00009
00019 class CbcSimpleIntegerDynamicPseudoCost : public CbcSimpleInteger {
00020
00021 public:
00022
00023
00024 CbcSimpleIntegerDynamicPseudoCost ();
00025
00026
00027 CbcSimpleIntegerDynamicPseudoCost (CbcModel * model, int sequence, int iColumn, double breakEven=0.5);
00028
00029
00030 CbcSimpleIntegerDynamicPseudoCost (CbcModel * model, int sequence, int iColumn,
00031 double downDynamicPseudoCost, double upDynamicPseudoCost);
00032
00033
00034 CbcSimpleIntegerDynamicPseudoCost ( const CbcSimpleIntegerDynamicPseudoCost &);
00035
00037 virtual CbcObject * clone() const;
00038
00039
00040 CbcSimpleIntegerDynamicPseudoCost & operator=( const CbcSimpleIntegerDynamicPseudoCost& rhs);
00041
00042
00043 ~CbcSimpleIntegerDynamicPseudoCost ();
00044
00046 virtual double infeasibility(int & preferredWay) const;
00047
00049 virtual CbcBranchingObject * createBranch(int way) ;
00050
00055 virtual OsiSolverBranch * solverBranch() const;
00056
00058 inline double downDynamicPseudoCost() const
00059 { return downDynamicPseudoCost_;};
00061 inline void setDownDynamicPseudoCost(double value)
00062 { downDynamicPseudoCost_=value;};
00063
00065 inline double upDynamicPseudoCost() const
00066 { return upDynamicPseudoCost_;};
00068 inline void setUpDynamicPseudoCost(double value)
00069 { upDynamicPseudoCost_=value;};
00070
00072 inline double upDownSeparator() const
00073 { return upDownSeparator_;};
00075 inline void setUpDownSeparator(double value)
00076 { upDownSeparator_=value;};
00077
00079 inline double sumDownCost() const
00080 { return sumDownCost_;};
00082 inline void setSumDownCost(double value)
00083 { sumDownCost_=value;};
00085 inline void addToSumDownCost(double value)
00086 { sumDownCost_+=value;lastDownCost_=value;sumDownCostSquared_ += value*value;};
00087
00089 inline double sumUpCost() const
00090 { return sumUpCost_;};
00092 inline void setSumUpCost(double value)
00093 { sumUpCost_=value;};
00095 inline void addToSumUpCost(double value)
00096 { sumUpCost_+=value;lastUpCost_=value;sumUpCostSquared_ += value*value;};
00097
00099 inline double sumDownChange() const
00100 { return sumDownChange_;};
00102 inline void setSumDownChange(double value)
00103 { sumDownChange_=value;};
00105 inline void addToSumDownChange(double value)
00106 { sumDownChange_+=value;};
00107
00109 inline double sumUpChange() const
00110 { return sumUpChange_;};
00112 inline void setSumUpChange(double value)
00113 { sumUpChange_=value;};
00115 inline void addToSumUpChange(double value)
00116 { sumUpChange_+=value;};
00117
00119 inline double sumDownDecrease() const
00120 { return sumDownDecrease_;};
00122 inline void setSumDownDecrease(double value)
00123 { sumDownDecrease_=value;};
00125 inline void addToSumDownDecrease(double value)
00126 { sumDownDecrease_+=value;lastDownDecrease_ = (int) value;};
00127
00129 inline double sumUpDecrease() const
00130 { return sumUpDecrease_;};
00132 inline void setSumUpDecrease(double value)
00133 { sumUpDecrease_=value;};
00135 inline void addToSumUpDecrease(double value)
00136 { sumUpDecrease_+=value;lastUpDecrease_ = (int) value;};
00137
00139 inline int numberTimesDown() const
00140 { return numberTimesDown_;};
00142 inline void setNumberTimesDown(int value)
00143 { numberTimesDown_=value;};
00145 inline void incrementNumberTimesDown()
00146 { numberTimesDown_++;};
00147
00149 inline int numberTimesUp() const
00150 { return numberTimesUp_;};
00152 inline void setNumberTimesUp(int value)
00153 { numberTimesUp_=value;};
00155 inline void incrementNumberTimesUp()
00156 { numberTimesUp_++;};
00157
00159 inline int numberTimesDownInfeasible() const
00160 { return numberTimesDownInfeasible_;};
00162 inline void setNumberTimesDownInfeasible(int value)
00163 { numberTimesDownInfeasible_=value;};
00165 inline void incrementNumberTimesDownInfeasible()
00166 { numberTimesDownInfeasible_++;};
00167
00169 inline int numberTimesUpInfeasible() const
00170 { return numberTimesUpInfeasible_;};
00172 inline void setNumberTimesUpInfeasible(int value)
00173 { numberTimesUpInfeasible_=value;};
00175 inline void incrementNumberTimesUpInfeasible()
00176 { numberTimesUpInfeasible_++;};
00177
00179 inline int numberBeforeTrust() const
00180 { return numberBeforeTrust_;};
00182 inline void setNumberBeforeTrust(int value)
00183 { numberBeforeTrust_=value;};
00184
00186 virtual double upEstimate() const;
00188 virtual double downEstimate() const;
00189
00191 inline int method() const
00192 { return method_;};
00194 inline void setMethod(int value)
00195 { method_=value;};
00196
00198 void setDownInformation(double changeObjectiveDown, int changeInfeasibilityDown);
00200 void setUpInformation(double changeObjectiveUp, int changeInfeasibilityUp);
00201
00203 void print(int type=0, double value=0.0) const;
00204 protected:
00206
00208 double downDynamicPseudoCost_;
00210 double upDynamicPseudoCost_;
00215 double upDownSeparator_;
00217 double sumDownCost_;
00219 double sumUpCost_;
00221 double sumDownChange_;
00223 double sumUpChange_;
00225 double sumDownCostSquared_;
00227 double sumUpCostSquared_;
00229 double sumDownDecrease_;
00231 double sumUpDecrease_;
00233 double lastDownCost_;
00235 double lastUpCost_;
00237 int lastDownDecrease_;
00239 int lastUpDecrease_;
00241 int numberTimesDown_;
00243 int numberTimesUp_;
00245 int numberTimesDownInfeasible_;
00247 int numberTimesUpInfeasible_;
00249 int numberBeforeTrust_;
00253 int method_;
00254 };
00255
00256
00267 class CbcDynamicPseudoCostBranchingObject : public CbcIntegerBranchingObject {
00268
00269 public:
00270
00272 CbcDynamicPseudoCostBranchingObject ();
00273
00281 CbcDynamicPseudoCostBranchingObject (CbcModel *model, int variable,
00282 int way , double value,
00283 CbcSimpleIntegerDynamicPseudoCost * object) ;
00284
00292 CbcDynamicPseudoCostBranchingObject (CbcModel *model, int variable, int way,
00293 double lowerValue, double upperValue) ;
00294
00296 CbcDynamicPseudoCostBranchingObject ( const CbcDynamicPseudoCostBranchingObject &);
00297
00299 CbcDynamicPseudoCostBranchingObject & operator= (const CbcDynamicPseudoCostBranchingObject& rhs);
00300
00302 virtual CbcBranchingObject * clone() const;
00303
00305 virtual ~CbcDynamicPseudoCostBranchingObject ();
00306
00311 virtual double branch(bool normalBranch=false);
00316 virtual int fillStrongInfo( CbcStrongInfo & info);
00317
00319 inline double changeInGuessed() const
00320 { return changeInGuessed_;};
00322 inline void setChangeInGuessed(double value)
00323 { changeInGuessed_=value;};
00325 inline CbcSimpleIntegerDynamicPseudoCost * object() const
00326 { return object_;};
00327 protected:
00329 double changeInGuessed_;
00331 CbcSimpleIntegerDynamicPseudoCost * object_;
00332
00333 };
00340 class CbcBranchDynamicDecision : public CbcBranchDecision {
00341 public:
00342
00343 CbcBranchDynamicDecision ();
00344
00345
00346 CbcBranchDynamicDecision ( const CbcBranchDynamicDecision &);
00347
00348 virtual ~CbcBranchDynamicDecision();
00349
00351 virtual CbcBranchDecision * clone() const;
00352
00354 virtual void initialize(CbcModel * model);
00355
00375 virtual int betterBranch(CbcBranchingObject * thisOne,
00376 CbcBranchingObject * bestSoFar,
00377 double changeUp, int numInfUp,
00378 double changeDn, int numInfDn);
00380 virtual void setBestCriterion(double value);
00381 virtual double getBestCriterion() const;
00384 virtual int whichMethod() {return 3;};
00385
00388 virtual void saveBranchingObject(CbcBranchingObject * object) ;
00391 virtual void updateInformation(OsiSolverInterface * solver,
00392 const CbcNode * node);
00393
00394
00395 private:
00396
00398 CbcBranchDynamicDecision & operator=(const CbcBranchDynamicDecision& rhs);
00399
00401
00403 double bestCriterion_;
00404
00406 double bestChangeUp_;
00407
00409 int bestNumberUp_;
00410
00412 double bestChangeDown_;
00413
00415 int bestNumberDown_;
00416
00418 CbcBranchingObject * bestObject_;
00419 };
00420 #endif