|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Object | +--ilog.cplex.IloCplex.SearchLimit
This class allows you to limit the branch-and-cut search
within certain subtrees. For example, you may consider doing so in order
to limit the number of branches or nodes to use when
exploring a certain decision. Such search limits can be implemented in
the context of IloCplex goals by means of
IloCplex.SearchLimit objects.
To create your own search limit, you must subclass
IloCplex.SearchLimit and implement the method
check. You may optionally implement the method
init.
Also, if the default implementation of method clone is not
adequate and the goal is to be used for parallel optimization,
this method needs also be implemented by the user. Recall that the
default clone method performs a shallow copy, so
typically a user implementation would perform a deep copy for
objects that should be local to threads or use the
synchronize keyword where synchronization is required.
Prior to calling the methods check or init,
IloCplex initializes the search limit object as the node
for which to determine whether a search limit
has been encountered. This node is referred to as the current node.
The method check must be implemented in such a way that it
returns true if the limit has been reached and
false otherwise. Information about the current node can
be queried through the protected API of the class
IloCplex.SearchLimit.
Before the method check is called for the first time, the
virtual method init is called at that node. This method is
called only once and allows you to initialize the search limit. As for
the method check, information about the current node can
be queried through the protected API of class
IloCplex.SearchLimit.
The method IloCplex.limitSearch is used to create a goal
that imposes a limit on a search controlled by a goal, as shown in this
example:
IloCplex.Goal limitGoal = cplex.limitSearch(goal1, limit);
In this example limit is of type
IloCplex.SearchLimit and goal1 is of type
IloCplex.Goal.
The method IloCplex.limitSearch
creates and returns a new goal that performs branch-and-cut search as
specified by goal1 until the limit specified by
limit is reached. In doing so, the search limit defined by
limit is active only for the search subtree generated by
goal1. For example, if you created two branches with the goal
cplex.or(limitGoal, goal2);
only the subtree defined by goal1 is subjected to the
search limit limit, while the subtree defined by
goal2 is not.
The possibility of specifying search limits for subtrees leads to the
possible situation where certain branches are subject to more than one
search limit. Nodes with multiple search limits attached to them are
processed only if none of the search limits has been reached, or, in other
words, if all the search limits return false when the
check method is called by IloCplex.
The fact that search limits are tied to goals implies that as soon as
the goal stack becomes empty and IloCplex proceeds with
built-in search strategies, the search limit is deactivated. In order to
impose a search limit while using a built-in IloCplex
branch strategy, a goal such as the following one can be used.
class DefaultSearchGoal extends IloCplex.Goal {
public IloCplex.Goal execute(IloCplex cplex) throws IloException {
if (!isIntegerFeasible())
return cplex.and(cplex.branchAsCplex(), this);
return null;
}
}
| Constructor Summary | |
IloCplex.SearchLimit()
Creates a new search limit. |
|
| Method Summary | |
abstract boolean |
check()
This method must be implemented by the user. |
int |
getDepth()
Returns the depth of the current node in the search tree. |
int |
getLeftDepth()
Returns the left depth of the current node in the search tree. |
int |
getRightDepth()
Returns the right depth of the current node in the search tree. |
void |
init()
When a goal created with the method IloCplex.limitSearch is
executed, IloCplex calls this method after initializing
the invoked search limit to the current node. |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Constructor Detail |
public IloCplex.SearchLimit()
| Method Detail |
public abstract boolean check()
true. If so, the unexplored subtree of the current node
as well as the node itself will simply be discarded.
IloCplex initializes the search limit object to the node
to be evaluated before calling method check. Information
about this node can be queried through the protected API of class
IloCplex.SearchLimit.
public void init()
IloCplex.limitSearch is
executed, IloCplex calls this method after initializing
the invoked search limit to the current node. By overriding this
method, users can initialize the search limit object.
The method init is called only once for a limit. This
convention
makes it generally not possible to use one limit object in two
subtrees, because init would be called only in one
subtree and thus the limit would not be correctly initialized for
the other subtree. Use two separate instances of your limit
instead to overcome this convention.
public final int getDepth()
init and check.
public final int getLeftDepth()
0 (zero); the left depth of other
nodes is the number of times that the first goal in a call to
IloCplex.or has been taken when branching down from the
root to the current node.
When IloCplex.or is called with more than two parameters,
this is translated into a sequence of or goals with two children each.
For example, IloCplex.or(goal1, goal2, goal3); is
internally translated into IloCplex.or(goal1, IloCplex.or(goal2,
goal3)); to form a binary tree. This transformation is accounted
for when defining the left depth of a node.
This method can be called only from the methods
init and check.
public final int getRightDepth()
0 (zero); the right depth of other
nodes is the number of times that the second goal in a call to
IloCplex.or has been taken when branching down from the
root to the current node.
When IloCplex.or is called with more than two parameters,
this is translated into a sequence of or goals with two children each.
For example, IloCplex.or(goal1, goal2, goal3); is
internally translated into IloCplex.or(goal1, IloCplex.or(goal2,
goal3)); to form a binary tree. This transformation is accounted
for when defining the right depth of a node.
This method can be called only from the methods
init and check.
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||