[1] | 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 *% |
---|