The source code and dockerfile for the GSW2024 AI Lab.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

336 lines
12 KiB

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