<TITLE> Linear Programming FAQ </TITLE>
<body bgcolor="#ffffff">
<IMG ALT=" " SRC="_gifs/colorbar.gif">
<P>

<IMG ALT=" " ALIGN=left HSPACE=20 SRC="_gifs/cutcube.gif">
<H2> Linear Programming<br>
     Frequently Asked Questions </H2> 
<a href=http://www.ece.nwu.edu/OTC/>Optimization Technology
Center</a> of<br> Northwestern University and Argonne National Laboratory
<BR clear=all>
<IMG ALT=" " VSPACE=20 SRC="_gifs/colorbar.gif"><br>


<STRONG> Posted at&nbsp; </STRONG><tt>
http://www-unix.mcs.anl.gov/otc/Guide/faq/linear-programming-faq.html
</tt><BR>

<STRONG> Changes posted to Usenet newsgroup <A
HREF="news:sci.op-research">sci.op-research</A></STRONG><P>

<!-- <STRONG>Archived version:</STRONG>
<I><A HREF="ftp://rtfm.mit.edu/pub/usenet/sci.answers/linear-programming-faq">
ftp://rtfm.mit.edu/pub/usenet/sci.answers/nonlinear-programming-faq</A></I>
-->

<STRONG>
Date of this version: June 1, 2001
</STRONG>
<P>

<!---
<BR>
"You never know what is enough until you know what is more than 
enough".  -- Blake
--->

<UL>
<LI>
   Q1.  "<A HREF="#Q1">What is Linear Programming</A>?"
<LI>
   Q2.  "<A HREF="#Q2">Where is there good software</A> to solve LP problems?"
<UL>
<LI>
<A HREF="#free">"Free" codes</A>
<LI>
<A HREF="#commercial">Commercial codes and modeling systems</A>
<LI>
<A HREF="#freedemos">Free demos of commercial codes</A>
</UL>
<LI>
   Q3.  "Oh, and we also want to solve it as an <A HREF="#Q3">integer program</A>."
<LI>
   Q4.  "I wrote an optimization code.  Where are some <A HREF="#Q4">test models</A>?"
<LI>
   Q5.  "What is <A HREF="#Q5">MPS format</A>?"
<LI>
   Q6.  <A HREF="#Q6">Topics briefly covered:</A>
<UL>
<LI>
<A HREF="#Q6.1">Q6.1</A>:
"What is a modeling language?"
<LI>
<A HREF="#Q6.2">Q6.2</A>:
"How do I diagnose an infeasible LP model?"
<LI>
<A HREF="#Q6.3">Q6.3</A>:
"I want to know the specific constraints that contradict each other."
<LI>
<A HREF="#Q6.4">Q6.4</A>:
"I just want to know whether or not a feasible solution <i>exists</i>."
<LI>
<A HREF="#Q6.5">Q6.5</A>:
"I have an LP, except it's got several objective functions."
<LI>
<A HREF="#Q6.6">Q6.6</A>:
"I have an LP that has large almost-independent matrix blocks that
are linked by a few constraints.  Can I take advantage of this?"
<LI>
<A HREF="#Q6.7">Q6.7</A>:
"I am looking for an algorithm to compute the convex hull of a
finite number of points in n-dimensional space."
<LI>
<A HREF="#Q6.8">Q6.8</A>:
"Are there any parallel LP codes?"
<LI>
<A HREF="#Q6.9">Q6.9</A>:
"What software is there for Network models?"
<LI>
<A HREF="#Q6.10">Q6.10</A>:
"What software is there for the Traveling Salesman Problem (TSP)?"
<LI>
<A HREF="#Q6.11">Q6.11</A>:
"What software is there for cutting or packing problems?"
<LI>
<A HREF="#Q6.12">Q6.12</A>:
"What software is there for Stochastic Programming?"
<LI>
<A HREF="#Q6.13">Q6.13</A>:
"I need to do post-optimal analysis."
<LI>
<A HREF="#Q6.14">Q6.14</A>:
"Do LP codes require a starting vertex?"
<LI>
<A HREF="#Q6.15">Q6.15</A>:
"How can I combat cycling in the Simplex algorithm?"
</UL>
<LI>
   Q7.  "What <A HREF="#Q7">references</A> are there in this field?"
<UL>
<li><a href=#general_reference>General reference</a>
<li><a href=#textbooks>Textbooks</a>
<li><a href=#modeling_systems>Presentations of LP modeling systems</a>
<li><a href=#books_with_source>Books containing source code</a>
<li><a href=#additional>Additional books</a>
<li><a href=#periodicals>Periodicals</a>
<li><a href=#articles>Articles of interest</a>
</UL>
<LI>
  Q8.  "What's available <A HREF="#Q8">online</A> in this field?"
<UL>
<li><a href=#online_services>Online sources of optimization services</a>
<li><a href=#online_software>Online sources of optimization software</a>
<li><a href=#online_information>Online sources of optimization information</a>
</UL>
<LI>
   Q9.  "<A HREF="#Q9">Who maintains this FAQ list</A>?"
</UL>

<b><i>See also</i> the following pages<br>
pertaining to mathematical programming and optimization modeling:</b>
<ul>
<li>The related <A HREF="nonlinear-programming-faq.html">Nonlinear Programming
FAQ</A>.
<li>Harvey Greenberg's <a
href="http://www.cudenver.edu/~hgreenbe/glossary/glossary.html">Mathematical Programming Glossary</a>.
<li>The <a href=http://www.optimization-online.org>Optimization Online</a> repository of reports and papers.
<li>The <a href=http://www.e-optimization.com/>e-Optimization.com</a>munity
website.<P>

<li>The <A
HREF="http://www.mcs.anl.gov/otc/Guide/">NEOS Guide</A> to optimization
models and software.
<li>The <A href="http://plato.la.asu.edu/guide.html">Decision Tree for
Optimization Software</a> by H.D. Mittelmann and P. Spellucci.
<li><a href="http://www.ampl.com/cm/cs/what/ampl/buyers1.html">Software for Optimization: A Buyer's Guide</a> by Robert Fourer.
<li>The <i>OR/MS Today</i> <a
href="http://lionhrtpub.com/orms/surveys/LP/LP-survey.html">1999 Linear
Programming Software Survey</a>.
<li>Hans Mittelmann's <a
href="http://plato.la.asu.edu/bench.html">Benchmarks for Optimization
Software</a>.
<li>The <i>Computational Optimization and Applications</i> <a href=http://www.math.ufl.edu/~coap>Software Forum</a>
</ul>

<b><i>. . . and don't forget the Web search engines!</i></b>  Services
such as <a href=http://www.google.com>google</a>, <a
href=http://infoseek.go.com>go/infoseek</a>, <a
href=http://www.lycos.com>lycos</a>, <a
href=http://www.excite.com>excite</a>, and <a
href=http://www.altavista.com>altavista</a> can be surprisingly helpful
in finding pages on particular problem types or application areas.


<P>
<H3> <A NAME="Q1">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q1.  "What is Linear Programming?"
</H3>

<P>
<B>A:</B>  (For rigorous definitions and theory, which are beyond the scope of
this document, the interested reader is referred to the many LP
textbooks in print, a few of which are listed in
the <A HREF="#textbooks">references</A> section.)

<P>
A <i>Linear Program</i> (LP) is a problem that can be expressed as
follows (the so-called Standard Form):

<PRE>
    minimize   cx
    subject to Ax  = b
                x >= 0
</PRE>

where x is the vector of variables to be solved for, A is a matrix of
known coefficients, and c and b are vectors of known coefficients.  The
expression "cx" is called the objective function, and the equations
"Ax=b" are called the constraints.  All these entities must have
consistent dimensions, of course, and you can add "transpose" symbols
to taste.  The matrix A is generally not square, hence you don't solve
an LP by just inverting A.  Usually A has more columns than rows, and
Ax=b  is therefore quite likely to be under-determined, leaving great
latitude in the choice of x with which to minimize cx.

<P>
The word "Programming" is used here in the sense of "planning"; the
necessary relationship to computer programming was incidental to the
choice of name.  Hence the phrase "LP program" to refer to a piece of
software is not a redundancy, although I tend to use the term "code"
instead of "program" to avoid the possible ambiguity.

<P>
Although all linear programs <i>can</i> be put into the Standard Form,
in practice it may not be necessary to do so.  For example, although
the Standard Form requires all variables to be non-negative, most good
LP software allows general bounds l <= x <= u, where l and u are
vectors of known lower and upper bounds.  Individual elements of these
bounds vectors can even be infinity and/or minus-infinity.  This allows
a variable to be without an explicit upper or lower bound, although of
course the constraints in the A-matrix will need to put implied limits
on the variable or else the problem may have no finite solution.
Similarly, good software allows b1 <= Ax <= b2 for arbitrary b1, b2;
the user need not hide inequality constraints by the inclusion of
explicit "slack" variables, nor write Ax >= b1 and Ax <= b2 as two
separate constraints.  Also, LP software can handle maximization
problems just as easily as minimization (in effect, the vector c is
just multiplied by -1).

<P>
The importance of linear programming derives in part from its many
applications (see further below) and in part from the existence of good
<i>general-purpose</i> techniques for finding optimal solutions.  These
techniques take as input only an LP in the above Standard Form, and
determine a solution without reference to any information concerning the
LP's origins or special structure.  They are fast and reliable over a
substantial range of problem sizes and applications.

<P>
Two families of solution techniques are in wide use today.  Both visit
a progressively improving series of trial solutions, until a solution
is reached that satisfies the conditions for an optimum.
<i>Simplex</i> methods, introduced by <A
HREF="http://www.stanford.edu/dept/eesor/people/faculty/dantzig/">Dantzig</A>
about 50 years ago, visit "basic" solutions computed by fixing enough
of the variables at their bounds to reduce the constraints Ax = b to a
square system, which can be solved for unique values of the remaining
variables.  Basic solutions represent extreme boundary points of the
feasible region defined by Ax = b, x >= 0, and the simplex method can
be viewed as moving from one such point to another along the edges of
the boundary.  <i>Barrier</i> or <i>interior-point</i> methods, by
contrast, visit points within the interior of the feasible region.
These methods derive from techniques for nonlinear programming that
were developed and popularized in the 1960s by Fiacco and McCormick,
but their application to linear programming dates back only to
Karmarkar's innovative analysis in 1984.

<P>
The related problem of <a href="#Q3"><i>integer programming</i></a> (or
integer linear programming, strictly speaking) requires some or all of
the variables to take integer (whole number) values.  Integer programs
(IPs) often have the advantage of being more realistic than LPs, but
the disadvantage of being much harder to solve.  The most widely used
general-purpose techniques for solving IPs use the solutions to a
series of LPs to manage the search for integer solutions and to prove
optimality.  Thus most IP software is built upon LP software, and this
FAQ applies to problems of both kinds.

<P>
Linear and integer programming have proved valuable for modeling many
and diverse types of problems in planning, routing, scheduling,
assignment, and design.  Industries that make use of LP and its
extensions include transportation, energy, telecommunications, and
manufacturing of many kinds.  A sampling of applications can be found
in many <a href="#textbooks">LP textbooks</a>, in <a
href="#modeling_systems">books on LP modeling systems</a>, and among the
application cases in the journal <a
href="http://silmaril.smeal.psu.edu/interfaces/"><i>Interfaces</i></a>.


<P>
<H3> <A NAME="Q2">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q2.  "Where is there good software to solve LP problems?"
</H3>

<P>
<B>A:</B>  Thanks to the advances in computing of the past decade,
linear programs in a few thousand variables and constraints are nowadays
viewed as "small".  Problems having tens or hundreds of thousands of
continuous variables are regularly solved; tractable integer programs
are necessarily smaller, but are still commonly in the hundreds or
thousands of variables and constraints.  The computers of choice for
linear and integer programming applications are Pentium-based PCs and
the several varieties of Unix workstations.
  
<P> 
There is more to linear programming than optimal solutions and
number-crunching, however.  This can be appreciated by observing that
modern LP software comes in two related but very different kinds of
packages:

<ul> 
<li><i>Algorithmic codes</i> are devoted to finding optimal solutions
to specific linear programs.  A code takes as input a compact listing of
the LP constraint coefficients (the A, b, c and related values in the <a
href=#Q1>standard form</a>) and produces as output a similarly compact
listing of optimal solution values and related information.

<P>
<li><i>Modeling systems</i> are designed to help people formulate LPs and
analyze their solutions.  An LP modeling system takes as input a
description of a linear program in a form that people find reasonably
natural and convenient, and allows the solution output to be viewed in
similar terms; conversion to the forms requried by algorithmic codes is
done automatically. The collection of statement forms for the input is
often called a <i>modeling language</i>. </ul>

<P>
Most modeling systems support a variety of algorithmic codes, while the
more popular codes can be used with many different modeling systems.
Because packages of the two kinds are often bundled for convenience of
marketing or operation, the distinction between them is sometimes obscured,
but it is important to keep in mind when attempting to sort through the
many alternatives available.

<P>
Large-scale LP algorithmic codes rely on general-structure sparse matrix
techniques and numerous other refinements developed through years of
experience.  The fastest and most reliable codes thus represent
considerable development effort, and tend to be expensive except in 
very limited demonstration or "student" versions.  Those codes that
are free -- to all, or at least for research and teaching -- tend to be
somewhat less robust, though they are still useful for many problems.
The ability of a code to solve any particular class of problems cannot
easily be predicted from problem size alone; some experimentation is
usually necessary to establish difficulty.

<P>
Large-scale LP modeling systems are commercial products virtually
without exception, and tend to be as expensive as the commercial
algorithmic codes (again with the exception of small demo versions).  
They vary so greatly in design and capability that a description in
words is adequate only to make a preliminary decision among them; your 
ultimate choice is best guided by using each candidate to formulate a
model of interest.

<P>
Listed below are summary descriptions of available <a href="#free">free
codes</a>, and a tabulation of many <a href="#commercial">commercial codes
and modeling systems</a> for linear (and integer) programming.  A list of
<a href="#freedemos">free demos</a> of commercial software appears at the 
end of this section.

<P>
Another useful source of information is the <i><a
href=http://www.siam.org/catalog/mcc12/more.htm>Optimization Software
Guide</a></i> by Jorge More' and Stephen Wright. It contains
references to about 75 available software packages (not all of them just
LP), and goes into more detail than is possible in this FAQ; see in
particular the sections on "linear programming" and on "modeling
languages and optimization systems." An updated <A
HREF="http://www.mcs.anl.gov/otc/Guide/SoftwareGuide/">Web version</A>
of this book is available on the <A
HREF="http://www.mcs.anl.gov/otc/Guide/">NEOS Guide</A>.  Another good
soruce of feature summaries and contact information is the <a
href=http://lionhrtpub.com/orms/surveys/LP/LP-survey.html>Linear
Programming Software Survey</a> compiled by <a
href=http://lionhrtpub.com/ORMS.html><i>OR/MS Today</i></a> (which also
has the largest selection of advertisements for optimization software).
Much information can also be obtained through the websites of
optimization software developers, many of which are identified in the
writeup and tables below.

<P>
To provide some idea of the relative performance of LP codes, a Web
page of pointers to <a
href="http://plato.la.asu.edu/bench.html">benchmarks</a> for
optimization software is being compiled by Hans Mittelmann of Arizona
State University.  It currently includes tests of numerous simplex
codes (LP_SOLVE, LPAKO, MOMIP, MINOS, SNOPT, SoPlex, SIMPO) and
interior-point codes (BPMPD, HOPDM, LIPSOL, LOQO, PCx, LPABO), all of
them downloadable and most freely available.  (Many nonlinear
programming benchmarks are also available at this site.)
<P>

When evaluating any performance comparison, whether performed by a
customer, vendor, or disinterested third party, keep in mind that all
high-quality codes provide options that offer superior performance on
certain difficult kinds of LP or IP problems.  Benchmark studies of the
"default settings" of codes will fail to reflect the power of any
optional settings that are applicable.

<H4>
<A NAME="free">
"Free" codes</A>
</H4>

Some of these programs require registration or payment for some
(especially commercial) uses.  Conditions of use are also subject to
change.  It is a good practice to check a code's "readme" file or
introductory documentation for restrictions before committing to use it.
<P>

<i>Based on the simplex method:</i>

<P>
<A NAME="lp_solve"> There</A> is a downloadable code, written in C,
called <A HREF="ftp://ftp.ics.ele.tue.nl/pub/lp_solve">lp_solve</A>
that its author (Michel Berkelaar, <tt>michel@es.ele.tue.nl</tt>) says
has solved models with up to 30,000 variables and 50,000 constraints.
Version 3.0 is now available under the Lesser GNU Public License.  As
an editorial opinion, I must state that difficult models will give
lp_solve trouble; it's not as good as a commercial code.  But for
someone who isn't sure what kind of LP code is needed, it represents a
reasonable first try.  (The author has also made available a program
that converts data files from <A HREF="#Q5">MPS-format</A> into
lp_solve's own input format; it's file <tt>mps2eq_0.2.tar.gz</tt> in
the same directory as the lp_solve files.)
<P>

