#include <SbbBranchActual.hpp>
Inheritance diagram for SbbBranchDefaultDecision:
Public Member Functions | |
SbbBranchDefaultDecision (const SbbBranchDefaultDecision &) | |
virtual SbbBranchDecision * | clone () const |
Clone. | |
virtual void | initialize (SbbModel *model) |
Initialize, e.g. before the start of branch selection at a node. | |
virtual int | betterBranch (SbbBranchingObject *thisOne, SbbBranchingObject *bestSoFar, double changeUp, int numInfUp, double changeDn, int numInfDn) |
Compare two branching objects. Return nonzero if thisOne is better than bestSoFar . | |
Private Member Functions | |
SbbBranchDefaultDecision & | operator= (const SbbBranchDefaultDecision &rhs) |
Illegal Assignment operator. | |
Private Attributes | |
double | bestCriterion_ |
data "best" so far | |
double | bestChangeUp_ |
Change up for best. | |
int | bestNumberUp_ |
Number of infeasibilities for up. | |
double | bestChangeDown_ |
Change down for best. | |
int | bestNumberDown_ |
Number of infeasibilities for down. | |
SbbBranchingObject * | bestObject_ |
Pointer to best branching object. |
This class implements a simple default algorithm (betterBranch()) for choosing a branching variable.
Definition at line 339 of file SbbBranchActual.hpp.
|
Compare two branching objects. Return nonzero if
The routine compares branches using the values supplied in
As the names imply, the assumption is that the values supplied for
Because an Implements SbbBranchDecision. Definition at line 966 of file SbbBranchActual.cpp. References bestChangeDown_, bestChangeUp_, bestCriterion_, bestNumberDown_, bestNumberUp_, bestObject_, SbbModel::getNumberHeuristicSolutions(), SbbModel::getSolutionCount(), and SbbBranchingObject::model().
00970 { 00971 bool beforeSolution = thisOne->model()->getSolutionCount()== 00972 thisOne->model()->getNumberHeuristicSolutions();; 00973 int betterWay=0; 00974 if (beforeSolution) { 00975 if (!bestObject_) { 00976 bestNumberUp_=INT_MAX; 00977 bestNumberDown_=INT_MAX; 00978 } 00979 // before solution - choose smallest number 00980 // could add in depth as well 00981 int bestNumber = min(bestNumberUp_,bestNumberDown_); 00982 if (numInfUp<numInfDn) { 00983 if (numInfUp<bestNumber) { 00984 betterWay = 1; 00985 } else if (numInfUp==bestNumber) { 00986 if (changeUp<bestCriterion_) 00987 betterWay=1; 00988 } 00989 } else if (numInfUp>numInfDn) { 00990 if (numInfDn<bestNumber) { 00991 betterWay = -1; 00992 } else if (numInfDn==bestNumber) { 00993 if (changeDn<bestCriterion_) 00994 betterWay=-1; 00995 } 00996 } else { 00997 // up and down have same number 00998 bool better=false; 00999 if (numInfUp<bestNumber) { 01000 better=true; 01001 } else if (numInfUp==bestNumber) { 01002 if (min(changeUp,changeDn)<bestCriterion_) 01003 better=true;; 01004 } 01005 if (better) { 01006 // see which way 01007 if (changeUp<=changeDn) 01008 betterWay=1; 01009 else 01010 betterWay=-1; 01011 } 01012 } 01013 } else { 01014 if (!bestObject_) { 01015 bestCriterion_=-1.0; 01016 } 01017 // got a solution 01018 if (changeUp<=changeDn) { 01019 if (changeUp>bestCriterion_) 01020 betterWay=1; 01021 } else { 01022 if (changeDn>bestCriterion_) 01023 betterWay=-1; 01024 } 01025 } 01026 if (betterWay) { 01027 bestCriterion_ = min(changeUp,changeDn); 01028 bestChangeUp_ = changeUp; 01029 bestNumberUp_ = numInfUp; 01030 bestChangeDown_ = changeDn; 01031 bestNumberDown_ = numInfDn; 01032 bestObject_=thisOne; 01033 } 01034 return betterWay; 01035 } |