
min_max(+Goal, ?Template, ?Solution, ?C, +Lower, +Upper, +Percent, +Timeout)

   Find the solution of Goal that minimizes the maximum of elements of C,
within the bounds set by Lower,Upper and Percent in time not longer than
Timeout.



Arguments
   +Goal               A callable term.
   ?Template           A term containing all or some of Goal's variables
   ?Solution           Term to be unified with the minimized Template
   ?C                  A linear term or a list of linear terms.
   +Lower              An integer.
   +Upper              An integer.
   +Percent            An integer.
   +Timeout            A number.

Type
   library(fd)

Description
   This is the most general version of the min_max predicate with all
   options.


   If C is a linear term, a solution of the goal Goal is found that
   minimizes the value of C. If C is a list of linear terms, the returned
   solution minimizes the maximum value of terms in the list.  The solution
   is found using the branch and bound method; as soon as a partial
   solution is found that is worse than a previous solution, the search is
   abandoned and a new solution is searched for.  The starting assumption
   is that the value to minimize is less than Upper and that any value less
   than Lower can be considered as a final solution.  Moreover, solutions
   whose minimized values are closer than Percent % are considered equal.
   Every time a new better solution is found, the event 280 is raised, its
   default handler prints the current cost.


   Solutions will be unified with a copy of Template where the variables
   are replaced with their minimized values. Typically, the Template will
   contain all or a subset of Goal's variables.


   If Timeout is not zero, the predicate will stop after Timeout seconds
   and report the best solution it has found so far.  Calls with specified
   Timeout cannot be nested.


   All other variants of min_max can be written in terms of min_max/9, eg.



	min_max(Goal, Cost) :-
	    minint(Min), maxint(Max),
	    min_max(Goal, Goal, Goal, Cost, Min, Max, 0, 0).



Modules
   This predicate is sensitive to its module context (tool predicate, see @/2).

Fail Conditions
      Fails if there is no solution to Goal.



Resatisfiable
      No.

Examples
   
    % Find the minimal C and bind X to the corresponding value
    [eclipse]: X::1..3, C #= 3-X, min_max(indomain(X), X, X, C).
    Found a solution with cost 2
    Found a solution with cost 1
    Found a solution with cost 0
    X = 3
    C = 0
    yes.

    % Find the minimal C and don't bind anything
    [eclipse]: X::1..3, C #= 3-X, min_max(indomain(X), [], [], C).
    Found a solution with cost 2
    Found a solution with cost 1
    Found a solution with cost 0
    X = X{[1..3]}
    C = C{[0..2]}

    Delayed goals:
	    -3 + X{[1..3]} + C{[0..2]}#=0
    yes.

    % Find the minimal C and return it in MinC. Don't bind X or C.
    [eclipse]: X::1..3, C #= 3-X, min_max(indomain(X), C, MinC, C).
    Found a solution with cost 2
    Found a solution with cost 1
    Found a solution with cost 0
    X = X{[1..3]}
    MinC = 0
    C = C{[0..2]}

    Delayed goals:
	    -3 + X{[1..3]} + C{[0..2]}#=0
    yes.






See Also
   min_max / 2, min_max / 4, min_max / 5, min_max / 6, minimize / 2, minimize / 4, minimize / 5, minimize / 6, minimize / 8
