CNLMath : Optimization : lin_prog
lin_prog
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.
Synopsis
#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.
Required Arguments
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.
Return Value
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.
Synopsis with Optional Arguments
#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)
Optional Arguments
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.
Description
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).
Examples
Example 1
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);
}
Output
 
X
1 2 3 4 5 6
0.5 1.0 0.0 1.0 0.5 0.0
Example 2
The linear programming problem in the previous example can be formulated as follows:
This problem can be solved more efficiently.
 
#include <imsl.h>
#include <stdio.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);
}
Output
 
X
1 2
0.5 1.0
 
D
-1
 
obj = -3.5
Warning Errors
IMSL_PROB_UNBOUNDED
The problem is unbounded.
IMSL_TOO_MANY_ITN
Maximum number of iterations exceeded.
IMSL_PROB_INFEASIBLE
The problem is infeasible.
Fatal Errors
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.