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 iColumn, double breakEven=0.5);
00028
00029
00030 CbcSimpleIntegerDynamicPseudoCost (CbcModel * model, int iColumn,
00031 double downDynamicPseudoCost, double upDynamicPseudoCost);
00032
00033
00034 CbcSimpleIntegerDynamicPseudoCost (CbcModel * model, int dummy, int iColumn,
00035 double downDynamicPseudoCost, double upDynamicPseudoCost);
00036
00037
00038 CbcSimpleIntegerDynamicPseudoCost ( const CbcSimpleIntegerDynamicPseudoCost &);
00039
00041 virtual CbcObject * clone() const;
00042
00043
00044 CbcSimpleIntegerDynamicPseudoCost & operator=( const CbcSimpleIntegerDynamicPseudoCost& rhs);
00045
00046
00047 ~CbcSimpleIntegerDynamicPseudoCost ();
00048
00049 using CbcObject::infeasibility ;
00051 virtual double infeasibility(int & preferredWay) const;
00052
00053 using CbcObject::createBranch ;
00055 virtual CbcBranchingObject * createBranch(int way) ;
00056
00058 virtual double infeasibility(const OsiSolverInterface * solver,
00059 const OsiBranchingInformation * info, int & preferredWay) const;
00060
00061
00067 virtual CbcBranchingObject * createBranch(OsiSolverInterface * solver,
00068 const OsiBranchingInformation * info, int way) ;
00069
00073 virtual CbcObjectUpdateData createUpdateInformation(const OsiSolverInterface * solver,
00074 const CbcNode * node,
00075 const CbcBranchingObject * branchingObject);
00077 virtual void updateInformation(const CbcObjectUpdateData & data) ;
00079 void copySome(CbcSimpleIntegerDynamicPseudoCost * otherObject);
00080
00081 using CbcSimpleInteger::solverBranch ;
00086 virtual OsiSolverBranch * solverBranch() const;
00087
00089 inline double downDynamicPseudoCost() const
00090 { return downDynamicPseudoCost_;}
00092 inline void setDownDynamicPseudoCost(double value)
00093 { downDynamicPseudoCost_=value;}
00094
00096 inline double upDynamicPseudoCost() const
00097 { return upDynamicPseudoCost_;}
00099 inline void setUpDynamicPseudoCost(double value)
00100 { upDynamicPseudoCost_=value;}
00101
00103 inline double upDownSeparator() const
00104 { return upDownSeparator_;}
00106 inline void setUpDownSeparator(double value)
00107 { upDownSeparator_=value;}
00108
00110 inline double sumDownCost() const
00111 { return sumDownCost_;}
00113 inline void setSumDownCost(double value)
00114 { sumDownCost_=value;}
00116 inline void addToSumDownCost(double value)
00117 { sumDownCost_+=value;lastDownCost_=value;sumDownCostSquared_ += value*value;}
00118
00120 inline double sumUpCost() const
00121 { return sumUpCost_;}
00123 inline void setSumUpCost(double value)
00124 { sumUpCost_=value;}
00126 inline void addToSumUpCost(double value)
00127 { sumUpCost_+=value;lastUpCost_=value;sumUpCostSquared_ += value*value;}
00128
00130 inline double sumDownChange() const
00131 { return sumDownChange_;}
00133 inline void setSumDownChange(double value)
00134 { sumDownChange_=value;}
00136 inline void addToSumDownChange(double value)
00137 { sumDownChange_+=value;}
00138
00140 inline double sumUpChange() const
00141 { return sumUpChange_;}
00143 inline void setSumUpChange(double value)
00144 { sumUpChange_=value;}
00146 inline void addToSumUpChange(double value)
00147 { sumUpChange_+=value;}
00148
00150 inline double sumDownDecrease() const
00151 { return sumDownDecrease_;}
00153 inline void setSumDownDecrease(double value)
00154 { sumDownDecrease_=value;}
00156 inline void addToSumDownDecrease(double value)
00157 { sumDownDecrease_+=value;lastDownDecrease_ = (int) value;}
00158
00160 inline double sumUpDecrease() const
00161 { return sumUpDecrease_;}
00163 inline void setSumUpDecrease(double value)
00164 { sumUpDecrease_=value;}
00166 inline void addToSumUpDecrease(double value)
00167 { sumUpDecrease_+=value;lastUpDecrease_ = (int) value;}
00168
00170 inline int numberTimesDown() const
00171 { return numberTimesDown_;}
00173 inline void setNumberTimesDown(int value)
00174 { numberTimesDown_=value;}
00176 inline void incrementNumberTimesDown()
00177 { numberTimesDown_++;}
00178
00180 inline int numberTimesUp() const
00181 { return numberTimesUp_;}
00183 inline void setNumberTimesUp(int value)
00184 { numberTimesUp_=value;}
00186 inline void incrementNumberTimesUp()
00187 { numberTimesUp_++;}
00188
00190 inline int numberTimesDownInfeasible() const
00191 { return numberTimesDownInfeasible_;}
00193 inline void setNumberTimesDownInfeasible(int value)
00194 { numberTimesDownInfeasible_=value;}
00196 inline void incrementNumberTimesDownInfeasible()
00197 { numberTimesDownInfeasible_++;}
00198
00200 inline int numberTimesUpInfeasible() const
00201 { return numberTimesUpInfeasible_;}
00203 inline void setNumberTimesUpInfeasible(int value)
00204 { numberTimesUpInfeasible_=value;}
00206 inline void incrementNumberTimesUpInfeasible()
00207 { numberTimesUpInfeasible_++;}
00208
00210 inline int numberBeforeTrust() const
00211 { return numberBeforeTrust_;}
00213 inline void setNumberBeforeTrust(int value)
00214 { numberBeforeTrust_=value;}
00215
00217 virtual double upEstimate() const;
00219 virtual double downEstimate() const;
00220
00222 inline int method() const
00223 { return method_;}
00225 inline void setMethod(int value)
00226 { method_=value;}
00227
00229 void setDownInformation(double changeObjectiveDown, int changeInfeasibilityDown);
00231 void setUpInformation(double changeObjectiveUp, int changeInfeasibilityUp);
00233 void setProbingInformation(int fixedDown, int fixedUp);
00234
00236 void print(int type=0, double value=0.0) const;
00237 protected:
00239
00241 double downDynamicPseudoCost_;
00243 double upDynamicPseudoCost_;
00248 double upDownSeparator_;
00250 double sumDownCost_;
00252 double sumUpCost_;
00254 double sumDownChange_;
00256 double sumUpChange_;
00258 double sumDownCostSquared_;
00260 double sumUpCostSquared_;
00262 double sumDownDecrease_;
00264 double sumUpDecrease_;
00266 double lastDownCost_;
00268 double lastUpCost_;
00270 int lastDownDecrease_;
00272 int lastUpDecrease_;
00274 int numberTimesDown_;
00276 int numberTimesUp_;
00278 int numberTimesDownInfeasible_;
00280 int numberTimesUpInfeasible_;
00282 int numberBeforeTrust_;
00284 int numberTimesDownLocalFixed_;
00286 int numberTimesUpLocalFixed_;
00288 double numberTimesDownTotalFixed_;
00290 double numberTimesUpTotalFixed_;
00292 int numberTimesProbingTotal_;
00297 int method_;
00298 };
00299
00300
00311 class CbcDynamicPseudoCostBranchingObject : public CbcIntegerBranchingObject {
00312
00313 public:
00314
00316 CbcDynamicPseudoCostBranchingObject ();
00317
00325 CbcDynamicPseudoCostBranchingObject (CbcModel *model, int variable,
00326 int way , double value,
00327 CbcSimpleIntegerDynamicPseudoCost * object) ;
00328
00336 CbcDynamicPseudoCostBranchingObject (CbcModel *model, int variable, int way,
00337 double lowerValue, double upperValue) ;
00338
00340 CbcDynamicPseudoCostBranchingObject ( const CbcDynamicPseudoCostBranchingObject &);
00341
00343 CbcDynamicPseudoCostBranchingObject & operator= (const CbcDynamicPseudoCostBranchingObject& rhs);
00344
00346 virtual CbcBranchingObject * clone() const;
00347
00349 virtual ~CbcDynamicPseudoCostBranchingObject ();
00350
00351 using CbcBranchingObject::branch ;
00356 virtual double branch();
00357
00362 virtual int fillStrongInfo( CbcStrongInfo & info);
00363
00365 inline double changeInGuessed() const
00366 { return changeInGuessed_;}
00368 inline void setChangeInGuessed(double value)
00369 { changeInGuessed_=value;}
00371 inline CbcSimpleIntegerDynamicPseudoCost * object() const
00372 { return object_;}
00373 protected:
00375 double changeInGuessed_;
00377 CbcSimpleIntegerDynamicPseudoCost * object_;
00378
00379 };
00386 class CbcBranchDynamicDecision : public CbcBranchDecision {
00387 public:
00388
00389 CbcBranchDynamicDecision ();
00390
00391
00392 CbcBranchDynamicDecision ( const CbcBranchDynamicDecision &);
00393
00394 virtual ~CbcBranchDynamicDecision();
00395
00397 virtual CbcBranchDecision * clone() const;
00398
00400 virtual void initialize(CbcModel * model);
00401
00421 virtual int betterBranch(CbcBranchingObject * thisOne,
00422 CbcBranchingObject * bestSoFar,
00423 double changeUp, int numInfUp,
00424 double changeDn, int numInfDn);
00426 virtual void setBestCriterion(double value);
00427 virtual double getBestCriterion() const;
00430 virtual int whichMethod() {return 3;}
00431
00434 virtual void saveBranchingObject(OsiBranchingObject * object) ;
00437 virtual void updateInformation(OsiSolverInterface * solver,
00438 const CbcNode * node);
00439
00440
00441 private:
00442
00444 CbcBranchDynamicDecision & operator=(const CbcBranchDynamicDecision& rhs);
00445
00447
00449 double bestCriterion_;
00450
00452 double bestChangeUp_;
00453
00455 int bestNumberUp_;
00456
00458 double bestChangeDown_;
00459
00461 int bestNumberDown_;
00462
00464 CbcBranchingObject * bestObject_;
00465 };
00466 #endif