<a
href="http://www.netcologne.de/~nc-weidenma/readme.htm">LP-Optimizer</a>
is a simplex-based code for linear and integer programs, written by
Markus Weidenauer (<tt>weidenauer@netcologne.de</tt>).  Free Borland
Pascal 7.0 and Borland Delphi 4 <a
href="http://www.netcologne.de/~nc-weidenma/source.zip">source</a> is
available for downloading, as are executables for <a
href="http://www.netcologne.de/~nc-weidenma/lp_dos.zip">DOS</a> and for
<a href="http://www.netcologne.de/~nc-weidenma/lp_win.zip">Windows</a>
(95 or later).
<P>

<a href="http://www.zib.de/Optimization/Software/Soplex">SoPlex</a> is
an object-oriented implementation of the primal and dual simplex
algorithms, developed by Roland Wunderling.  Source code is available
free for research uses at noncommercial and academic institutions.
<P>

Among the
<A HREF="ftp://netlib2.cs.utk.edu/slatec/">SLATEC</A>
library routines is a Fortran sparse implementation of the simplex method,
<A HREF="ftp://netlib2.cs.utk.edu/slatec/src/splp.f">SPLP</A>.
Its documentation states that it can solve LP models
of "at most a few thousand constraints and variables".
<P>

<A HREF="http://compsci.math.klte.hu/Personal/tr93-86.html">GULF</A> is a
a small-scale implementation of the simplex method for linear programs
and linear-fractional programs (having a ratio of two linear functions
in the objective).  It is available as a DOS program with built-in
spreadsheet-style editor; a Windows verion is planned.
<P>

<i>Based on interior-point methods:</i>
<P>

The <A HREF="http://www.ece.nwu.edu/OTC/">Optimization Technology
Center</A> at Argonne National Laboratory and Northwestern University
has developed <A HREF="http://www.mcs.anl.gov/otc/Tools/PCx/">PCx</A>,
an interior-point code that is freely available for downloading.  PCx
is available in Fortran or C source or a variety of Windows and Unix
executables, with an optional <a
href=http://www.mcs.anl.gov/otc/Tools/PCx/PCxGUI/>Java-based GUI
interface</a>.  Input can be specified in <a href=#Q5>MPS form</a> or
by use of the <a href=http://www.ampl.com/ampl/>AMPL</a> modeling
language.
<P>

Csaba Meszaros (<tt>meszaros@sztaki.hu</tt>) has written <a
href=http://www.sztaki.hu/~meszaros/bpmpd>BPMPD</a>, an interior-point
code for linear and convex quadratic programs.  A demonstration
version, which solves problems of any size but does not report optimal
values of the variables for problems larger than about 500 x 500, is
available as a Windows95/NT executable or DLL.  Separately, a large
variety of <a
href=ftp://plato.la.asu.edu/pub/other_software/bpmpd_binaries/>Unix
binaries</a> for Linux and four workstation platforms are available for
downloading.
<P>

Jacek Gondzio (<tt>gondzio@maths.ed.ac.uk</tt>) has developed the
interior-point LP (and convex QP) solver <A
HREF="http://www.maths.ed.ac.uk/~gondzio/software/hopdm.html">HOPDM</a>.
Several papers (also available at the HOPDM website) detail the
features of this solver, which include automatic selection of multiple
centrality correctors and factorization method, and a "warm start"
feature for taking advantage of known solutions.  A public-domain
Fortran version (2.13, LP only) can be downloaded, and a newer C
version (2.30) is available on request to the developer.
<P>

