
In particular, the following things are done: *) Consistent tabulation of 4 spaces is ensured *) New function dprintf() is introduced, so now printing of the debug information can be turned on/off via the ALEX_DEBUG macro *) Removed solveLP_aux namespace *) All auxiliary functions are declared as static *) The return codes of solveLP() are encapsulated in enum.
49 lines
2.3 KiB
ReStructuredText
49 lines
2.3 KiB
ReStructuredText
Linear Programming
|
|
==================
|
|
|
|
.. highlight:: cpp
|
|
|
|
optim::solveLP
|
|
--------------------
|
|
Solve given (non-integer) linear programming problem using the Simplex Algorithm (Simplex Method).
|
|
What we mean here by "linear programming problem" (or LP problem, for short) can be
|
|
formulated as:
|
|
|
|
.. math::
|
|
\mbox{Maximize } c\cdot x\\
|
|
\mbox{Subject to:}\\
|
|
Ax\leq b\\
|
|
x\geq 0
|
|
|
|
Where :math:`c` is fixed *1*-by-*n* row-vector, :math:`A` is fixed *m*-by-*n* matrix, :math:`b` is fixed *m*-by-*1* column vector and
|
|
:math:`x` is an arbitrary *n*-by-*1* column vector, which satisfies the constraints.
|
|
|
|
Simplex algorithm is one of many algorithms that are designed to handle this sort of problems efficiently. Although it is not optimal in theoretical
|
|
sense (there exist algorithms that can solve any problem written as above in polynomial type, while simplex method degenerates to exponential time
|
|
for some special cases), it is well-studied, easy to implement and is shown to work well for real-life purposes.
|
|
|
|
The particular implementation is taken almost verbatim from **Introduction to Algorithms, third edition**
|
|
by T. H. Cormen, C. E. Leiserson, R. L. Rivest and Clifford Stein. In particular, the Bland's rule
|
|
(`http://en.wikipedia.org/wiki/Bland%27s\_rule <http://en.wikipedia.org/wiki/Bland%27s_rule>`_) is used to prevent cycling.
|
|
|
|
.. ocv:function:: int optim::solveLP(const Mat& Func, const Mat& Constr, Mat& z)
|
|
|
|
:param Func: This row-vector corresponds to :math:`c` in the LP problem formulation (see above).
|
|
|
|
:param Constr: *m*-by-*n\+1* matrix, whose rightmost column corresponds to :math:`b` in formulation above and the remaining to :math:`A`.
|
|
|
|
:param z: The solution will be returned here as a row-vector - it corresponds to (transposed) :math:`c` in the formulation above.
|
|
|
|
:return: One of the return codes:
|
|
|
|
::
|
|
|
|
//!the return codes for solveLP() function
|
|
enum
|
|
{
|
|
SOLVELP_UNBOUNDED = -2, //problem is unbounded (target function can achieve arbitrary high values)
|
|
SOLVELP_UNFEASIBLE = -1, //problem is unfeasible (there are no points that satisfy all the constraints imposed)
|
|
SOLVELP_SINGLE = 0, //there is only one maximum for target function
|
|
SOLVELP_MULTI = 1 //there are multiple maxima for target function - the arbitrary one is returned
|
|
};
|