00001
00002
00003 #ifndef SbbBranchActual_H
00004 #define SbbBranchActual_H
00005
00006 #include "SbbBranchBase.hpp"
00007
00008
00010
00011
00012 class SbbClique : public SbbObject {
00013
00014 public:
00015
00016
00017 SbbClique ();
00018
00019
00020
00021 SbbClique (SbbModel * model, int cliqueType, int numberMembers,
00022 const int * which, const char * type,
00023 int identifier,int slack=-1);
00024
00025
00026 SbbClique ( const SbbClique &);
00027
00029 virtual SbbObject * clone() const;
00030
00031
00032 SbbClique & operator=( const SbbClique& rhs);
00033
00034
00035 ~SbbClique ();
00036
00038 virtual double infeasibility(int & preferredWay, double & otherWay) const;
00039
00041 virtual void feasibleRegion();
00043 virtual SbbBranchingObject * createBranch(int way) const;
00045 inline int numberMembers() const
00046 {return numberMembers_;};
00047
00049 inline int numberNonSOSMembers() const
00050 {return numberNonSOSMembers_;};
00051
00053 inline const int * members() const
00054 {return members_;};
00055
00058 inline const char type(int index) const
00059 {if (type_) return type_[index]; else return 1;};
00060
00062 inline int cliqueType() const
00063 {return cliqueType_;};
00064
00065 private:
00068 int numberMembers_;
00069
00071 int numberNonSOSMembers_;
00072
00074 int * members_;
00075
00077 char * type_;
00078
00080 int cliqueType_;
00081
00083 int slack_;
00084 };
00085
00087
00088
00089 class SbbSimpleInteger : public SbbObject {
00090
00091 public:
00092
00093
00094 SbbSimpleInteger ();
00095
00096
00097 SbbSimpleInteger (SbbModel * model, int sequence, int iColumn);
00098
00099
00100 SbbSimpleInteger ( const SbbSimpleInteger &);
00101
00103 virtual SbbObject * clone() const;
00104
00105
00106 SbbSimpleInteger & operator=( const SbbSimpleInteger& rhs);
00107
00108
00109 ~SbbSimpleInteger ();
00110
00112 virtual double infeasibility(int & preferredWay, double & otherWay) const;
00113
00121 virtual void feasibleRegion();
00122
00124 virtual SbbBranchingObject * createBranch(int way) const;
00125
00139 virtual SbbBranchingObject * preferredNewFeasible() const;
00140
00148 virtual SbbBranchingObject * notPreferredNewFeasible() const ;
00149
00155 virtual void resetBounds();
00156
00158 inline int sequence() const
00159 {return sequence_;};
00160
00162 inline int modelSequence() const
00163 {return columnNumber_;};
00164
00166 inline double originalLowerBound() const
00167 { return originalLower_;};
00168 inline double originalUpperBound() const
00169 { return originalUpper_;};
00170
00171
00172 private:
00174
00176 int sequence_;
00178 int columnNumber_;
00180 double originalLower_;
00182 double originalUpper_;
00183 };
00184
00185
00196 class SbbIntegerBranchingObject : public SbbBranchingObject {
00197
00198 public:
00199
00201 SbbIntegerBranchingObject ();
00202
00210 SbbIntegerBranchingObject (SbbModel *model, int variable,
00211 int way , double value) ;
00212
00220 SbbIntegerBranchingObject (SbbModel *model, int variable, int way,
00221 double lowerValue, double upperValue) ;
00222
00224 SbbIntegerBranchingObject ( const SbbIntegerBranchingObject &);
00225
00227 SbbIntegerBranchingObject & operator= (const SbbIntegerBranchingObject& rhs);
00228
00230 virtual SbbBranchingObject * clone() const;
00231
00233 virtual ~SbbIntegerBranchingObject ();
00234
00238 virtual void branch();
00239
00240 private:
00242 double down_[2];
00244 double up_[2];
00245 };
00246
00247
00256 class SbbCliqueBranchingObject : public SbbBranchingObject {
00257
00258 public:
00259
00260
00261 SbbCliqueBranchingObject ();
00262
00263
00264 SbbCliqueBranchingObject (SbbModel * model, const SbbClique * clique,
00265 int way,
00266 int numberOnDownSide, const int * down,
00267 int numberOnUpSide, const int * up);
00268
00269
00270 SbbCliqueBranchingObject ( const SbbCliqueBranchingObject &);
00271
00272
00273 SbbCliqueBranchingObject & operator=( const SbbCliqueBranchingObject& rhs);
00274
00276 virtual SbbBranchingObject * clone() const;
00277
00278
00279 virtual ~SbbCliqueBranchingObject ();
00280
00282 virtual void branch();
00283 private:
00285 const SbbClique * clique_;
00287 unsigned int downMask_[2];
00289 unsigned int upMask_[2];
00290 };
00291
00292
00297 class SbbLongCliqueBranchingObject : public SbbBranchingObject {
00298
00299 public:
00300
00301
00302 SbbLongCliqueBranchingObject ();
00303
00304
00305 SbbLongCliqueBranchingObject (SbbModel * model, const SbbClique * clique,
00306 int way,
00307 int numberOnDownSide, const int * down,
00308 int numberOnUpSide, const int * up);
00309
00310
00311 SbbLongCliqueBranchingObject ( const SbbLongCliqueBranchingObject &);
00312
00313
00314 SbbLongCliqueBranchingObject & operator=( const SbbLongCliqueBranchingObject& rhs);
00315
00317 virtual SbbBranchingObject * clone() const;
00318
00319
00320 virtual ~SbbLongCliqueBranchingObject ();
00321
00323 virtual void branch();
00324 private:
00326 const SbbClique * clique_;
00328 unsigned int * downMask_;
00330 unsigned int * upMask_;
00331 };
00332
00339 class SbbBranchDefaultDecision : public SbbBranchDecision {
00340 public:
00341
00342 SbbBranchDefaultDecision ();
00343
00344
00345 SbbBranchDefaultDecision ( const SbbBranchDefaultDecision &);
00346
00347 virtual ~SbbBranchDefaultDecision();
00348
00350 virtual SbbBranchDecision * clone() const;
00351
00353 virtual void initialize(SbbModel * model);
00354
00374 virtual int betterBranch(SbbBranchingObject * thisOne,
00375 SbbBranchingObject * bestSoFar,
00376 double changeUp, int numInfUp,
00377 double changeDn, int numInfDn);
00378
00379 private:
00380
00382 SbbBranchDefaultDecision & operator=(const SbbBranchDefaultDecision& rhs);
00383
00385
00387 double bestCriterion_;
00388
00390 double bestChangeUp_;
00391
00393 int bestNumberUp_;
00394
00396 double bestChangeDown_;
00397
00399 int bestNumberDown_;
00400
00402 SbbBranchingObject * bestObject_;
00403
00404 };
00405
00406 #endif