If you want to solve an LP without downloading a code to your own
machine, you can execute many of these interior-point codes (as well as
varied <a href=#commercial>commercial LP codes</a>) through the <A
HREF="http://www-neos.mcs.anl.gov/">NEOS Server</A>.
<P>

<i>Modeling systems:</i>
<P>

<a href=http://www2-iiuf.unifr.ch/tcs/lpl/>LPL</a> is a mathematical
modeling language for formulating and maintaining linear and
mixed-integer programs.  It is particularly notable for its ability to
also handle a variety of logical constraints, which are translated
symbolically into algebraic constraints using 0-1 variables.  You can
download the software and documentation free of charge.
<P>

<i>Other software of interest:</i>
<P>

<a
href=http://oss.software.ibm.com/developerworks/opensource/coin/>COIN</a>,
a Common Optimization INterface for Operations Research, is an "open
source" repository established with support from IBM Corporation.
Source code initially available includes a parallel branch-cut-price
framework, a cut generation library, an implementation of the Volume
Algorithm for fast approximate solutions to combinatorial problems, and
an open solver interface layer.
<P>

<a
href=http://www.informatik.uni-koeln.de/ls_juenger/projects/abacus.html>ABACUS</a>
is a C++ class library that "provides a framework for the
implementation of branch-and-bound algorithms using linear programming
relaxations that can be complemented with the dynamic generation of
cutting planes or columns" (branch-and-cut and/or branch-and-price).
It relies on CPLEX, SoPlex, or XPRESS-MP to solve linear programs.
Further information is available from <a
href=http://www.informatik.uni-koeln.de/ls_juenger/staff/thienel.html>Stefan
Thienel</a>, <tt>thienel@informatik.uni-koeln.de</tt>.
<P>

Various small-scale implementations are mainly intended for instructional purposes. 

<UL>
<LI>Robert Vanderbei of Princeton has developed Java-based tools for <a
href=http://www.sor.princeton.edu/~rvdb/JAVA/pivot/simple.html>facilitating
simplex pivots</a> and <a
href=http://www.sor.princeton.edu/~rvdb/JAVA/network/nettool/netsimp.html>facilitating
network simplex pivots</a>, and well as a variety of Java <a
href=http://www.sor.princeton.edu/~rvdb/JAVA/pivot/online.html>applets
that test students</a> on their knowledge of various simplex-based
methods.  

<LI>A web-based <A
HREF="http://riot.ieor.berkeley.edu/riot/Applications/SimplexDemo/Simplex.html">Linear
Program Solver with Simplex</A>, part of the <a
href="http://riot.ieor.berkeley.edu/riot/index.html">RIOT</a> project
at Berkeley, appears to be useful for solving small models that can be
entered by hand.

<LI>The <A
HREF="http://www.mcs.anl.gov/otc/Guide/">NEOS Guide</A> developed by
Northwestern and Argonne National Laboratory offers a Java-based <A
HREF="http://www.mcs.anl.gov/otc/Guide/CaseStudies/simplex/">Simplex
Tool</A> that demonstrates the workings of the simplex method on small
user-entered problems.
</UL>

<P>
The <a href="http://orly1.snu.ac.kr/software/">Operations Research
Laboratory</a> at Seoul National University, Korea offers C source for
large-scale Linear Programming software (both Simplex and Barrier) and
for numerous more specialized optimization problems.

<p>
<a href=http://www.willnaylor.com/index.html>Will Naylor</a> has a
collection of software he calls <a
href=http://www.willnaylor.com/wnlib.html>WNLIB</A>.  Routines of
interest include a dense-matrix simplex method for linear programming
(with anti-cycling and numerical stability "hacks") and a sparse-matrix
transportation/assignment problem routine.  (WNLIB also contains
routines pertaining to nonlinear optimization.)

<P>
A code known as <a
href=http://graphics.lcs.mit.edu/~seth/geomlib/lp.tar>lp</a> is Mike
Hohmeyer's C implementation of Raimund Seidel's O(d! n) time linear
programming algorithm.  It's reputed to be extremely fast in low
dimensions (say, d < 10), so that it's appropriate for a variety of
geometric problems, especially with very large numbers of constraints.

<P>
The next several suggestions are for codes that are severely limited by
the dense vector and matrix algebra employed in their implementations;
they may be OK for models with (on the order of) 100 variables and
constraints, but it's unlikely they will be satisfactory for larger
models.  In the words of Matt Saltzman (<a
href=mailto:mjs@clemson.edu>mjs@clemson.edu</a>):
<UL>
  The main problems with these codes have to do with scaling, use of
  explicit inverses and lack of reinversion, and handling of
  degeneracy.  Even small problems that are ill-conditioned or
  degenerate can bring most of these tableau codes to their knees.
  Other disadvantages for larger problems relate to sparsity,
  pricing, and maintaining the complete nonbasic portion of the
  tableau.  But for small, dense problems these difficulties may not be
  serious enough to prevent such codes from being useful, or even
  preferable to more "sophisticated" sparse codes.  In any event, use
  them with care.
</UL>
<UL>
<LI>
For DOS/PC users, there is a "friendly Linear Programming and Linear
Goal Programming" code called <A
HREF="ftp://garbo.uwasa.fi/pc/ts/tslin35c.zip">LINSOLVE</A>, developed
by Prof. Timo Salmi (<tt>ts@uwasa.fi</tt>).
<LI>
Also on the garbo server is a <A
HREF="ftp://garbo.uwasa.fi/pc/math/lp261.zip">LP 2.61</A>, a shareware
linear and integer programming code of Cornel Huth, distributed as PC
binaries.  It accepts text and spreadsheet files as input.
<LI>
There is
an <A HREF="ftp://netlib2.cs.utk.edu/toms/">ACM TOMS</A> routine for
LP, #<A HREF="ftp://netlib2.cs.utk.edu/toms/552">552</A>.  This routine
was designed for fitting data to linear constraints using an L1 norm,
but it uses a modification of the Simplex Method and could presumably
be modified to satisfy LP purposes.
<LI>
There are books that contain source code for the Simplex Method.
See the section on
<A HREF="#books_with_source">references</A>.
You should not expect such code to be
robust.  In particular, you can check whether it uses a 2-dimensional
array for the A-matrix; if so, it is surely using the tableau Simplex
Method rather than sparse methods, and Saltzman's comments will apply.
<LI>
<a href=http://OpsResearch.com/OR-Objects/index.html>OR-Objects</a> is
a <a href=http://www.java.org/>Java</a> class library that includes
objects for dense linear programming (and other methods common in
operations research).
<LI>
<a href=http://www.pythonpros.com/arw/pysimplex/>Pysimplex</a> contains
an implementation of the simplex method in the object-oriented
language Python, together with modules that allow construction of
models in a straightforward symbolic manner.
</UL>

<P>
For Macintosh users there is relatively little available, but here
are a few possibilities:
<UL>
<LI>
<A HREF="http://www.cdrom.com/pub/MacSciTech/programming/">LinPro</A>
is a freely available but strictly small-scale linear programming
package.  It has its own input format and does not support <A
HREF="#Q5">MPS</A> format.
<LI>
The 2nd edition of Wayne L. Winston's <i>Introduction to Mathematical
Programing: Applications and Algorithms</i> is listed by Duxbury Press
as being available with the <A
HREF="http://www.duxbury.com/catalog/lmp.html">Macintosh LINDO</A> LP
solver.
</UL><P>

<P>
Stephen F. Gale (sfgale@calcna.ab.ca) writes:
<UL>
<LI>
Available at my website is a fairly simple <A
HREF="http://www.calcna.ab.ca/~sfgale/simplex.html"> Simplex Solver
written for Turbo Pascal 3.0</A>.  The original algorithm is from the
book "Some Common BASIC Programs" by Lon Poole and Mary Borchers (ISBN
0-931988-06-3).  However, I revised it considerably when I converted it
to Pascal.  I then added Sensitivity Analysis based on the book "The
Operations Research Problem Solver" (ISBN 0-87891-548-6).  I have
tested the program on over 30 textbook problems, but never used it for
real life applications.  If someone finds a problem with the program, I
would be pleased to correct it.  I would also appreciate knowing how
the program was used.
</UL>

<P>
The following suggestions may represent low-cost ways of solving LPs
if you already have certain software available to you.

<UL>
<LI>All of the most popular spreadsheet programs come with a limited
linear/integer programming solver as a feature or add-in.  A much
broader range of more powerful solvers are available for separate
purchase from <a href=http://www.lindo.com>LINDO Systems</a> and <a
href=http://www.frontsys.com>Frontline Systems</a>.  Some of these
solvers give special attention to common spreadsheet functions such as
<tt>MIN</tt>, <tt>IF</tt>, and <tt>LOOKUP</tt> that can be handled by
linear or integer programming approaches.

<LI><i>QSB for Windows</i> by Yih-Long Chang, published by Wiley, has
an LPf module among its routines.

<LI>If you have access to a commercial math library, such as
<a href="http://www.sas.com/">SAS</a>,
<a href="http://www.vni.com/products/imsl/index.html">IMSL</a> or
<a href="http://www.nag.com/">NAG</a>, you may be able to use an LP routine from there.
<LI>If you have <a href=http://www.mathworks.com>MATLAB</a>, you can
run a number of useful optimization packages that provide some linear programming features:
   <UL>
   <LI>The MATLAB <a
href=http://www.mathworks.com/products/optimization/>Optimization
Toolbox</a>.
   <LI><a href=http://www.ie.ncsu.edu/kay/matlog/milp.m>milp.m</a>, a
routine that uses the Optimization Toolbox to solve mixed-integer
linear programs.
   <LI>The <a
href=http://www.ima.mdh.se/tom/tom-software/tomlab.htm>TOMLAB
Optimization Environment</a>: "For linear programming, different types
of simplex algorithms are implemented as well as the dual simplex
algorithm. MIP problems are treated by a branch and bound method and a
cutting plane algorithm.  Solvers are also available for various
network programs and dynamic programs."
   <LI><a
href=ftp://ftp.mathworks.com/pub/contrib/v4/optim/lpmex/>LPMEX</a>, an
interface to let you run <a
href=ftp://ftp.es.ele.tue.nl/pub/lp_solve>lp_solve</a> from MATLAB.
   <LI>MATLAB interfaces to the <a
href=http://www.orfe.princeton.edu/~loqo/>LOQO</a> and <a
href=http://www.caam.rice.edu/~zhang/lipsol/>LIPSOL</a>, and <a
href=http://www.mosek.com>MOSEK</a> solvers.
   </UL>
The <a href=http://www.maplesoft.on.ca/>MAPLE</a> and <a
href=http://www.mathematica.com/>Mathematica</a> packages for
mathematical computation also provide some linear programming routines;
you can get more information by searching at their websites.
</UL>

<H4>
<A NAME="commercial">
Commercial codes and modeling systems</A>
</H4>

<P>
If your models prove to be too difficult for free or add-on software to
handle, then you may have to consider acquiring a commercial LP code.
Dozens of such codes are on the market.  There are many considerations
in selecting an LP code.  Speed is important, but LP is complex enough
that different codes go faster on different models; you won't find a
"Consumer Reports" article to say with certainty which code is THE
fastest.  I usually suggest getting benchmark results for your
particular type of model if speed is paramount to you.  Benchmarking
can also help determine whether a given code has sufficient numerical
stability for your kind of models.

<P>
Other questions you should answer: Can you use a stand-alone code, or
do you need a code that can be used as a callable library, or do you
require source code?  Do you want the flexibility of a code that runs
on many platforms and/or operating systems, or do you want code that's
tuned to your particular hardware architecture (in which case your
hardware vendor may have suggestions)?  Is the choice of algorithm
(Simplex, Interior-Point) important to you?  Do you need an interface
to a spreadsheet code?  Is the purchase price an overriding concern?
If you are at a university, is the software offered at an academic
discount?  How much hotline support do you think you'll need?  There is
usually a large difference in LP codes, in performance (speed,
numerical stability, adaptability to computer architectures) and in
features, as you climb the price scale.

<P>
Information on commercial systems is provided in two tables below.  The
first lists packages that are primarily algorithmic codes, and the
second lists modeling systems.  For a more extensive summary, take a
look at the <a
href="http://lionhrtpub.com/orms/surveys/LP/LP-survey.html">Linear
Programming Software Survey</a> in the August 1999 issue of <i>OR/MS
Today</i>.

<P>
In the tables below, product names are linked to product or developer
websites where known.  Under "Platform" is an indication of common
environments in which the code runs, with the choices being PC-DOS
and/or versions of Microsoft Windows (PC), Macintosh OS (M), and
Unix/Linux on various computer types (U).  The codes under "Features"
are as follows:

<PRE>
                  S=Simplex        Q=Quadratic
                  B=Barrier        G=General Nonlinear
                  N=Network   
                  I=Integer/Combinatorial      
</PRE>

All product information is subject to change, and some delay may occur
before changes are reflected in this table.  Consult the products'
developers or vendors for definitive information.

<P>
<table border=0 cellpadding=2 cellspacing=0>

<tr valign=bottom>
<td><b>Solver<br>Product</b>
<td><b>Features</b>
<td><b>Platform</b>
<td align=right><b>Phone (+1)&nbsp;</b>
<td><b>E-mail address</b>
</tr>

<tr valign=top>
<td><A HREF="http://www.ketronms.com/cwhiz.html">C-WHIZ</A>
<td>SI
<td>PC U
<td align=right>703-412-3201
<td><tt>info@ketronms.com</tt>
</tr>

<tr valign=top>
<td><A HREF="http://www.ilog.com/products/cplex/">CPLEX</A>
<td>SBINQ
<td>PC U
<td align=right>800-367-4564 <br>775-831-7744
<td><tt>info@ilog.com</tt>
</tr>

<tr valign=top>
<td><A HREF="http://www.optirisk-systems.com/">FortMP</a>
<td>SBIQ
<td>PC U
<td align=right>+44 18-9525-6484
<td><tt>optirisk@optirisk-systems.com</tt> 
</tr>

<tr>
<td>HI-PLEX
<td>S
<td>PC U
<td align=right>+44 20-7594-8334
<td><tt>i.maros@ic.ac.uk</tt>
</tr>

<tr>
<td><A HREF="http://www.haverly.com/">HS/LP</A>
<td>SI
<td>PC
<td align=right>201-627-1424
<td><tt>info@haverly.com</tt>
</tr>

<tr valign=top>
<td><A HREF="http://www.ilog.com/products/optimization/">ILOG Opt Suite</A>
<td>SBINQ
<td>PC U
<td align=right>800-367-4564 <br>775-831-7744
<td><tt>info@ilog.com</tt>
</tr>

<tr>
<td>LAMPS
<td>SI
<td>PC U
<td align=right>+44 20-8877-3030
<td><tt>info@amsoft.demon.co.uk</tt>
</tr>

<tr>
<td><A HREF="http://www.lindo.com/">LINGO</A>
<td>SBI
<td>PC U
<td align=right>312-988-7422
<td><tt>info@lindo.com</tt>
</tr>

<tr>
<td><a href=http://www.orfe.princeton.edu/~loqo/>LOQO</a>
<td>IQG
<td>PC U
<td align=right>609-258-0876
<td><tt>rvdb@princeton.edu</tt>
</tr>

<tr>
<td><a href="http://www.aae.com">LPS-867</a>
<td>SI
<td>PC U
<td align=right>609-737-6800
<td><tt>info@main.aae.com</tt>
</tr>

<tr>
<td><a href="http://www.frontsys.com">LS-XLSOL</a>
<td>SI
<td>PC
<td align=right>775-831-0300
<td><tt>info@frontsys.com</tt>
</tr>

<tr>
<td><a href="http://www.sbsi-sol-optimize.com/Minos.htm">MINOS</a>
<td>SG
<td>PC
<td align=right>650-856-1695
<td><tt>info@sbsi-sol-optimize.com</tt>
</tr>

<tr>
<td><a href="http://akula.isye.gatech.edu/~mwps/projects/minto.html">MINTO</a>
<td>I
<td>U
<td align=right>404-894-6287
<td><tt>martin.savelsbergh@isye.gatech.edu</tt>
</tr>

<tr>
<td><a href="http://www.mosek.com/">MOSEK</a>
<td>SBQG
<td>PC U
<td align=right>
<td><tt>info@mosek.com</tt>
</tr>

<tr valign=top>
<td><a href="http://www.ketronms.com/mpsiii.html">MPSIII</a>
<td>SIN
<td>PC U
<td align=right>703-412-3201 <br>+352 5313-2455
<td><tt>info@ketronms.com</tt> <br><tt>rudy@arbed-rech-isdn1.restena.lu</tt>
</tr>

<tr>
<td><A HREF="http://www6.software.ibm.com/sos/osl/optimization.htm">OSL</A>
<td>SBINQ
<td>PC U
<td align=right>914-435-6685
<td><tt>osl@us.ibm.com</tt>
</tr>

<tr>
<td><a href="http://www.sas.com/rnd/">SAS/OR</a>
<td>SINQG
<td>PC M U
<td align=right>919-677-8000
<td><tt>saseph@unx.sas.com</tt>
</tr>

<tr>
<td>SCICONIC
<td>SI
<td>PC U
<td align=right>+44 19-0828-4188
<td><tt>msukwt03.gztltm@eds.com</tt>
</tr>

<tr valign=top>
<td><a href="http://www.saitech-inc.com">SOPT</a>
<td>SBIQG
<td>PC U
<td align=right>732-264-4700 <br>+81 3-5966-1220
<td><tt>sales@saitech-inc.com</tt>
</tr>

<tr>
<td><a href="http://www.sunsetsoft.com/">XA</a>
<td>SI
<td>PC M U
<td align=right>626-441-1565
<td><tt>jim@sunsetsoft.com</tt>
</tr>

<tr valign=top>
<td><A HREF="http://www.dash.co.uk/">XPRESS-MP</A>
<td>SBIQ
<td>PC M
<td align=right>+44 16-0485-8993 <br>201-313-5297
<td><tt>info@dash.co.uk</tt> <br><tt>av@dashoptimization.com</tt>
</tr>

</table>
<br>


<table border=0 cellpadding=2 cellspacing=0>

<tr valign=bottom>
<td><b>Modeling<br>Product</b>
<td><b>Platform</b>
<td align=right><b>Phone (+1)&nbsp;</b>
<td><b>E-mail address</b>
</tr>

<tr>
<td><A HREF="http://www.aimms.com/">AIMMS</A>
<td>PC
<td align=right>+31 23-5511512
<td><tt>info@paragon.nl</tt>
</tr>

<!-- <tr>
<td><A HREF="http://www.draytonanalytics.com/">AMMO</A>
<td>PC
<td align=right>+61 8 8342 9614
<td><tt>sales@draytonanalytics.com</tt>
</tr> -->

<tr>
<td><A HREF="http://www.ampl.com/ampl/">AMPL</A>
<td>PC U
<td align=right><a href=http://www.ampl.com/ampl/vendors.html><i>see list</i></a>
<td><tt>info@ampl.com</tt>
</tr>

<tr>
<td><A HREF="http://www.cudenver.edu/~hgreenbe/imps/analyze.html">ANALYZE</A>
<td>PC
<td align=right>303-796-7830
<td><tt>hgreenbe@carbon.cudenver.edu</tt>
</tr>

<tr>
<td><a href="http://www.vanguardsw.com/">DecisionPRO</a>
<td>PC
<td align=right>919-859-4101
<td><tt>vsinfo@vanguardsw.com</tt>
</tr>

<tr>
<td><a href="http://www.ketronms.com/dataform.html">DATAFORM</a>
<td>PC U
<td align=right>703-412-3201
<td><tt>info@ketronms.com</tt>
</tr>

<tr>
<td><a href="http://www.modellium.com">EZMod</a>
<td>PC
<td align=right>418-653-0853
<td><tt>info@modellium.com</tt>
</tr>

<tr>
<td><A HREF="http://www.gams.com/">GAMS</A>
<td>PC U
<td align=right>202-342-0180
<td><tt>sales@gams.com</tt>
</tr>

<tr>
<td><A HREF="http://www.lindo.com/">LINGO</A>
<td>PC U
<td align=right>800-441-2378
<td><tt>info@lindo.com</tt>
</tr>

<tr>
<td><A HREF="http://www.eurodecision.fr/English/html/lp-toolkit.html">LP-TOOLKIT</A>
<td>PC U
<td align=right>+33 1-39071240
<td><tt>info@eurodecision.fr</tt>
</tr>

<tr>
<td><a href="http://www.mathproinc.com/">MathPro</a>
<td>PC U
<td align=right>301-951-9006
<td><tt>mathpro@erols.com</tt>
</tr>

<tr>
<td><A HREF="http://www.chesapeake.com/">MIMI</A>
<td>PC U
<td align=right>908-464-8300
<td><tt>supplychain@aspentech.com</tt>
</tr>

<tr>
<td><A HREF="http://titan.princeton.edu/MINOPT/">MINOPT</A>
<td>PC U
<td align=right>609-258-3097
<td><tt>jean@princeton.edu</tt>
</tr>

<tr>
<td><A HREF="http://www.cudenver.edu/~hgreenbe/imps/modler.html">MODLER</A>
<td>PC U
<td align=right>303-796-7830
<td><tt>hgreenbe@carbon.cudenver.edu</tt>
</tr>

<tr>
<td><A HREF="http://www.maximal-usa.com/">MPL</A>
<td>PC
<td align=right>703-522-7900
<td><tt>info@maximal-usa.com</tt>
</tr>

<tr>
<td><A HREF="http://www.ketronms.com/oml.html">OML</A>
<td>PC U
<td align=right>703-412-3201
<td><tt>info@ketronms.com</tt>
</tr>

<tr>
<td><A HREF="http://www.haverly.com/">OMNI</A>
<td>PC U
<td align=right>973-627-1424
<td><tt>info@haverly.com</tt>
</tr>

<tr valign=top>
<td><A HREF="http://www.ilog.com/products/oplstudio/">OPL Studio</A>
<td>PC U
<td align=right>800-367-4564 <br>775-831-7744
<td><tt>info@ilog.com</tt>
</tr>

<tr valign=top>
<td><A HREF="http://www.dash.co.uk/">Visual XPRESS</A>
<td>PC
<td align=right>+44 16-0485-8993 <br>201-313-5297
<td><tt>info@dash.co.uk</tt> <br><tt>av@dashoptimization.com</tt>
</tr>

<!-- <tr>
<td><a href="http://www.sundown-vmp.com">VMP</a>
<td>PC U
<td align=right>301-622-4319
<td><tt>j-welch@sundown-vmp.com</tt>
</tr> -->

<tr>
<td><A HREF="http://www.lindo.com/">What's Best!</A>
<td>PC M U
<td align=right>800-441-2378
<td><tt>info@lindo.com</tt>
</tr>

</table>


<H4>
<A NAME="freedemos">
Free demos of commercial codes</A>
</H4>

An increasing number of commercial LP software developers are making
demo or academic versions available for downloading through websites
or as add-ons to book packages.  Typically these versions are limited
in the size of problem they accept or the length of time that they will
operate, or are made available only for "academic use" (mainly research
or teaching at universities).  Nevertheless, they have most or all of
the features of the full versions.  Most run under several variations
of Microsoft Windows on PCs, and/or certain Unix workstations; check
the relevant web pages for details.

<P>
Downloadable free demos are available for:
<UL>
<LI>
   <a href=http://www.aimms.com/>AIMMS</a>
<LI>
   <a href=http://www.ampl.com/ampl/DOWNLOADS>AMPL</a> with CPLEX and MINOS
<LI>
   <a
href="http://www.cudenver.edu/~hgreenbe/imps/software.html">ANALYZE</a>,
   <a
href="http://www.cudenver.edu/~hgreenbe/imps/software.html">MODLER</a>
   and <a
href="http://www.cudenver.edu/~hgreenbe/imps/software.html">RANDMOD</a>
<LI>
   <a href="http://www.ketronms.com/dnld_intro.html">C-WHIZ</a> and
   <a href="http://www.ketronms.com/dnld_intro.html">OML</a>
<LI>
   <a href="http://www.lindo.com/">LINDO</a>, 
   <a href="http://www.lindo.com/">LINGO</a> and
   <a href="http://www.lindo.com/">What's Best!</a>
<LI>
   <a href=http://www.princeton.edu/~rvdb/loqoexecs.html>LOQO</a> with a built-in AMPL interface
<LI>
   <a href="http://www.mosek.com/request/download.html">MOSEK</a> API and MATLAB toolbox
<LI>
   <a href="http://www.maximal-usa.com/download/">MPL</a> with CPLEX
<LI>
   <a href="http://www.ilog.com/products/oplstudio/trial.cfm">OPL Studio</a> with the ILOG Optimization Suite (including CPLEX)
<LI>
   <a
href="http://www.dash.co.uk/products_interfaces_vxstudent.html">Visual
XPRESS</a> with XPRESS-MP
</UL>
Books that are packaged with demo software include:
<UL>
<LI>
   A. Brooke, D. Kendrick and A. Meeraus, <i><a
   href=http://www.gams.com/docs/gams/GAMSUsersGuide.pdf>GAMS: A Users'
   Guide</a>,</i> Thomson Learning/Duxbury Press, ISBN 0-894-26215-7.
<LI>
   R. Fourer, D.M. Gay and B.W. Kernighan, <i><a
   href=http://www.ampl.com/ampl/BOOK/>AMPL:  A Modeling Language for
   Mathematical Programming</a>,</i> Thomson Learning/Duxbury Press,
   ISBN 0-534-37895-1.
<LI>
   H.J. Greenberg, <i>Modeling by Object-Driven Linear Elemental
   Relations: A User's Guide for MODLER,</i> Kluwer Academic
   Publishers, ISBN 0-792-39323-6.
<LI>
   L. Schrage, <i>Optimization Modeling with LINGO,</i> <a
   href="http://www.lindo.com">LINDO Systems</a>, ISBN 1-893-35500-4.
</UL>
Many developers are also willing to arrange for you to "borrow" copies
of their full-featured versions for purposes of evaluation.  Details
vary, however, so you'll have to check with each vendor whose product
you're interested in.


<P>
<H3> <A NAME="Q3">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q3.  "Oh, and we also want to solve it as an integer program."
</H3>

<P>
<B>A:</B>  Integer LP models are ones whose variables are constrained
to take integer or whole number (as opposed to fractional) values.  It
may not be obvious that integer programming is a <i>very</i> much
harder problem than ordinary linear programming, but that is
nonetheless the case, in both theory and practice.

<P>
Integer models are known by a variety of names and abbreviations,
according to the generality of the restrictions on their variables.
<i>Mixed integer</i> (MILP or MIP) problems require only some of the
variables to take integer values, whereas <i>pure integer</i> (ILP or
IP) problems require all variables to be integer.  <i>Zero-one</i> (or
0-1 or binary) MIPs or IPs restrict their integer variables to the
values zero and one.  (The latter are more common than you might
expect, because many kinds of combinatorial and logical restrictions
can be modeled through the use of zero-one variables.)

<P>
For the sake of generality, the following disucssion uses the term MIP
to refer to any kind of integer LP problem; the other kinds can be
viewed as special cases.  MIP, in turn, is a particular member of the
class of combinatorial or discrete optimization problems.  In fact the
problem of determining whether a MIP has an objective value less than a
given target is a member of the class of "NP-complete" problems, all of
which are very hard to solve (at least as far as anyone has been able
to tell).  Since any NP-complete problem is reducible to any other,
virtually any combinatorial problem of interest can be attacked in
principle by solving some equivalent MIP.  This approach sometimes
works well in practice, though it is by no means infallible.

<P>
People are sometimes surprised to learn that MIP problems are solved
using floating point arithmetic.  Most available general-purpose
large-scale MIP codes use a procedure called "branch-and-bound" to
search for an optimal integer solution by solving a sequence of related
LP "relaxations" that allow some fractional values.  Good codes for MIP
distinguish themselves primarily by solving shorter sequences of LPs,
and secondarily by solving the individual LPs faster.  (The
similarities between successive LPs in the "search tree" can be
exploited to speed things up considerably.)  Even more so than with
regular LP, a costly commercial code may prove its value if your MIP
model is difficult.

<P>
Another solution approach known generally as <i>constraint logic
programming</i> or <i>constraint programming</i> (CP) has drawn
increasing interest of late.  Having their roots in studies of logical
inference in artificial intelligence, CP codes typically do not proceed
by solving any LPs.  As a result, compared to branch-and-bound they
search "harder" but faster through the tree of potential solutions.
Their greatest advantage, however, lies in their ability to tailor the
search to many constraint forms that can be converted only with
difficulty to the form of an integer program; their greatest success
tends to be with "highly combinatorial" optimization problems such as
scheduling, sequencing, and assignment, where the construction of an
equivalent IP would require the definition of large numbers of zero-one
variables.  Much more information can be found in the <a
href="http://www.cs.unh.edu/ccc/archive/">Constraints Archive</a>,
which contains the the <tt>comp.constraints</tt> newsgroup FAQ, pages
of constraint-related pointers, source code for various systems,
benchmarks, a directory of people interested in constraints, constraint
bibliographies, and a collection of on-line papers.

<P>
The IP and CP approaches are not so far apart as they may seem, particularly now that each is being adapted to incorporate some of the strengths of the other.  Some fundamental connections are described in [<a href=#Chandru>Chandru and Hooker</a>] and [<a href=#Hooker>Hooker</a>].

<P>
Whatever your solution technique, you should be prepared to devote
<i>far</i> more computer time and memory to solving a MIP problem than
to solving the corresponding LP relaxation.  (Or equivalently, you
should be prepared to solve much smaller MIP problems than LP problems
using a given amount of computer resources.)  To further complicate
matters, the difficulty of any particular MIP problem is hard to
predict (in advance, at least!).  Problems in no more than a hundred
variables can be challenging, while others in tens of thousands of
variables solve readily.  The best explanations of why a particular MIP
is difficult often rely on some insight into the system you are
modeling, and even then tend to appear only after a lot of
computational tests have been run.  A related observation is that the
way you formulate your model can be as important as the actual choice
of solver.

<P>
Thus a MIP problem with hundreds of variables (or more) should be
approached with a certain degree of caution and patience.  A
willingness to experiment with alternative formulations and with a MIP
code's many search options often pays off in greatly improved
performance.  In the hardest cases, you may wish to abandon the goal of
a provable optimum; by terminating a MIP code prematurely, you can
often obtain a high-quality solution along with a provable upper bound
on its distance from optimality.  A solution whole objective value is
within some fraction of 1% of optimal may be all that is required for
your purposes.  (Indeed, it may be an optimal solution.  In contrast to
methods for ordinary LP, procedures for MIP may not be able to prove a
solution to be optimal until long after they have found it.)

<P>
Once one accepts that large MIP models are not typically solved to a
proved optimal solution, that opens up a broad area of approximate
methods, probabilistic methods and heuristics, as well as modifications
to B&amp;B.  See <A HREF="#Balas">[Balas]</A>
which contains a useful heuristic for 0-1 MIP
models.  See also the brief discussion of Genetic Algorithms and
Simulated Annealing in the
<A HREF="nonlinear-programming-faq.html">Nonlinear Programming FAQ</A>.

<P>
A major exception to this somewhat gloomy outlook is that there are
certain models whose LP solution always turns out to be integer,
assuming the input data is integer to start with.  In general these
models have a "unimodular" constraint matrix of some sort, but by far
the best-known and most widely used models of this kind are the
so-called pure network flow models.  It turns out that such problems
are best solved by specialized routines, usually based on the simplex
method, that are much faster than any general-purpose LP methods.  See
the section on <A HREF="#Q6.9">Network models</A> for further
information.

<P>
Commercial MIP codes are listed with the <a href=#commercial>commercial
LP codes</a> and modeling systems above.  The following are notes on
some publicly available codes for MIP problems.

<UL>

<P><LI>
The public domain code <A HREF="#lp_solve">lp_solve</A>, mentioned
earlier, accepts MIP models.

<P><LI>
<A
HREF="ftp://ftp.mpi-sb.mpg.de/pub/guide/staff/barth/opbdp/opbdp.html">OPBDP</A>
is a C++ implementation by Peter Barth of an implicit enumeration
algorithm for solving linear 0-1 optimization problems.  The developer
states that the algorithm compares well with commercial linear
programming-based branch-and-bound on a variety of standard 0-1 integer
programming benchmarks; exploiting the logical structure of a problem,
using OPBDP, is said to yield good performance on problems where
exploiting the polyhedral structure seems to be inefficient and vice
versa.

<P><LI>
I have seen mention made of algorithm 333 in the Collected Algorithms
from CACM, though I'd be surprised if it was robust enough to solve
large models.  I am not aware of this algorithm being available
online anywhere.

<P><LI>
In <A HREF="#Syslo">[Syslo]</A>
is code for 28 algorithms, most of which pertain to some
aspect of Discrete Optimization.

<P><LI>
<A HREF="http://www.cs.umd.edu/projects/omega">Omega</A> analyzes
systems of linear equations in integer variables.  It does not solve
optimization problems, except in the case that a model reduces
completely, but its features could be useful in analyzing and reducing
MIP models.

<P><LI>
Bob Craig of Lucent Technologies (kat3@ihgp-ebb.ih.lucent.com) has
software written in C, which implements Balas' enumerative algorithm
for solving 0-1 ILP, that he is willing to make available to those who
request it.

<P></UL>

<P>
<H3> <A NAME="Q4">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q4.  "I wrote an optimization code.  Where are some test models?"
</H3>

<P>
<B>A:</B>  If you want to try out your code on some real-world linear
programs, there is a very nice collection of small-to-medium-size ones,
with a few that are rather large, popularly known as the <A
HREF="ftp://netlib2.cs.utk.edu/lp/data">Netlib collection</A> (although
Netlib consists of much more than just LP).  Also on netlib is a
collection of <A
HREF="ftp://netlib2.cs.utk.edu/lp/infeas">infeasible</A> LP models.
See the <A HREF="ftp://netlib2.cs.utk.edu/lp/data/readme">readme
file</A> for a listing and further information.  The test problem files
(after you uncompress them) are in a format called <A
HREF="#Q5">MPS</A>, which is described in another section of this
document.  Note that, when you receive a model, it may be compressed
both with the Unix compression utility (use <tt>uncompress</tt> if the
file name ends in <tt>.Z</tt>) <i>and</i> with an LP-specific program
(grab either <A
HREF="ftp://netlib2.cs.utk.edu/lp/data/emps.f"><tt>emps.f</tt></A> or
<A HREF="ftp://netlib2.cs.utk.edu/lp/data/emps.c"><tt>emps.c</tt></A>
at the same time you download the model, then compile/run the program
to undo the compression).

<P>
There is a collection of mixed integer (linear) programming (or MIP)
models, called <A
HREF="http://www.caam.rice.edu/~bixby/miplib/miplib.html">MIPLIB</A>,
housed at Rice University.

<P>
<A
HREF="http://www.iwr.uni-heidelberg.de/iwr/comopt/software/TSPLIB95/">TSPLIB</A>
is a library of traveling salesman and related problems, including
vehicle routing problems.

<P>
For network flow problems, there are some <A
HREF="ftp://dimacs.rutgers.edu/pub/netflow/generators/">generators</a>
and <a
href=ftp://dimacs.rutgers.edu/pub/netflow/instances/>instances</A>
collected at <a href=http://www.dimacs.rutgers.edu>DIMACS</a>.  The <A
HREF="ftp://netlib2.cs.utk.edu/lp/generators/netgen">NETGEN</A> and <A
HREF="ftp://netlib2.cs.utk.edu/lp/generators/gnetgen">GNETGEN</A>
generator can be downloaded from <a
href=http://www.netlib.org/index.html>netlib</a>.  Generators and
instances for <a
href=http://www.di.unipi.it/di/groups/optimize/Data/MMCF.html>multicommodity</a>
network flow problems are maintained by the Operations Research group
in the Department of Computer Science at the University of Pisa.

<P>
The commercial modeling language <A
HREF="http://www.gams.com/modlib/modlib.htm">GAMS</A> comes with about
160 test models, which you might be able to test your code with.  There
are also pages containing pointers to numerous examples in <a
href=http://www.ampl.com/ampl/EXAMPLES/>AMPL</a>, <a
href=http://www.maximal-usa.com/mpllib/mpllib.html>MPL</a>, and <a
href=http://web.ilog.com/oplmodels/>OPL</a>.

<P>
There is a collection called
<A HREF="http://elib.zib.de/pub/Packages/mp-testdata/">MP-TESTDATA</A>
available at Konrad-Zuse-Zentrum fuer Informations-technik Berlin (ZIB).
This directory contains various subdirectories, each of which has a
file named "index" containing further information.
Indexed at this writing are:
assign, cluster, lp, ip, matching, maxflow, mincost, set-parti,
steiner-tree, tsp, vehicle-rout, and generators.

<P>
John Beasley of the Imperial College Management School maintains the <A
HREF="http://mscmga.ms.ic.ac.uk/info.html">OR-Library</A>, which lists
linear programming and over 3 dozen other categories of optimization
test problems.

<P>
Finally, Martin Chlond's pages on <a
href=http://www.chlond.demon.co.uk/academic/puzzles.html>Integer
Programming in Recreational Mathematics</a> provide a variety of
challenges for both modelers and software.

<P>
<H3> <A NAME="Q5">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q5.  "What is MPS format?"
</H3>

<P>
<B>A:</B>  MPS format was named after an early IBM LP product and has emerged
as a de facto standard ASCII medium among most of the commercial LP
codes.  Essentially all commercial LP codes accept this format, but if
you are using public domain software and have MPS files, you may need
to write your own reader routine for this.  It's not too hard.  See
also the comment regarding the
<A HREF="#lp_solve">lp_solve</A>
code, in another section of this document, for the availability of
an MPS reader.

<P>
The main things to know about MPS format are that it is column oriented
(as opposed to entering the model as equations), and everything
(variables, rows, etc.) gets a name.  The MIPLIB site provides a <A
HREF="ftp://softlib.cs.rice.edu/pub/miplib/mps_format">concise
summary</A> of MPS format, and a more detailed description is given
in <A HREF="#Murtagh">[Murtagh]</A>.

<P>
MPS is a very old format, so it is set up as though you were using punch
cards, and is not free format. Fields start in column 1, 5, 15, 25, 40
and 50.  Sections of an MPS file are marked by so-called header cards,
which are distinguished by their starting in column 1.  Although it is
typical to use upper-case throughout the file (like I said, MPS has
long historical roots), many MPS-readers will accept mixed-case for
anything except the header cards, and some allow mixed-case anywhere.
The names that you choose for the individual entities (constraints or
variables) are not important to the solver; you should pick names that
are meaningful to you, or will be easy for a post-processing code to
read.

<P>
Here is a little sample model written in MPS format (explained in more
detail below):

<PRE>
NAME          TESTPROB
ROWS
 N  COST
 L  LIM1
 G  LIM2
 E  MYEQN
COLUMNS
    XONE      COST                 1   LIM1                 1
    XONE      LIM2                 1
    YTWO      COST                 4   LIM1                 1
    YTWO      MYEQN               -1
    ZTHREE    COST                 9   LIM2                 1
    ZTHREE    MYEQN                1
RHS
    RHS1      LIM1                 5   LIM2                10
    RHS1      MYEQN                7
BOUNDS
 UP BND1      XONE                 4
 LO BND1      YTWO                -1
 UP BND1      YTWO                 1
ENDATA
</PRE>

<P>
For comparison, here is the same model written out in an
equation-oriented format:

<PRE>
Optimize
 COST:    XONE + 4 YTWO + 9 ZTHREE
Subject To
 LIM1:    XONE + YTWO &lt = 5
 LIM2:    XONE + ZTHREE &gt = 10
 MYEQN:   - YTWO + ZTHREE  = 7
Bounds
 0 &lt = XONE &lt = 4
-1 &lt = YTWO &lt = 1
End
</PRE>

<P>
Strangely, there is nothing in MPS format that specifies the direction
of optimization.  And there really is no standard "default" direction;
some LP codes will maximize if you don't specify otherwise, others will
minimize, and still others put safety first and have no default and
require you to specify it somewhere in a control program or by a
calling parameter.  If you have a model formulated for minimization
and the code you are using insists on maximization (or vice versa), it
may be easy to convert: just multiply all the coefficients in your
objective function by (-1).  The optimal value of the objective
function will then be the negative of the true value, but the values of
the variables themselves will be correct.

<P>
The NAME card can have anything you want, starting in column 15.  The
ROWS section defines the names of all the constraints; entries in
column 2 or 3 are E for equality rows, L for less-than ( <= ) rows, G
for greater-than ( >= ) rows, and N for non-constraining rows (the
first of which would be interpreted as the objective function).  The
order of the rows named in this section is unimportant.

<P>
The largest part of the file is in the COLUMNS section, which is the
place where the entries of the A-matrix are put.  All entries for a
given column must be placed consecutively, although within a column the
order of the entries (rows) is irrelevant. Rows not mentioned for a
column are implied to have a coefficient of zero.

<P>
The RHS section allows one or more right-hand-side vectors to be
defined; most people don't bother having more than one.  In the above
example, the name of the RHS vector is RHS1, and has non-zero values
in all 3 of the constraint rows of the problem.  Rows not mentioned in
an RHS vector would be assumed to have a right-hand-side of zero.

<P>
The optional BOUNDS section lets you put lower and upper bounds on
individual variables (no * wild cards, unfortunately), instead of
having to define extra rows in the matrix.  All the bounds that have
a given name in column 5 are taken together as a set.  Variables not
mentioned in a given BOUNDS set are taken to be non-negative (lower
bound zero, no upper bound).  A bound of type UP means an upper bound
is applied to the variable.  A bound of type LO means a lower bound is
applied.  A bound type of FX ("fixed") means that the variable has
upper and lower bounds equal to a single value.  A bound type of FR
("free") means the variable has neither lower nor upper bounds.

<P>
There is another optional section called RANGES that I won't go into
here. The final card must be ENDATA, and yes, it is spelled funny.
<P>
<H3> <A NAME="Q6">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q6.  Topics briefly covered:
</H3>

<P>
<H4> <A NAME="Q6.1">
Q6.1:  "What is a modeling language?"
</A>
<BR>
</H4>

<B>A:</B>  There is more to linear programming (or integer programming)
than optimal solutions and number-crunching.  This can be appreciated
by observing that modern LP software comes in two related but very
different kinds of packages:

<ul> 
<li><i>Algorithmic codes</i> are devoted to finding optimal solutions
to specific linear programs.  A code takes as input a compact listing of
the LP constraint coefficients (the A, b, c and related values in the <a
href=#Q1>standard form</a>) and produces as output a similarly compact
listing of optimal solution values and related information.

<P>
<li><i>Modeling systems</i> are designed to help people formulate LPs and
analyze their solutions.  An LP modeling system takes as input a
description of a linear program in a form that people find reasonably
natural and convenient, and allows the solution output to be viewed in
similar terms; conversion to the forms requried by algorithmic codes is
done automatically. The collection of statement forms for the input is
often called a <i>modeling language</i>. 
</ul>

<P>
Most modeling systems support a variety of algorithmic codes, while the
more popular codes can be used with many different modeling systems.
Because packages of the two kinds are often bundled for convenience of
marketing or operation, the distinction between them is sometimes
obscured, but it is important to keep in mind when sorting through the
many possibilities.  See under <a href=#commercial>Commercial Codes 
and Modeling Systems</a> elsewhere in this FAQ for a list of modeling
systems available.  There are no free ones of note, but many do offer
<a href=#freedemos>free demo versions</a>.
<P>

Common alternatives to modeling languages and systems include
spreadsheet front ends to optimization, and custom optimization
applications written in general-purpose programming languages.  You can
find a discussion of the pros and cons of these approaches in <a
href=http://www.frontsys.com/modtools.htm>What Modeling Tool Should I
Use?</a> on the Frontline Systems website.

<P>
<H4><A NAME="Q6.2">
Q6.2:  "How do I diagnose an infeasible LP model?"
</A>
<BR>
</H4>

<B>A:</B>  A linear program is infeasible if there exists no solution
that satisfies all of the constraints -- in other words, if no
<i>feasible</i> solution can be constructed.  Since any real operation
that you are modeling must remain within the constraints of reality,
infeasibility most often indicates an error of some kind.
Simplex-based LP software efficiently detects when no feasible solution
is possible; some early interior-point codes could not detect an
infeasible situation as reliably, but remedies for this flaw have been
introduced.<p>

The source of infeasibility is often difficult to track down.  It may
stem from an error in specifying some of the constraints in your model,
or from some wrong numbers in your data.  It can be the result of a
combination of factors, such as the demands at some customers being too
high relative to the supplies at some warehouses.<p>

Upon detecting infeasibility, LP codes typically show you the most
recent infeasible solution that they have encountered.  Sometimes this
solution provides a good clue as to the source of infeasibility.  If
it fails to satisfy certain capacity constraints, for example, then
you would do well to check whether the capacity is sufficient to meet
the demand; perhaps a demand number has been mistyped, or an incorrect
expression for the capacity has been used in the capacity constraint,
or or the model simply lacks any provision for coping with increasing
demands.  More often, unfortunately, LP codes respond to an infeasible
problem by returning a meaninglessly infeasible solution, such as one
that violates material balances.<p>

A more useful approach is to forestall meaningless infeasibilities by
explicitly modeling those sources of infeasibility that you view as
realistic.  As a simple example, you could add a new "slack"
variable on each capacity constraint, having a very high penalty cost.
Then infeasibilities in your capacities would be signalled by positive
values for these slacks at the optimal solution, rather than by a
mysterious lack of feasibility in the linear program as a whole.  Many
modelers recommend the use of "soft constraints" of this kind in all
models, since in reality many so-called constraints can be violated for
a sufficiently high price.  Modeling approaches that use such
constraints have a number of names, most notably "goal programming" and
"elastic programming".<p>

<P>
<H4><A NAME="Q6.3">
Q6.3:  "I want to know the specific constraints that contradict each other."
</A>
<BR>
</H4>
<B>A:</B>  There can be many ways to answer this question, some of them
potentially harder than solving the underlying LP would be (if it were
feasible).  One useful appoach is to apply auxiliary algorithms that
look for small groups of constraints that can be considered to "cause"
the infeasibility of the LP.<p>

Several codes include methods for finding an "irreducible infeasible
subset" (IIS) of constraints that has no feasible solution, but that
becomes feasible if any one constraint is removed.  John Chinneck has
developed <a
href=http://www.sce.carleton.ca/faculty/chinneck/minosiis.html>MINOS(IIS)</a>,
an extended version of the <a
href=http://www.stanford.edu/~saunders/brochure/brochure.html>MINOS</a>
package that finds an IIS when the constraints have no feasible
solution; a demonstration copy is available for downloading.  There are
also IIS finders in <A HREF="http://www.cplex.com/">CPLEX</A>, <A HREF="http://www.lindo.com/">LINDO</A>, <A HREF="http://www.frontsys.com/">LS-XLSOL</A>, <A HREF="http://www6.software.ibm.com/sos/osl/optimization.htm">OSL</A>,
and <A HREF="http://www.dash.co.uk/">XPRESS-MP</A>.<p>

Methods also exist for finding an "IIS cover" that has at least one
constraint in every IIS.  A minimal IIS cover is the smallest subset of
constraints whose removal makes the linear program feasible.  Further
details and references for a variety of IIS topics are available in <a
href=http://www.sce.carleton.ca/faculty/chinneck/chinneck_pub.shtml>papers</a>
by John Chinneck.<p>

The software system <A
HREF="http://www.cudenver.edu/~hgreenbe/imps/analyze.html">ANALYZE</A>
carries out various other analyses to detect structures typically
associated with infeasibility.  (A <A
HREF="http://www.cudenver.edu/~hgreenbe/imps/impsbib/impsbib.html">bibliography</A>
on optimization modeling systems collected by Harvey Greenberg of the
University of Colorado at Denver contains cross-references to over 100
papers on the subject of model analysis.)

<P>
<H4><A NAME="Q6.4">
Q6.4:  "I just want to know whether or not a feasible solution <i>exists</i>."
</A>
<BR>
</H4>
<B>A:</B>  From the standpoint of computational complexity, finding out if an
    LP model has a feasible solution is essentially as hard as actually finding
    the optimal LP solution, within a factor of 2 on average, in terms of
    effort in the Simplex Method; plug your problem
    into a normal LP solver with any objective function you like, such as c=0.
    For MIP models, it's also difficult - if there exists no feasible
    solution, then you must go through the entire Branch and Bound
    procedure (or whatever algorithm you use) to prove this.
    There are no shortcuts in general,
    unless you know something useful about your model's structure
    (e.g., if you are solving some form of a transportation problem,
    you may be able to assure feasibility by checking that the sources
    add up to at least as great a number as the sum of the
    destinations).

<P>
<H4><A NAME="Q6.5">
Q6.5:  "I have an LP, except it's got several objective functions."
</A>
<BR>
</H4>
<B>A:</B>  If you have several objectives, then you may find that they
cannot all be optimized by any one solution.  Instead, you will need to
look for a solution or solutions that achieve an acceptable tradeoff
between objectives.  Deciding what tradeoffs are "acceptable" is a
topic of investigation in its own right.  You may want to consult <a
href=http://www.cba.uga.edu/mcdm/>MCDM WorldScan</a>, the newsletter of
the International Society on Multiple Criteria
Decision Making.
<p>
There are a few free software packages specifically for multiple
objective linear programming, including:

<UL>
<LI>
    ADBASE computes all efficient (i.e., nondominated)
    extreme points of a multiple objective linear program.  It is available
    without charge for research and instructional purposes.  If someone
    has a genuine need for such a code, they should send a request to:
    Ralph E. Steuer, Faculty of Management Science, Brooks Hall,
    University of Georgia, Athens, GA 30602-6255.

<LI>
    <a href=http://www.ekspert.szczecin.pl/protass/en/>PROTASS</a>,
    developed by Rafal Cytrycki (<tt>rcytrycki@computerland.pl</tt>) and
    Andrzej Dzik (<tt>andrzej.dzik@ekspert.szczecin.pl</tt>), provides two
    methods for multicriteria optimization: STEM and HSJ.

<LI>
    <a href=http://nimbus.mit.jyu.fi/>NIMBUS</a> is an interactive
    multiobjective optimization system that has a Web interface.
</UL> 

    Other approaches that have worked are:
<UL>
<LI>
    Goal Programming (treat the objectives as constraints with costed
    slacks), or, almost equivalently, form a composite function from
    the given objective functions;
<LI>
    Pareto preference analysis (essentially brute force examination
    of all vertices);
<LI>
    Put your objective functions in priority order, optimize on one
    objective, then change it to a constraint fixed at the optimal
    value (perhaps subject to a small tolerance), and repeat with the
    next function.
</UL>
    There is a section on this whole topic in
    <A HREF="#Nemhauser">[Nemhauser]</A>.  <A HREF="#Schrage">[Schrage]</A>
    has a chapter devoted to the subject.
    <A HREF="#Hwang">[Hwang]</A> has
    also been recommended by a reader on Usenet.  As a final piece of
    advice, if you can cast your model in terms of physical realities,
    or dollars and cents, sometimes the multiple objectives disappear!
    8v)

<P>
<H4><A NAME="Q6.6">
Q6.6:  "I have an LP that has large almost-independent matrix blocks that
    are linked by a few constraints.  Can I take advantage of this?"
</A>
<BR>
</H4>
<B>A:</B>  Possibly you could solve your LP faster by using some form
of decomposition scheme; see for example section 6.2 in [<A
HREF="#Nemhauser">Nemhauser</A>] or chapter 26 of [<A
HREF="#Chvatal">Chvatal</A>].  The commercial code <A
href="http://www6.software.ibm.com/es/oslv2/features/featur09.htm#HDRLPDPC">OSL</A>
has features to assist in decomposing so-called Dantzig-Wolfe and
staircase structures.  With any other code, you'll have to create your
own decomposition framework and then call an LP solver to handle the
subproblems.
<P>
The folklore is that generally decomposition schemes take a long time
to converge, so that they're slower than just solving the model as a
whole -- although research continues.  For now my advice, unless you are
using OSL or your model is so huge that you can't buy enough memory to
hold it, is to not bother decomposing it.  It's probably more cost
effective to upgrade your solver than to invest more time in
programming (a good piece of advice in many situations).

<P>
<H4><A NAME="Q6.7">
Q6.7:  "I am looking for an algorithm to compute the convex hull of a
    finite number of points in n-dimensional space."
</A>
<BR>
</H4>
<B>A:</B> A good place to start is the directory of <a
href=ftp://ftp.zib.de/pub/Packages/mathprog/polyth/index.html>Codes for
Polytope and Polyhedron Algorithms</a> at the Konrad-Zuse-Zentrum für
Informationstechnik Berlin.  It includes codes for convex hull
computation, as well as for the opposite problem of generating all
extreme points and extreme rays of a general convex polyhedron given by
a system of linear inequalities.  Here are further comments on some of
these codes:
<p>
Ken Clarkson has written <A
HREF="http://netlib.bell-labs.com/netlib/voronoi/hull.html">Hull</A>,
an ANSI C program that computes the convex hull of a point set in
general dimension.  The input is a list of points, and the output is a
list of facets of the convex hull of the points, each facet presented
as a list of its vertices.
<p>
<A HREF="http://www.geom.umn.edu/locate/qhull">Qhull</A>
computes convex hulls as well as Delaunay triangulations, halfspace
intersections about a point, Voronoi diagrams, and related objects.  It
uses the "Beneath Beyond" method, described in <A
HREF="#Edelsbrunner">[Edelsbrunner]</A>.
<p>
Komei Fukuda's <a
href=http://www.ifor.math.ethz.ch/ifor/staff/fukuda/cdd_home/cdd.html>cdd</a>
solves both the convex hull and vertex enumeration problems, using the
Double Description Method of Motzkin <i>et al.</i>  There are also a C++
version (cdd+) and a C-library version (cddlib) that can be compiled to
run with both floating-point and GMP exact rational arithmetics.
<p>
David Avis's <A
HREF="http://cgm.cs.mcgill.ca/~avis/C/lrs.html">lrslib</A> is a
self-contained ANSI C implementation of the reverse search algorithm
for vertex enumeration/convex hull problems, implemented as a callable
library with a choice of three arithmetic packages.  <a
href=ftp://ftp.cs.sunysb.edu/pub/Combinatorica/VE041.Z>VE041</a>,
another implementation of this approach by Fukuda and Mizukoshi, is
available in a Mathematica implementation.
<p>
The <a href=http://www.geom.umn.edu/>Center for the Computation and
Visualization of Geometric Structures</a> at the University of
Minnesota maintains a list of its <a
href=http://www.geom.umn.edu/software/download/>downloadable
software</a>, and hosts a <a
href=http://www.geom.umn.edu/software/cglist/>directory of
computational geometry software</a> compiled by Nina Amenta.
<p>
    Other algorithms for such problems are described in
    <A HREF="#Swart">[Swart]</A>,
    <A HREF="#Seidel">[Seidel]</A>, and
    <A HREF="#Avis">[Avis]</A>.
    Such topics are said to be discussed in
    <A HREF="#Schrijver">[Schrijver]</A> (page 224),
    <A HREF="#Chvatal">[Chvatal]</A> (chapter 18),
    <A HREF="#Balinski">[Balinski]</A>, and
    <A HREF="#Mattheis">[Mattheis]</A> as well.

<P>
<H4><A NAME="Q6.8">
Q6.8:  "Are there any parallel LP codes?"
</A>
<BR>
</H4>
<B>A:</B>  Options for parallel computation of various kinds have
become a common feature of software for linear and
mixed-integer programming.  Here are some examples:

<UL>
<LI>IBM's <a
href=http://www6.software.ibm.com/es/oslv2/features/eppover.htm>OSL
Parallel Extensions</a> implement interior-point methods for linear
programming and branch-and-bound methods for mixed-integer programming
on homogeneous networks under Windows NT, AIX 4.x (on IBM RS/6000 and
SP systems), HP-UX, Sun Solaris, and SGI IRIX, using the Parallel
Virtual Machine (PVM) System version 3.4 for communication.

<LI>The <A HREF="http://www.cplex.com/products/parsolv.html">CPLEX
Parallel Solvers</A> include simplex, barrier, and branch-and-bound
solvers for linear and mixed-integer programming on a number of
multiple-CPU systems.

<LI>Dash's <A HREF="http://www.dash.co.uk/xpcpts.html#parallel">Parallel
IP XPRESS</A> includes a branch-and-bound mixed-integer programming code
designed to exploit both multi-processor computers and networks of
workstations.  A new barrier linear programming code is promised for
the next release.

<LI><a
href=http://www.maths.ed.ac.uk/~gondzio/parallel/solver.html>OOPS</a>
is an object-oriented parallel implementation of the interior point
algorithm, developed by Jacek Gondzio (gondzio@maths.ed.ac.uk), Andreas
Grothey and Robert Sarkissian.  The code can exploit any special
structure of the problem.  It runs on all parallel computing platforms
that support MPI.
</UL>

Two parallel branch-cut-price frameworks are available to those who
want to program specialized solvers for hard combinatorial problems
that can be approached via integer programming:

<UL>
<LI><a href=http://branchandcut.org/SYMPHONY/description.htm>Symphony</a>
requires the user to supply model-specific preprocessing and separation
functions, while other components including search tree, cut pool, and
communication management are handled internally.  Source code is
included for basic applications to traveling salesman and vehicle
routing problems.  The distributed version runs in any environment
supported by the PVM message passing protocol, and can also be compiled
for shared-memory architectures using any OpenMP compliant compiler.

<LI>BCP is a component of the <a
href=http://oss.software.ibm.com/developerworks/opensource/coin/>COIN</a>
open source initiative. 
</UL>

Performance evaluations of parallel solvers must be interpreted with
care.  One common measurement is the "speedup" defined as the time for
solution using a single processor divided by the time using multiple
processors.  A speedup close to the number of processors is ideal in
some sense, but it is only a relative measure.  The greatest speedups
tend to be achieved by the least efficient codes, and especially by
those that fail to take advantage of the sparsity (predominance of zero
coefficients) in the constraints.  For problems having thousands of
constraints, a sparse single-processor code will tend to be faster than
a non-sparse multiprocessor code running on current-day hardware.

<P>
<H4><A NAME="Q6.9">
Q6.9:  "What software is there for Network models?"
</A>
<BR>
</H4>
<B>A:</B>  In the context of linear programming, the term "network" is
most often associated with the minimum-cost network flow problem.  A
network for this problem is viewed as a collection of nodes (or circles
or locations) and arcs (or lines or routes) connecting selected pairs
of nodes.  Arcs carry a physical or conceptual flow of some kind, and
may be directed (one-way) or undirected (two-way).  Some nodes may be
sources (permitting flow to enter the network) or sinks (permitting
flow to leave).
<P>
The <i>network linear programming problem</i> is to minimize the
(linear) total cost of flows along all arcs of a network, subject to
conservation of flow at each node, and upper and/or lower bounds on the
flow along each arc.  This is a special case of the general linear
programming problem.  The <i>transportation problem</i> is an even more
special case in which the network is bipartite: all arcs run from nodes
in one subset to the nodes in a disjoint subset.  A variety of other
well-known network problems, including shortest path problems, maximum
flow problems, and certain assignment problems, can also be modeled and
solved as network linear programs.  Details are presented in many <A
HREF="#Q7">books on linear programming</A> and operations research.
<P>
Network linear programs can be solved 10 to 100 times faster than general
linear programs of the same size, by use of specialized optimization
algorithms.  Some commercial LP solvers include a version of the network
simplex method for this purpose.  That method has the nice property that,
if it is given integer flow data, it will return optimal flows that are
integral.  Integer network LPs can thus be solved efficiently without
resort to complex integer programming software.
<P>
Unfortunately, many different network problems of practical interest do
not have a formulation as a network LP.  These include network LPs with
additional linear "side constraints" (such as multicommodity flow
problems) as well as problems of network routing and design that have
completely different kinds of constraints.  In principle, nearly all of
these network problems can be modeled as integer programs.  Some "easy"
cases can be solved much more efficiently by specialized network
algorithms, however, while other "hard" ones are so difficult that they
require specialized methods that may or may not involve some integer
programming.  Contrary to many people's intuition, the statement of a
hard problem may be only marginally more complicated than the statement
of some easy problem.
<P>
A canonical example of a hard network problem is the "<a
href=#Q6.10>traveling salesman</a>" problem of finding a shortest tour
through a network that visits each node once.  A canonical easy problem
not obviously equivalent to a linear program is the "minimum spanning
tree" problem to find a least-cost collection of arcs that connect all
the nodes.  But if instead you want to connect only some given subset
of nodes (the "Steiner tree" problem) then you are faced with a hard
problem.  These and many other network problems are described in some
of the <A HREF="#Q7">references</A> below.
<P>
Software for network optimization is thus in a much more fragmented
state than is general-purpose software for linear programming.  The
following are some of the implementations that are available for
downloading.  Most are freely available for many purposes, but check
their web pages or "readme" files for details.

<ul>
<li><A
HREF="ftp://netlib2.cs.utk.edu/toms/548">ASSCT</A>, an implementation
of the Hungarian Method for the Assignment problem (#548 from <a
href=ftp://netlib2.cs.utk.edu/toms/index.html>Collected Algorithms of
the ACM</a>).
<P>

<li><a href=http://www.iems.nwu.edu/~giden/>GIDEN</a>, an interactive
graphical environment for a variety of network problems and algorithms,
available as a Java application or as an applet that can be executed 
through any Java-enabled Web browser.  Further information is available
by writing to <tt>giden@iems.nwu.edu</tt>.
<P>

<li><a href=http://www.zib.de/Optimization/Software/Mcf/>MCF</a>, a C
implementation of primal and dual network simplex methods (from Andreas
Loebel, <tt>loebel@zib.de</tt>), supported for Unix/Linux environments and Windows 95/98/NT (MS Visual C++ 6.0), and available for academic use free of charge.
<P>

<li><A
HREF="ftp://dimacs.rutgers.edu/pub/netflow/mincost/solver-1">Netflo</A>,
the Fortran network simplex code from <A
HREF="#Kennington">[Kennington]</A>, and several codes for <a
href=ftp://dimacs.rutgers.edu/pub/netflow/matching/>maximum
matching</a> and <a
href=ftp://dimacs.rutgers.edu/pub/netflow/maxflow/>maximum flow</a>
problems (from <A HREF="http://www.dimacs.rutgers.edu/">DIMACS</A>,
<tt>help@dimacs.rutgers.edu</tt>)
<p>

<li><A HREF="http://www-eio.upc.es/~jcastro/pprn.html">PPRN</A>, for
single or multicommodity network flow problems having a linear or
nonlinear objective function, optionally with linear side constraints,
by Jordi Castro (<tt>jcastro@eio.upc.es</tt>)
<P>

<li><a
HREF="ftp://LIDS.MIT.EDU/pub/bertsekas/RELAX">RELAX-IV</a> for
minimum-cost network flows (by Dimitri Bertsekas,
<tt>bertsekas@lids.mit.edu</tt> and Paul Tseng,
<tt>tseng@math.washington.edu</tt>); also a <a
href=http://www.di.unipi.it/di/groups/optimize/Software/list.html>C++
version of the RELAX-IV algorithm</a> (at the Department of Computer
Science, University of Pisa, <tt>frangio@di.unipi.it</tt>)
</ul>

The following indexes may also be useful:

<ul>
<li>Network optimization codes <a
href=http://www.mat.uc.pt/~eqvm/cientificos/fortran/codigos.html>in
Fortran 77</a> and <a
href=http://www.mat.uc.pt/~eqvm/cientificos/c/codigos.html>in C</a>,
compiled by Ernesto Martins (<tt>eqvm@mat.uc.pt</tt>)
<p>

<li>The <a
href=http://www.neci.nj.nec.com/homepages/avg/soft/soft.html>network
optimization library</a>, including codes for assignment, shortest path,
minimum-cost flow, and maximum flow/minimum cut, by Andrew Goldberg
(<tt>avg@research.nj.nec.com</tt>).
<p>

<li>Optimization routines for <a
href="http://ucsu.colorado.edu/~xu/software.html#network optimization">networks</a> and <a
href="http://ucsu.colorado.edu/~xu/software.html#graph theory">graphs</a>
in the listing of public-domain optimization codes maintained by
Jiefeng Xu (<tt>Jiefeng.Xu@Colorado.edu</tt>).
<p>

<li><a
href=http://www.mcs.anl.gov/otc/Guide/SoftwareGuide/Categories/netwrkopt.html>Network
optimization listings</a> from the <a
href=http://www.mcs.anl.gov/otc/Guide/index.html>NEOS
Guide</a>.
<p>
</ul>

Fortran code for the Assignment Problem and others can also be copied
from<A HREF="#Burkard">[Burkard]</A> and from <A
HREF="#Martello">[Martello]</A>.

<P>
<H4><A NAME="Q6.10">
Q6.10: "What software is there for the Traveling Salesman Problem?"
</A>
<BR>
</H4>
<B>A:</B> This famously hard problem -- known more briefly as the TSP
-- is to find the shortest tour that visits a given collection of
cities or locations of some kind.  It is a hard (NP-complete) problem
just like <a href=#Q3>integer programming</a>, but the obvious integer
programming formulations of it are not especially useful in getting
good solutions within a reasonable amount of time.

<P>
The TSP has attracted many of the best minds in the optimization field,
and serves as a kind of test-bed for methods subsequently applied to
more complex and practical problems.  Methods have been explored both
to give proved optimal solutions, and to give approximate but "good"
solutions, with a number of codes being developed as a result:

<UL>
<LI>
<A HREF="http://www.keck.caam.rice.edu/tsp/">Concorde</A> has solved a
number of the largest TSPs for which proved optimal solutions are
known.  It employs a <i>polyhedral</i> approach, which is to say that
it relies on a range of exceedingly sophisticated linear programming
constraints, in a framework that resembles integer programming
branch-and-bound methods.  The constraints are selectively generated as
the solution process proceeds.  The full C code is available without
cost for research purposes.

<LI>
Public domain code for the Asymmetric TSP (with travel between two
cities significantly cheaper in one of the two directions) is available
in <A HREF="ftp://netlib2.cs.utk.edu/toms/750">TOMS routine #750</A>,
documented in <A HREF="#Carpaneto">[Carpaneto]</A>.

<LI>
Code for a solver can be obtained via instructions in <A
HREF="#Volgenant">[Volgenant]</A>.

<LI>
Bob Craig of Lucent Technologies (kat3@ihgp-ebb.ih.lucent.com) has
software written in C, for both exact solution and heuristics, that he
is willing to make available to those who request it.

<LI>
Chad Hurwitz (<tt>churritz@cts.com</tt>), offers a code called
<tt>tsp_solve</tt> for heuristic and optimal solution, to those who
email him.

<LI>
<A HREF="#Syslo">[Syslo]</A> contains some algorithms and Pascal code.

<LI>
<i>Numerical Recipes</i> <A HREF="#Press">[Press]</A> contains code
that uses simulated annealing.

<LI>
Stephan Mertens's <A
HREF="http://itp.nat.uni-magdeburg.de/~mertens/TSP/index.html">TSP
Algorithms in Action</A> uses Java applets to illustrate some simple
heursitics and compare them to optimal solutions, on 10-25 node
problems.

<LI>
Onno Waalewijn has constructed Java TSP applets exhibiting the
behavior of different methods for <a
href=http://www.wxs.nl/~onno.waalewijn/tspfast.html>heuristic</a> and <a
href=http://www.wxs.nl/~onno.waalewijn/tspx.html>exhaustive</a> search on
various test problems.
</UL>


For a bibliography, check the Integer Programming section of <A
HREF="#Nemhauser">[Nemhauser]</A>, particularly the references with the
names Groetschel and/or Padberg in them.  Other good references are <A
HREF="#Lawler">[Lawler]</A> and <A HREF="#Reinelt">[Reinelt]</A>.
Sophisticated and widely used heuristics for getting a "good" solution
are described in the article by Lin and Kernighan in <i>Operations
Research</i> 21 (1973) 498-516.
<P>

For practical purposes, the traveling salesman problem is only the
simplest case of what are generally known as vehicle-routing problems.
Thus commercial software packages for vehicle routing -- or more
generally for "supply chain management" or "logistics" -- may have TSP
routines buried somewhere within them.  <i>OR/MS Today</i> published a
detailed <a
href=http://lionhrtpub.com/orms/orms-8-00/vehiclerouting.html>vehicle
routing software survey</a> in their August 2000 issue.

<P>
<H4><A NAME="Q6.11">
Q6.11:  "What software is there for cutting or packing problems?"
</A>
<BR>
</H4>
<B>A:</B>  The cutting (or "cutting stock") problem involves cutting
large pieces of something into specified numbers of smaller pieces in
the most economical way.  In the <i>one-dimensional</i> version,
cutting only reduces a single measurement, usually referred to as the
length or width of the pieces; examples include cutting wide rolls of
paper or sheet steel into specified numbers of smaller widths (also
called the "roll trim" problem), and cutting long pieces of wood or
pipe into specified specified numbers of shorter pieces.  In the
<i>two-dimensional</i> version, both a length and width may be
specified for both the large pieces you start with and the smaller ones
to be cut, or the shapes to be cut may be more general.  The material
may again be wood or metal, or paper or fabric, or even cookie dough.

<P>
The packing problem can be regarded as a kind of cutting in reverse,
where the goal is to fill large spaces with specified smaller pieces in
the most economical (or profitable) way.  As with cutting, there are
one-dimensional problems (also called <i>knapsack</i> problems) and
two-dimensional problems, but there are also many three-dimensional
cases such as arise in filling trucks or shipping containers.  The size
measure is not always length or width; it may be weight, for example.

<P>
Except for some very special cases, cutting and packing problems are
hard (NP-complete) like <a href=#Q3>integer programming</a> or the <a href=#Q6.10>TSP</a>.  The simpler one-dimensional instances are often
not hard to solve in practice, however:

<UL>
<LI>
For knapsack problems, a good MIP solver applied to a straightforward
integer-programming formulation can often be used.  Specialized
algorithms are said to be available in [<A HREF="#Syslo">Syslo</A>] and
<A HREF="#Martello">[Martello]</A>.  Bob Craig of Lucent Technologies (<a
href=mailto:kat3@ihgp-ebb.ih.lucent.com>kat3@ihgp-ebb.ih.lucent.com</a>)
has software written in C, for both exact solution and heuristics, that
he is willing to make available to those who request it.
<P>
<LI>
For roll-trim problems, it is not hard to implement the Gilmore-Gomory
procedure using a linear programming subroutine library or modeling
language.  The NEOS Guide's <a
href="http://www-fp.mcs.anl.gov/otc/Guide/CaseStudies/cutting/index.html">cutting
stock case study</A> introduces this procedure and lets you try small
examples, while a good detailed presentation can be found in chapter 13
of [<A HREF="#Chvatal">Chvatal</A>]).  This approach is based on a
linear programming problem that decides how many rolls should be cut in
each of several patterns, which means that fractional numbers of
patterns may show up in the results.  As long as most widths are needed
in substantial quantities -- say, 10 or more -- an acceptable result
can usually be found by rounding the fractions, or by solving one
integer program at the end of the procedure.
</UL>

One-dimensional problems that are subject to additional special
requirements can be much harder, though; see [<a
href=#Haessler>Haessler</a>] for some examples in the roll-trim
context.  Higher-dimensional problems tend to be much harder still.  As
a result, there are a great variety of approximating heuristics and
exact methods for solving various classes of cutting and packing
problems.  To find a useful solver for your particular problem may take
some searching, and the best ones may be costly.

<P>
There has been a great deal written on cutting and packing topics, but
it tends to be scattered.  You might want to start by looking at the
web page of the <A
HREF="http://prodlog.wiwi.uni-halle.de/sicup/index.html">Special
Interest Group on Cutting and Packing</A> and the "application-oriented
research bibliography" in [<A HREF="#Sweeney">Sweeney</A>].  A search
through some of the <A
HREF="http://www.informs.org/databases.html">INFORMS databases</A> will
also turn up a lot of references.  In fact, even an ordinary web search
engine can find you a lot on this topic; try searching on "cutting
stock".

<P>
Among the commercial systems are CutRite, act/cut and act/square of <A
HREF="http://www.alma.fr/">Alma</A>, Cutting Optimizer of <A
HREF="http://www.ardis.be/">Ardis</A>, Cutter of <A
HREF="http://www.escape.gr/cutter/">Escape</a>, Cube-IQ and PlanIQ of
<A HREF="http://www.magiclogic.com/">MagicLogic</A>, Cut Planner of <A
HREF="http://www.patternsystems.com/">Pattern Systems</A>, and
SmartTRIM of <a href=http://ssidecisions.com/>Strategic Systems</a>.
Particular application areas, from paper to <a
href=http://www.ifcomputer.com/MasterPiece/home_en.html>carpeting</a>,
have also given rise to their own specialized cutting-stock tools, which can often be found by a web search on the area of interest.

<P>
<H4><A NAME="Q6.12">
Q6.12:  "What software is there for Stochastic Programming?"
</A>
<BR>
</H4>
<B>A:</B>  [Thanks to
    Derek Holmes, <a
    href=mailto:dholmes@engin.umich.edu>dholmes@engin.umich.edu</a>,
    for this text.] Your success solving a stochastic program depends
    greatly on the characteristics of your problem.  The two broad
    classes of stochastic programming problems are recourse problems
    and chance-constrained (or probabilistically constrained)
    problems.

<P>
    Recourse Problems are staged problems wherein one alteranates
    decisions with realizations of stochastic data.  The objective is
    to minimize total expected costs of all decisions.  The main
    sources of code (not necessarily public domain) depend on how the
    data is distributed and how many stages (decision points) are in
    the problem.  

    <UL>
    <LI>For discretely distributed multistage problems, a good package
    called <a
    href=http://ttg.sba.dal.ca/sba/profs/hgassmann/mslip.html>MSLiP</a>
    has been developed by Gus Gassmann (<a
    href=mailto:Horand.Gassmann@dal.ca>Horand.Gassmann@dal.ca</a>).
    Also, for not huge discretely distributed problems, a deterministic
    equivalent can be formed which can be solved with a standard
    solver.

    <LI>The most recent program for continuously distributed data is
    BRAIN, by K.  Frauendorfer (<a
    href=mailto:frauendorfer@sgcl1.unisg.ch>frauendorfer@sgcl1.unisg.ch</a>),
    written up in detail in the author's monograph ``Stochastic
    Two-Stage Programming'', Lecture Notes in Economics &amp; Math.
    Systems #392 (Springer-Verlag).

    <LI>IBM's <a
    href=http://www6.software.ibm.com/es/oslv2/features/stoch.htm>Stochastic
    Solutions</a> and <a
    href=http://www6.software.ibm.com/es/oslv2/features/stex.htm>Optimization
    Library Stochastic Extensions</a> build on the <a
    href=http://www6.software.ibm.com/sos/osl/optimization.htm>OSL</a>
    library to solve multistage stochastic programs.

    <LI><a
    href=http://www-personal.umich.edu/~jrbirge/dholmes/post.html>POSTS</a>
    is a small test set of recourse problems designed to highlight
    different qualities; it is meant as a common test bed for reporting
    the computational characteristics of state-of-the-art SLP
    algorithms and their implementations.  Some test problems from a
    financial application have been posted by the <a
    href=http://www-cfr.jims.cam.ac.uk/research/stprog.html>Centre for
    Financial Research</a>.
    </UL>

<P>
    Chance-Constrained Programming (CCP) problems are not usually
    staged, and have a constraint of the form Pr( Ax <= b ) >= alpha.
    The solvability of CCP problems depends on the distribution of the
    data (A &/v b).  I don't know of any public domain codes for CCP
    probs., but you can get an idea of how to approach the problem by
    reading Chapter 5 by Prof.  A.  Prekopa
    (prekopa@cancer.rutgers.edu) Y. Ermoliev, and R. J-B. Wets, eds.,
    Numerical Techniques for Stochastic Optimization (Series in Comp.
    Math. 10, Springer-Verlag, 1988).

<P>
    Both Springer Verlag texts mentioned above are good introductory
    references to Stochastic Programming.  The <a
    href=http://dochost.rz.hu-berlin.de/speps/>Stochastic Programming
    E-Print Series</a> collects many recent papers in the field.

<P>
    A variety of other useful stochastic programming links can be found
    on the <a href=http://stopro.org>stopro.org</a> webpage.

<P>
<H4><A NAME="Q6.13">
Q6.13:  "I need to do post-optimal analysis."
</A>
<BR>
</H4>
<B>A:</B>  Many commercial LP codes have features to do this.  Also called
    Ranging or Sensitivity Analysis, it gives information about how the
    coefficients in the problem could change without affecting the
    nature of the solution.  Most LP textbooks, such as
    <A HREF="#Nemhauser">[Nemhauser]</A>,
    describe this.  Unfortunately, all this theory applies only to LP.

<P>
    For a MIP model with both integer and continuous variables, you
    could get a limited amount of information by fixing the integer
    variables at their optimal values, re-solving the model as an LP,
    and doing standard post-optimal analyses on the remaining
    continuous variables; but this tells you nothing about the integer
    variables, which presumably are the ones of interest.  Another MIP
    approach would be to choose the coefficients of your model that are
    of the most interest, and generate "scenarios" using values within
    a stated range created by a random number generator.  Perhaps five
    or ten scenarios would be sufficient; you would solve each of them,
    and by some means compare, contrast, or average the answers that
    are obtained.  Noting patterns in the solutions, for instance, may
    give you an idea of what solutions might be most stable.  A third
    approach would be to consider a goal-programming formulation;
    perhaps your desire to see post-optimal analysis is an indication
    that some important aspect is missing from your model.

<P>
<H4><A NAME="Q6.14">
Q6.14:  "Do LP codes require a starting vertex?"
</A>
<BR>
</H4>
<B>A:</B>  No.  Any reasonable simplex-based LP code can construct a
starting vertex (or "basic solution") for you, given the constraints
and the objective function.  Most codes go through a so-called
two-phase procedure, wherein they first look for a feasible solution,
and then work on getting an optimal solution.  (The two phases are
often grandly titled phase I and phase II.)  The first phase, if
properly written, can begin at any infeasible basic solution, and
commercial codes typically have a so-called crash routine to pick a
reasonable start.  It is generally not worth going to a lot of trouble
to look for a better starting basic solution, <i>unless</i> you have
already solved a similar problem.  The optimal basis (the list of basic
variables) from a similar problem often does help the simplex solver to
get good start that substantially reduces the number of iterations to
optimality.  Commercial codes generally provide for saving an optimal
basis and reusing it in this way, but free codes may not.
<P>
Interior-point methods for LP have entirely different requirements for
a good starting point.  Any reasonable interior-point-based LP code has
its own routines for picking a starting point that is "well-centered"
away from the constraints, in an appropriate sense.  There is not much
advantage to supplying your own starting point of any kind -- at least,
not at the current state of the art -- and some codes do not even
provide an option for giving a starting point.
<P>
<H4><A NAME="Q6.15">
Q6.15:  "How can I combat cycling in the Simplex algorithm?"
</A>
<BR>
</H4>
<B>A:</B>  Cycling is the condition that occurs when the Simplex method
gets "stuck" and finds itself repeating the same vertices over and over.
While this specific behavior is rather rare in practice, it is quite
common for the algorithm to reach a point where it temporarily stops 
making forward progress in terms of improvement in the objective function; 
this is termed "stalling", or more loosely known as "degeneracy" since 
it is caused by one or more basic variables taking on 
the value of a lower or upper bound.  In most cases, the algorithm will
work through this nest of coincident vertices, then resume
making tangible progress.  However, in extreme cases the degeneracy
is so bad that to all intents and purposes it can be considered cycling.
<P>
The simplest answer to the problem of degeneracy/cycling is often to
"get a better optimizer", i.e. one with stronger pricing algorithms,
and a better selection of features.
However, obviously that is not always an option (money!), and even
the best LP codes can run into degeneracy on certain models.  Besides,
they say it's a poor workman who blames his tools.
<P>
So, when one cannot change the optimizer, it's expedient to change
the model.  Not drastically, of course, but a little "noise" can
usually help to break the ties that occur during the Simplex method.
A procedure that can work nicely is to add, to the values in the RHS,
random values roughly six orders of magnitude smaller.  Depending on
your model's formulation, such a perturbation may not even seriously
affect the quality of the solution values.  However, if you want to
switch back to the original formulation, the final solution basis for 
the perturbed model should be a useful starting point for a "cleanup"
optimization phase.  (Depending on the code you are using, this
may take some ingenuity to do, however.)
<P>
Another helpful tactic: if your optimization code has more than one 
solution algorithm, you can alternate among them.  When one algorithm 
gets stuck, begin again with another algorithm, using the most recent
basis as a starting point.  For instance, alternating between a
primal and a dual method can move the solution away from a nasty
point of degeneracy.  Using partial pricing can be a useful
tactic against true cycling, as it tends to reorder the columns.
And of course Interior Point algorithms are much less affected by
(though not totally immune to) degeneracy.
Unfortunately, the optimizers richest in alternate algorithms and
features also tend to be least prone to problems with
degeneracy in the first place.


<P>
<H3> <A NAME="Q7">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q7.  "What references are there in this field?"
</H3>

<P>
<B>A:</B>  What follows is an idiosyncratic list, based on my own
preferences, various people's recommendations on the net, and recent
announcements of new publications.  It is divided into the following
categories:

<ul><ul>
<li><a href=#general_reference>General reference</a>
<li><a href=#textbooks>Textbooks</a>
<li><a href=#modeling_systems>Presentations of LP modeling systems</a>
<li><a href=#books_with_source>Books containing source code</a>
<li><a href=#additional>Additional books</a>
<li><a href=#periodicals>Periodicals</a>
<li><a href=#articles>Articles of interest</a><p>

<li><b><i>See also</i></b> the listings of <a href=#Q8>online sources of information</a> following.
</ul></ul>

I have <i>not</i> reviewed everything listed.

<H4>
<A NAME="general_reference">
General reference
</H4>
<UL>
<LI>
<A NAME="Nemhauser">
   Nemhauser, Rinnooy Kan, &amp; Todd, eds</A>, <i>Optimization:</i>
   Handbooks in Operations Research and Management Science, Volume 1,
   North-Holland, 1989.  (Very broad-reaching, with large bibliography;
   a good reference, and worth checking first.  Expensive, though, and
   tough reading for beginners.)
</UL>

<H4>
<A NAME="textbooks">
Textbooks</A>
</H4>
<P>
Regarding the common question of the choice of textbook for a college
LP course, it's difficult to give a blanket answer because of the
variety of topics that can be emphasized: brief overview of algorithms,
deeper study of algorithms, theorems and proofs, complexity theory,
efficient linear algebra, modeling techniques, solution analysis, and
so on.  A small and unscientific poll of <A
HREF="http://www.informs.org/Network/Orcs.html">ORCS-L mailing list</A>
readers in 1993 uncovered a consensus that [<A
HREF="#Chvatal">Chvatal</A>] was in most ways pretty good, at least
for an algorithmically oriented class; of course, some new candidate
texts have been published in the meantime.  For a class in modeling, a
book about a commercial code would be useful (<A
HREF="http://www.lindo.com/">LINDO</A>, <A
HREF="http://www.ampl.com/ampl">AMPL</A>, <A
HREF="http://www.gams.com/">GAMS</A> were suggested), especially if the
students are going to use such a code; and many are fond of <A 
HREF="#Williams">[Williams]</A>, which presents a considerable variety of
modeling examples.

<UL>
<LI>
   Bazaraa, Jarvis and Sherali.  Linear Programming and Network Flows.
   <i>Grad level.</i>
<LI>
   Bertsimas, Dimitris and  Tsitsiklis, John, <a
   href="http://world.std.com/~athenasc/linoptbook.html">Introduction to
   Linear Optimization</a>.  Athena Scientific, 1997 (ISBN
   1-886529-19-1).  <i>Graduate-level text on linear programming,
   network flows, and discrete optimization.</i>
<LI>
<A NAME="Chvatal">
   Chvatal</A>, Linear Programming, Freeman, 1983.  <i>Undergrad or grad.</i>
<LI> 
   Cook, W.J., Cunningham, W.H., Pulleyblank, W.R. and Schrijver, A.
   <a
   href="http://math.uwaterloo.ca/~whcunnin/bookpage.html">Combinatorial
   Optimization</a>, Wiley Interscience, 1997.
<LI>
   Daellenbach, Hans G., A User's Guide to Linear Programming.  <i>Good
   for engineers.  Currently out of print.</i>
<LI>
   Fang, S.-C. &amp; Puthenpura, S., Linear Optimization and
   Extensions: Theory and Algorithms.  Prentice Hall, 1993.
<LI>
   Dantzig, George B., Linear Programming and Extensions,
   Princeton University Press, 1963..  <i>The most widely
   cited early textbook in the field.</i>
<LI>
   Dantzig, George B. and Thapa, Mukund N., Linear Programming 1:
   Introduction, Springer Verlag, 1997..
<LI>
   Gass, Saul I., Linear Programming: Methods and Applications, 5th edition.
   International Thomson Publishing, 1985..  <i>The author
   received the 1997 INFORMS Expository Writing Award.</i>
<LI>
   Ignizio, J.P. &amp; Cavalier, T.M.,  <A
   HREF="http://www.personal.psu.edu/tmc7/lpbook.html">   Linear
   Programming</A>, Prentice Hall, 1994.  <i>Covers usual LP topics, plus
   interior point,  multi-objective and  heuristic techniques.</i>
<LI>
   Luenberger, Introduction to Linear and Nonlinear Programming,
   Addison Wesley, 1984.  <i>Updated version of an old standby.  The
   author received the 1999 INFORMS Expository Writing Award.</i>
<LI>
<A NAME="Murtagh">
   Murtagh, B.</A>, Advanced Linear Programming: Computation and
   Practice. McGraw-Hill, 1981.  <i>Good one after you've read an
   introductory text.  Currently out of print.</i>
<LI>
   Murty, K., Linear and Combinatorial Programming.
<LI>
   Nash, S., and Sofer, A.,
   <A HREF="http://www.gmu.edu/departments/ore/books/Nash-Sofer.html">Linear
   and Nonlinear Programming</A>, McGraw-Hill, 1996.
<LI>
   Nazareth, J.L., Computer Solution of Linear Programs,
   Oxford University Press, New York and Oxford, 1987.
<LI>
   Nemhauser, G.L. and Wolsey, L.A., Integer and Combinatorial
   Optimization, Wiley Interscience, 1988.  <i>An advanced text that
   covers many theortical and computational topics.</i>
<LI>
   Nering, E.D. &amp; Tucker, A.W., Linear Programs and Related Problems,
   Academic Press, 1993.
<LI>
   Roos, Terlaky and Vial, <a href="http://ssor.twi.tudelft.nl/Publications/Books/TAfLOAIPM/ipmbook.html">Theory
   and Algorithms for Linear Optimization: An Interior Point
   Approach</a>.  John Wiley, Chichester, 1997
<LI>
   Saigal, R., Linear Programming: A Modern Integrated Analysis, Kluwer
   Academic Publishers, 1995.
<LI>
<A NAME="Schrijver">
   Schrijver, A.</A>, Theory of Linear and Integer Programming, Wiley,
   1986.  <i>Advanced.</i>
<LI>
   Taha, H., Operations Research: An Introduction, 1987.
<LI>
   Thie, P.R., An Introduction to Linear Programming and Game Theory,
   Wiley, 1988.
<LI>
   Vanderbei, Robert J., <a
   href="http://www.princeton.edu/~rvdb/LPbook/">Linear Programming:
   Foundations and Extensions</a>.  Kluwer Academic Publishers, 1996.
   <i>Balanced coverage of simplex and interior-point methods.  Source
   code available on-line for all algorithms presented.</i>
<LI>
<A NAME="Williams">
   Williams, H.P.</A>, Model Building in Mathematical Programming, Wiley
   1993, 3rd edition.  <i>Little on algorithms, but excellent for
   learning what makes a good model.</i>
<LI>
   Wright, Stephen J., <A
   HREF="http://www.siam.org/books/swright/">Primal-Dual Interior-Point
   Methods</A>. <A HREF="http://www.siam.org/catalog/cathome.htm">SIAM
   Publications</A>, 1997.  <i>Covers theoretical, practical and
   computational aspects of the most important and useful class of
   interior-point algorithms.  The <A
   HREF="http://www.siam.org/books/swright/">web page</A> for this book
   contains current information on interior-point codes for linear
   programming, including links to their websites.</i>
<LI>
   Ye, Yinyu, <A
   HREF="http://dollar.biz.uiowa.edu/col/ye/book.html">Interior Point
   Algorithms: Theory and Analysis</A>.  Wiley, 1997.
</UL>

<H4>
<A NAME="modeling_systems">
Presentations of LP modeling systems
(usable as texts for some classes)</A>
</H4>
<UL>
<LI>
   Bisschop and Roelofs, <A
   HREF="http://www.aimms.com/Documentation/index.html">AIMMS</A>
   Optimization Modeling and AIMMS User's Guide, Paragon Decision
   Technology, 1999.
<LI>
   Brooke, Kendrick &amp; Meeraus, <A HREF="http://www.gams.com/">GAMS</A>: A
   Users' Guide, The Scientific Press/Duxbury Press, 1988.
<LI>
   Fourer, Gay &amp; Kernighan, <A
   HREF="http://www.ampl.com/ampl/BOOK/">AMPL</A>:  A Modeling Language
   for Mathematical Programming, Duxbury Press, 1992.  <i>Comes with
   Windows "student" version including MINOS 5.5 and CPLEX 6.5.</i>
<LI>
   Greenberg, H.J., Modeling by Object-Driven Linear Elemental
   Relations: A User's Guide for <A
   HREF="http://www.cudenver.edu/~hgreenbe/imps/modler.html">MODLER</A>,
   Kluwer Academic Publishers, 1993.
<LI>
<A NAME="Schrage">
   Schrage, L.</A>, Optimization Modeling with <A
   HREF="http://www.lindo.com/">LINDO</A>, 5th edition, Duxbury Press,
   1997.
</UL>

<H4>
<A NAME="books_with_source">
Books containing source code
</A>
</H4>
<UL>
<LI>
   Best and Ritter, Linear Programming: active set analysis and
   computer programs, Prentice-Hall, 1985.
<LI>
<A NAME="Bertsekas">
   Bertsekas, D.P.</A>, Linear Network Optimization: Algorithms and Codes,
   MIT Press, 1991.
<LI>
   Bunday and Garside, Linear Programming in Pascal, Edward Arnold
   Publishers, 1987.
<LI>
   Bunday, Linear Programming in Basic (presumably the same publisher).
<LI>
<A NAME="Burkard">
   Burkard and Derigs</A>, Springer Verlag Lecture Notes in Math Systems
   #184 (the Assignment Problem and others).
<LI>
<A NAME="Kennington">
   Kennington &amp; Helgason</A>, Algorithms for Network Programming, Wiley,
   1980.  (A special case of LP; contains Fortran source code.)
<LI>
   Lau, H.T., <A HREF="http://www.crcpress.com/catalog/7376.htm">A
   Numerical Library in C for Scientists and Engineers</A>, 1994, CRC
   Press.  (Contains a section on optimization.)
<LI>
<A NAME="Martello">
   Martello and Toth</A>, Knapsack Problems: Algorithms and Computer
   Implementations, Wiley, 1990.  (Contains Fortran code, comes with a
   disk - also covers Assignment Problem.)
<LI>
<A NAME="Press">
   Press, Flannery, Teukolsky &amp; Vetterling</A>, Numerical Recipes,
   Cambridge, 1986.    (Comment: use their LP code with care.)
<LI>
<A NAME="Syslo">
   Syslo, Deo &amp; Kowalik</A>, Discrete Optimization Algorithms with Pascal
   Programs, Prentice-Hall (1983).  (Contains code for 28 algorithms
   such as Revised Simplex, MIP, networks.)
</UL>

<H4>
<A NAME="additional">
Additional books
</H4>
<UL>
<LI>
   Ahuja, Magnanti &amp; Orlin, Network Flows, Prentice Hall, 1993.
<LI>
   Beasley, J.E., ed., <a
   href="http://mscmga.ms.ic.ac.uk/jeb/book/book.html">Advances in Linear
   and Integer Programming</a>. Oxford University Press, 1996.  <i>Each
   chapter is a self-contained essay on one aspect of the subject.</i>
<!--- <LI>
<A NAME="Bentley">
   Bentley, J.L.</A>, "Writing Efficient Programs," Prentice Hall, 1982. --->
<LI>
   Bondy &amp; Murty, Graph Theory with Applications.
<LI>
<A NAME="Chandru">
   Chandru and Hooker, Optimization Methods for Logical Inference,
   Wiley-Interscience, 1999.
<LI>
<A NAME="Edelsbrunner">
   Edelsbrunner</A>, Algorithms in Combinatorial Geometry, Springer Verlag,
   1987.
<LI>
   Forsythe, Malcolm &amp; Moler, Computer Methods for Mathematical
   Computations, Prentice-Hall.
<LI>
   Gill, Murray and Wright, Numerical Linear Algebra and Optimization,
   Addison-Wesley, 1991.
<LI>
   Greenberg, H.J., A Computer-Assisted Analysis System for
   Mathematical Programming Models and Solutions: A User's Guide for
   <A HREF="http://www.cudenver.edu/~hgreenbe/imps/analyze.html">ANALYZE</A>,
   Kluwer Academic Publishers, 1993.
<LI>
<A NAME="Hooker">
   Hooker, Logic-Based Methods for Optimization, Wiley-Interscience, 2000.
<LI>
<A NAME="Hwang">
   Hwang &amp; Yoon</A>, Multiple Attribute Decision Making : Methods and
   Applications, Springer-Verlag, Lecture Notes #186.
<LI>
<A NAME="Lawler">
   Lawler, Lenstra, et al</A>, The Traveling Salesman Problem, Wiley, 1985.

<LI>
   More' &amp; Wright, Optimization Software Guide, SIAM Publications,
   1993.  See also the <A
   HREF="http://www.mcs.anl.gov/otc/Guide/SoftwareGuide/">NEOS Guide to
   Optimization Software</A>.

<LI>
   Murty, Network Programming, Prentice Hall, 1992.
<LI>
   Papadimitriou &amp; Steiglitz, Combinatorial Optimization.  (Also contains
   a discussion of complexity of Simplex method.)
<LI>
   Reeves, C.R., ed., Modern Heuristic Techniques for Combinatorial
   Problems, Halsted Press (Wiley), 1993.  (Contains chapters on tabu
   search, simulated annealing, genetic algorithms, neural nets, and
   Lagrangian relaxation.)
<LI>
<A NAME="Reinelt">
   Reinelt, G.</A>, The Travelling Salesman: Computational Solutions for TSP
   Applications, Springer-Verlag Lecture Notes in Computer
   Science #840, 1994.
<LI>
   Rockafellar, R.T., Network Flows and Monotropic Optimization, Athena 
   Scientific, 1984, reprinted 1998.
</UL>

<H4>
<A NAME="periodicals">
Periodicals
</H4>
<UL>

<LI>
Publications of <a href=http://www.informs.org/>INFORMS</a>, the principal
operations research and management science society in the United States:
<UL>
<LI><a href=http://lionhrtpub.com/ORMS.html><i>OR/MS Today</i></a>, the
bimonthly newsletter of INFORMS, includes case studies, software
reviews, and software surveys relevant to linear programming.  It also
has the most extensive collection of advertisements for commercial
linear programming (and other optimization) software packages.
<LI><a
href=http://silmaril.smeal.psu.edu/interfaces/><i>Interfaces</i></a>
frequently publishes interesting accounts of applications that make use
of linear programming.
<LI><a href=http://www.informs.org/Pubs/Jocedit.html><i>INFORMS Journal on
Computing</i></a> includes some articles on the computational aspects of
linear programming algorithms.
<LI><a
href=http://catt.bus.okstate.edu/itorms/volumes/index.html><i>Interactive
Transactions of OR/MS</i></a> contains a number of useful surveys and
bibliographies relevant to linear programming.
</UL>

<LI>
Publications of the <a
href=http://www.caam.rice.edu/~mathprog/>Mathematical Programming
Society</a>:
<UL>
<LI>
<a href=http://www.caam.rice.edu/~mathprog/mpsjournal/><i>Mathematical
Programming</i></a> contains technical articles on theory and
computation.  
<LI>
<a href=http://www.ise.ufl.edu/~optima/><i>Optima</i></a>, the Society's
newsletter, incorporates survey articles and book reviews.
</UL>

<LI>
Publications of <a href=http://www.siam.org>SIAM</a>, the principal
applied mathematics society in the United States:
<UL>
<LI>
<a href=http://www.siam.org/journals/siopt/siopt.htm><i>SIAM Journal on
Optimization</i></a> contains technical articles, mainly of a mathematical
nature.
<LI>
<i><a href=http://iris.gmu.edu/~asofer/siagopt.html>SIAG/OPT</a> Newsletter</i>, from the SIAM Activity Group on Optimization.
</UL>

<LI>
Publisher-sponsored technical journals focusing on optimization topics:
<UL>
<LI>
<a href=http://kapis.www.wkap.nl/kapis/CGI-BIN/WORLD/journalhome.htm?0926-6003><i>Computational Optimization and Applications</i></a> (and allied <a href=http://www.math.ufl.edu/~coap>Software Forum</a>)
<LI>
<a href=http://kapis.www.wkap.nl/journalhome.htm/1383-7133><i>Constraints</i></a>
<LI>
<a href=http://www.plenum.com/cgi/getarec?ple20000150><i>Journal of Optimization Theory and Applications</i></a>
<LI>
<a href=http://www.gbhap-us.com/journals/191/191-top.htm><i>Optimization Methods and Software</i></a>
</UL>

</UL>

<H4>
<A NAME="articles">
Articles of interest
</H4>
<UL>
<LI>
<A NAME="Avis">
   Avis &amp; Fukuda</A>, "A Pivoting Algorithm for Convex Hulls and Vertex
   Enumeration of Arrangements and Polyhedra", Discrete and
   Computational Geometry, 8 (1992), 295--313.
<LI>
<A NAME="Balas">
   Balas, E. and Martin, C.</A>, "Pivot And Complement: A Heuristic For 0-1
   Programming Problems", Management Science, 1980, Vol 26, pp 86-96.
<LI>
<A NAME="Balinski">
   Balinski, M.L.</A>, "An Algorithm for Finding all Vertices of Convex
   Polyhedral Sets", SIAM J. 9, 1, 1961.
<LI>
<A NAME="Carpaneto">
   Carpaneto</A>, Dell'amico &amp; Toth, "A Branch-and-bound Algorithm for
   Large Scale Asymmetric Travelling Salesman Problems,"
   <i>ACM Transactions on Mathematical Software</i> 21 (1995) 410-415.
<LI>
<A NAME="Haessler">
   Haessler, "Selection and Design of Heuristic Procedures for Solving
   Roll Trim Problems," <i>Management Science</i> 12 (1988) 1460-1471.
<LI>
   Lustig, Marsten and Shanno, "Interior Point Methods for Linear
   Programming: Computational State of the Art", ORSA Journal on
   Computing, Vol. 6, No. 1, Winter 1994, pp. 1-14.  Followed by
   commentary articles, and a rejoinder by the authors.
<LI>
   Marsten, Subramanian, Shanno, Saltzman and Lustig, "Interior point
   methods for linear programming: Just call Newton, Lagrange, and
   Fiacco and McCormick!" Interfaces, Vol. 20, No. 4 (1990) pp. 105-116.
<LI>
<A NAME="Mattheis">
   Mattheis and Rubin</A>, "A Survey and Comparison of Methods for Finding
   All Vertices of Convex Polyhedral Sets", Mathematics of Operations
   Research, vol. 5 no. 2 1980, pp. 167-185.
<LI>
<A NAME="Seidel">
   Seidel</A>, "Constructing Higher-Dimensional Convex Hulls at Logarithmic
   Cost per Face", 1986, 18th ACM STOC, 404--413.
<LI>
Smale, Stephen, "On the Average Number of Steps in the Simplex
   Method of Linear Programming", Math Programming 27 (1983), 241-262.
<LI>
<A NAME="Swart">
   Swart</A>, "Finding the Convex Hull Facet by Facet", Journal of
   Algorithms, 6 (1985), 17--48.
<LI>
<A NAME="Sweeney">
  P.E. Sweeney and E.R. Paternoster, "Cutting and Packing Problems: A
  Categorized, Application-Oriented Research Bibliography," <i>Journal
  of the Operational Research Society</i> 43 (1992) 691-706.
<LI>
<A NAME="Volgenant">
   Volgenant, A.</A>, Symmetric TSPs, European Journal of Operations Research,
   49 (1990) 153-154.
<P>
<LI>
   A special issue of <i><a
   href=http://www.gbhap.com/journals/191/191-top.htm>Optimization
   Methods and Software</a></i> (volumes 11-12, December 1999) is
   devoted to interior-point methods and includes a supplementary CD
   with related sofware.
</UL>

<H3> <A NAME="Q8">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q8.  "What's available online in this field?"
</H3>

<B>A:</B>  Though traditional publications may remain the best places
to learn about optimization theory and algorithms, the Web is the place
to go for optimization software.  In addition to numerous sources of
optimization codes and optimization-related home pages, the Web is
increasingly a source of <i>optimization services</i> that let you try
out solvers without having to install them on your own equipment.

<H4>
<A NAME="online_services">
On-line sources of optimization services</A>
</H4>
The following websites offer, in some sense, to run your linear or
integer programming problem and return a result.  Check their home
pages for details, which vary considerably.  (See also the analogous
listing in the <a href="nonlinear-programming-faq.html">NLP FAQ</a>.)

<UL>
<LI>
<a href="http://www.ampl.com/ampl/TRYAMPL">AMPL</a>.  A convenient
interface supports experimentation with the AMPL modeling language on
test problems up to 300 variables and 300 constraints + objectives.
Users can request any example from the AMPL book, or provide their own
model and data files.  There is a choice among 8 solvers for linear and
integer programming (as well as nonlinear optimization and
complementarity problems).
<P>

<LI>
<a href="http://dnet.sm.nps.navy.mil/">DecisionNet</a>.  Provides access
to "a distributed collection of decision technologies," including
linear programming, "that are made available for execution over the
World Wide Web. These technologies are developed and maintained locally
by their providers.  DecisionNet contains technology metainformation
necessary to guide consumers in search, selection, and execution of
these technologies."  Facilities for submitting problems in popular
modeling language formats are currently being tested.
<P>

<LI>
<a href=http://giden.iems.nwu.edu/>GIDEN</a>.  An interactive
graphical environment for a variety of network optimization problems
and algorithms.  It is written in Java, so you can try it out through
any Java-enabled Web browser.
<P>

<LI>
<a href=http://www2-iiuf.unifr.ch/tcs/lpl/lplwww/lplfile.html>LPL</a>.
Small problems modeled in the LPL language can be submitted by typing
or pasting into a web form or by specifying a filename.  Results are
returned on a subsequent web page.
<P>

<LI>
<a href=http://pinnacle.edrc.cmu.edu:8080/milp.shtml>MILP</a> by Dmitry
V. Golovashkin.  Small-scale mixed-integer programs in a simple
algebraic format are solved through a web form interface.
<P>

<LI> 
<a href="http://www-neos.mcs.anl.gov/">Network-Enabled
Optimization System (NEOS) Server</a>.  Offers access to over a dozen
solvers for linear and integer programming as well as various nonlinear
optimization problems.  
   <ul>
   <li>Linear and integer programs are accepted in <a href="#Q5">MPS
format</a> or in modeling languages such as AMPL and GAMS.
   <li>Submissions may be made by sending e-mail, by submitting names
of local files through a Web form, or via a socket-based
submission tool available in Java and Unix tcl/tk versions.
   </ul>
<P>

<LI>
<a href=http://fb0445.mathematik.tu-darmstadt.de:8081/>Numerische
Mathematik Interaktiv</a> includes <a
href=http://fb0445.mathematik.tu-darmstadt.de:8081/optiwww/themen.html>OptiW&#179;</a>,
a teaching tool for various linear and nonlinear optimization methods
(in German).
<P>

<LI>
<a href="http://riot.ieor.berkeley.edu/riot/">RIOT</a>.  The Remote
Interactive Optimization Testbed at Berkeley's Industrial Engineering
and Operations Research Department, offering online demonstrations of
numerous optimization tools and applications.

</UL>

A more extensive survey appears in <a
href=http://silmaril.smeal.psu.edu/interfaces/ebiz/fourer.html>Optimization
as an Internet Resource</a> by R. Fourer and J.-P. Goux,
in the INFORMS journal <i>Interfaces,</i> volume 31, number 2 (2001).
<P>

<H4> 
<A NAME="online_software">
Online sources of optimization software</A>
</H4>

The <A HREF="http://www.netlib.org/">Netlib Repository</A> contains a
huge collection of mathematical software, papers, and databases,
maintained at the University of Tennessee, Knoxville and Oak Ridge
National Laboratory.  There are also mirror sites in the <A
HREF="http://netlib.bell-labs.com/netlib/master/readme.html">United
States</A>, <A
HREF="http://www.netlib.no/netlib/master/readme.html">Norway</A>, the
<A HREF="http://www.hensa.ac.uk/ftp/mirrors/netlib/">United
Kingdom</A>, and <a href="http://www.netlib.org/bib/mirrors.html">other
locations</a>.  Once you know what you want from Netlib, you may may
prefer to make requests by anonymous ftp or e-mail; alternative access
methods and many other relevant matters are explained in the <a
href="http://www.netlib.org/misc/faq.html">Netlib FAQ</a>.
<P>

Many optimization packages are distributed from their own Web sites.
Numerous links to these sites are provided elsewhere in this FAQ,
especially under the <A HREF="#Q2">Where is there good software?</A>
question.

<H4> 
<A NAME="online_information">
Online sources of optimization information</A>
</H4>

Varied general sources on optimization include information
on linear and integer programming.  They include:

<UL>
<LI> The <a href=http://www.optimization-online.org>Optimization
Online</a> repository of papers and reports on optimization.
Contributions are accepted from anyone working in the field, and are
moderated by a team of volunteer coordinators; you can subscribe to a
<a href=http://www.optimization-online.org/cgi-bin/digest.cgi>monthly
digest</a> that summarizes reports recently received.<p>

<LI>The <a
href=http://www.e-optimization.com/>e-Optimization.com</a>munity, a
web meeting place for optimization users and developers, featuring a
who's who of people in optimization as well as listings of optimization
resources, applications, vendors, case studies, and news.<p>

<LI>
The <A HREF="http://www.mcs.anl.gov/otc/Guide/">NEOS Guide</A> of the
Argonne/Northwestern <a href=http://www.ece.nwu.edu/OTC/>Optimization
Technology Center</a>.<p>

<LI>
The <A HREF="http://plato.la.asu.edu/guide.html">Decision Tree for
Optimization Software</A> by Hans Mittelmann and P. Spellucci, and the
related <a href="http://plato.la.asu.edu/bench.html">Benchmarks for
Optimization Software</a>.<p>

<LI>
Harvey Greenberg's <a
href="http://www.cudenver.edu/~hgreenbe/glossary/glossary.html">Mathematical
Programming Glossary</a> and <A
HREF="http://www.cudenver.edu/~hgreenbe/imps/impsbib/impsbib.html">Bibliography
for the Development of An Intelligent Mathematical Programming
System</A>.<p>

<LI>
Listings of optimization software and related information at the <A HREF="http://www.ici.ro/camo">Center for Advanced Modeling and Optimization</A>.
</UL>

More specialized sources include:

<UL>
<LI> <A
HREF="http://www-unix.mcs.anl.gov/otc/InteriorPoint/">Interior-Point
Methods Online</A>, containing most new reports
in the area of interior-point methods that have appeared since December
1994. Abstracts for all reports are available, as are links to
postscript source for most reports; a <a
href="http://www-unix.mcs.anl.gov/otc/InteriorPoint/subscribe.html">mailing
list</a> carries announcements of new papers, conferences, software,
and special journal issues relevant to interior-point methods.<P>

<LI>
A bibliography of books and papers on <A
HREF="http://www.netlib.org/bib/ipmbib.bbl">Interior-Point
methods</A> (including many older ones) compiled by Eberhard Kranich.<P>

<LI>
A resource website in <A
HREF="http://www.zib.de/helmberg/semidef.html">semidefinite
programming</A> maintained by Christoph Helmberg, and a <a
href=http://liinwww.ira.uka.de/bibliography/Math/psd.html>semidefinite
programming bibliography</a> by Henry Wolkowicz.<P>

<LI>
An extensive bibliography for <a
href="http://mally.eco.rug.nl/biblio/stoprog.html">stochastic
programming</a> and a specialized one for <a
href="http://mally.eco.rug.nl/biblio/sip.html">stochastic integer
programming</a>, compiled by Maarten van der Vlerk.
</UL>

The following sites cover operations research and management science
more generally, but have a large amount of content relevant to linear
programming and other optimization problems:

<UL>
<LI>
<A HREF="http://mat.gsia.cmu.edu/">Michael Trick's Operations Research
Page</A>.<P>

<LI>
<A HREF="http://www.informs.org/">INFORMS Online</A>, the website of
the Institute for Operations Research and the Management Sciences,
including searchable databases of the twice-a-year INFORMS conferences
going back to 1990, and publications in operations research back to
1982.<P>

<LI>
<A HREF="http://www.worms.ms.unimelb.edu.au/toc.html">WORMS</A>
(World-Wide-Web for Operations Research and Management Science) at the
Department of Mathematics and Statistics, University of Melbourne,
Australia.
<BR>&nbsp;
</UL>
<P>

<H3> <A NAME="Q9">
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
</A>
Q9.  "Who maintains this FAQ list?"
</H3>

A: This list is maintained by <A
HREF="http://iems.nwu.edu/~4er">Robert Fourer</A> (<A
HREF="mailto:4er@iems.nwu.edu"><tt>4er@iems.nwu.edu</tt></A>) and the
<a href="http://www.ece.nwu.edu/OTC/">Optimization Technology
Center</A> of Northwestern University and Argonne National Laboratory.

<P>
This article is Copyright &copy; 2000 by Robert Fourer.
It may be freely redistributed in its entirety provided that this
copyright notice is not removed.  It may not be sold for profit or
incorporated in commercial documents without the written permission of
the copyright holder.  Permission is expressly granted for this
document to be made available for file transfer from installations
offering unrestricted anonymous file transfer on the Internet.

<P>
The material in this document does not reflect any official position
taken by any organization.  While all information in this article is
believed to be correct at the time of writing, it is provided "as is"
with no warranty implied.

<P>
If you wish to cite this FAQ formally -- this may seem strange, but it
does come up -- you may use: <BLOCKQUOTE>

  Robert Fourer (4er@iems.nwu.edu), "Linear Programming Frequently
  Asked Questions," Optimization Technology Center of Northwestern
  University and Argonne National Laboratory,
  <tt>http://www-unix.mcs.anl.gov/otc/Guide/faq/
  linear-programming-faq.html</tt> (2000).

</BLOCKQUOTE>
<!---
There's a mail server on <tt>rtfm.mit.edu</tt>, so if you don't have FTP
privileges, you can send an e-mail message to
<tt>mail-server@rtfm.mit.edu</tt> containing:
<PRE>
    send usenet/sci.answers/nonlinear-programming-faq
</PRE>
as the body of the message to receive the latest version (it is posted
on the first working day of each month).  This FAQ is cross-posted to
<tt>news.answers</tt> and <tt>sci.op-research</tt>.<P>
--->

Suggestions, corrections, topics you'd like to see covered, and
additional material are all solicited.  Send them to <A
HREF="mailto:4er@iems.nwu.edu"><tt>4er@iems.nwu.edu</tt></A>.
<P>
<IMG ALT=" " SRC="_gifs/colorbar.gif"><p>
END linear-programming-faq
