Solves a linear programming problem using the revised simplex algorithm.
NOTE: For double precision, the function lin_prog has generally been superseded by the function linear_programming. Function lin_prog remains in place to ensure compatibility of existing calls.
#include <imsl.h>
float *imsl_f_lin_prog (int m, int n, float a[], float b[], float c[], …, 0)
The type double function is imsl_d_lin_prog.
int m
(Input)
Number of constraints.
int n
(Input)
Number of variables.
float a[]
(Input)
Array of size m × n containing a matrix with
coefficients of the m constraints.
float b[]
(Input)
Array with m components
containing the right-hand side of the constraints; if there are limits on both
sides of the constraints, then b contains the lower
limit of the constraints.
float c[]
(Input)
Array with n components
containing the coefficients of the objective function.
A pointer to the solution x of the linear programming problem. To release this space, use imsl_free. If no solution can be computed, then NULL is returned.
#include <imsl.h>
float *imsl_f_lin_prog (int m, int n, float a[], float b[], float c[],
IMSL_A_COL_DIM, int a_col_dim,
IMSL_UPPER_LIMIT, float bu[],
IMSL_CONSTR_TYPE, int irtype[],
IMSL_LOWER_BOUND, float xlb[],
IMSL_UPPER_BOUND, float xub[],
IMSL_MAX_ITN, int max_itn,
IMSL_OBJ, float *obj,
IMSL_RETURN_USER, float x[],
IMSL_DUAL, float **y,
IMSL_DUAL_USER, float y[],
0)
IMSL_A_COL_DIM, int a_col_dim
(Input)
The column dimension of a.
Default: a_col_dim = n
IMSL_UPPER_LIMIT, float bu[]
(Input)
Array with m components
containing the upper limit of the constraints that have both the lower and the
upper bounds. If no such constraint exists, then bu is not needed.
IMSL_CONSTR_TYPE, int irtype[]
(Input)
Array with m components
indicating the types of general constraints in the matrix a. Let ri = ai1x1 + … + ainxn. Then, the value
of irtype(i) signifies the
following:
|
irtype(i) |
Constraint |
|
0 |
ri = bi |
|
1 |
ri ≤ bui |
|
2 |
ri ≥ bi |
|
3 |
bi ≤ ri ≤ bui |
Default: irtype = 0
IMSL_LOWER_BOUND, float xlb[]
(Input)
Array with n components
containing the lower bound on the variables. If there is no lower bound on a
variable, then 1030 should be set as the lower
bound.
Default: xlb = 0
IMSL_UPPER_BOUND, float xub[]
(Input)
Array with n components
containing the upper bound on the variables. If there is no upper bound on a
variable, then −1030 should be
set as the upper bound.
Default: xub = ∞
IMSL_MAX_ITN, int max_itn
(Input)
Maximum number of iterations.
Default: max_itn = 10000
IMSL_OBJ, float *obj
(Output)
Optimal value of the objective function.
IMSL_RETURN_USER, float x[]
(Output)
Array with n components
containing the primal solution.
IMSL_DUAL,
float **y
(Output)
The address of a pointer y to an array with
m components
containing the dual solution. On return, the necessary space is allocated by
imsl_f_lin_prog.
Typically, float *y is declared, and
&y is used
as an argument.
IMSL_DUAL_USER, float y[]
(Output)
A user-allocated array of size m. On return, y contains the dual
solution.
IMSL_USE_UPDATED_LP_ALGORITHM
(Input)
Calls the function imsl_d_linear_programming
to solve the problem. If this optional argument is present, then the
optional argument IMSL_MAX_ITN is
ignored. This optional argument is only valid in double precision.
The function imsl_f_lin_prog uses a revised simplex method to solve linear programming problems, i.e., problems of the form

where c is the objective coefficient vector, A is the coefficient matrix, and the vectors bl, bu, xl, and xu are the lower and upper bounds on the constraints and the variables, respectively.
For a complete description of the revised simplex method, see Murtagh (1981) or Murty (1983).
The linear programming problem in the standard form

is solved.
#include <imsl.h>
int main()
{
int m = 4;
int n = 6;
float a[ ] = {1.0, 1.0, 1.0, 0.0, 0.0, 0.0,
1.0, 1.0, 0.0, -1.0, 0.0, 0.0,
1.0, 0.0, 0.0, 0.0, 1.0, 0.0,
0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
float b[ ] = {1.5, 0.5, 1.0, 1.0};
float c[ ] = {-1.0, -3.0, 0.0, 0.0, 0.0, 0.0};
float *x;
/* Solve the LP problem */
x = imsl_f_lin_prog (m, n, a, b, c, 0);
/* Print x */
imsl_f_write_matrix ("x", 1, 6, x, 0);
}
X
1 2 3 4 5 6
0.5 1.0 0.0 1.0 0.5 0.0
The linear programming problem in the previous example can be formulated as follows:

This problem can be solved more efficiently.
#include <imsl.h>
int main()
{
int irtype[ ] = {3};
int m = 1;
int n = 2;
float xub[ ] = {1.0, 1.0};
float a[ ] = {1.0, 1.0};
float b[ ] = {0.5};
float bu[ ] = {1.5};
float c[ ] = {-1.0, -3.0};
float d[1];
float obj, *x;
/* Solve the LP problem */
x = imsl_f_lin_prog (m, n, a, b, c,
IMSL_UPPER_LIMIT, bu,
IMSL_CONSTR_TYPE, irtype,
IMSL_UPPER_BOUND, xub,
IMSL_DUAL_USER, d,
IMSL_OBJ, &obj,
0);
/* Print x */
imsl_f_write_matrix ("x", 1, 2, x, 0);
/* Print d */
imsl_f_write_matrix ("d", 1, 1, d, 0);
printf("\n obj = %g \n", obj);
}
X
1 2
0.5 1.0
D
-1
obj = -3.5
IMSL_PROB_UNBOUNDED The problem is unbounded.
IMSL_TOO_MANY_ITN Maximum number of iterations exceeded.
IMSL_PROB_INFEASIBLE The problem is infeasible.
IMSL_NUMERIC_DIFFICULTY Numerical difficulty occurred (moved to a vertex that is poorly conditioned). If float is currently being used, using double precision may help.
IMSL_BOUNDS_INCONSISTENT The bounds are inconsistent.