Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

SbbBranchDefaultDecision Class Reference

#include <SbbBranchActual.hpp>

Inheritance diagram for SbbBranchDefaultDecision:

SbbBranchDecision List of all members.

Public Member Functions

 SbbBranchDefaultDecision (const SbbBranchDefaultDecision &)
virtual SbbBranchDecisionclone () 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

SbbBranchDefaultDecisionoperator= (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.

SbbBranchingObjectbestObject_
 Pointer to best branching object.


Detailed Description

Branching decision default class

This class implements a simple default algorithm (betterBranch()) for choosing a branching variable.

Definition at line 339 of file SbbBranchActual.hpp.


Member Function Documentation

int SbbBranchDefaultDecision::betterBranch SbbBranchingObject thisOne,
SbbBranchingObject bestSoFar,
double  changeUp,
int  numInfUp,
double  changeDn,
int  numInfDn
[virtual]
 

Compare two branching objects. Return nonzero if thisOne is better than bestSoFar.

The routine compares branches using the values supplied in numInfUp and numInfDn until a solution is found by search, after which it uses the values supplied in changeUp and changeDn. The best branching object seen so far and the associated parameter values are remembered in the SbbBranchDefaultDecision object. The nonzero return value is +1 if the up branch is preferred, -1 if the down branch is preferred.

As the names imply, the assumption is that the values supplied for numInfUp and numInfDn will be the number of infeasibilities reported by the branching object, and changeUp and changeDn will be the estimated change in objective. Other measures can be used if desired.

Because an SbbBranchDefaultDecision object remembers the current best branching candidate (bestObject_) as well as the values used in the comparison, the parameter bestSoFar is redundant, hence unused.

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 }


The documentation for this class was generated from the following files:
Generated on Wed Dec 3 14:36:22 2003 for Sbb by doxygen 1.3.5