wnsplx(3)

NAME

wn_simplex_method, wn_simplex_loop - simplex method pack
age

SYNOPSIS

#include <wn/wnmat.h>
wn_simplex_method(&code,     &objective,    shadow_prices,
solution,
objective_vect, mat, right_side, len_i, len_j)
int code;
double objective;
double *shadow_prices, *solution, *objective_vect;
double **mat;
double *right_side;
int len_i, len_j;
wn_simplex_loop(&code,          mat,           right_side,
right_side_control,
non_zero_vars, zero_vars, len_i, len_j)
int code;
double **mat;
double *right_side, *right_side_control;
int *non_zero_vars, *zero_vars;
int len_i, len_j;

DESCRIPTION

This package solves the "linear programming" problem easi
ly and efficiently. The "linear programming" problem is the fol
lowing optimization problem:
CHOOSE solution[j] TO MAXIMIZE
sum_over(j){ objective_vect[j]*solution[j] }
WHILE SATISFYING THE CONSTRAINTS
for_all(i){ sum_over(j){mat[i][j]*solution[j]} ==
right_side[i] }
AND
for_all(j){ solution[j] >= 0 }
Difficult optimization problems from many fields can be
put into this form, and thus solved efficiently with this pack
age.
Set objective to NULL if you want any feasible solution;
set shadow_prices to NULL if you don't care about shadow prices.
For an introduction to the linear programming problem,
consult [1] and [2]. The basis of the algorithm used here is the
"revised simplex method" given in [3]. However, the algorithm
used has these improvements:
1) It is randomized to avoid various degeneracy problems.
2) The pivot element is selected for numerical stability
3) A perturbed right side is provided as an anti-cycling
measure.
Naive users should confine themselves to
wn_simplex_method.
wn_simplex_loop makes available to sophisticated users the
(improved) simplex loop given in [3] in raw form. The 0'th row
is the objective row. right_side[0] contains minus the objective
after completion of the algorithm. right_side_control should be
an array with len_i entries, initialized to the values in
right_side plus a small random perturbation. The perturbation is
necessary to prevent cycling. wn_simplex_loop uses
right_side_control to control the basis; right_side is carried
along with it to give the exact answer.

RESOURCES

Solving the simplex problem using wn_simplex_method re
quires
AVERAGE CASE:
time = len_i^2 * len_j
stack memory = 1
dynamic memory = len_i*len_j
Randomizing is used to avoid exponential worst-case per
formance.
wn_simplex_loop requires
AVERAGE CASE:
time = len_i * len_j
stack memory = 1
dynamic memory = 0
for each iteration. Usually no more than order len_i it
erations are required for an optimal solution.

DIAGNOSTICS

code == WN_SUCCESS for successful solution. code == WN_UNBOUNDED for unbounded solution. code == WN_INFEASIBLE if no solution satisfies the con
straints.
WN_INFEASIBLE also given if mat is degenerate, even if so
lutions are feasible.

SEE ALSO

wnminv, wnanl, wnnlp

REFERENCES

[1] F. Hillier and G. Lieberman: Introduction to Opera
tions Research. Holden-Day Inc.
[2] J. Franklin: Methods of Mathematical Economics.
Springer-Verlag.
[3] G. B. Dantzig, A. Orden, and P. Wolfe: Generalized
Simplex Method for Minimizing a Linear Form under Linear Inequal
ity Restraints, Pacific J. Math. Vol. 5 (1955) pp. 183-195.

AUTHOR

Will Naylor
WNLIB August 23, 1998
Copyright © 2010-2025 Platon Technologies, s.r.o.           Home | Man pages | tLDP | Documents | Utilities | About
Design by styleshout