doc/glpk01.tex
changeset 2 4c8956a7bdf4
equal deleted inserted replaced
-1:000000000000 0:0315aeb3b8d6
       
     1 %* glpk01.tex *%
       
     2 
       
     3 \chapter{Introduction}
       
     4 
       
     5 GLPK (\underline{G}NU \underline{L}inear \underline{P}rogramming
       
     6 \underline{K}it) is a set of routines written in the ANSI C programming
       
     7 language and organized in the form of a callable library. It is intended
       
     8 for solving linear programming (LP), mixed integer programming (MIP),
       
     9 and other related problems.
       
    10 
       
    11 \section{LP problem}
       
    12 \label{seclp}
       
    13 
       
    14 GLPK assumes the following formulation of {\it linear programming (LP)}
       
    15 problem:
       
    16 
       
    17 \medskip
       
    18 
       
    19 \noindent
       
    20 \hspace{.5in} minimize (or maximize)
       
    21 $$z = c_1x_{m+1} + c_2x_{m+2} + \dots + c_nx_{m+n} + c_0 \eqno (1.1)$$
       
    22 \hspace{.5in} subject to linear constraints
       
    23 $$
       
    24 \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r}
       
    25 x_1&=&a_{11}x_{m+1}&+&a_{12}x_{m+2}&+ \dots +&a_{1n}x_{m+n} \\
       
    26 x_2&=&a_{21}x_{m+1}&+&a_{22}x_{m+2}&+ \dots +&a_{2n}x_{m+n} \\
       
    27 \multicolumn{7}{c}
       
    28 {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .} \\
       
    29 x_m&=&a_{m1}x_{m+1}&+&a_{m2}x_{m+2}&+ \dots +&a_{mn}x_{m+n} \\
       
    30 \end{array} \eqno (1.2)
       
    31 $$
       
    32 \hspace{.5in} and bounds of variables
       
    33 $$
       
    34 \begin{array}{r@{\:}c@{\:}c@{\:}c@{\:}l}
       
    35 l_1&\leq&x_1&\leq&u_1 \\
       
    36 l_2&\leq&x_2&\leq&u_2 \\
       
    37 \multicolumn{5}{c}{.\ \ .\ \ .\ \ .\ \ .}\\
       
    38 l_{m+n}&\leq&x_{m+n}&\leq&u_{m+n} \\
       
    39 \end{array} \eqno (1.3)
       
    40 $$
       
    41 where: $x_1, x_2, \dots, x_m$ are auxiliary variables;
       
    42 $x_{m+1}, x_{m+2}, \dots, x_{m+n}$ are\linebreak structural variables;
       
    43 $z$ is the objective function;
       
    44 $c_1, c_2, \dots, c_n$ are objective coefficients;
       
    45 $c_0$ is the constant term (``shift'') of the objective function;
       
    46 $a_{11}, a_{12}, \dots, a_{mn}$ are constraint coefficients;
       
    47 $l_1, l_2, \dots, l_{m+n}$ are lower bounds of variables;
       
    48 $u_1, u_2, \dots, u_{m+n}$ are upper bounds of variables.
       
    49 
       
    50 Auxiliary variables are also called {\it rows}, because they correspond
       
    51 to rows of the constraint matrix (i.e. a matrix built of the constraint
       
    52 coefficients). Similarly, structural variables are also called
       
    53 {\it columns}, because they correspond to columns of the constraint
       
    54 matrix.
       
    55 
       
    56 Bounds of variables can be finite as well as infinite. Besides, lower
       
    57 and upper bounds can be equal to each other. Thus, the following types
       
    58 of variables are possible:
       
    59 \begin{center}
       
    60 \begin{tabular}{r@{}c@{}ll}
       
    61 \multicolumn{3}{c}{Bounds of variable} & Type of variable \\
       
    62 \hline
       
    63 $-\infty <$ &$\ x_k\ $& $< +\infty$ & Free (unbounded) variable \\
       
    64 $l_k \leq$ &$\ x_k\ $& $< +\infty$  & Variable with lower bound \\
       
    65 $-\infty <$ &$\ x_k\ $& $\leq u_k$  & Variable with upper bound \\
       
    66 $l_k \leq$ &$\ x_k\ $& $\leq u_k$   & Double-bounded variable \\
       
    67 $l_k =$ &$\ x_k\ $& $= u_k$         & Fixed variable \\
       
    68 \end{tabular}
       
    69 \end{center}
       
    70 \noindent
       
    71 Note that the types of variables shown above are applicable to
       
    72 structural as well as to auxiliary variables.
       
    73 
       
    74 To solve the LP problem (1.1)---(1.3) is to find such values of all
       
    75 structural and auxiliary variables, which:
       
    76 
       
    77 $\bullet$ satisfy to all the linear constraints (1.2), and
       
    78 
       
    79 $\bullet$ are within their bounds (1.3), and
       
    80 
       
    81 $\bullet$ provide the smallest (in case of minimization) or the largest
       
    82 (in case of maximization) value of the objective function (1.1).
       
    83 
       
    84 \section{MIP problem}
       
    85 
       
    86 {\it Mixed integer linear programming (MIP)} problem is LP problem in
       
    87 which some variables are additionally required to be integer.
       
    88 
       
    89 GLPK assumes that MIP problem has the same formulation as ordinary
       
    90 (pure) LP problem (1.1)---(1.3), i.e. includes auxiliary and structural
       
    91 variables, which may have lower and/or upper bounds. However, in case of
       
    92 MIP problem some variables may be required to be integer. This
       
    93 additional constraint means that a value of each {\it integer variable}
       
    94 must be only integer number. (Should note that GLPK allows only
       
    95 structural variables to be of integer kind.)
       
    96 
       
    97 \section{Using the package}
       
    98 
       
    99 \subsection{Brief example}
       
   100 
       
   101 In order to understand what GLPK is from the user's standpoint,
       
   102 consider the following simple LP problem:
       
   103 
       
   104 \medskip
       
   105 
       
   106 \noindent
       
   107 \hspace{.5in} maximize
       
   108 $$z = 10 x_1 + 6 x_2 + 4 x_3$$
       
   109 \hspace{.5in} subject to
       
   110 $$
       
   111 \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r}
       
   112 x_1 &+&x_2 &+&x_3 &\leq 100 \\
       
   113 10 x_1 &+& 4 x_2 & +&5 x_3 & \leq 600 \\
       
   114 2 x_1 &+& 2 x_2 & +& 6 x_3 & \leq 300 \\
       
   115 \end{array}
       
   116 $$
       
   117 \hspace{.5in} where all variables are non-negative
       
   118 $$x_1 \geq 0, \ x_2 \geq 0, \ x_3 \geq 0$$
       
   119 
       
   120 At first this LP problem should be transformed to the standard form
       
   121 (1.1)---(1.3). This can be easily done by introducing auxiliary
       
   122 variables, by one for each original inequality constraint. Thus, the
       
   123 problem can be reformulated as follows:
       
   124 
       
   125 \medskip
       
   126 
       
   127 \noindent
       
   128 \hspace{.5in} maximize
       
   129 $$z = 10 x_1 + 6 x_2 + 4 x_3$$
       
   130 \hspace{.5in} subject to
       
   131 $$
       
   132 \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r}
       
   133 p& = &x_1 &+&x_2 &+&x_3 \\
       
   134 q& = &10 x_1 &+& 4 x_2 &+& 5 x_3 \\
       
   135 r& = &2  x_1 &+& 2 x_2 &+& 6 x_3 \\
       
   136 \end{array}
       
   137 $$
       
   138 \hspace{.5in} and bounds of variables
       
   139 $$
       
   140 \begin{array}{ccc}
       
   141 \nonumber -\infty < p \leq 100 && 0 \leq x_1 < +\infty \\
       
   142 \nonumber -\infty < q \leq 600 && 0 \leq x_2 < +\infty \\
       
   143 \nonumber -\infty < r \leq 300 && 0 \leq x_3 < +\infty \\
       
   144 \end{array}
       
   145 $$
       
   146 where $p, q, r$ are auxiliary variables (rows), and $x_1, x_2, x_3$ are
       
   147 structural variables (columns).
       
   148 
       
   149 The example C program shown below uses GLPK API routines in order to
       
   150 solve this LP problem.\footnote{If you just need to solve LP or MIP
       
   151 instance, you may write it in MPS or CPLEX LP format and then use the
       
   152 GLPK stand-alone solver to obtain a solution. This is much less
       
   153 time-consuming than programming in C with GLPK API routines.}
       
   154 
       
   155 \newpage
       
   156 
       
   157 \begin{verbatim}
       
   158 /* sample.c */
       
   159 
       
   160 #include <stdio.h>
       
   161 #include <stdlib.h>
       
   162 #include <glpk.h>
       
   163 
       
   164 int main(void)
       
   165 {     glp_prob *lp;
       
   166       int ia[1+1000], ja[1+1000];
       
   167       double ar[1+1000], z, x1, x2, x3;
       
   168 s1:   lp = glp_create_prob();
       
   169 s2:   glp_set_prob_name(lp, "sample");
       
   170 s3:   glp_set_obj_dir(lp, GLP_MAX);
       
   171 s4:   glp_add_rows(lp, 3);
       
   172 s5:   glp_set_row_name(lp, 1, "p");
       
   173 s6:   glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0);
       
   174 s7:   glp_set_row_name(lp, 2, "q");
       
   175 s8:   glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 600.0);
       
   176 s9:   glp_set_row_name(lp, 3, "r");
       
   177 s10:  glp_set_row_bnds(lp, 3, GLP_UP, 0.0, 300.0);
       
   178 s11:  glp_add_cols(lp, 3);
       
   179 s12:  glp_set_col_name(lp, 1, "x1");
       
   180 s13:  glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0);
       
   181 s14:  glp_set_obj_coef(lp, 1, 10.0);
       
   182 s15:  glp_set_col_name(lp, 2, "x2");
       
   183 s16:  glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0);
       
   184 s17:  glp_set_obj_coef(lp, 2, 6.0);
       
   185 s18:  glp_set_col_name(lp, 3, "x3");
       
   186 s19:  glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0);
       
   187 s20:  glp_set_obj_coef(lp, 3, 4.0);
       
   188 s21:  ia[1] = 1, ja[1] = 1, ar[1] =  1.0; /* a[1,1] =  1 */
       
   189 s22:  ia[2] = 1, ja[2] = 2, ar[2] =  1.0; /* a[1,2] =  1 */
       
   190 s23:  ia[3] = 1, ja[3] = 3, ar[3] =  1.0; /* a[1,3] =  1 */
       
   191 s24:  ia[4] = 2, ja[4] = 1, ar[4] = 10.0; /* a[2,1] = 10 */
       
   192 s25:  ia[5] = 3, ja[5] = 1, ar[5] =  2.0; /* a[3,1] =  2 */
       
   193 s26:  ia[6] = 2, ja[6] = 2, ar[6] =  4.0; /* a[2,2] =  4 */
       
   194 s27:  ia[7] = 3, ja[7] = 2, ar[7] =  2.0; /* a[3,2] =  2 */
       
   195 s28:  ia[8] = 2, ja[8] = 3, ar[8] =  5.0; /* a[2,3] =  5 */
       
   196 s29:  ia[9] = 3, ja[9] = 3, ar[9] =  6.0; /* a[3,3] =  6 */
       
   197 s30:  glp_load_matrix(lp, 9, ia, ja, ar);
       
   198 s31:  glp_simplex(lp, NULL);
       
   199 s32:  z = glp_get_obj_val(lp);
       
   200 s33:  x1 = glp_get_col_prim(lp, 1);
       
   201 s34:  x2 = glp_get_col_prim(lp, 2);
       
   202 s35:  x3 = glp_get_col_prim(lp, 3);
       
   203 s36:  printf("\nz = %g; x1 = %g; x2 = %g; x3 = %g\n",
       
   204          z, x1, x2, x3);
       
   205 s37:  glp_delete_prob(lp);
       
   206       return 0;
       
   207 }
       
   208 
       
   209 /* eof */
       
   210 \end{verbatim}
       
   211 
       
   212 The statement \verb|s1| creates a problem object. Being created the
       
   213 object is initially empty. The statement \verb|s2| assigns a symbolic
       
   214 name to the problem object.
       
   215 
       
   216 The statement \verb|s3| calls the routine \verb|glp_set_obj_dir| in
       
   217 order to set the optimization direction flag, where \verb|GLP_MAX| means
       
   218 maximization.
       
   219 
       
   220 The statement \verb|s4| adds three rows to the problem object.
       
   221 
       
   222 The statement \verb|s5| assigns the symbolic name `\verb|p|' to the
       
   223 first row, and the statement \verb|s6| sets the type and bounds of the
       
   224 first row, where \verb|GLP_UP| means that the row has an upper bound.
       
   225 The statements \verb|s7|, \verb|s8|, \verb|s9|, \verb|s10| are used in
       
   226 the same way in order to assign the symbolic names `\verb|q|' and
       
   227 `\verb|r|' to the second and third rows and set their types and bounds.
       
   228 
       
   229 The statement \verb|s11| adds three columns to the problem object.
       
   230 
       
   231 The statement \verb|s12| assigns the symbolic name `\verb|x1|' to the
       
   232 first column, the statement \verb|s13| sets the type and bounds of the
       
   233 first column, where \verb|GLP_LO| means that the column has an lower
       
   234 bound, and the statement \verb|s14| sets the objective coefficient for
       
   235 the first column. The statements \verb|s15|---\verb|s20| are used in the
       
   236 same way in order to assign the symbolic names `\verb|x2|' and
       
   237 `\verb|x3|' to the second and third columns and set their types, bounds,
       
   238 and objective coefficients.
       
   239 
       
   240 The statements \verb|s21|---\verb|s29| prepare non-zero elements of the
       
   241 constraint matrix (i.e. constraint coefficients). Row indices of each
       
   242 element are stored in the array \verb|ia|, column indices are stored in
       
   243 the array \verb|ja|, and numerical values of corresponding elements are
       
   244 stored in the array \verb|ar|. Then the statement \verb|s30| calls
       
   245 the routine \verb|glp_load_matrix|, which loads information from these
       
   246 three arrays into the problem object.
       
   247 
       
   248 Now all data have been entered into the problem object, and therefore
       
   249 the statement \verb|s31| calls the routine \verb|glp_simplex|, which is
       
   250 a driver to the simplex method, in order to solve the LP problem. This
       
   251 routine finds an optimal solution and stores all relevant information
       
   252 back into the problem object.
       
   253 
       
   254 The statement \verb|s32| obtains a computed value of the objective
       
   255 function, and the statements \verb|s33|---\verb|s35| obtain computed
       
   256 values of structural variables (columns), which correspond to the
       
   257 optimal basic solution found by the solver.
       
   258 
       
   259 The statement \verb|s36| writes the optimal solution to the standard
       
   260 output. The printout may look like follows:
       
   261 
       
   262 {\footnotesize
       
   263 \begin{verbatim}
       
   264 *     0:   objval =   0.000000000e+00   infeas =   0.000000000e+00 (0)
       
   265 *     2:   objval =   7.333333333e+02   infeas =   0.000000000e+00 (0)
       
   266 OPTIMAL SOLUTION FOUND
       
   267 
       
   268 z = 733.333; x1 = 33.3333; x2 = 66.6667; x3 = 0
       
   269 \end{verbatim}
       
   270 
       
   271 }
       
   272 
       
   273 Finally, the statement \verb|s37| calls the routine
       
   274 \verb|glp_delete_prob|, which frees all the memory allocated to the
       
   275 problem object.
       
   276 
       
   277 \subsection{Compiling}
       
   278 
       
   279 The GLPK package has the only header file \verb|glpk.h|, which should
       
   280 be available on compiling a C (or C++) program using GLPK API routines.
       
   281 
       
   282 If the header file is installed in the default location
       
   283 \verb|/usr/local/include|, the following typical command may be used to
       
   284 compile, say, the example C program described above with the GNU C
       
   285 compiler:
       
   286 
       
   287 \begin{verbatim}
       
   288    $ gcc -c sample.c
       
   289 \end{verbatim}
       
   290 
       
   291 If \verb|glpk.h| is not in the default location, the corresponding
       
   292 directory containing it should be made known to the C compiler through
       
   293 \verb|-I| option, for example:
       
   294 
       
   295 \begin{verbatim}
       
   296    $ gcc -I/foo/bar/glpk-4.15/include -c sample.c
       
   297 \end{verbatim}
       
   298 
       
   299 In any case the compilation results in an object file \verb|sample.o|.
       
   300 
       
   301 \subsection{Linking}
       
   302 
       
   303 The GLPK library is a single file \verb|libglpk.a|. (On systems which
       
   304 support shared libraries there may be also a shared version of the
       
   305 library \verb|libglpk.so|.)
       
   306 
       
   307 If the library is installed in the default
       
   308 location \verb|/usr/local/lib|, the following typical command may be
       
   309 used to link, say, the example C program described above against with
       
   310 the library:
       
   311 
       
   312 \begin{verbatim}
       
   313    $ gcc sample.o -lglpk -lm
       
   314 \end{verbatim}
       
   315 
       
   316 If the GLPK library is not in the default location, the corresponding
       
   317 directory containing it should be made known to the linker through
       
   318 \verb|-L| option, for example:
       
   319 
       
   320 \begin{verbatim}
       
   321    $ gcc -L/foo/bar/glpk-4.15 sample.o -lglpk -lm
       
   322 \end{verbatim}
       
   323 
       
   324 Depending on configuration of the package linking against with the GLPK
       
   325 library may require the following optional libraries:
       
   326 
       
   327 \bigskip
       
   328 
       
   329 \begin{tabular}{@{}ll}
       
   330 \verb|-lgmp|  & the GNU MP bignum library; \\
       
   331 \verb|-lz|    & the zlib data compression library; \\
       
   332 \verb|-lltdl| & the GNU ltdl shared support library. \\
       
   333 \end{tabular}
       
   334 
       
   335 \bigskip
       
   336 
       
   337 \noindent
       
   338 in which case corresponding libraries should be also made known to the
       
   339 linker, for example:
       
   340 
       
   341 \begin{verbatim}
       
   342    $ gcc sample.o -lglpk -lz -lltdl -lm
       
   343 \end{verbatim}
       
   344 
       
   345 For more details about configuration options of the GLPK package see
       
   346 Appendix \ref{install}, page \pageref{install}.
       
   347 
       
   348 %* eof *%