simplex                 package:boot                 R Documentation

Simplex Method for Linear Programming Problems

Description:

     This function will optimize the linear function 'a%*%x' subject to
     the constraints 'A1%*%x <= b1', 'A2%*%x >= b2', 'A3%*%x = b3' and
     'x >= 0'.  Either maximization or minimization is possible but the
     default is minimization.

Usage:

     simplex(a, A1 = NULL, b1 = NULL, A2 = NULL, b2 = NULL, A3 = NULL,
             b3 = NULL, maxi = FALSE, n.iter = n + 2 * m, eps = 1e-10)

Arguments:

       a: A vector of length 'n' which gives the coefficients of the
          objective function. 

      A1: An 'm1' by 'n' matrix of coefficients for the "<=" type of
          constraints. 

      b1: A vector of length 'm1' giving the right hand side of the
          "<=" constraints. This argument is required if 'A1' is given
          and ignored otherwise.  All values in 'b1' must be
          non-negative. 

      A2: An 'm2' by 'n' matrix of coefficients for the ">=" type of
          constraints. 

      b2: A vector of length 'm2' giving the right hand side of the
          ">=" constraints. This argument is required if 'A2' is given
          and ignored otherwise.  All values in 'b2' must be
          non-negative. Note that the constraints 'x >= 0' are included
          automatically and so should not be repeated here. 

      A3: An 'm3' by 'n' matrix of coefficients for the equality
          constraints. 

      b3: A vector of length 'm3' giving the right hand side of
          equality constraints. This argument is required if 'A3' is
          given and ignored otherwise.  All values in 'b3' must be
          non-negative. 

    maxi: A logical flag which specifies minimization if 'FALSE'
          (default) and maximization otherwise.  If 'maxi' is 'TRUE'
          then the maximization problem is recast as a minimization
          problem by changing the objective function coefficients to
          their negatives. 

  n.iter: The maximum number of iterations to be conducted in each
          phase of the simplex method.  The default is
          'n+2*(m1+m2+m3)'. 

     eps: The floating point tolerance to be used in tests of equality. 

Details:

     The method employed by this function is the two phase tableau
     simplex method. If there are ">=" or equality constraints an
     initial feasible solution is not easy to find.  To find a feasible
     solution an artificial variable is introduced into each ">=" or
     equality constraint and an auxiliary objective function is defined
     as the sum of these artificial variables.  If a feasible solution
     to the set of constraints exists then the auxiliary objective will
     be minimized when all of the artificial variables are 0. These are
     then discarded and the original problem solved starting at the
     solution to the auxiliary problem.  If the only constraints are of
     the "<=" form, the origin is a feasible solution and so the first
     stage can be omitted.

Value:

     An object of class '"simplex"': see 'simplex.object'.

Note:

     The method employed here is suitable only for relatively small
     systems.  Also if possible the number of constraints should be
     reduced to a minimum in order to speed up the execution time which
     is approximately proportional to the cube of the number of
     constraints. In particular if there are any constraints of the
     form 'x[i] >= b2[i]' they should be omitted by setting 'x[i] =
     x[i]-b2[i]', changing all the constraints and the objective
     function accordingly and then transforming back after the solution
     has been found.

References:

     Gill, P.E., Murray, W. and Wright, M.H. (1991) _Numerical Linear
     Algebra and Optimization Vol. 1_. Addison-Wesley.

     Press, W.H., Teukolsky, S.A., Vetterling, W.T. and Flannery, B.P.
     (1992) _Numerical Recipes: The Art of Scientific Computing (Second
     Edition)_. Cambridge University Press.

Examples:

     #  This example is taken from Exercise 7.5 of Gill, Murray,
     #  and Wright (1991).
     enj <- c(200, 6000, 3000, -200)
     fat <- c(800, 6000, 1000, 400)
     vitx <- c(50, 3, 150, 100)
     vity <- c(10, 10, 75, 100)
     vitz <- c(150, 35, 75, 5)
     simplex(a = enj, A1 = fat, b1 = 13800, A2 = rbind(vitx, vity, vitz),
             b2 = c(600, 300, 550), maxi = TRUE)

