|
1 %* glpk02.tex *% |
|
2 |
|
3 \chapter{Basic API Routines} |
|
4 |
|
5 This chapter describes GLPK API routines intended for using in |
|
6 application programs. |
|
7 |
|
8 \subsubsection*{Library header} |
|
9 |
|
10 All GLPK API data types and routines are defined in the header file |
|
11 \verb|glpk.h|. It should be included in all source files which use |
|
12 GLPK API, either directly or indirectly through some other header file |
|
13 as follows: |
|
14 |
|
15 \begin{verbatim} |
|
16 #include <glpk.h> |
|
17 \end{verbatim} |
|
18 |
|
19 \subsubsection*{Error handling} |
|
20 |
|
21 If some GLPK API routine detects erroneous or incorrect data passed by |
|
22 the application program, it writes appropriate diagnostic messages to |
|
23 the terminal and then abnormally terminates the application program. |
|
24 In most practical cases this allows to simplify programming by avoiding |
|
25 numerous checks of return codes. Thus, in order to prevent crashing the |
|
26 application program should check all data, which are suspected to be |
|
27 incorrect, before calling GLPK API routines. |
|
28 |
|
29 Should note that this kind of error handling is used only in cases of |
|
30 incorrect data passed by the application program. If, for example, the |
|
31 application program calls some GLPK API routine to read data from an |
|
32 input file and these data are incorrect, the GLPK API routine reports |
|
33 about error in the usual way by means of the return code. |
|
34 |
|
35 \subsubsection*{Thread safety} |
|
36 |
|
37 Currently GLPK API routines are non-reentrant and therefore cannot be |
|
38 used in multi-threaded programs. |
|
39 |
|
40 \subsubsection*{Array indexing} |
|
41 |
|
42 Normally all GLPK API routines start array indexing from 1, not from 0 |
|
43 (except the specially stipulated cases). This means, for example, that |
|
44 if some vector $x$ of the length $n$ is passed as an array to some GLPK |
|
45 API routine, the latter expects vector components to be placed in |
|
46 locations \verb|x[1]|, \verb|x[2]|, \dots, \verb|x[n]|, and the location |
|
47 \verb|x[0]| normally is not used. |
|
48 |
|
49 In order to avoid indexing errors it is most convenient and most |
|
50 reliable to declare the array \verb|x| as follows: |
|
51 |
|
52 \begin{verbatim} |
|
53 double x[1+n]; |
|
54 \end{verbatim} |
|
55 |
|
56 \noindent |
|
57 or to allocate it as follows: |
|
58 |
|
59 \begin{verbatim} |
|
60 double *x; |
|
61 . . . |
|
62 x = calloc(1+n, sizeof(double)); |
|
63 \end{verbatim} |
|
64 |
|
65 \noindent |
|
66 In both cases one extra location \verb|x[0]| is reserved that allows |
|
67 passing the array to GLPK routines in a usual way. |
|
68 |
|
69 \section{Problem object} |
|
70 |
|
71 All GLPK API routines deal with so called {\it problem object}, which |
|
72 is a program object of type \verb|glp_prob| and intended to represent |
|
73 a particular LP or MIP instance. |
|
74 |
|
75 The type \verb|glp_prob| is a data structure declared in the header |
|
76 file \verb|glpk.h| as follows: |
|
77 |
|
78 \begin{verbatim} |
|
79 typedef struct { ... } glp_prob; |
|
80 \end{verbatim} |
|
81 |
|
82 Problem objects (i.e. program objects of the \verb|glp_prob| type) are |
|
83 allocated and managed internally by the GLPK API routines. The |
|
84 application program should never use any members of the \verb|glp_prob| |
|
85 structure directly and should deal only with pointers to these objects |
|
86 (that is, \verb|glp_prob *| values). |
|
87 |
|
88 \pagebreak |
|
89 |
|
90 The problem object consists of five segments, which are: |
|
91 |
|
92 $\bullet$ problem segment, |
|
93 |
|
94 $\bullet$ basis segment, |
|
95 |
|
96 $\bullet$ interior point segment, |
|
97 |
|
98 $\bullet$ MIP segment, and |
|
99 |
|
100 $\bullet$ control parameters and statistics segment. |
|
101 |
|
102 \subsubsection*{Problem segment} |
|
103 |
|
104 The {\it problem segment} contains original LP/MIP data, which |
|
105 corresponds to the problem formulation (1.1)---(1.3) (see Section |
|
106 \ref{seclp}, page \pageref{seclp}). It includes the following |
|
107 components: |
|
108 |
|
109 $\bullet$ rows (auxiliary variables), |
|
110 |
|
111 $\bullet$ columns (structural variables), |
|
112 |
|
113 $\bullet$ objective function, and |
|
114 |
|
115 $\bullet$ constraint matrix. |
|
116 |
|
117 Rows and columns have the same set of the following attributes: |
|
118 |
|
119 $\bullet$ ordinal number, |
|
120 |
|
121 $\bullet$ symbolic name (1 up to 255 arbitrary graphic characters), |
|
122 |
|
123 $\bullet$ type (free, lower bound, upper bound, double bound, fixed), |
|
124 |
|
125 $\bullet$ numerical values of lower and upper bounds, |
|
126 |
|
127 $\bullet$ scale factor. |
|
128 |
|
129 {\it Ordinal numbers} are intended for referencing rows and columns. |
|
130 Row ordinal numbers are integers $1, 2, \dots, m$, and column ordinal |
|
131 numbers are integers $1, 2, \dots, n$, where $m$ and $n$ are, |
|
132 respectively, the current number of rows and columns in the problem |
|
133 object. |
|
134 |
|
135 {\it Symbolic names} are intended for informational purposes. They also |
|
136 can be used for referencing rows and columns. |
|
137 |
|
138 {\it Types and bounds} of rows (auxiliary variables) and columns |
|
139 (structural variables) are explained above (see Section \ref{seclp}, |
|
140 page \pageref{seclp}). |
|
141 |
|
142 {\it Scale factors} are used internally for scaling rows and columns of |
|
143 the constraint matrix. |
|
144 |
|
145 Information about the {\it objective function} includes numerical |
|
146 values of objective coefficients and a flag, which defines the |
|
147 optimization direction (i.e. minimization or maximization). |
|
148 |
|
149 The {\it constraint matrix} is a $m \times n$ rectangular matrix built |
|
150 of constraint coefficients $a_{ij}$, which defines the system of linear |
|
151 constraints (1.2) (see Section \ref{seclp}, page \pageref{seclp}). This |
|
152 matrix is stored in the problem object in both row-wise and column-wise |
|
153 sparse formats. |
|
154 |
|
155 Once the problem object has been created, the application program can |
|
156 access and modify any components of the problem segment in arbitrary |
|
157 order. |
|
158 |
|
159 \subsubsection*{Basis segment} |
|
160 |
|
161 The {\it basis segment} of the problem object keeps information related |
|
162 to the current basic solution. It includes: |
|
163 |
|
164 $\bullet$ row and column statuses, |
|
165 |
|
166 $\bullet$ basic solution statuses, |
|
167 |
|
168 $\bullet$ factorization of the current basis matrix, and |
|
169 |
|
170 $\bullet$ basic solution components. |
|
171 |
|
172 The {\it row and column statuses} define which rows and columns are |
|
173 basic and which are non-basic. These statuses may be assigned either by |
|
174 the application program of by some API routines. Note that these |
|
175 statuses are always defined independently on whether the corresponding |
|
176 basis is valid or not. |
|
177 |
|
178 The {\it basic solution statuses} include the {\it primal status} and |
|
179 the {\it dual status}, which are set by the simplex-based solver once |
|
180 the problem has been solved. The primal status shows whether a primal |
|
181 basic solution is feasible, infeasible, or undefined. The dual status |
|
182 shows the same for a dual basic solution. |
|
183 |
|
184 The {\it factorization of the basis matrix} is some factorized form |
|
185 (like LU-factorization) of the current basis matrix (defined by the |
|
186 current row and column statuses). The factorization is used by the |
|
187 simplex-based solver and kept when the solver terminates the search. |
|
188 This feature allows efficiently reoptimizing the problem after some |
|
189 modifications (for example, after changing some bounds or objective |
|
190 coefficients). It also allows performing the post-optimal analysis (for |
|
191 example, computing components of the simplex table, etc.). |
|
192 |
|
193 The {\it basic solution components} include primal and dual values of |
|
194 all auxiliary and structural variables for the most recently obtained |
|
195 basic solution. |
|
196 |
|
197 \subsubsection*{Interior point segment} |
|
198 |
|
199 The {\it interior point segment} is automatically allocated after the |
|
200 problem has been solved using the interior point solver. It contains |
|
201 interior point solution components, which include the solution status, |
|
202 and primal and dual values of all auxiliary and structural variables. |
|
203 |
|
204 \subsubsection*{MIP segment} |
|
205 |
|
206 The {\it MIP segment} is used only for MIP problems. This segment |
|
207 includes: |
|
208 |
|
209 $\bullet$ column kinds, |
|
210 |
|
211 $\bullet$ MIP solution status, and |
|
212 |
|
213 $\bullet$ MIP solution components. |
|
214 |
|
215 The {\it column kinds} define which columns (i.e. structural variables) |
|
216 are integer and which are continuous. |
|
217 |
|
218 The {\it MIP solution status} is set by the MIP solver and shows whether |
|
219 a MIP solution is integer optimal, integer feasible (non-optimal), or |
|
220 undefined. |
|
221 |
|
222 The {\it MIP solution components} are computed by the MIP solver and |
|
223 include primal values of all auxiliary and structural variables for the |
|
224 most recently obtained MIP solution. |
|
225 |
|
226 Note that in case of MIP problem the basis segment corresponds to |
|
227 the optimal solution of LP relaxation, which is also available to the |
|
228 application program. |
|
229 |
|
230 Currently the search tree is not kept in the MIP segment. Therefore if |
|
231 the search has been terminated, it cannot be continued. |
|
232 |
|
233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
234 |
|
235 \newpage |
|
236 |
|
237 \section{Problem creating and modifying routines} |
|
238 |
|
239 \subsection{glp\_create\_prob---create problem object} |
|
240 |
|
241 \subsubsection*{Synopsis} |
|
242 |
|
243 \begin{verbatim} |
|
244 glp_prob *glp_create_prob(void); |
|
245 \end{verbatim} |
|
246 |
|
247 \subsubsection*{Description} |
|
248 |
|
249 The routine \verb|glp_create_prob| creates a new problem object, which |
|
250 initially is ``empty'', i.e. has no rows and columns. |
|
251 |
|
252 \subsubsection*{Returns} |
|
253 |
|
254 The routine returns a pointer to the created object, which should be |
|
255 used in any subsequent operations on this object. |
|
256 |
|
257 \subsection{glp\_set\_prob\_name---assign (change) problem name} |
|
258 |
|
259 \subsubsection*{Synopsis} |
|
260 |
|
261 \begin{verbatim} |
|
262 void glp_set_prob_name(glp_prob *lp, const char *name); |
|
263 \end{verbatim} |
|
264 |
|
265 \subsubsection*{Description} |
|
266 |
|
267 The routine \verb|glp_set_prob_name| assigns a given symbolic |
|
268 \verb|name| (1 up to 255 characters) to the specified problem object. |
|
269 |
|
270 If the parameter \verb|name| is \verb|NULL| or empty string, the routine |
|
271 erases an existing symbolic name of the problem object. |
|
272 |
|
273 \subsection{glp\_set\_obj\_name---assign (change) objective function |
|
274 name} |
|
275 |
|
276 \subsubsection*{Synopsis} |
|
277 |
|
278 \begin{verbatim} |
|
279 void glp_set_obj_name(glp_prob *lp, const char *name); |
|
280 \end{verbatim} |
|
281 |
|
282 \subsubsection*{Description} |
|
283 |
|
284 The routine \verb|glp_set_obj_name| assigns a given symbolic |
|
285 \verb|name| (1 up to 255 characters) to the objective function of the |
|
286 specified problem object. |
|
287 |
|
288 If the parameter \verb|name| is \verb|NULL| or empty string, the routine |
|
289 erases an existing symbolic name of the objective function. |
|
290 |
|
291 \subsection{glp\_set\_obj\_dir---set (change) optimization direction\\ |
|
292 flag} |
|
293 |
|
294 \subsubsection*{Synopsis} |
|
295 |
|
296 \begin{verbatim} |
|
297 void glp_set_obj_dir(glp_prob *lp, int dir); |
|
298 \end{verbatim} |
|
299 |
|
300 \subsubsection*{Description} |
|
301 |
|
302 The routine \verb|glp_set_obj_dir| sets (changes) the optimization |
|
303 direction flag (i.e. ``sense'' of the objective function) as specified |
|
304 by the parameter \verb|dir|: |
|
305 |
|
306 \begin{tabular}{@{}ll} |
|
307 \verb|GLP_MIN| & minimization; \\ |
|
308 \verb|GLP_MAX| & maximization. \\ |
|
309 \end{tabular} |
|
310 |
|
311 \noindent |
|
312 (Note that by default the problem is minimization.) |
|
313 |
|
314 \subsection{glp\_add\_rows---add new rows to problem object} |
|
315 |
|
316 \subsubsection*{Synopsis} |
|
317 |
|
318 \begin{verbatim} |
|
319 int glp_add_rows(glp_prob *lp, int nrs); |
|
320 \end{verbatim} |
|
321 |
|
322 \subsubsection*{Description} |
|
323 |
|
324 The routine \verb|glp_add_rows| adds \verb|nrs| rows (constraints) to |
|
325 the specified problem object. New rows are always added to the end of |
|
326 the row list, so the ordinal numbers of existing rows are not changed. |
|
327 |
|
328 Being added each new row is initially free (unbounded) and has empty |
|
329 list of the constraint coefficients. |
|
330 |
|
331 \subsubsection*{Returns} |
|
332 |
|
333 The routine \verb|glp_add_rows| returns the ordinal number of the first |
|
334 new row added to the problem object. |
|
335 |
|
336 \newpage |
|
337 |
|
338 \subsection{glp\_add\_cols---add new columns to problem object} |
|
339 |
|
340 \subsubsection*{Synopsis} |
|
341 |
|
342 \begin{verbatim} |
|
343 int glp_add_cols(glp_prob *lp, int ncs); |
|
344 \end{verbatim} |
|
345 |
|
346 \subsubsection*{Description} |
|
347 |
|
348 The routine \verb|glp_add_cols| adds \verb|ncs| columns (structural |
|
349 variables) to the specified problem object. New columns are always added |
|
350 to the end of the column list, so the ordinal numbers of existing |
|
351 columns are not changed. |
|
352 |
|
353 Being added each new column is initially fixed at zero and has empty |
|
354 list of the constraint coefficients. |
|
355 |
|
356 \subsubsection*{Returns} |
|
357 |
|
358 The routine \verb|glp_add_cols| returns the ordinal number of the first |
|
359 new column added to the problem object. |
|
360 |
|
361 \subsection{glp\_set\_row\_name---assign (change) row name} |
|
362 |
|
363 \subsubsection*{Synopsis} |
|
364 |
|
365 \begin{verbatim} |
|
366 void glp_set_row_name(glp_prob *lp, int i, const char *name); |
|
367 \end{verbatim} |
|
368 |
|
369 \subsubsection*{Description} |
|
370 |
|
371 The routine \verb|glp_set_row_name| assigns a given symbolic |
|
372 \verb|name| (1 up to 255 characters) to \verb|i|-th row (auxiliary |
|
373 variable) of the specified problem object. |
|
374 |
|
375 If the parameter \verb|name| is \verb|NULL| or empty string, the routine |
|
376 erases an existing name of $i$-th row. |
|
377 |
|
378 \subsection{glp\_set\_col\_name---assign (change) column name} |
|
379 |
|
380 \subsubsection*{Synopsis} |
|
381 |
|
382 \begin{verbatim} |
|
383 void glp_set_col_name(glp_prob *lp, int j, const char *name); |
|
384 \end{verbatim} |
|
385 |
|
386 \subsubsection*{Description} |
|
387 |
|
388 The routine \verb|glp_set_col_name| assigns a given symbolic |
|
389 \verb|name| (1 up to 255 characters) to \verb|j|-th column (structural |
|
390 variable) of the specified problem object. |
|
391 |
|
392 If the parameter \verb|name| is \verb|NULL| or empty string, the routine |
|
393 erases an existing name of $j$-th column. |
|
394 |
|
395 \subsection{glp\_set\_row\_bnds---set (change) row bounds} |
|
396 |
|
397 \subsubsection*{Synopsis} |
|
398 |
|
399 \begin{verbatim} |
|
400 void glp_set_row_bnds(glp_prob *lp, int i, int type, |
|
401 double lb, double ub); |
|
402 \end{verbatim} |
|
403 |
|
404 \subsubsection*{Description} |
|
405 |
|
406 The routine \verb|glp_set_row_bnds| sets (changes) the type and bounds |
|
407 of \verb|i|-th row (auxiliary variable) of the specified problem object. |
|
408 |
|
409 The parameters \verb|type|, \verb|lb|, and \verb|ub| specify the type, |
|
410 lower bound, and upper bound, respectively, as follows: |
|
411 |
|
412 \begin{center} |
|
413 \begin{tabular}{cr@{}c@{}ll} |
|
414 Type & \multicolumn{3}{c}{Bounds} & Comment \\ |
|
415 \hline |
|
416 \verb|GLP_FR| & $-\infty <$ &$\ x\ $& $< +\infty$ |
|
417 & Free (unbounded) variable \\ |
|
418 \verb|GLP_LO| & $lb \leq$ &$\ x\ $& $< +\infty$ |
|
419 & Variable with lower bound \\ |
|
420 \verb|GLP_UP| & $-\infty <$ &$\ x\ $& $\leq ub$ |
|
421 & Variable with upper bound \\ |
|
422 \verb|GLP_DB| & $lb \leq$ &$\ x\ $& $\leq ub$ |
|
423 & Double-bounded variable \\ |
|
424 \verb|GLP_FX| & $lb =$ &$\ x\ $& $= ub$ |
|
425 & Fixed variable \\ |
|
426 \end{tabular} |
|
427 \end{center} |
|
428 |
|
429 \noindent |
|
430 where $x$ is the auxiliary variable associated with $i$-th row. |
|
431 |
|
432 If the row has no lower bound, the parameter \verb|lb| is ignored. If |
|
433 the row has no upper bound, the parameter \verb|ub| is ignored. If the |
|
434 row is an equality constraint (i.e. the corresponding auxiliary variable |
|
435 is of fixed type), only the parameter \verb|lb| is used while the |
|
436 parameter \verb|ub| is ignored. |
|
437 |
|
438 Being added to the problem object each row is initially free, i.e. its |
|
439 type is \verb|GLP_FR|. |
|
440 |
|
441 \newpage |
|
442 |
|
443 \subsection{glp\_set\_col\_bnds---set (change) column bounds} |
|
444 |
|
445 \subsubsection*{Synopsis} |
|
446 |
|
447 \begin{verbatim} |
|
448 void glp_set_col_bnds(glp_prob *lp, int j, int type, |
|
449 double lb, double ub); |
|
450 \end{verbatim} |
|
451 |
|
452 \subsubsection*{Description} |
|
453 |
|
454 The routine \verb|glp_set_col_bnds| sets (changes) the type and bounds |
|
455 of \verb|j|-th column (structural variable) of the specified problem |
|
456 object. |
|
457 |
|
458 The parameters \verb|type|, \verb|lb|, and \verb|ub| specify the type, |
|
459 lower bound, and upper bound, respectively, as follows: |
|
460 |
|
461 \begin{center} |
|
462 \begin{tabular}{cr@{}c@{}ll} |
|
463 Type & \multicolumn{3}{c}{Bounds} & Comment \\ |
|
464 \hline |
|
465 \verb|GLP_FR| & $-\infty <$ &$\ x\ $& $< +\infty$ |
|
466 & Free (unbounded) variable \\ |
|
467 \verb|GLP_LO| & $lb \leq$ &$\ x\ $& $< +\infty$ |
|
468 & Variable with lower bound \\ |
|
469 \verb|GLP_UP| & $-\infty <$ &$\ x\ $& $\leq ub$ |
|
470 & Variable with upper bound \\ |
|
471 \verb|GLP_DB| & $lb \leq$ &$\ x\ $& $\leq ub$ |
|
472 & Double-bounded variable \\ |
|
473 \verb|GLP_FX| & $lb =$ &$\ x\ $& $= ub$ |
|
474 & Fixed variable \\ |
|
475 \end{tabular} |
|
476 \end{center} |
|
477 |
|
478 \noindent |
|
479 where $x$ is the structural variable associated with $j$-th column. |
|
480 |
|
481 If the column has no lower bound, the parameter \verb|lb| is ignored. |
|
482 If the column has no upper bound, the parameter \verb|ub| is ignored. |
|
483 If the column is of fixed type, only the parameter \verb|lb| is used |
|
484 while the parameter \verb|ub| is ignored. |
|
485 |
|
486 Being added to the problem object each column is initially fixed at |
|
487 zero, i.e. its type is \verb|GLP_FX| and both bounds are 0. |
|
488 |
|
489 \subsection{glp\_set\_obj\_coef---set (change) objective coefficient |
|
490 or constant term} |
|
491 |
|
492 \subsubsection*{Synopsis} |
|
493 |
|
494 \begin{verbatim} |
|
495 void glp_set_obj_coef(glp_prob *lp, int j, double coef); |
|
496 \end{verbatim} |
|
497 |
|
498 \subsubsection*{Description} |
|
499 |
|
500 The routine \verb|glp_set_obj_coef| sets (changes) the objective |
|
501 coefficient at \verb|j|-th column (structural variable). A new value of |
|
502 the objective coefficient is specified by the parameter \verb|coef|. |
|
503 |
|
504 If the parameter \verb|j| is 0, the routine sets (changes) the constant |
|
505 term (``shift'') of the objective function. |
|
506 |
|
507 \subsection{glp\_set\_mat\_row---set (replace) row of the constraint |
|
508 matrix} |
|
509 |
|
510 \subsubsection*{Synopsis} |
|
511 |
|
512 \begin{verbatim} |
|
513 void glp_set_mat_row(glp_prob *lp, int i, int len, |
|
514 const int ind[], const double val[]); |
|
515 \end{verbatim} |
|
516 |
|
517 \subsubsection*{Description} |
|
518 |
|
519 The routine \verb|glp_set_mat_row| stores (replaces) the contents of |
|
520 \verb|i|-th row of the constraint matrix of the specified problem |
|
521 object. |
|
522 |
|
523 Column indices and numerical values of new row elements must be placed |
|
524 in locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, |
|
525 \dots, \verb|val[len]|, respectively, where $0 \leq$ \verb|len| $\leq n$ |
|
526 is the new length of $i$-th row, $n$ is the current number of columns in |
|
527 the problem object. Elements with identical column indices are not |
|
528 allowed. Zero elements are allowed, but they are not stored in the |
|
529 constraint matrix. |
|
530 |
|
531 If the parameter \verb|len| is 0, the parameters \verb|ind| and/or |
|
532 \verb|val| can be specified as \verb|NULL|. |
|
533 |
|
534 \subsection{glp\_set\_mat\_col---set (replace) column of the |
|
535 constr\-aint matrix} |
|
536 |
|
537 \subsubsection*{Synopsis} |
|
538 |
|
539 \begin{verbatim} |
|
540 void glp_set_mat_col(glp_prob *lp, int j, int len, |
|
541 const int ind[], const double val[]); |
|
542 \end{verbatim} |
|
543 |
|
544 \subsubsection*{Description} |
|
545 |
|
546 The routine \verb|glp_set_mat_col| stores (replaces) the contents of |
|
547 \verb|j|-th column of the constraint matrix of the specified problem |
|
548 object. |
|
549 |
|
550 Row indices and numerical values of new column elements must be placed |
|
551 in locations \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, |
|
552 \dots, \verb|val[len]|, respectively, where $0 \leq$ \verb|len| $\leq m$ |
|
553 is the new length of $j$-th column, $m$ is the current number of rows in |
|
554 the problem object. Elements with identical row indices are not allowed. |
|
555 Zero elements are allowed, but they are not stored in the constraint |
|
556 matrix. |
|
557 |
|
558 If the parameter \verb|len| is 0, the parameters \verb|ind| and/or |
|
559 \verb|val| can be specified as \verb|NULL|. |
|
560 |
|
561 \subsection{glp\_load\_matrix---load (replace) the whole constraint |
|
562 matrix} |
|
563 |
|
564 \subsubsection*{Synopsis} |
|
565 |
|
566 \begin{verbatim} |
|
567 void glp_load_matrix(glp_prob *lp, int ne, const int ia[], |
|
568 const int ja[], const double ar[]); |
|
569 \end{verbatim} |
|
570 |
|
571 \subsubsection*{Description} |
|
572 |
|
573 The routine \verb|glp_load_matrix| loads the constraint matrix passed |
|
574 in the arrays \verb|ia|, \verb|ja|, and \verb|ar| into the specified |
|
575 problem object. Before loading the current contents of the constraint |
|
576 matrix is destroyed. |
|
577 |
|
578 Constraint coefficients (elements of the constraint matrix) must be |
|
579 specified as triplets (\verb|ia[k]|, \verb|ja[k]|, \verb|ar[k]|) for |
|
580 $k=1,\dots,ne$, where \verb|ia[k]| is the row index, \verb|ja[k]| is |
|
581 the column index, and \verb|ar[k]| is a numeric value of corresponding |
|
582 constraint coefficient. The parameter \verb|ne| specifies the total |
|
583 number of (non-zero) elements in the matrix to be loaded. Coefficients |
|
584 with identical indices are not allowed. Zero coefficients are allowed, |
|
585 however, they are not stored in the constraint matrix. |
|
586 |
|
587 If the parameter \verb|ne| is 0, the parameters \verb|ia|, \verb|ja|, |
|
588 and/or \verb|ar| can be specified as \verb|NULL|. |
|
589 |
|
590 \subsection{glp\_check\_dup---check for duplicate elements in sparse |
|
591 matrix} |
|
592 |
|
593 \subsubsection*{Synopsis} |
|
594 |
|
595 \begin{verbatim} |
|
596 int glp_check_dup(int m, int n, int ne, const int ia[], |
|
597 const int ja[]); |
|
598 \end{verbatim} |
|
599 |
|
600 \subsubsection*{Description} |
|
601 |
|
602 The routine \verb|glp_check_dup checks| for duplicate elements (that |
|
603 is, elements with identical indices) in a sparse matrix specified in |
|
604 the coordinate format. |
|
605 |
|
606 The parameters $m$ and $n$ specifies, respectively, the number of rows |
|
607 and columns in the matrix, $m\geq 0$, $n\geq 0$. |
|
608 |
|
609 The parameter {\it ne} specifies the number of (structurally) non-zero |
|
610 elements in the matrix, {\it ne} $\geq 0$. |
|
611 |
|
612 Elements of the matrix are specified as doublets $(ia[k],ja[k])$ for |
|
613 $k=1,\dots,ne$, where $ia[k]$ is a row index, $ja[k]$ is a column index. |
|
614 |
|
615 The routine \verb|glp_check_dup| can be used prior to a call to the |
|
616 routine \verb|glp_load_matrix| to check that the constraint matrix to |
|
617 be loaded has no duplicate elements. |
|
618 |
|
619 \subsubsection*{Returns} |
|
620 |
|
621 The routine \verb|glp_check_dup| returns one of the following values: |
|
622 |
|
623 \noindent |
|
624 \begin{tabular}{@{}r@{\ }c@{\ }l@{}} |
|
625 0&---&the matrix has no duplicate elements;\\ |
|
626 $-k$&---&indices $ia[k]$ or/and $ja[k]$ are out of range;\\ |
|
627 $+k$&---&element $(ia[k],ja[k])$ is duplicate.\\ |
|
628 \end{tabular} |
|
629 |
|
630 \subsection{glp\_sort\_matrix---sort elements of the constraint matrix} |
|
631 |
|
632 \subsubsection*{Synopsis} |
|
633 |
|
634 \begin{verbatim} |
|
635 void glp_sort_matrix(glp_prob *P); |
|
636 \end{verbatim} |
|
637 |
|
638 \subsubsection*{Description} |
|
639 |
|
640 The routine \verb|glp_sort_matrix| sorts elements of the constraint |
|
641 matrix rebuilding its row and column linked lists. On exit from the |
|
642 routine the constraint matrix is not changed, however, elements in the |
|
643 row linked lists become ordered by ascending column indices, and the |
|
644 elements in the column linked lists become ordered by ascending row |
|
645 indices. |
|
646 |
|
647 \subsection{glp\_del\_rows---delete rows from problem object} |
|
648 |
|
649 \subsubsection*{Synopsis} |
|
650 |
|
651 \begin{verbatim} |
|
652 void glp_del_rows(glp_prob *lp, int nrs, const int num[]); |
|
653 \end{verbatim} |
|
654 |
|
655 \subsubsection*{Description} |
|
656 |
|
657 The routine \verb|glp_del_rows| deletes rows from the specified problem |
|
658 ob-\linebreak ject. Ordinal numbers of rows to be deleted should be |
|
659 placed in locations \verb|num[1]|, \dots, \verb|num[nrs]|, where |
|
660 ${\tt nrs}>0$. |
|
661 |
|
662 Note that deleting rows involves changing ordinal numbers of other |
|
663 rows remaining in the problem object. New ordinal numbers of the |
|
664 remaining rows are assigned under the assumption that the original |
|
665 order of rows is not changed. Let, for example, before deletion there |
|
666 be five rows $a$, $b$, $c$, $d$, $e$ with ordinal numbers 1, 2, 3, 4, 5, |
|
667 and let rows $b$ and $d$ have been deleted. Then after deletion the |
|
668 remaining rows $a$, $c$, $e$ are assigned new oridinal numbers 1, 2, 3. |
|
669 |
|
670 \subsection{glp\_del\_cols---delete columns from problem object} |
|
671 |
|
672 \subsubsection*{Synopsis} |
|
673 |
|
674 \begin{verbatim} |
|
675 void glp_del_cols(glp_prob *lp, int ncs, const int num[]); |
|
676 \end{verbatim} |
|
677 |
|
678 \subsubsection*{Description} |
|
679 |
|
680 The routine \verb|glp_del_cols| deletes columns from the specified |
|
681 problem object. Ordinal numbers of columns to be deleted should be |
|
682 placed in locations \verb|num[1]|, \dots, \verb|num[ncs]|, where |
|
683 ${\tt ncs}>0$. |
|
684 |
|
685 Note that deleting columns involves changing ordinal numbers of other |
|
686 columns remaining in the problem object. New ordinal numbers of the |
|
687 remaining columns are assigned under the assumption that the original |
|
688 order of columns is not changed. Let, for example, before deletion there |
|
689 be six columns $p$, $q$, $r$, $s$, $t$, $u$ with ordinal numbers 1, 2, |
|
690 3, 4, 5, 6, and let columns $p$, $q$, $s$ have been deleted. Then after |
|
691 deletion the remaining columns $r$, $t$, $u$ are assigned new ordinal |
|
692 numbers 1, 2, 3. |
|
693 |
|
694 \subsection{glp\_copy\_prob---copy problem object content} |
|
695 |
|
696 \subsubsection*{Synopsis} |
|
697 |
|
698 \begin{verbatim} |
|
699 void glp_copy_prob(glp_prob *dest, glp_prob *prob, int names); |
|
700 \end{verbatim} |
|
701 |
|
702 \subsubsection*{Description} |
|
703 |
|
704 The routine \verb|glp_copy_prob| copies the content of the problem |
|
705 object \verb|prob| to the problem object \verb|dest|. |
|
706 |
|
707 The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, |
|
708 the routine also copies all symbolic names; otherwise, if it is |
|
709 \verb|GLP_OFF|, no symbolic names are copied. |
|
710 |
|
711 \newpage |
|
712 |
|
713 \subsection{glp\_erase\_prob---erase problem object content} |
|
714 |
|
715 \subsubsection*{Synopsis} |
|
716 |
|
717 \begin{verbatim} |
|
718 void glp_erase_prob(glp_prob *lp); |
|
719 \end{verbatim} |
|
720 |
|
721 \subsubsection*{Description} |
|
722 |
|
723 The routine \verb|glp_erase_prob| erases the content of the specified |
|
724 problem object. The effect of this operation is the same as if the |
|
725 problem object would be deleted with the routine \verb|glp_delete_prob| |
|
726 and then created anew with the routine \verb|glp_create_prob|, with the |
|
727 only exception that the handle (pointer) to the problem object remains |
|
728 valid. |
|
729 |
|
730 \subsection{glp\_delete\_prob---delete problem object} |
|
731 |
|
732 \subsubsection*{Synopsis} |
|
733 |
|
734 \begin{verbatim} |
|
735 void glp_delete_prob(glp_prob *lp); |
|
736 \end{verbatim} |
|
737 |
|
738 \subsubsection*{Description} |
|
739 |
|
740 The routine \verb|glp_delete_prob| deletes a problem object, which the |
|
741 parameter \verb|lp| points to, freeing all the memory allocated to this |
|
742 object. |
|
743 |
|
744 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
745 |
|
746 \newpage |
|
747 |
|
748 \section{Problem retrieving routines} |
|
749 |
|
750 \subsection{glp\_get\_prob\_name---retrieve problem name} |
|
751 |
|
752 \subsubsection*{Synopsis} |
|
753 |
|
754 \begin{verbatim} |
|
755 const char *glp_get_prob_name(glp_prob *lp); |
|
756 \end{verbatim} |
|
757 |
|
758 \subsubsection*{Returns} |
|
759 |
|
760 The routine \verb|glp_get_prob_name| returns a pointer to an internal |
|
761 buffer, which contains symbolic name of the problem. However, if the |
|
762 problem has no assigned name, the routine returns \verb|NULL|. |
|
763 |
|
764 \subsection{glp\_get\_obj\_name---retrieve objective function name} |
|
765 |
|
766 \subsubsection*{Synopsis} |
|
767 |
|
768 \begin{verbatim} |
|
769 const char *glp_get_obj_name(glp_prob *lp); |
|
770 \end{verbatim} |
|
771 |
|
772 \subsubsection*{Returns} |
|
773 |
|
774 The routine \verb|glp_get_obj_name| returns a pointer to an internal |
|
775 buffer, which contains symbolic name assigned to the objective |
|
776 function. However, if the objective function has no assigned name, the |
|
777 routine returns \verb|NULL|. |
|
778 |
|
779 \subsection{glp\_get\_obj\_dir---retrieve optimization direction flag} |
|
780 |
|
781 \subsubsection*{Synopsis} |
|
782 |
|
783 \begin{verbatim} |
|
784 int glp_get_obj_dir(glp_prob *lp); |
|
785 \end{verbatim} |
|
786 |
|
787 \subsubsection*{Returns} |
|
788 |
|
789 The routine \verb|glp_get_obj_dir| returns the optimization direction |
|
790 flag (i.e. ``sense'' of the objective function): |
|
791 |
|
792 \begin{tabular}{@{}ll} |
|
793 \verb|GLP_MIN| & minimization; \\ |
|
794 \verb|GLP_MAX| & maximization. \\ |
|
795 \end{tabular} |
|
796 |
|
797 \pagebreak |
|
798 |
|
799 \subsection{glp\_get\_num\_rows---retrieve number of rows} |
|
800 |
|
801 \subsubsection*{Synopsis} |
|
802 |
|
803 \begin{verbatim} |
|
804 int glp_get_num_rows(glp_prob *lp); |
|
805 \end{verbatim} |
|
806 |
|
807 \subsubsection*{Returns} |
|
808 |
|
809 The routine \verb|glp_get_num_rows| returns the current number of rows |
|
810 in the specified problem object. |
|
811 |
|
812 \subsection{glp\_get\_num\_cols---retrieve number of columns} |
|
813 |
|
814 \subsubsection*{Synopsis} |
|
815 |
|
816 \begin{verbatim} |
|
817 int glp_get_num_cols(glp_prob *lp); |
|
818 \end{verbatim} |
|
819 |
|
820 \subsubsection*{Returns} |
|
821 |
|
822 The routine \verb|glp_get_num_cols| returns the current number of |
|
823 columns the specified problem object. |
|
824 |
|
825 \subsection{glp\_get\_row\_name---retrieve row name} |
|
826 |
|
827 \subsubsection*{Synopsis} |
|
828 |
|
829 \begin{verbatim} |
|
830 const char *glp_get_row_name(glp_prob *lp, int i); |
|
831 \end{verbatim} |
|
832 |
|
833 \subsubsection*{Returns} |
|
834 |
|
835 The routine \verb|glp_get_row_name| returns a pointer to an internal |
|
836 buffer, which contains a symbolic name assigned to \verb|i|-th row. |
|
837 However, if the row has no assigned name, the routine returns |
|
838 \verb|NULL|. |
|
839 |
|
840 \subsection{glp\_get\_col\_name---retrieve column name} |
|
841 |
|
842 \subsubsection*{Synopsis} |
|
843 |
|
844 \begin{verbatim} |
|
845 const char *glp_get_col_name(glp_prob *lp, int j); |
|
846 \end{verbatim} |
|
847 |
|
848 \subsubsection*{Returns} |
|
849 |
|
850 The routine \verb|glp_get_col_name| returns a pointer to an internal |
|
851 buffer, which contains a symbolic name assigned to \verb|j|-th column. |
|
852 However, if the column has no assigned name, the routine returns |
|
853 \verb|NULL|. |
|
854 |
|
855 \subsection{glp\_get\_row\_type---retrieve row type} |
|
856 |
|
857 \subsubsection*{Synopsis} |
|
858 |
|
859 \begin{verbatim} |
|
860 int glp_get_row_type(glp_prob *lp, int i); |
|
861 \end{verbatim} |
|
862 |
|
863 \subsubsection*{Returns} |
|
864 |
|
865 The routine \verb|glp_get_row_type| returns the type of \verb|i|-th |
|
866 row, i.e. the type of corresponding auxiliary variable, as follows: |
|
867 |
|
868 \begin{tabular}{@{}ll} |
|
869 \verb|GLP_FR| & free (unbounded) variable; \\ |
|
870 \verb|GLP_LO| & variable with lower bound; \\ |
|
871 \verb|GLP_UP| & variable with upper bound; \\ |
|
872 \verb|GLP_DB| & double-bounded variable; \\ |
|
873 \verb|GLP_FX| & fixed variable. \\ |
|
874 \end{tabular} |
|
875 |
|
876 \subsection{glp\_get\_row\_lb---retrieve row lower bound} |
|
877 |
|
878 \subsubsection*{Synopsis} |
|
879 |
|
880 \begin{verbatim} |
|
881 double glp_get_row_lb(glp_prob *lp, int i); |
|
882 \end{verbatim} |
|
883 |
|
884 \subsubsection*{Returns} |
|
885 |
|
886 The routine \verb|glp_get_row_lb| returns the lower bound of |
|
887 \verb|i|-th row, i.e. the lower bound of corresponding auxiliary |
|
888 variable. However, if the row has no lower bound, the routine returns |
|
889 \verb|-DBL_MAX|. |
|
890 |
|
891 \subsection{glp\_get\_row\_ub---retrieve row upper bound} |
|
892 |
|
893 \subsubsection*{Synopsis} |
|
894 |
|
895 \begin{verbatim} |
|
896 double glp_get_row_ub(glp_prob *lp, int i); |
|
897 \end{verbatim} |
|
898 |
|
899 \subsubsection*{Returns} |
|
900 |
|
901 The routine \verb|glp_get_row_ub| returns the upper bound of |
|
902 \verb|i|-th row, i.e. the upper bound of corresponding auxiliary |
|
903 variable. However, if the row has no upper bound, the routine returns |
|
904 \verb|+DBL_MAX|. |
|
905 |
|
906 \subsection{glp\_get\_col\_type---retrieve column type} |
|
907 |
|
908 \subsubsection*{Synopsis} |
|
909 |
|
910 \begin{verbatim} |
|
911 int glp_get_col_type(glp_prob *lp, int j); |
|
912 \end{verbatim} |
|
913 |
|
914 \subsubsection*{Returns} |
|
915 |
|
916 The routine \verb|glp_get_col_type| returns the type of \verb|j|-th |
|
917 column, i.e. the type of corresponding structural variable, as follows: |
|
918 |
|
919 \begin{tabular}{@{}ll} |
|
920 \verb|GLP_FR| & free (unbounded) variable; \\ |
|
921 \verb|GLP_LO| & variable with lower bound; \\ |
|
922 \verb|GLP_UP| & variable with upper bound; \\ |
|
923 \verb|GLP_DB| & double-bounded variable; \\ |
|
924 \verb|GLP_FX| & fixed variable. \\ |
|
925 \end{tabular} |
|
926 |
|
927 \subsection{glp\_get\_col\_lb---retrieve column lower bound} |
|
928 |
|
929 \subsubsection*{Synopsis} |
|
930 |
|
931 \begin{verbatim} |
|
932 double glp_get_col_lb(glp_prob *lp, int j); |
|
933 \end{verbatim} |
|
934 |
|
935 \subsubsection*{Returns} |
|
936 |
|
937 The routine \verb|glp_get_col_lb| returns the lower bound of |
|
938 \verb|j|-th column, i.e. the lower bound of corresponding structural |
|
939 variable. However, if the column has no lower bound, the routine returns |
|
940 \verb|-DBL_MAX|. |
|
941 |
|
942 \subsection{glp\_get\_col\_ub---retrieve column upper bound} |
|
943 |
|
944 \subsubsection*{Synopsis} |
|
945 |
|
946 \begin{verbatim} |
|
947 double glp_get_col_ub(glp_prob *lp, int j); |
|
948 \end{verbatim} |
|
949 |
|
950 \subsubsection*{Returns} |
|
951 |
|
952 The routine \verb|glp_get_col_ub| returns the upper bound of |
|
953 \verb|j|-th column, i.e. the upper bound of corresponding structural |
|
954 variable. However, if the column has no upper bound, the routine returns |
|
955 \verb|+DBL_MAX|. |
|
956 |
|
957 \subsection{glp\_get\_obj\_coef---retrieve objective coefficient or\\ |
|
958 constant term} |
|
959 |
|
960 \subsubsection*{Synopsis} |
|
961 |
|
962 \begin{verbatim} |
|
963 double glp_get_obj_coef(glp_prob *lp, int j); |
|
964 \end{verbatim} |
|
965 |
|
966 \subsubsection*{Returns} |
|
967 |
|
968 The routine \verb|glp_get_obj_coef| returns the objective coefficient |
|
969 at \verb|j|-th structural variable (column). |
|
970 |
|
971 If the parameter \verb|j| is 0, the routine returns the constant term |
|
972 (``shift'') of the objective function. |
|
973 |
|
974 \subsection{glp\_get\_num\_nz---retrieve number of constraint |
|
975 coefficients} |
|
976 |
|
977 \subsubsection*{Synopsis} |
|
978 |
|
979 \begin{verbatim} |
|
980 int glp_get_num_nz(glp_prob *lp); |
|
981 \end{verbatim} |
|
982 |
|
983 \subsubsection*{Returns} |
|
984 |
|
985 The routine \verb|glp_get_num_nz| returns the number of non-zero |
|
986 elements in the constraint matrix of the specified problem object. |
|
987 |
|
988 \subsection{glp\_get\_mat\_row---retrieve row of the constraint |
|
989 matrix} |
|
990 |
|
991 \subsubsection*{Synopsis} |
|
992 |
|
993 \begin{verbatim} |
|
994 int glp_get_mat_row(glp_prob *lp, int i, int ind[], |
|
995 double val[]); |
|
996 \end{verbatim} |
|
997 |
|
998 \subsubsection*{Description} |
|
999 |
|
1000 The routine \verb|glp_get_mat_row| scans (non-zero) elements of |
|
1001 \verb|i|-th row of the constraint matrix of the specified problem object |
|
1002 and stores their column indices and numeric values to locations |
|
1003 \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, |
|
1004 \verb|val[len]|, respectively, where $0\leq{\tt len}\leq n$ is the |
|
1005 number of elements in $i$-th row, $n$ is the number of columns. |
|
1006 |
|
1007 The parameter \verb|ind| and/or \verb|val| can be specified as |
|
1008 \verb|NULL|, in which case corresponding information is not stored. |
|
1009 |
|
1010 \subsubsection*{Returns} |
|
1011 |
|
1012 The routine \verb|glp_get_mat_row| returns the length \verb|len|, i.e. |
|
1013 the number of (non-zero) elements in \verb|i|-th row. |
|
1014 |
|
1015 \subsection{glp\_get\_mat\_col---retrieve column of the constraint\\ |
|
1016 matrix} |
|
1017 |
|
1018 \subsubsection*{Synopsis} |
|
1019 |
|
1020 \begin{verbatim} |
|
1021 int glp_get_mat_col(glp_prob *lp, int j, int ind[], |
|
1022 double val[]); |
|
1023 \end{verbatim} |
|
1024 |
|
1025 \subsubsection*{Description} |
|
1026 |
|
1027 The routine \verb|glp_get_mat_col| scans (non-zero) elements of |
|
1028 \verb|j|-th column of the constraint matrix of the specified problem |
|
1029 object and stores their row indices and numeric values to locations |
|
1030 \verb|ind[1]|, \dots, \verb|ind[len]| and \verb|val[1]|, \dots, |
|
1031 \verb|val[len]|, respectively, where $0\leq{\tt len}\leq m$ is the |
|
1032 number of elements in $j$-th column, $m$ is the number of rows. |
|
1033 |
|
1034 The parameter \verb|ind| and/or \verb|val| can be specified as |
|
1035 \verb|NULL|, in which case corresponding information is not stored. |
|
1036 |
|
1037 \subsubsection*{Returns} |
|
1038 |
|
1039 The routine \verb|glp_get_mat_col| returns the length \verb|len|, i.e. |
|
1040 the number of (non-zero) elements in \verb|j|-th column. |
|
1041 |
|
1042 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1043 |
|
1044 \newpage |
|
1045 |
|
1046 \section{Row and column searching routines} |
|
1047 |
|
1048 \subsection{glp\_create\_index---create the name index} |
|
1049 |
|
1050 \subsubsection*{Synopsis} |
|
1051 |
|
1052 \begin{verbatim} |
|
1053 void glp_create_index(glp_prob *lp); |
|
1054 \end{verbatim} |
|
1055 |
|
1056 \subsubsection*{Description} |
|
1057 |
|
1058 The routine \verb|glp_create_index| creates the name index for the |
|
1059 specified problem object. The name index is an auxiliary data structure, |
|
1060 which is intended to quickly (i.e. for logarithmic time) find rows and |
|
1061 columns by their names. |
|
1062 |
|
1063 This routine can be called at any time. If the name index already |
|
1064 exists, the routine does nothing. |
|
1065 |
|
1066 \subsection{glp\_find\_row---find row by its name} |
|
1067 |
|
1068 \subsubsection*{Synopsis} |
|
1069 |
|
1070 \begin{verbatim} |
|
1071 int glp_find_row(glp_prob *lp, const char *name); |
|
1072 \end{verbatim} |
|
1073 |
|
1074 \subsubsection*{Returns} |
|
1075 |
|
1076 The routine \verb|glp_find_row| returns the ordinal number of a row, |
|
1077 which is assigned (by the routine \verb|glp_set_row_name|) the specified |
|
1078 symbolic \verb|name|. If no such row exists, the routine returns 0. |
|
1079 |
|
1080 \subsection{glp\_find\_col---find column by its name} |
|
1081 |
|
1082 \subsubsection*{Synopsis} |
|
1083 |
|
1084 \begin{verbatim} |
|
1085 int glp_find_col(glp_prob *lp, const char *name); |
|
1086 \end{verbatim} |
|
1087 |
|
1088 \subsubsection*{Returns} |
|
1089 |
|
1090 The routine \verb|glp_find_col| returns the ordinal number of a column, |
|
1091 which is assigned (by the routine \verb|glp_set_col_name|) the specified |
|
1092 symbolic \verb|name|. If no such column exists, the routine returns 0. |
|
1093 |
|
1094 \subsection{glp\_delete\_index---delete the name index} |
|
1095 |
|
1096 \subsubsection*{Synopsis} |
|
1097 |
|
1098 \begin{verbatim} |
|
1099 void glp_delete_index(glp_prob *lp); |
|
1100 \end{verbatim} |
|
1101 |
|
1102 \subsubsection*{Description} |
|
1103 |
|
1104 The routine \verb|glp_delete_index| deletes the name index previously |
|
1105 created by the routine \verb|glp_create_index| and frees the memory |
|
1106 allocated to this auxiliary data structure. |
|
1107 |
|
1108 This routine can be called at any time. If the name index does not |
|
1109 exist, the routine does nothing. |
|
1110 |
|
1111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1112 |
|
1113 \newpage |
|
1114 |
|
1115 \section{Problem scaling routines} |
|
1116 |
|
1117 \subsection{Background} |
|
1118 |
|
1119 In GLPK the {\it scaling} means a linear transformation applied to the |
|
1120 constraint matrix to improve its numerical properties.\footnote{In many |
|
1121 cases a proper scaling allows making the constraint matrix to be better |
|
1122 conditioned, i.e. decreasing its condition number, that makes |
|
1123 computations numerically more stable.} |
|
1124 |
|
1125 The main equality is the following: |
|
1126 $$\widetilde{A}=RAS,\eqno(2.1)$$ |
|
1127 where $A=(a_{ij})$ is the original constraint matrix, $R=(r_{ii})>0$ is |
|
1128 a diagonal matrix used to scale rows (constraints), $S=(s_{jj})>0$ is a |
|
1129 diagonal matrix used to scale columns (variables), $\widetilde{A}$ is |
|
1130 the scaled constraint matrix. |
|
1131 |
|
1132 From (2.1) it follows that in the {\it scaled} problem instance each |
|
1133 original constraint coefficient $a_{ij}$ is replaced by corresponding |
|
1134 scaled constraint coefficient: |
|
1135 $$\widetilde{a}_{ij}=r_{ii}a_{ij}s_{jj}.\eqno(2.2)$$ |
|
1136 |
|
1137 Note that the scaling is performed internally and therefore |
|
1138 transparently to the user. This means that on API level the user always |
|
1139 deal with unscaled data. |
|
1140 |
|
1141 Scale factors $r_{ii}$ and $s_{jj}$ can be set or changed at any time |
|
1142 either directly by the application program in a problem specific way |
|
1143 (with the routines \verb|glp_set_rii| and \verb|glp_set_sjj|), or by |
|
1144 some API routines intended for automatic scaling. |
|
1145 |
|
1146 \subsection{glp\_set\_rii---set (change) row scale factor} |
|
1147 |
|
1148 \subsubsection*{Synopsis} |
|
1149 |
|
1150 \begin{verbatim} |
|
1151 void glp_set_rii(glp_prob *lp, int i, double rii); |
|
1152 \end{verbatim} |
|
1153 |
|
1154 \subsubsection*{Description} |
|
1155 |
|
1156 The routine \verb|glp_set_rii| sets (changes) the scale factor $r_{ii}$ |
|
1157 for $i$-th row of the specified problem object. |
|
1158 |
|
1159 \subsection{glp\_set\_sjj---set (change) column scale factor} |
|
1160 |
|
1161 \subsubsection*{Synopsis} |
|
1162 |
|
1163 \begin{verbatim} |
|
1164 void glp_set_sjj(glp_prob *lp, int j, double sjj); |
|
1165 \end{verbatim} |
|
1166 |
|
1167 \subsubsection*{Description} |
|
1168 |
|
1169 The routine \verb|glp_set_sjj| sets (changes) the scale factor $s_{jj}$ |
|
1170 for $j$-th column of the specified problem object. |
|
1171 |
|
1172 \subsection{glp\_get\_rii---retrieve row scale factor} |
|
1173 |
|
1174 \subsubsection*{Synopsis} |
|
1175 |
|
1176 \begin{verbatim} |
|
1177 double glp_get_rii(glp_prob *lp, int i); |
|
1178 \end{verbatim} |
|
1179 |
|
1180 \subsubsection*{Returns} |
|
1181 |
|
1182 The routine \verb|glp_get_rii| returns current scale factor $r_{ii}$ for |
|
1183 $i$-th row of the specified problem object. |
|
1184 |
|
1185 \subsection{glp\_get\_sjj---retrieve column scale factor} |
|
1186 |
|
1187 \subsubsection*{Synopsis} |
|
1188 |
|
1189 \begin{verbatim} |
|
1190 double glp_get_sjj(glp_prob *lp, int j); |
|
1191 \end{verbatim} |
|
1192 |
|
1193 \subsubsection*{Returns} |
|
1194 |
|
1195 The routine \verb|glp_get_sjj| returns current scale factor $s_{jj}$ for |
|
1196 $j$-th column of the specified problem object. |
|
1197 |
|
1198 \subsection{glp\_scale\_prob---scale problem data} |
|
1199 |
|
1200 \subsubsection*{Synopsis} |
|
1201 |
|
1202 \begin{verbatim} |
|
1203 void glp_scale_prob(glp_prob *lp, int flags); |
|
1204 \end{verbatim} |
|
1205 |
|
1206 \subsubsection*{Description} |
|
1207 |
|
1208 The routine \verb|glp_scale_prob| performs automatic scaling of problem |
|
1209 data for the specified problem object. |
|
1210 |
|
1211 The parameter \verb|flags| specifies scaling options used by the |
|
1212 routine. The options can be combined with the bitwise OR operator and |
|
1213 may be the following: |
|
1214 |
|
1215 \begin{tabular}{@{}ll} |
|
1216 \verb|GLP_SF_GM| & perform geometric mean scaling;\\ |
|
1217 \verb|GLP_SF_EQ| & perform equilibration scaling;\\ |
|
1218 \verb|GLP_SF_2N| & round scale factors to nearest power of two;\\ |
|
1219 \verb|GLP_SF_SKIP| & skip scaling, if the problem is well scaled.\\ |
|
1220 \end{tabular} |
|
1221 |
|
1222 The parameter \verb|flags| may be specified as \verb|GLP_SF_AUTO|, in |
|
1223 which case the routine chooses the scaling options automatically. |
|
1224 |
|
1225 \subsection{glp\_unscale\_prob---unscale problem data} |
|
1226 |
|
1227 \subsubsection*{Synopsis} |
|
1228 |
|
1229 \begin{verbatim} |
|
1230 void glp_unscale_prob(glp_prob *lp); |
|
1231 \end{verbatim} |
|
1232 |
|
1233 The routine \verb|glp_unscale_prob| performs unscaling of problem data |
|
1234 for the specified problem object. |
|
1235 |
|
1236 ``Unscaling'' means replacing the current scaling matrices $R$ and $S$ |
|
1237 by unity matrices that cancels the scaling effect. |
|
1238 |
|
1239 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1240 |
|
1241 \newpage |
|
1242 |
|
1243 \section{LP basis constructing routines} |
|
1244 |
|
1245 \subsection{Background} |
|
1246 |
|
1247 To start the search the simplex method needs a valid initial basis. In |
|
1248 GLPK the basis is completely defined by a set of {\it statuses} assigned |
|
1249 to {\it all} (auxiliary and structural) variables, where the status may |
|
1250 be one of the following: |
|
1251 |
|
1252 \begin{tabular}{@{}ll} |
|
1253 \verb|GLP_BS| & basic variable;\\ |
|
1254 \verb|GLP_NL| & non-basic variable having active lower bound;\\ |
|
1255 \verb|GLP_NU| & non-basic variable having active upper bound;\\ |
|
1256 \verb|GLP_NF| & non-basic free variable;\\ |
|
1257 \verb|GLP_NS| & non-basic fixed variable.\\ |
|
1258 \end{tabular} |
|
1259 |
|
1260 The basis is {\it valid}, if the basis matrix, which is a matrix built |
|
1261 of columns of the augmented constraint matrix $(I\:|-A)$ corresponding |
|
1262 to basic variables, is non-singular. This, in particular, means that |
|
1263 the number of basic variables must be the same as the number of rows in |
|
1264 the problem object. (For more details see Section \ref{lpbasis}, page |
|
1265 \pageref{lpbasis}.) |
|
1266 |
|
1267 Any initial basis may be constructed (or restored) with the API |
|
1268 routines \verb|glp_set_row_stat| and \verb|glp_set_col_stat| by |
|
1269 assigning appropriate statuses to auxiliary and structural variables. |
|
1270 Another way to construct an initial basis is to use API routines like |
|
1271 \verb|glp_adv_basis|, which implement so called |
|
1272 {\it crashing}.\footnote{This term is from early linear programming |
|
1273 systems and means a heuristic to construct a valid initial basis.} Note |
|
1274 that on normal exit the simplex solver remains the basis valid, so in |
|
1275 case of reoptimization there is no need to construct an initial basis |
|
1276 from scratch. |
|
1277 |
|
1278 \subsection{glp\_set\_row\_stat---set (change) row status} |
|
1279 |
|
1280 \subsubsection*{Synopsis} |
|
1281 |
|
1282 \begin{verbatim} |
|
1283 void glp_set_row_stat(glp_prob *lp, int i, int stat); |
|
1284 \end{verbatim} |
|
1285 |
|
1286 \subsubsection*{Description} |
|
1287 |
|
1288 The routine \verb|glp_set_row_stat| sets (changes) the current status |
|
1289 of \verb|i|-th row (auxiliary variable) as specified by the parameter |
|
1290 \verb|stat|: |
|
1291 |
|
1292 \begin{tabular}{@{}lp{104.2mm}@{}} |
|
1293 \verb|GLP_BS| & make the row basic (make the constraint inactive); \\ |
|
1294 \verb|GLP_NL| & make the row non-basic (make the constraint active); \\ |
|
1295 \end{tabular} |
|
1296 |
|
1297 \newpage |
|
1298 |
|
1299 \begin{tabular}{@{}lp{104.2mm}@{}} |
|
1300 \verb|GLP_NU| & make the row non-basic and set it to the upper bound; |
|
1301 if the row is not double-bounded, this status is equivalent to |
|
1302 \verb|GLP_NL| (only in the case of this routine); \\ |
|
1303 \verb|GLP_NF| & the same as \verb|GLP_NL| (only in the case of this |
|
1304 routine); \\ |
|
1305 \verb|GLP_NS| & the same as \verb|GLP_NL| (only in the case of this |
|
1306 routine). \\ |
|
1307 \end{tabular} |
|
1308 |
|
1309 \subsection{glp\_set\_col\_stat---set (change) column status} |
|
1310 |
|
1311 \subsubsection*{Synopsis} |
|
1312 |
|
1313 \begin{verbatim} |
|
1314 void glp_set_col_stat(glp_prob *lp, int j, int stat); |
|
1315 \end{verbatim} |
|
1316 |
|
1317 \subsubsection*{Description} |
|
1318 |
|
1319 The routine \verb|glp_set_col_stat sets| (changes) the current status |
|
1320 of \verb|j|-th column (structural variable) as specified by the |
|
1321 parameter \verb|stat|: |
|
1322 |
|
1323 \begin{tabular}{@{}lp{104.2mm}@{}} |
|
1324 \verb|GLP_BS| & make the column basic; \\ |
|
1325 \verb|GLP_NL| & make the column non-basic; \\ |
|
1326 \verb|GLP_NU| & make the column non-basic and set it to the upper |
|
1327 bound; if the column is not double-bounded, this status is equivalent |
|
1328 to \verb|GLP_NL| (only in the case of this routine); \\ |
|
1329 \verb|GLP_NF| & the same as \verb|GLP_NL| (only in the case of this |
|
1330 routine); \\ |
|
1331 \verb|GLP_NS| & the same as \verb|GLP_NL| (only in the case of this |
|
1332 routine). |
|
1333 \end{tabular} |
|
1334 |
|
1335 \subsection{glp\_std\_basis---construct standard initial LP basis} |
|
1336 |
|
1337 \subsubsection*{Synopsis} |
|
1338 |
|
1339 \begin{verbatim} |
|
1340 void glp_std_basis(glp_prob *lp); |
|
1341 \end{verbatim} |
|
1342 |
|
1343 \subsubsection*{Description} |
|
1344 |
|
1345 The routine \verb|glp_std_basis| constructs the ``standard'' (trivial) |
|
1346 initial LP basis for the specified problem object. |
|
1347 |
|
1348 In the ``standard'' LP basis all auxiliary variables (rows) are basic, |
|
1349 and all structural variables (columns) are non-basic (so the |
|
1350 corresponding basis matrix is unity). |
|
1351 |
|
1352 \newpage |
|
1353 |
|
1354 \subsection{glp\_adv\_basis---construct advanced initial LP basis} |
|
1355 |
|
1356 \subsubsection*{Synopsis} |
|
1357 |
|
1358 \begin{verbatim} |
|
1359 void glp_adv_basis(glp_prob *lp, int flags); |
|
1360 \end{verbatim} |
|
1361 |
|
1362 \subsubsection*{Description} |
|
1363 |
|
1364 The routine \verb|glp_adv_basis| constructs an advanced initial LP |
|
1365 basis for the specified problem object. |
|
1366 |
|
1367 The parameter \verb|flags| is reserved for use in the future and must |
|
1368 be specified as zero. |
|
1369 |
|
1370 In order to construct the advanced initial LP basis the routine does |
|
1371 the following: |
|
1372 |
|
1373 1) includes in the basis all non-fixed auxiliary variables; |
|
1374 |
|
1375 2) includes in the basis as many non-fixed structural variables as |
|
1376 possible keeping the triangular form of the basis matrix; |
|
1377 |
|
1378 3) includes in the basis appropriate (fixed) auxiliary variables to |
|
1379 complete the basis. |
|
1380 |
|
1381 As a result the initial LP basis has as few fixed variables as possible |
|
1382 and the corresponding basis matrix is triangular. |
|
1383 |
|
1384 \subsection{glp\_cpx\_basis---construct Bixby's initial LP basis} |
|
1385 |
|
1386 \subsubsection*{Synopsis} |
|
1387 |
|
1388 \begin{verbatim} |
|
1389 void glp_cpx_basis(glp_prob *lp); |
|
1390 \end{verbatim} |
|
1391 |
|
1392 \subsubsection*{Description} |
|
1393 |
|
1394 The routine \verb|glp_cpx_basis| constructs an initial basis for the |
|
1395 specified problem object with the algorithm proposed by |
|
1396 R.~Bixby.\footnote{Robert E. Bixby, ``Implementing the Simplex Method: |
|
1397 The Initial Basis.'' ORSA Journal on Computing, Vol. 4, No. 3, 1992, |
|
1398 pp. 267-84.} |
|
1399 |
|
1400 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1401 |
|
1402 \newpage |
|
1403 |
|
1404 \section{Simplex method routines} |
|
1405 |
|
1406 The {\it simplex method} is a well known efficient numerical procedure |
|
1407 to solve LP problems. |
|
1408 |
|
1409 On each iteration the simplex method transforms the original system of |
|
1410 equaility constraints (1.2) resolving them through different sets of |
|
1411 variables to an equivalent system called {\it the simplex table} (or |
|
1412 sometimes {\it the simplex tableau}), which has the following form: |
|
1413 $$ |
|
1414 \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}r} |
|
1415 z&=&d_1(x_N)_1&+&d_2(x_N)_2&+ \dots +&d_n(x_N)_n \\ |
|
1416 (x_B)_1&=&\xi_{11}(x_N)_1& +& \xi_{12}(x_N)_2& + \dots +& |
|
1417 \xi_{1n}(x_N)_n \\ |
|
1418 (x_B)_2&=& \xi_{21}(x_N)_1& +& \xi_{22}(x_N)_2& + \dots +& |
|
1419 \xi_{2n}(x_N)_n \\ |
|
1420 \multicolumn{7}{c} |
|
1421 {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .} \\ |
|
1422 (x_B)_m&=&\xi_{m1}(x_N)_1& +& \xi_{m2}(x_N)_2& + \dots +& |
|
1423 \xi_{mn}(x_N)_n \\ |
|
1424 \end{array} \eqno (2.3) |
|
1425 $$ |
|
1426 where: $(x_B)_1, (x_B)_2, \dots, (x_B)_m$ are basic variables; |
|
1427 $(x_N)_1, (x_N)_2, \dots, (x_N)_n$ are non-basic variables; |
|
1428 $d_1, d_2, \dots, d_n$ are reduced costs; |
|
1429 $\xi_{11}, \xi_{12}, \dots, \xi_{mn}$ are coefficients of the |
|
1430 simplex table. (May note that the original LP problem (1.1)---(1.3) also |
|
1431 has the form of a simplex table, where all equalities are resolved |
|
1432 through auxiliary variables.) |
|
1433 |
|
1434 From the linear programming theory it is known that if an optimal |
|
1435 solution of the LP problem (1.1)---(1.3) exists, it can always be |
|
1436 written in the form (2.3), where non-basic variables are set on their |
|
1437 bounds while values of the objective function and basic variables are |
|
1438 determined by the corresponding equalities of the simplex table. |
|
1439 |
|
1440 A set of values of all basic and non-basic variables determined by the |
|
1441 simplex table is called {\it basic solution}. If all basic variables are |
|
1442 within their bounds, the basic solution is called {\it (primal) |
|
1443 feasible}, otherwise it is called {\it (primal) infeasible}. A feasible |
|
1444 basic solution, which provides a smallest (in case of minimization) or |
|
1445 a largest (in case of maximization) value of the objective function is |
|
1446 called {\it optimal}. Therefore, for solving LP problem the simplex |
|
1447 method tries to find its optimal basic solution. |
|
1448 |
|
1449 Primal feasibility of some basic solution may be stated by simple |
|
1450 checking if all basic variables are within their bounds. Basic solution |
|
1451 is optimal if additionally the following optimality conditions are |
|
1452 satisfied for all non-basic variables: |
|
1453 \begin{center} |
|
1454 \begin{tabular}{lcc} |
|
1455 Status of $(x_N)_j$ & Minimization & Maximization \\ |
|
1456 \hline |
|
1457 $(x_N)_j$ is free & $d_j = 0$ & $d_j = 0$ \\ |
|
1458 $(x_N)_j$ is on its lower bound & $d_j \geq 0$ & $d_j \leq 0$ \\ |
|
1459 $(x_N)_j$ is on its upper bound & $d_j \leq 0$ & $d_j \geq 0$ \\ |
|
1460 \end{tabular} |
|
1461 \end{center} |
|
1462 In other words, basic solution is optimal if there is no non-basic |
|
1463 variable, which changing in the feasible direction (i.e. increasing if |
|
1464 it is free or on its lower bound, or decreasing if it is free or on its |
|
1465 upper bound) can improve (i.e. decrease in case of minimization or |
|
1466 increase in case of maximization) the objective function. |
|
1467 |
|
1468 If all non-basic variables satisfy to the optimality conditions shown |
|
1469 above (independently on whether basic variables are within their bounds |
|
1470 or not), the basic solution is called {\it dual feasible}, otherwise it |
|
1471 is called {\it dual infeasible}. |
|
1472 |
|
1473 It may happen that some LP problem has no primal feasible solution due |
|
1474 to incorrect formulation---this means that its constraints conflict |
|
1475 with each other. It also may happen that some LP problem has unbounded |
|
1476 solution again due to incorrect formulation---this means that some |
|
1477 non-basic variable can improve the objective function, i.e. the |
|
1478 optimality conditions are violated, and at the same time this variable |
|
1479 can infinitely change in the feasible direction meeting no resistance |
|
1480 from basic variables. (May note that in the latter case the LP problem |
|
1481 has no dual feasible solution.) |
|
1482 |
|
1483 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1484 |
|
1485 \subsection{glp\_simplex---solve LP problem with the primal or dual |
|
1486 simplex method} |
|
1487 |
|
1488 \subsubsection*{Synopsis} |
|
1489 |
|
1490 \begin{verbatim} |
|
1491 int glp_simplex(glp_prob *lp, const glp_smcp *parm); |
|
1492 \end{verbatim} |
|
1493 |
|
1494 \subsubsection*{Description} |
|
1495 |
|
1496 The routine \verb|glp_simplex| is a driver to the LP solver based on |
|
1497 the simplex method. This routine retrieves problem data from the |
|
1498 specified problem object, calls the solver to solve the problem |
|
1499 instance, and stores results of computations back into the problem |
|
1500 object. |
|
1501 |
|
1502 The simplex solver has a set of control parameters. Values of the |
|
1503 control parameters can be passed in the structure \verb|glp_smcp|, |
|
1504 which the parameter \verb|parm| points to. For detailed description of |
|
1505 this structure see paragraph ``Control parameters'' below. |
|
1506 Before specifying some control parameters the application program |
|
1507 should initialize the structure \verb|glp_smcp| by default values of |
|
1508 all control parameters using the routine \verb|glp_init_smcp| (see the |
|
1509 next subsection). This is needed for backward compatibility, because in |
|
1510 the future there may appear new members in the structure |
|
1511 \verb|glp_smcp|. |
|
1512 |
|
1513 The parameter \verb|parm| can be specified as \verb|NULL|, in which |
|
1514 case the solver uses default settings. |
|
1515 |
|
1516 \subsubsection*{Returns} |
|
1517 |
|
1518 \def\arraystretch{1} |
|
1519 |
|
1520 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
1521 0 & The LP problem instance has been successfully solved. (This code |
|
1522 does {\it not} necessarily mean that the solver has found optimal |
|
1523 solution. It only means that the solution process was successful.) \\ |
|
1524 \verb|GLP_EBADB| & Unable to start the search, because the initial basis |
|
1525 specified in the problem object is invalid---the number of basic |
|
1526 (auxiliary and structural) variables is not the same as the number of |
|
1527 rows in the problem object.\\ |
|
1528 \verb|GLP_ESING| & Unable to start the search, because the basis matrix |
|
1529 corresponding to the initial basis is singular within the working |
|
1530 precision.\\ |
|
1531 \verb|GLP_ECOND| & Unable to start the search, because the basis matrix |
|
1532 corresponding to the initial basis is ill-conditioned, i.e. its |
|
1533 condition number is too large.\\ |
|
1534 \verb|GLP_EBOUND| & Unable to start the search, because some |
|
1535 double-bounded (auxiliary or structural) variables have incorrect |
|
1536 bounds.\\ |
|
1537 \verb|GLP_EFAIL| & The search was prematurely terminated due to the |
|
1538 solver failure.\\ |
|
1539 \verb|GLP_EOBJLL| & The search was prematurely terminated, because the |
|
1540 objective function being maximized has reached its lower limit and |
|
1541 continues decreasing (the dual simplex only).\\ |
|
1542 \verb|GLP_EOBJUL| & The search was prematurely terminated, because the |
|
1543 objective function being minimized has reached its upper limit and |
|
1544 continues increasing (the dual simplex only).\\ |
|
1545 \verb|GLP_EITLIM| & The search was prematurely terminated, because the |
|
1546 simplex iteration limit has been exceeded.\\ |
|
1547 \verb|GLP_ETMLIM| & The search was prematurely terminated, because the |
|
1548 time limit has been exceeded.\\ |
|
1549 \verb|GLP_ENOPFS| & The LP problem instance has no primal feasible |
|
1550 solution (only if the LP presolver is used).\\ |
|
1551 \verb|GLP_ENODFS| & The LP problem instance has no dual feasible |
|
1552 solution (only if the LP presolver is used).\\ |
|
1553 \end{tabular} |
|
1554 |
|
1555 \subsubsection*{Built-in LP presolver} |
|
1556 |
|
1557 The simplex solver has {\it built-in LP presolver}. It is a subprogram |
|
1558 that transforms the original LP problem specified in the problem object |
|
1559 to an equivalent LP problem, which may be easier for solving with the |
|
1560 simplex method than the original one. This is attained mainly due to |
|
1561 reducing the problem size and improving its numeric properties (for |
|
1562 example, by removing some inactive constraints or by fixing some |
|
1563 non-basic variables). Once the transformed LP problem has been solved, |
|
1564 the presolver transforms its basic solution back to the corresponding |
|
1565 basic solution of the original problem. |
|
1566 |
|
1567 Presolving is an optional feature of the routine \verb|glp_simplex|, |
|
1568 and by default it is disabled. In order to enable the LP presolver the |
|
1569 control parameter \verb|presolve| should be set to \verb|GLP_ON| (see |
|
1570 paragraph ``Control parameters'' below). Presolving may be used when |
|
1571 the problem instance is solved for the first time. However, on |
|
1572 performing re-optimization the presolver should be disabled. |
|
1573 |
|
1574 The presolving procedure is transparent to the API user in the sense |
|
1575 that all necessary processing is performed internally, and a basic |
|
1576 solution of the original problem recovered by the presolver is the same |
|
1577 as if it were computed directly, i.e. without presolving. |
|
1578 |
|
1579 Note that the presolver is able to recover only optimal solutions. If |
|
1580 a computed solution is infeasible or non-optimal, the corresponding |
|
1581 solution of the original problem cannot be recovered and therefore |
|
1582 remains undefined. If you need to know a basic solution even if it is |
|
1583 infeasible or non-optimal, the presolver should be disabled. |
|
1584 |
|
1585 \subsubsection*{Terminal output} |
|
1586 |
|
1587 Solving large problem instances may take a long time, so the solver |
|
1588 reports some information about the current basic solution, which is sent |
|
1589 to the terminal. This information has the following format: |
|
1590 |
|
1591 \begin{verbatim} |
|
1592 nnn: obj = xxx infeas = yyy (ddd) |
|
1593 \end{verbatim} |
|
1594 |
|
1595 \noindent |
|
1596 where: `\verb|nnn|' is the iteration number, `\verb|xxx|' is the |
|
1597 current value of the objective function (it is is unscaled and has |
|
1598 correct sign); `\verb|yyy|' is the current sum of primal or dual |
|
1599 infeasibilities (it is scaled and therefore may be used only for visual |
|
1600 estimating), `\verb|ddd|' is the current number of fixed basic |
|
1601 variables. |
|
1602 |
|
1603 The symbol preceding the iteration number indicates which phase of the |
|
1604 simplex method is in effect: |
|
1605 |
|
1606 {\it Blank} means that the solver is searching for primal feasible |
|
1607 solution using the primal simplex or for dual feasible solution using |
|
1608 the dual simplex; |
|
1609 |
|
1610 {\it Asterisk} (\verb|*|) means that the solver is searching for |
|
1611 optimal solution using the primal simplex; |
|
1612 |
|
1613 {\it Vertical dash} (\verb/|/) means that the solver is searching for |
|
1614 optimal solution using the dual simplex. |
|
1615 |
|
1616 \subsubsection*{Control parameters} |
|
1617 |
|
1618 This paragraph describes all control parameters currently used in the |
|
1619 simplex solver. Symbolic names of control parameters are names of |
|
1620 corresponding members in the structure \verb|glp_smcp|. |
|
1621 |
|
1622 \medskip |
|
1623 |
|
1624 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1625 \multicolumn{2}{@{}l}{{\tt int msg\_lev} (default: {\tt GLP\_MSG\_ALL})} |
|
1626 \\ |
|
1627 &Message level for terminal output:\\ |
|
1628 &\verb|GLP_MSG_OFF|---no output;\\ |
|
1629 &\verb|GLP_MSG_ERR|---error and warning messages only;\\ |
|
1630 &\verb|GLP_MSG_ON |---normal output;\\ |
|
1631 &\verb|GLP_MSG_ALL|---full output (including informational messages). |
|
1632 \\ |
|
1633 \end{tabular} |
|
1634 |
|
1635 \medskip |
|
1636 |
|
1637 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1638 \multicolumn{2}{@{}l}{{\tt int meth} (default: {\tt GLP\_PRIMAL})} |
|
1639 \\ |
|
1640 &Simplex method option:\\ |
|
1641 &\verb|GLP_PRIMAL|---use two-phase primal simplex;\\ |
|
1642 &\verb|GLP_DUAL |---use two-phase dual simplex;\\ |
|
1643 &\verb|GLP_DUALP |---use two-phase dual simplex, and if it fails, |
|
1644 switch to the\\ |
|
1645 &\verb| |$\:$ primal simplex.\\ |
|
1646 \end{tabular} |
|
1647 |
|
1648 \medskip |
|
1649 |
|
1650 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1651 \multicolumn{2}{@{}l}{{\tt int pricing} (default: {\tt GLP\_PT\_PSE})} |
|
1652 \\ |
|
1653 &Pricing technique:\\ |
|
1654 &\verb|GLP_PT_STD|---standard (textbook);\\ |
|
1655 &\verb|GLP_PT_PSE|---projected steepest edge.\\ |
|
1656 \end{tabular} |
|
1657 |
|
1658 \medskip |
|
1659 |
|
1660 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1661 \multicolumn{2}{@{}l}{{\tt int r\_test} (default: {\tt GLP\_RT\_HAR})} |
|
1662 \\ |
|
1663 &Ratio test technique:\\ |
|
1664 &\verb|GLP_RT_STD|---standard (textbook);\\ |
|
1665 &\verb|GLP_RT_HAR|---Harris' two-pass ratio test.\\ |
|
1666 \end{tabular} |
|
1667 |
|
1668 \medskip |
|
1669 |
|
1670 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1671 \multicolumn{2}{@{}l}{{\tt double tol\_bnd} (default: {\tt 1e-7})} |
|
1672 \\ |
|
1673 &Tolerance used to check if the basic solution is primal feasible. |
|
1674 (Do not change this parameter without detailed understanding its |
|
1675 purpose.)\\ |
|
1676 \end{tabular} |
|
1677 |
|
1678 \medskip |
|
1679 |
|
1680 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1681 \multicolumn{2}{@{}l}{{\tt double tol\_dj} (default: {\tt 1e-7})} |
|
1682 \\ |
|
1683 &Tolerance used to check if the basic solution is dual feasible. |
|
1684 (Do not change this parameter without detailed understanding its |
|
1685 purpose.)\\ |
|
1686 \end{tabular} |
|
1687 |
|
1688 \medskip |
|
1689 |
|
1690 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1691 \multicolumn{2}{@{}l}{{\tt double tol\_piv} (default: {\tt 1e-10})} |
|
1692 \\ |
|
1693 &Tolerance used to choose eligble pivotal elements of the simplex table. |
|
1694 (Do not change this parameter without detailed understanding its |
|
1695 purpose.)\\ |
|
1696 \end{tabular} |
|
1697 |
|
1698 \medskip |
|
1699 |
|
1700 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1701 \multicolumn{2}{@{}l}{{\tt double obj\_ll} (default: {\tt -DBL\_MAX})} |
|
1702 \\ |
|
1703 &Lower limit of the objective function. If the objective function |
|
1704 reaches this limit and continues decreasing, the solver terminates the |
|
1705 search. (Used in the dual simplex only.)\\ |
|
1706 \end{tabular} |
|
1707 |
|
1708 \medskip |
|
1709 |
|
1710 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1711 \multicolumn{2}{@{}l}{{\tt double obj\_ul} (default: {\tt +DBL\_MAX})} |
|
1712 \\ |
|
1713 &Upper limit of the objective function. If the objective function |
|
1714 reaches this limit and continues increasing, the solver terminates the |
|
1715 search. (Used in the dual simplex only.)\\ |
|
1716 \end{tabular} |
|
1717 |
|
1718 \medskip |
|
1719 |
|
1720 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1721 \multicolumn{2}{@{}l}{{\tt int it\_lim} (default: {\tt INT\_MAX})} |
|
1722 \\ |
|
1723 &Simplex iteration limit.\\ |
|
1724 \end{tabular} |
|
1725 |
|
1726 \medskip |
|
1727 |
|
1728 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1729 \multicolumn{2}{@{}l}{{\tt int tm\_lim} (default: {\tt INT\_MAX})} |
|
1730 \\ |
|
1731 &Searching time limit, in milliseconds.\\ |
|
1732 \end{tabular} |
|
1733 |
|
1734 \medskip |
|
1735 |
|
1736 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1737 \multicolumn{2}{@{}l}{{\tt int out\_frq} (default: {\tt 500})} |
|
1738 \\ |
|
1739 &Output frequency, in iterations. This parameter specifies how |
|
1740 frequently the solver sends information about the solution process to |
|
1741 the terminal.\\ |
|
1742 \end{tabular} |
|
1743 |
|
1744 \medskip |
|
1745 |
|
1746 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1747 \multicolumn{2}{@{}l}{{\tt int out\_dly} (default: {\tt 0})} |
|
1748 \\ |
|
1749 &Output delay, in milliseconds. This parameter specifies how long the |
|
1750 solver should delay sending information about the solution process to |
|
1751 the terminal.\\ |
|
1752 \end{tabular} |
|
1753 |
|
1754 \medskip |
|
1755 |
|
1756 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
1757 \multicolumn{2}{@{}l}{{\tt int presolve} (default: {\tt GLP\_OFF})} |
|
1758 \\ |
|
1759 &LP presolver option:\\ |
|
1760 &\verb|GLP_ON |---enable using the LP presolver;\\ |
|
1761 &\verb|GLP_OFF|---disable using the LP presolver.\\ |
|
1762 \end{tabular} |
|
1763 |
|
1764 \subsubsection*{Example 1} |
|
1765 |
|
1766 The following main program reads LP problem instance in fixed MPS |
|
1767 format from file \verb|25fv47.mps|,\footnote{This instance in fixed MPS |
|
1768 format can be found in the Netlib LP collection; see |
|
1769 {\tt ftp://ftp.netlib.org/lp/data/}.} constructs an advanced initial |
|
1770 basis, solves the instance with the primal simplex method (by default), |
|
1771 and writes the solution to file \verb|25fv47.txt|. |
|
1772 |
|
1773 \newpage |
|
1774 |
|
1775 \begin{footnotesize} |
|
1776 \begin{verbatim} |
|
1777 /* spxsamp1.c */ |
|
1778 |
|
1779 #include <stdio.h> |
|
1780 #include <stdlib.h> |
|
1781 #include <glpk.h> |
|
1782 |
|
1783 int main(void) |
|
1784 { glp_prob *P; |
|
1785 P = glp_create_prob(); |
|
1786 glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); |
|
1787 glp_adv_basis(P, 0); |
|
1788 glp_simplex(P, NULL); |
|
1789 glp_print_sol(P, "25fv47.txt"); |
|
1790 glp_delete_prob(P); |
|
1791 return 0; |
|
1792 } |
|
1793 |
|
1794 /* eof */ |
|
1795 \end{verbatim} |
|
1796 \end{footnotesize} |
|
1797 |
|
1798 \noindent |
|
1799 Below here is shown the terminal output from this example program. |
|
1800 |
|
1801 \begin{footnotesize} |
|
1802 \begin{verbatim} |
|
1803 Reading problem data from `25fv47.mps'... |
|
1804 Problem: 25FV47 |
|
1805 Objective: R0000 |
|
1806 822 rows, 1571 columns, 11127 non-zeros |
|
1807 6919 records were read |
|
1808 Crashing... |
|
1809 Size of triangular part = 799 |
|
1810 0: obj = 1.627307307e+04 infeas = 5.194e+04 (23) |
|
1811 200: obj = 1.474901610e+04 infeas = 1.233e+04 (19) |
|
1812 400: obj = 1.343909995e+04 infeas = 3.648e+03 (13) |
|
1813 600: obj = 1.756052217e+04 infeas = 4.179e+02 (7) |
|
1814 * 775: obj = 1.789251591e+04 infeas = 4.982e-14 (1) |
|
1815 * 800: obj = 1.663354510e+04 infeas = 2.857e-14 (1) |
|
1816 * 1000: obj = 1.024935068e+04 infeas = 1.958e-12 (1) |
|
1817 * 1200: obj = 7.860174791e+03 infeas = 2.810e-29 (1) |
|
1818 * 1400: obj = 6.642378184e+03 infeas = 2.036e-16 (1) |
|
1819 * 1600: obj = 6.037014568e+03 infeas = 0.000e+00 (1) |
|
1820 * 1800: obj = 5.662171307e+03 infeas = 6.447e-15 (1) |
|
1821 * 2000: obj = 5.528146165e+03 infeas = 9.764e-13 (1) |
|
1822 * 2125: obj = 5.501845888e+03 infeas = 0.000e+00 (1) |
|
1823 OPTIMAL SOLUTION FOUND |
|
1824 Writing basic solution to `25fv47.txt'... |
|
1825 \end{verbatim} |
|
1826 \end{footnotesize} |
|
1827 |
|
1828 \newpage |
|
1829 |
|
1830 \subsubsection*{Example 2} |
|
1831 |
|
1832 The following main program solves the same LP problem instance as in |
|
1833 Example 1 above, however, it uses the dual simplex method, which starts |
|
1834 from the standard initial basis. |
|
1835 |
|
1836 \begin{footnotesize} |
|
1837 \begin{verbatim} |
|
1838 /* spxsamp2.c */ |
|
1839 |
|
1840 #include <stdio.h> |
|
1841 #include <stdlib.h> |
|
1842 #include <glpk.h> |
|
1843 |
|
1844 int main(void) |
|
1845 { glp_prob *P; |
|
1846 glp_smcp parm; |
|
1847 P = glp_create_prob(); |
|
1848 glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); |
|
1849 glp_init_smcp(&parm); |
|
1850 parm.meth = GLP_DUAL; |
|
1851 glp_simplex(P, &parm); |
|
1852 glp_print_sol(P, "25fv47.txt"); |
|
1853 glp_delete_prob(P); |
|
1854 return 0; |
|
1855 } |
|
1856 |
|
1857 /* eof */ |
|
1858 \end{verbatim} |
|
1859 \end{footnotesize} |
|
1860 |
|
1861 \noindent |
|
1862 Below here is shown the terminal output from this example program. |
|
1863 |
|
1864 \begin{footnotesize} |
|
1865 \begin{verbatim} |
|
1866 Reading problem data from `25fv47.mps'... |
|
1867 Problem: 25FV47 |
|
1868 Objective: R0000 |
|
1869 822 rows, 1571 columns, 11127 non-zeros |
|
1870 6919 records were read |
|
1871 0: infeas = 1.223e+03 (516) |
|
1872 200: infeas = 7.000e+00 (471) |
|
1873 240: infeas = 1.106e-14 (461) |
|
1874 | 400: obj = -5.394267152e+03 infeas = 5.571e-16 (391) |
|
1875 | 600: obj = -4.586395752e+03 infeas = 1.389e-15 (340) |
|
1876 | 800: obj = -4.158268146e+03 infeas = 1.640e-15 (264) |
|
1877 | 1000: obj = -3.725320045e+03 infeas = 5.181e-15 (245) |
|
1878 | 1200: obj = -3.104802163e+03 infeas = 1.019e-14 (210) |
|
1879 | 1400: obj = -2.584190499e+03 infeas = 8.865e-15 (178) |
|
1880 | 1600: obj = -2.073852927e+03 infeas = 7.867e-15 (142) |
|
1881 | 1800: obj = -1.164037407e+03 infeas = 8.792e-15 (109) |
|
1882 | 2000: obj = -4.370590250e+02 infeas = 2.591e-14 (85) |
|
1883 | 2200: obj = 1.068240144e+03 infeas = 1.025e-13 (70) |
|
1884 | 2400: obj = 1.607481126e+03 infeas = 3.272e-14 (67) |
|
1885 | 2600: obj = 3.038230551e+03 infeas = 4.850e-14 (52) |
|
1886 | 2800: obj = 4.316238187e+03 infeas = 2.622e-14 (36) |
|
1887 | 3000: obj = 5.443842629e+03 infeas = 3.976e-15 (11) |
|
1888 | 3060: obj = 5.501845888e+03 infeas = 8.806e-15 (2) |
|
1889 OPTIMAL SOLUTION FOUND |
|
1890 Writing basic solution to `25fv47.txt'... |
|
1891 \end{verbatim} |
|
1892 \end{footnotesize} |
|
1893 |
|
1894 \subsection{glp\_exact---solve LP problem in exact arithmetic} |
|
1895 |
|
1896 \subsubsection*{Synopsis} |
|
1897 |
|
1898 \begin{verbatim} |
|
1899 int glp_exact(glp_prob *lp, const glp_smcp *parm); |
|
1900 \end{verbatim} |
|
1901 |
|
1902 \subsubsection*{Description} |
|
1903 |
|
1904 The routine \verb|glp_exact| is a tentative implementation of the |
|
1905 primal two-phase simplex method based on exact (rational) arithmetic. |
|
1906 It is similar to the routine \verb|glp_simplex|, however, for all |
|
1907 internal computations it uses arithmetic of rational numbers, which is |
|
1908 exact in mathematical sense, i.e. free of round-off errors unlike |
|
1909 floating-point arithmetic. |
|
1910 |
|
1911 Note that the routine \verb|glp_exact| uses only two control parameters |
|
1912 passed in the structure \verb|glp_smcp|, namely, \verb|it_lim| and |
|
1913 \verb|tm_lim|. |
|
1914 |
|
1915 \subsubsection*{Returns} |
|
1916 |
|
1917 \def\arraystretch{1} |
|
1918 |
|
1919 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
1920 0 & The LP problem instance has been successfully solved. (This code |
|
1921 does {\it not} necessarily mean that the solver has found optimal |
|
1922 solution. It only means that the solution process was successful.) \\ |
|
1923 \verb|GLP_EBADB| & Unable to start the search, because the initial basis |
|
1924 specified in the problem object is invalid---the number of basic |
|
1925 (auxiliary and structural) variables is not the same as the number of |
|
1926 rows in the problem object.\\ |
|
1927 \verb|GLP_ESING| & Unable to start the search, because the basis matrix |
|
1928 corresponding to the initial basis is exactly singular.\\ |
|
1929 \verb|GLP_EBOUND| & Unable to start the search, because some |
|
1930 double-bounded (auxiliary or structural) variables have incorrect |
|
1931 bounds.\\ |
|
1932 \verb|GLP_EFAIL| & The problem instance has no rows/columns.\\ |
|
1933 \verb|GLP_EITLIM| & The search was prematurely terminated, because the |
|
1934 simplex iteration limit has been exceeded.\\ |
|
1935 \verb|GLP_ETMLIM| & The search was prematurely terminated, because the |
|
1936 time limit has been exceeded.\\ |
|
1937 \end{tabular} |
|
1938 |
|
1939 \subsubsection*{Comments} |
|
1940 |
|
1941 Computations in exact arithmetic are very time consuming, so solving |
|
1942 LP problem with the routine \verb|glp_exact| from the very beginning is |
|
1943 not a good idea. It is much better at first to find an optimal basis |
|
1944 with the routine \verb|glp_simplex| and only then to call |
|
1945 \verb|glp_exact|, in which case only a few simplex iterations need to |
|
1946 be performed in exact arithmetic. |
|
1947 |
|
1948 \subsection{glp\_init\_smcp---initialize simplex solver control |
|
1949 parameters} |
|
1950 |
|
1951 \subsubsection*{Synopsis} |
|
1952 |
|
1953 \begin{verbatim} |
|
1954 int glp_init_smcp(glp_smcp *parm); |
|
1955 \end{verbatim} |
|
1956 |
|
1957 \subsubsection*{Description} |
|
1958 |
|
1959 The routine \verb|glp_init_smcp| initializes control parameters, which |
|
1960 are used by the simplex solver, with default values. |
|
1961 |
|
1962 Default values of the control parameters are stored in a \verb|glp_smcp| |
|
1963 structure, which the parameter \verb|parm| points to. |
|
1964 |
|
1965 \subsection{glp\_get\_status---determine generic status of basic |
|
1966 solution} |
|
1967 |
|
1968 \subsubsection*{Synopsis} |
|
1969 |
|
1970 \begin{verbatim} |
|
1971 int glp_get_status(glp_prob *lp); |
|
1972 \end{verbatim} |
|
1973 |
|
1974 \subsubsection*{Returns} |
|
1975 |
|
1976 The routine \verb|glp_get_status| reports the generic status of the |
|
1977 current basic solution for the specified problem object as follows: |
|
1978 |
|
1979 \begin{tabular}{@{}ll} |
|
1980 \verb|GLP_OPT| & solution is optimal; \\ |
|
1981 \verb|GLP_FEAS| & solution is feasible; \\ |
|
1982 \verb|GLP_INFEAS| & solution is infeasible; \\ |
|
1983 \verb|GLP_NOFEAS| & problem has no feasible solution; \\ |
|
1984 \verb|GLP_UNBND| & problem has unbounded solution; \\ |
|
1985 \verb|GLP_UNDEF| & solution is undefined. \\ |
|
1986 \end{tabular} |
|
1987 |
|
1988 More detailed information about the status of basic solution can be |
|
1989 retrieved with the routines \verb|glp_get_prim_stat| and |
|
1990 \verb|glp_get_dual_stat|. |
|
1991 |
|
1992 \newpage |
|
1993 |
|
1994 \subsection{glp\_get\_prim\_stat---retrieve status of primal basic |
|
1995 solution} |
|
1996 |
|
1997 \subsubsection*{Synopsis} |
|
1998 |
|
1999 \begin{verbatim} |
|
2000 int glp_get_prim_stat(glp_prob *lp); |
|
2001 \end{verbatim} |
|
2002 |
|
2003 \subsubsection*{Returns} |
|
2004 |
|
2005 The routine \verb|glp_get_prim_stat| reports the status of the primal |
|
2006 basic solution for the specified problem object as follows: |
|
2007 |
|
2008 \begin{tabular}{@{}ll} |
|
2009 \verb|GLP_UNDEF| & primal solution is undefined; \\ |
|
2010 \verb|GLP_FEAS| & primal solution is feasible; \\ |
|
2011 \verb|GLP_INFEAS| & primal solution is infeasible; \\ |
|
2012 \verb|GLP_NOFEAS| & no primal feasible solution exists. \\ |
|
2013 \end{tabular} |
|
2014 |
|
2015 \subsection{glp\_get\_dual\_stat---retrieve status of dual basic |
|
2016 solution} |
|
2017 |
|
2018 \subsubsection*{Synopsis} |
|
2019 |
|
2020 \begin{verbatim} |
|
2021 int glp_get_dual_stat(glp_prob *lp); |
|
2022 \end{verbatim} |
|
2023 |
|
2024 \subsubsection*{Returns} |
|
2025 |
|
2026 The routine \verb|glp_get_dual_stat| reports the status of the dual |
|
2027 basic solution for the specified problem object as follows: |
|
2028 |
|
2029 \begin{tabular}{@{}ll} |
|
2030 \verb|GLP_UNDEF| & dual solution is undefined; \\ |
|
2031 \verb|GLP_FEAS| & dual solution is feasible; \\ |
|
2032 \verb|GLP_INFEAS| & dual solution is infeasible; \\ |
|
2033 \verb|GLP_NOFEAS| & no dual feasible solution exists. \\ |
|
2034 \end{tabular} |
|
2035 |
|
2036 \subsection{glp\_get\_obj\_val---retrieve objective value} |
|
2037 |
|
2038 \subsubsection*{Synopsis} |
|
2039 |
|
2040 \begin{verbatim} |
|
2041 double glp_get_obj_val(glp_prob *lp); |
|
2042 \end{verbatim} |
|
2043 |
|
2044 \subsubsection*{Returns} |
|
2045 |
|
2046 The routine \verb|glp_get_obj_val| returns current value of the |
|
2047 objective function. |
|
2048 |
|
2049 \subsection{glp\_get\_row\_stat---retrieve row status} |
|
2050 |
|
2051 \subsubsection*{Synopsis} |
|
2052 |
|
2053 \begin{verbatim} |
|
2054 int glp_get_row_stat(glp_prob *lp, int i); |
|
2055 \end{verbatim} |
|
2056 |
|
2057 \subsubsection*{Returns} |
|
2058 |
|
2059 The routine \verb|glp_get_row_stat| returns current status assigned to |
|
2060 the auxiliary variable associated with \verb|i|-th row as follows: |
|
2061 |
|
2062 \begin{tabular}{@{}ll} |
|
2063 \verb|GLP_BS| & basic variable; \\ |
|
2064 \verb|GLP_NL| & non-basic variable on its lower bound; \\ |
|
2065 \verb|GLP_NU| & non-basic variable on its upper bound; \\ |
|
2066 \verb|GLP_NF| & non-basic free (unbounded) variable; \\ |
|
2067 \verb|GLP_NS| & non-basic fixed variable. \\ |
|
2068 \end{tabular} |
|
2069 |
|
2070 \subsection{glp\_get\_row\_prim---retrieve row primal value} |
|
2071 |
|
2072 \subsubsection*{Synopsis} |
|
2073 |
|
2074 \begin{verbatim} |
|
2075 double glp_get_row_prim(glp_prob *lp, int i); |
|
2076 \end{verbatim} |
|
2077 |
|
2078 \subsubsection*{Returns} |
|
2079 |
|
2080 The routine \verb|glp_get_row_prim| returns primal value of the |
|
2081 auxiliary variable associated with \verb|i|-th row. |
|
2082 |
|
2083 \subsection{glp\_get\_row\_dual---retrieve row dual value} |
|
2084 |
|
2085 \subsubsection*{Synopsis} |
|
2086 |
|
2087 \begin{verbatim} |
|
2088 double glp_get_row_dual(glp_prob *lp, int i); |
|
2089 \end{verbatim} |
|
2090 |
|
2091 \subsubsection*{Returns} |
|
2092 |
|
2093 The routine \verb|glp_get_row_dual| returns dual value (i.e. reduced |
|
2094 cost) of the auxiliary variable associated with \verb|i|-th row. |
|
2095 |
|
2096 \newpage |
|
2097 |
|
2098 \subsection{glp\_get\_col\_stat---retrieve column status} |
|
2099 |
|
2100 \subsubsection*{Synopsis} |
|
2101 |
|
2102 \begin{verbatim} |
|
2103 int glp_get_col_stat(glp_prob *lp, int j); |
|
2104 \end{verbatim} |
|
2105 |
|
2106 \subsubsection*{Returns} |
|
2107 |
|
2108 The routine \verb|glp_get_col_stat| returns current status assigned to |
|
2109 the structural variable associated with \verb|j|-th column as follows: |
|
2110 |
|
2111 \begin{tabular}{@{}ll} |
|
2112 \verb|GLP_BS| & basic variable; \\ |
|
2113 \verb|GLP_NL| & non-basic variable on its lower bound; \\ |
|
2114 \verb|GLP_NU| & non-basic variable on its upper bound; \\ |
|
2115 \verb|GLP_NF| & non-basic free (unbounded) variable; \\ |
|
2116 \verb|GLP_NS| & non-basic fixed variable. \\ |
|
2117 \end{tabular} |
|
2118 |
|
2119 \subsection{glp\_get\_col\_prim---retrieve column primal value} |
|
2120 |
|
2121 \subsubsection*{Synopsis} |
|
2122 |
|
2123 \begin{verbatim} |
|
2124 double glp_get_col_prim(glp_prob *lp, int j); |
|
2125 \end{verbatim} |
|
2126 |
|
2127 \subsubsection*{Returns} |
|
2128 |
|
2129 The routine \verb|glp_get_col_prim| returns primal value of the |
|
2130 structural variable associated with \verb|j|-th column. |
|
2131 |
|
2132 \subsection{glp\_get\_col\_dual---retrieve column dual value} |
|
2133 |
|
2134 \subsubsection*{Synopsis} |
|
2135 |
|
2136 \begin{verbatim} |
|
2137 double glp_get_col_dual(glp_prob *lp, int j); |
|
2138 \end{verbatim} |
|
2139 |
|
2140 \subsubsection*{Returns} |
|
2141 |
|
2142 The routine \verb|glp_get_col_dual| returns dual value (i.e. reduced |
|
2143 cost) of the structural variable associated with \verb|j|-th column. |
|
2144 |
|
2145 \newpage |
|
2146 |
|
2147 \subsection{glp\_get\_unbnd\_ray---determine variable causing\\ |
|
2148 unboundedness} |
|
2149 |
|
2150 \subsubsection*{Synopsis} |
|
2151 |
|
2152 \begin{verbatim} |
|
2153 int glp_get_unbnd_ray(glp_prob *lp); |
|
2154 \end{verbatim} |
|
2155 |
|
2156 \subsubsection*{Returns} |
|
2157 |
|
2158 The routine \verb|glp_get_unbnd_ray| returns the number $k$ of |
|
2159 a variable, which causes primal or dual unboundedness. |
|
2160 If $1\leq k\leq m$, it is $k$-th auxiliary variable, and if |
|
2161 $m+1\leq k\leq m+n$, it is $(k-m)$-th structural variable, where $m$ is |
|
2162 the number of rows, $n$ is the number of columns in the problem object. |
|
2163 If such variable is not defined, the routine returns 0. |
|
2164 |
|
2165 \subsubsection*{Comments} |
|
2166 |
|
2167 If it is not exactly known which version of the simplex solver |
|
2168 detected unboundedness, i.e. whether the unboundedness is primal or |
|
2169 dual, it is sufficient to check the status of the variable |
|
2170 with the routine \verb|glp_get_row_stat| or \verb|glp_get_col_stat|. |
|
2171 If the variable is non-basic, the unboundedness is primal, otherwise, |
|
2172 if the variable is basic, the unboundedness is dual (the latter case |
|
2173 means that the problem has no primal feasible dolution). |
|
2174 |
|
2175 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
2176 |
|
2177 \newpage |
|
2178 |
|
2179 \section{Interior-point method routines} |
|
2180 |
|
2181 {\it Interior-point methods} (also known as {\it barrier methods}) are |
|
2182 more modern and powerful numerical methods for large-scale linear |
|
2183 programming. Such methods are especially efficient for very sparse LP |
|
2184 problems and allow solving such problems much faster than the simplex |
|
2185 method. |
|
2186 |
|
2187 In brief, the GLPK interior-point solver works as follows. |
|
2188 |
|
2189 At first, the solver transforms the original LP to a {\it working} LP |
|
2190 in the standard format: |
|
2191 |
|
2192 \medskip |
|
2193 |
|
2194 \noindent |
|
2195 \hspace{.5in} minimize |
|
2196 $$z = c_1x_{m+1} + c_2x_{m+2} + \dots + c_nx_{m+n} + c_0 \eqno (2.4)$$ |
|
2197 \hspace{.5in} subject to linear constraints |
|
2198 $$ |
|
2199 \begin{array}{r@{\:}c@{\:}r@{\:}c@{\:}r@{\:}c@{\:}l} |
|
2200 a_{11}x_{m+1}&+&a_{12}x_{m+2}&+ \dots +&a_{1n}x_{m+n}&=&b_1 \\ |
|
2201 a_{21}x_{m+1}&+&a_{22}x_{m+2}&+ \dots +&a_{2n}x_{m+n}&=&b_2 \\ |
|
2202 \multicolumn{7}{c} |
|
2203 {.\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .\ \ .} \\ |
|
2204 a_{m1}x_{m+1}&+&a_{m2}x_{m+2}&+ \dots +&a_{mn}x_{m+n}&=&b_m \\ |
|
2205 \end{array} \eqno (2.5) |
|
2206 $$ |
|
2207 \hspace{.5in} and non-negative variables |
|
2208 $$x_1\geq 0,\ \ x_2\geq 0,\ \ \dots,\ \ x_n\geq 0 \eqno(2.6)$$ |
|
2209 where: $z$ is the objective function; $x_1$, \dots, $x_n$ are variables; |
|
2210 $c_1$, \dots, $c_n$ are objective coefficients; $c_0$ is a constant term |
|
2211 of the objective function;\linebreak $a_{11}$, \dots, $a_{mn}$ are |
|
2212 constraint coefficients; $b_1$, \dots, $b_m$ are right-hand sides. |
|
2213 |
|
2214 Using vector and matrix notations the working LP (2.4)---(2.6) can be |
|
2215 written as follows: |
|
2216 $$z=c^Tx+c_0\ \rightarrow\ \min,\eqno(2.7)$$ |
|
2217 $$Ax=b,\eqno(2.8)$$ |
|
2218 $$x\geq 0,\eqno(2.9)$$ |
|
2219 where: $x=(x_j)$ is $n$-vector of variables, $c=(c_j)$ is $n$-vector of |
|
2220 objective coefficients, $A=(a_{ij})$ is $m\times n$-matrix of |
|
2221 constraint coefficients, and $b=(b_i)$ is $m$-vector of right-hand |
|
2222 sides. |
|
2223 |
|
2224 Karush--Kuhn--Tucker optimality conditions for LP (2.7)---(2.9) are the |
|
2225 following: |
|
2226 |
|
2227 \newpage |
|
2228 |
|
2229 $$Ax=b,\eqno(2.10)$$ |
|
2230 $$A^T\pi+\lambda=c,\eqno(2.11)$$ |
|
2231 $$\lambda^Tx=0,\eqno(2.12)$$ |
|
2232 $$x\geq 0,\ \ \lambda\geq 0,\eqno(2.13)$$ |
|
2233 where: $\pi$ is $m$-vector of Lagrange multipliers (dual variables) for |
|
2234 equality constraints (2.8), $\lambda$ is $n$-vector of Lagrange |
|
2235 multipliers (dual variables) for non-negativity constraints (2.9), |
|
2236 (2.10) is the primal feasibility condition, (2.11) is the dual |
|
2237 feasibility condition, (2.12) is the primal-dual complementarity |
|
2238 condition, and (2.13) is the non-negativity conditions. |
|
2239 |
|
2240 The main idea of the primal-dual interior-point method is based on |
|
2241 finding a point in the primal-dual space (i.e. in the space of all |
|
2242 primal and dual variables $x$, $\pi$, and $\lambda$), which satisfies |
|
2243 to all optimality conditions (2.10)---(2.13). Obviously, $x$-component |
|
2244 of such point then provides an optimal solution to the working LP |
|
2245 (2.7)---(2.9). |
|
2246 |
|
2247 To find the optimal point $(x^*,\pi^*,\lambda^*)$ the interior-point |
|
2248 method attempts to solve the system of equations (2.10)---(2.12), which |
|
2249 is closed in the sense that the number of variables $x_j$, $\pi_i$, and |
|
2250 $\lambda_j$ and the number equations are the same and equal to $m+2n$. |
|
2251 Due to condition (2.12) this system of equations is non-linear, so it |
|
2252 can be solved with a version of {\it Newton's method} provided with |
|
2253 additional rules to keep the current point within the positive orthant |
|
2254 as required by the non-negativity conditions (2.13). |
|
2255 |
|
2256 Finally, once the optimal point $(x^*,\pi^*,\lambda^*)$ has been found, |
|
2257 the solver performs inverse transformations to recover corresponding |
|
2258 solution to the original LP passed to the solver from the application |
|
2259 program. |
|
2260 |
|
2261 \subsection{glp\_interior---solve LP problem with the interior-point |
|
2262 method} |
|
2263 |
|
2264 \subsubsection*{Synopsis} |
|
2265 |
|
2266 \begin{verbatim} |
|
2267 int glp_interior(glp_prob *P, const glp_iptcp *parm); |
|
2268 \end{verbatim} |
|
2269 |
|
2270 \subsubsection*{Description} |
|
2271 |
|
2272 The routine \verb|glp_interior| is a driver to the LP solver based on |
|
2273 the primal-dual interior-point method. This routine retrieves problem |
|
2274 data from the specified problem object, calls the solver to solve the |
|
2275 problem instance, and stores results of computations back into the |
|
2276 problem object. |
|
2277 |
|
2278 The interior-point solver has a set of control parameters. Values of |
|
2279 the control parameters can be passed in the structure \verb|glp_iptcp|, |
|
2280 which the parameter \verb|parm| points to. For detailed description of |
|
2281 this structure see paragraph ``Control parameters'' below. Before |
|
2282 specifying some control parameters the application program should |
|
2283 initialize the structure \verb|glp_iptcp| by default values of all |
|
2284 control parameters using the routine \verb|glp_init_iptcp| (see the |
|
2285 next subsection). This is needed for backward compatibility, because in |
|
2286 the future there may appear new members in the structure |
|
2287 \verb|glp_iptcp|. |
|
2288 |
|
2289 The parameter \verb|parm| can be specified as \verb|NULL|, in which |
|
2290 case the solver uses default settings. |
|
2291 |
|
2292 \subsubsection*{Returns} |
|
2293 |
|
2294 \def\arraystretch{1} |
|
2295 |
|
2296 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
2297 0 & The LP problem instance has been successfully solved. (This code |
|
2298 does {\it not} necessarily mean that the solver has found optimal |
|
2299 solution. It only means that the solution process was successful.) \\ |
|
2300 \verb|GLP_EFAIL| & The problem has no rows/columns.\\ |
|
2301 \verb|GLP_ENOCVG| & Very slow convergence or divergence.\\ |
|
2302 \verb|GLP_EITLIM| & Iteration limit exceeded.\\ |
|
2303 \verb|GLP_EINSTAB| & Numerical instability on solving Newtonian |
|
2304 system.\\ |
|
2305 \end{tabular} |
|
2306 |
|
2307 \subsubsection*{Comments} |
|
2308 |
|
2309 The routine \verb|glp_interior| implements an easy version of |
|
2310 the primal-dual interior-point method based on Mehrotra's |
|
2311 technique.\footnote{S. Mehrotra. On the implementation of a primal-dual |
|
2312 interior point method. SIAM J. on Optim., 2(4), pp. 575-601, 1992.} |
|
2313 |
|
2314 Note that currently the GLPK interior-point solver does not include |
|
2315 many important features, in particular: |
|
2316 |
|
2317 $\bullet$ it is not able to process dense columns. Thus, if the |
|
2318 constraint matrix of the LP problem has dense columns, the solving |
|
2319 process may be inefficient; |
|
2320 |
|
2321 $\bullet$ it has no features against numerical instability. For some |
|
2322 LP problems premature termination may happen if the matrix $ADA^T$ |
|
2323 becomes singular or ill-conditioned; |
|
2324 |
|
2325 $\bullet$ it is not able to identify the optimal basis, which |
|
2326 corresponds to the interior-point solution found. |
|
2327 |
|
2328 \newpage |
|
2329 |
|
2330 \subsubsection*{Terminal output} |
|
2331 |
|
2332 Solving large LP problems may take a long time, so the solver reports |
|
2333 some information about every interior-point iteration,\footnote{Unlike |
|
2334 the simplex method the interior point method usually needs 30---50 |
|
2335 iterations (independently on the problem size) in order to find an |
|
2336 optimal solution.} which is sent to the terminal. This information has |
|
2337 the following format: |
|
2338 |
|
2339 \begin{verbatim} |
|
2340 nnn: obj = fff; rpi = ppp; rdi = ddd; gap = ggg |
|
2341 \end{verbatim} |
|
2342 |
|
2343 \noindent where: \verb|nnn| is iteration number, \verb|fff| is the |
|
2344 current value of the objective function (in the case of maximization it |
|
2345 has wrong sign), \verb|ppp| is the current relative primal |
|
2346 infeasibility (cf. (2.10)): |
|
2347 $$\frac{\|Ax^{(k)}-b\|}{1+\|b\|},\eqno(2.14)$$ |
|
2348 \verb|ddd| is the current relative dual infeasibility (cf. (2.11)): |
|
2349 $$\frac{\|A^T\pi^{(k)}+\lambda^{(k)}-c\|}{1+\|c\|},\eqno(2.15)$$ |
|
2350 \verb|ggg| is the current primal-dual gap (cf. (2.12)): |
|
2351 $$\frac{|c^Tx^{(k)}-b^T\pi^{(k)}|}{1+|c^Tx^{(k)}|},\eqno(2.16)$$ |
|
2352 and $[x^{(k)},\pi^{(k)},\lambda^{(k)}]$ is the current point on $k$-th |
|
2353 iteration, $k=0,1,2,\dots$\ . Note that all solution components are |
|
2354 internally scaled, so information sent to the terminal is suitable only |
|
2355 for visual inspection. |
|
2356 |
|
2357 \subsubsection*{Control parameters} |
|
2358 |
|
2359 This paragraph describes all control parameters currently used in the |
|
2360 interior-point solver. Symbolic names of control parameters are names of |
|
2361 corresponding members in the structure \verb|glp_iptcp|. |
|
2362 |
|
2363 \medskip |
|
2364 |
|
2365 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2366 \multicolumn{2}{@{}l}{{\tt int msg\_lev} (default: {\tt GLP\_MSG\_ALL})} |
|
2367 \\ |
|
2368 &Message level for terminal output:\\ |
|
2369 &\verb|GLP_MSG_OFF|---no output;\\ |
|
2370 &\verb|GLP_MSG_ERR|---error and warning messages only;\\ |
|
2371 &\verb|GLP_MSG_ON |---normal output;\\ |
|
2372 &\verb|GLP_MSG_ALL|---full output (including informational messages). |
|
2373 \\ |
|
2374 \end{tabular} |
|
2375 |
|
2376 \medskip |
|
2377 |
|
2378 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2379 \multicolumn{2}{@{}l}{{\tt int ord\_alg} (default: {\tt GLP\_ORD\_AMD})} |
|
2380 \\ |
|
2381 &Ordering algorithm used prior to Cholesky factorization:\\ |
|
2382 &\verb|GLP_ORD_NONE |---use natural (original) ordering;\\ |
|
2383 &\verb|GLP_ORD_QMD |---quotient minimum degree (QMD);\\ |
|
2384 &\verb|GLP_ORD_AMD |---approximate minimum degree (AMD);\\ |
|
2385 &\verb|GLP_ORD_SYMAMD|---approximate minimum degree (SYMAMD).\\ |
|
2386 \end{tabular} |
|
2387 |
|
2388 \subsubsection*{Example} |
|
2389 |
|
2390 The following main program reads LP problem instance in fixed MPS |
|
2391 format from file \verb|25fv47.mps|,\footnote{This instance in fixed MPS |
|
2392 format can be found in the Netlib LP collection; see |
|
2393 {\tt ftp://ftp.netlib.org/lp/data/}.} solves it with the interior-point |
|
2394 solver, and writes the solution to file \verb|25fv47.txt|. |
|
2395 |
|
2396 \begin{footnotesize} |
|
2397 \begin{verbatim} |
|
2398 /* iptsamp.c */ |
|
2399 |
|
2400 #include <stdio.h> |
|
2401 #include <stdlib.h> |
|
2402 #include <glpk.h> |
|
2403 |
|
2404 int main(void) |
|
2405 { glp_prob *P; |
|
2406 P = glp_create_prob(); |
|
2407 glp_read_mps(P, GLP_MPS_DECK, NULL, "25fv47.mps"); |
|
2408 glp_interior(P, NULL); |
|
2409 glp_print_ipt(P, "25fv47.txt"); |
|
2410 glp_delete_prob(P); |
|
2411 return 0; |
|
2412 } |
|
2413 |
|
2414 /* eof */ |
|
2415 \end{verbatim} |
|
2416 \end{footnotesize} |
|
2417 |
|
2418 \noindent |
|
2419 Below here is shown the terminal output from this example program. |
|
2420 |
|
2421 \begin{footnotesize} |
|
2422 \begin{verbatim} |
|
2423 Reading problem data from `25fv47.mps'... |
|
2424 Problem: 25FV47 |
|
2425 Objective: R0000 |
|
2426 822 rows, 1571 columns, 11127 non-zeros |
|
2427 6919 records were read |
|
2428 Original LP has 822 row(s), 1571 column(s), and 11127 non-zero(s) |
|
2429 Working LP has 821 row(s), 1876 column(s), and 10705 non-zero(s) |
|
2430 Matrix A has 10705 non-zeros |
|
2431 Matrix S = A*A' has 11895 non-zeros (upper triangle) |
|
2432 Minimal degree ordering... |
|
2433 Computing Cholesky factorization S = L'*L... |
|
2434 Matrix L has 35411 non-zeros |
|
2435 Guessing initial point... |
|
2436 Optimization begins... |
|
2437 0: obj = 1.823377629e+05; rpi = 1.3e+01; rdi = 1.4e+01; gap = 9.3e-01 |
|
2438 1: obj = 9.260045192e+04; rpi = 5.3e+00; rdi = 5.6e+00; gap = 6.8e+00 |
|
2439 2: obj = 3.596999742e+04; rpi = 1.5e+00; rdi = 1.2e+00; gap = 1.8e+01 |
|
2440 3: obj = 1.989627568e+04; rpi = 4.7e-01; rdi = 3.0e-01; gap = 1.9e+01 |
|
2441 4: obj = 1.430215557e+04; rpi = 1.1e-01; rdi = 8.6e-02; gap = 1.4e+01 |
|
2442 5: obj = 1.155716505e+04; rpi = 2.3e-02; rdi = 2.4e-02; gap = 6.8e+00 |
|
2443 6: obj = 9.660273208e+03; rpi = 6.7e-03; rdi = 4.6e-03; gap = 3.9e+00 |
|
2444 7: obj = 8.694348283e+03; rpi = 3.7e-03; rdi = 1.7e-03; gap = 2.0e+00 |
|
2445 8: obj = 8.019543639e+03; rpi = 2.4e-03; rdi = 3.9e-04; gap = 1.0e+00 |
|
2446 9: obj = 7.122676293e+03; rpi = 1.2e-03; rdi = 1.5e-04; gap = 6.6e-01 |
|
2447 10: obj = 6.514534518e+03; rpi = 6.1e-04; rdi = 4.3e-05; gap = 4.1e-01 |
|
2448 11: obj = 6.361572203e+03; rpi = 4.8e-04; rdi = 2.2e-05; gap = 3.0e-01 |
|
2449 12: obj = 6.203355508e+03; rpi = 3.2e-04; rdi = 1.7e-05; gap = 2.6e-01 |
|
2450 13: obj = 6.032943411e+03; rpi = 2.0e-04; rdi = 9.3e-06; gap = 2.1e-01 |
|
2451 14: obj = 5.796553021e+03; rpi = 9.8e-05; rdi = 3.2e-06; gap = 1.0e-01 |
|
2452 15: obj = 5.667032431e+03; rpi = 4.4e-05; rdi = 1.1e-06; gap = 5.6e-02 |
|
2453 16: obj = 5.613911867e+03; rpi = 2.5e-05; rdi = 4.1e-07; gap = 3.5e-02 |
|
2454 17: obj = 5.560572626e+03; rpi = 9.9e-06; rdi = 2.3e-07; gap = 2.1e-02 |
|
2455 18: obj = 5.537276001e+03; rpi = 5.5e-06; rdi = 8.4e-08; gap = 1.1e-02 |
|
2456 19: obj = 5.522746942e+03; rpi = 2.2e-06; rdi = 4.0e-08; gap = 6.7e-03 |
|
2457 20: obj = 5.509956679e+03; rpi = 7.5e-07; rdi = 1.8e-08; gap = 2.9e-03 |
|
2458 21: obj = 5.504571733e+03; rpi = 1.6e-07; rdi = 5.8e-09; gap = 1.1e-03 |
|
2459 22: obj = 5.502576367e+03; rpi = 3.4e-08; rdi = 1.0e-09; gap = 2.5e-04 |
|
2460 23: obj = 5.502057119e+03; rpi = 8.1e-09; rdi = 3.0e-10; gap = 7.7e-05 |
|
2461 24: obj = 5.501885996e+03; rpi = 9.4e-10; rdi = 1.2e-10; gap = 2.4e-05 |
|
2462 25: obj = 5.501852464e+03; rpi = 1.4e-10; rdi = 1.2e-11; gap = 3.0e-06 |
|
2463 26: obj = 5.501846549e+03; rpi = 1.4e-11; rdi = 1.2e-12; gap = 3.0e-07 |
|
2464 27: obj = 5.501845954e+03; rpi = 1.4e-12; rdi = 1.2e-13; gap = 3.0e-08 |
|
2465 28: obj = 5.501845895e+03; rpi = 1.5e-13; rdi = 1.2e-14; gap = 3.0e-09 |
|
2466 OPTIMAL SOLUTION FOUND |
|
2467 Writing interior-point solution to `25fv47.txt'... |
|
2468 \end{verbatim} |
|
2469 \end{footnotesize} |
|
2470 |
|
2471 \subsection{glp\_init\_iptcp---initialize interior-point solver control |
|
2472 parameters} |
|
2473 |
|
2474 \subsubsection*{Synopsis} |
|
2475 |
|
2476 \begin{verbatim} |
|
2477 int glp_init_iptcp(glp_iptcp *parm); |
|
2478 \end{verbatim} |
|
2479 |
|
2480 \subsubsection*{Description} |
|
2481 |
|
2482 The routine \verb|glp_init_iptcp| initializes control parameters, which |
|
2483 are used by the interior-point solver, with default values. |
|
2484 |
|
2485 Default values of the control parameters are stored in the structure |
|
2486 \verb|glp_iptcp|, which the parameter \verb|parm| points to. |
|
2487 |
|
2488 \subsection{glp\_ipt\_status---determine solution status} |
|
2489 |
|
2490 \subsubsection*{Synopsis} |
|
2491 |
|
2492 \begin{verbatim} |
|
2493 int glp_ipt_status(glp_prob *lp); |
|
2494 \end{verbatim} |
|
2495 |
|
2496 \subsubsection*{Returns} |
|
2497 |
|
2498 The routine \verb|glp_ipt_status| reports the status of a solution |
|
2499 found by the interior-point solver as follows: |
|
2500 |
|
2501 \begin{tabular}{@{}p{25mm}p{91.3mm}@{}} |
|
2502 \verb|GLP_UNDEF| & interior-point solution is undefined. \\ |
|
2503 \verb|GLP_OPT| & interior-point solution is optimal. \\ |
|
2504 \verb|GLP_INFEAS|& interior-point solution is infeasible. \\ |
|
2505 \verb|GLP_NOFEAS|& no feasible primal-dual solution exists.\\ |
|
2506 \end{tabular} |
|
2507 |
|
2508 \subsection{glp\_ipt\_obj\_val---retrieve objective value} |
|
2509 |
|
2510 \subsubsection*{Synopsis} |
|
2511 |
|
2512 \begin{verbatim} |
|
2513 double glp_ipt_obj_val(glp_prob *lp); |
|
2514 \end{verbatim} |
|
2515 |
|
2516 \subsubsection*{Returns} |
|
2517 |
|
2518 The routine \verb|glp_ipt_obj_val| returns value of the objective |
|
2519 function for interior-point solution. |
|
2520 |
|
2521 \subsection{glp\_ipt\_row\_prim---retrieve row primal value} |
|
2522 |
|
2523 \subsubsection*{Synopsis} |
|
2524 |
|
2525 \begin{verbatim} |
|
2526 double glp_ipt_row_prim(glp_prob *lp, int i); |
|
2527 \end{verbatim} |
|
2528 |
|
2529 \subsubsection*{Returns} |
|
2530 |
|
2531 The routine \verb|glp_ipt_row_prim| returns primal value of the |
|
2532 auxiliary variable associated with \verb|i|-th row. |
|
2533 |
|
2534 \newpage |
|
2535 |
|
2536 \subsection{glp\_ipt\_row\_dual---retrieve row dual value} |
|
2537 |
|
2538 \subsubsection*{Synopsis} |
|
2539 |
|
2540 \begin{verbatim} |
|
2541 double glp_ipt_row_dual(glp_prob *lp, int i); |
|
2542 \end{verbatim} |
|
2543 |
|
2544 \subsubsection*{Returns} |
|
2545 |
|
2546 The routine \verb|glp_ipt_row_dual| returns dual value (i.e. reduced |
|
2547 cost) of the auxiliary variable associated with \verb|i|-th row. |
|
2548 |
|
2549 \subsection{glp\_ipt\_col\_prim---retrieve column primal value} |
|
2550 |
|
2551 \subsubsection*{Synopsis} |
|
2552 |
|
2553 \begin{verbatim} |
|
2554 double glp_ipt_col_prim(glp_prob *lp, int j); |
|
2555 \end{verbatim} |
|
2556 |
|
2557 \subsubsection*{Returns} |
|
2558 |
|
2559 The routine \verb|glp_ipt_col_prim| returns primal value of the |
|
2560 structural variable associated with \verb|j|-th column. |
|
2561 |
|
2562 \subsection{glp\_ipt\_col\_dual---retrieve column dual value} |
|
2563 |
|
2564 \subsubsection*{Synopsis} |
|
2565 |
|
2566 \begin{verbatim} |
|
2567 double glp_ipt_col_dual(glp_prob *lp, int j); |
|
2568 \end{verbatim} |
|
2569 |
|
2570 \subsubsection*{Returns} |
|
2571 |
|
2572 The routine \verb|glp_ipt_col_dual| returns dual value (i.e. reduced |
|
2573 cost) of the structural variable associated with \verb|j|-th column. |
|
2574 |
|
2575 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
2576 |
|
2577 \newpage |
|
2578 |
|
2579 \section{Mixed integer programming routines} |
|
2580 |
|
2581 \subsection{glp\_set\_col\_kind---set (change) column kind} |
|
2582 |
|
2583 \subsubsection*{Synopsis} |
|
2584 |
|
2585 \begin{verbatim} |
|
2586 void glp_set_col_kind(glp_prob *mip, int j, int kind); |
|
2587 \end{verbatim} |
|
2588 |
|
2589 \subsubsection*{Description} |
|
2590 |
|
2591 The routine \verb|glp_set_col_kind| sets (changes) the kind of |
|
2592 \verb|j|-th column (structural variable) as specified by the parameter |
|
2593 \verb|kind|: |
|
2594 |
|
2595 \begin{tabular}{@{}ll} |
|
2596 \verb|GLP_CV| & continuous variable; \\ |
|
2597 \verb|GLP_IV| & integer variable; \\ |
|
2598 \verb|GLP_BV| & binary variable. \\ |
|
2599 \end{tabular} |
|
2600 |
|
2601 %If a column is set to \verb|GLP_IV|, its bounds must be exact integer |
|
2602 %numbers with no tolerance, such that the condition |
|
2603 %\verb|bnd == floor(bnd)| would hold. |
|
2604 |
|
2605 Setting a column to \verb|GLP_BV| has the same effect as if it were |
|
2606 set to \verb|GLP_IV|, its lower bound were set 0, and its upper bound |
|
2607 were set to 1. |
|
2608 |
|
2609 \subsection{glp\_get\_col\_kind---retrieve column kind} |
|
2610 |
|
2611 \subsubsection*{Synopsis} |
|
2612 |
|
2613 \begin{verbatim} |
|
2614 int glp_get_col_kind(glp_prob *mip, int j); |
|
2615 \end{verbatim} |
|
2616 |
|
2617 \subsubsection*{Returns} |
|
2618 |
|
2619 The routine \verb|glp_get_col_kind| returns the kind of \verb|j|-th |
|
2620 column (structural variable) as follows: |
|
2621 |
|
2622 \begin{tabular}{@{}ll} |
|
2623 \verb|GLP_CV| & continuous variable; \\ |
|
2624 \verb|GLP_IV| & integer variable; \\ |
|
2625 \verb|GLP_BV| & binary variable. \\ |
|
2626 \end{tabular} |
|
2627 |
|
2628 \subsection{glp\_get\_num\_int---retrieve number of integer columns} |
|
2629 |
|
2630 \subsubsection*{Synopsis} |
|
2631 |
|
2632 \begin{verbatim} |
|
2633 int glp_get_num_int(glp_prob *mip); |
|
2634 \end{verbatim} |
|
2635 |
|
2636 \subsubsection*{Returns} |
|
2637 |
|
2638 The routine \verb|glp_get_num_int| returns the number of columns |
|
2639 (structural variables), which are marked as integer. Note that this |
|
2640 number {\it does} include binary columns. |
|
2641 |
|
2642 \subsection{glp\_get\_num\_bin---retrieve number of binary columns} |
|
2643 |
|
2644 \subsubsection*{Synopsis} |
|
2645 |
|
2646 \begin{verbatim} |
|
2647 int glp_get_num_bin(glp_prob *mip); |
|
2648 \end{verbatim} |
|
2649 |
|
2650 \subsubsection*{Returns} |
|
2651 |
|
2652 The routine \verb|glp_get_num_bin| returns the number of columns |
|
2653 (structural variables), which are marked as integer and whose lower |
|
2654 bound is zero and upper bound is one. |
|
2655 |
|
2656 \subsection{glp\_intopt---solve MIP problem with the branch-and-cut |
|
2657 method} |
|
2658 |
|
2659 \subsubsection*{Synopsis} |
|
2660 |
|
2661 \begin{verbatim} |
|
2662 int glp_intopt(glp_prob *mip, const glp_iocp *parm); |
|
2663 \end{verbatim} |
|
2664 |
|
2665 \subsubsection*{Description} |
|
2666 |
|
2667 The routine \verb|glp_intopt| is a driver to the MIP solver based on |
|
2668 the branch-and-cut method, which is a hybrid of branch-and-bound and |
|
2669 cutting plane methods. |
|
2670 |
|
2671 If the presolver is disabled (see paragraph ``Control parameters'' |
|
2672 below), on entry to the routine \verb|glp_intopt| the problem object, |
|
2673 which the parameter \verb|mip| points to, should contain optimal |
|
2674 solution to LP relaxation (it can be obtained, for example, with the |
|
2675 routine \verb|glp_simplex|). Otherwise, if the presolver is enabled, it |
|
2676 is not necessary. |
|
2677 |
|
2678 The MIP solver has a set of control parameters. Values of the control |
|
2679 parameters can be passed in the structure \verb|glp_iocp|, which the |
|
2680 parameter \verb|parm| points to. For detailed description of this |
|
2681 structure see paragraph ``Control parameters'' below. Before specifying |
|
2682 some control parameters the application program should initialize the |
|
2683 structure \verb|glp_iocp| by default values of all control parameters |
|
2684 using the routine \verb|glp_init_iocp| (see the next subsection). This |
|
2685 is needed for backward compatibility, because in the future there may |
|
2686 appear new members in the structure \verb|glp_iocp|. |
|
2687 |
|
2688 The parameter \verb|parm| can be specified as \verb|NULL|, in which case |
|
2689 the solver uses default settings. |
|
2690 |
|
2691 Note that the GLPK branch-and-cut solver is not perfect, so it is unable |
|
2692 to solve hard or very large scale MIP instances for a reasonable time. |
|
2693 |
|
2694 \subsubsection*{Returns} |
|
2695 |
|
2696 \def\arraystretch{1} |
|
2697 |
|
2698 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
2699 0 & The MIP problem instance has been successfully solved. (This code |
|
2700 does {\it not} necessarily mean that the solver has found optimal |
|
2701 solution. It only means that the solution process was successful.) \\ |
|
2702 \verb|GLP_EBOUND| & Unable to start the search, because some |
|
2703 double-bounded variables have incorrect bounds or some integer variables |
|
2704 have non-integer (fractional) bounds.\\ |
|
2705 \verb|GLP_EROOT| & Unable to start the search, because optimal basis for |
|
2706 initial LP relaxation is not provided. (This code may appear only if the |
|
2707 presolver is disabled.)\\ |
|
2708 \verb|GLP_ENOPFS| & Unable to start the search, because LP relaxation |
|
2709 of the MIP problem instance has no primal feasible solution. (This code |
|
2710 may appear only if the presolver is enabled.)\\ |
|
2711 \verb|GLP_ENODFS| & Unable to start the search, because LP relaxation |
|
2712 of the MIP problem instance has no dual feasible solution. In other |
|
2713 word, this code means that if the LP relaxation has at least one primal |
|
2714 feasible solution, its optimal solution is unbounded, so if the MIP |
|
2715 problem has at least one integer feasible solution, its (integer) |
|
2716 optimal solution is also unbounded. (This code may appear only if the |
|
2717 presolver is enabled.)\\ |
|
2718 \verb|GLP_EFAIL| & The search was prematurely terminated due to the |
|
2719 solver failure.\\ |
|
2720 \verb|GLP_EMIPGAP| & The search was prematurely terminated, because the |
|
2721 relative mip gap tolerance has been reached.\\ |
|
2722 \verb|GLP_ETMLIM| & The search was prematurely terminated, because the |
|
2723 time limit has been exceeded.\\ |
|
2724 \verb|GLP_ESTOP| & The search was prematurely terminated by application. |
|
2725 (This code may appear only if the advanced solver interface is used.)\\ |
|
2726 \end{tabular} |
|
2727 |
|
2728 \subsubsection*{Built-in MIP presolver} |
|
2729 |
|
2730 The branch-and-cut solver has {\it built-in MIP presolver}. It is |
|
2731 a subprogram that transforms the original MIP problem specified in the |
|
2732 problem object to an equivalent MIP problem, which may be easier for |
|
2733 solving with the branch-and-cut method than the original one. For |
|
2734 example, the presolver can remove redundant constraints and variables, |
|
2735 whose optimal values are known, perform bound and coefficient reduction, |
|
2736 etc. Once the transformed MIP problem has been solved, the presolver |
|
2737 transforms its solution back to corresponding solution of the original |
|
2738 problem. |
|
2739 |
|
2740 Presolving is an optional feature of the routine \verb|glp_intopt|, and |
|
2741 by default it is disabled. In order to enable the MIP presolver, the |
|
2742 control parameter \verb|presolve| should be set to \verb|GLP_ON| (see |
|
2743 paragraph ``Control parameters'' below). |
|
2744 |
|
2745 \subsubsection*{Advanced solver interface} |
|
2746 |
|
2747 The routine \verb|glp_intopt| allows the user to control the |
|
2748 branch-and-cut search by passing to the solver a user-defined callback |
|
2749 routine. For more details see Chapter ``Branch-and-Cut API Routines''. |
|
2750 |
|
2751 \subsubsection*{Terminal output} |
|
2752 |
|
2753 Solving a MIP problem may take a long time, so the solver reports some |
|
2754 information about best known solutions, which is sent to the terminal. |
|
2755 This information has the following format: |
|
2756 |
|
2757 \begin{verbatim} |
|
2758 +nnn: mip = xxx <rho> yyy gap (ppp; qqq) |
|
2759 \end{verbatim} |
|
2760 |
|
2761 \noindent |
|
2762 where: `\verb|nnn|' is the simplex iteration number; `\verb|xxx|' is a |
|
2763 value of the objective function for the best known integer feasible |
|
2764 solution (if no integer feasible solution has been found yet, |
|
2765 `\verb|xxx|' is the text `\verb|not found yet|'); `\verb|rho|' is the |
|
2766 string `\verb|>=|' (in case of minimization) or `\verb|<=|' (in case of |
|
2767 maximization); `\verb|yyy|' is a global bound for exact integer optimum |
|
2768 (i.e. the exact integer optimum is always in the range from `\verb|xxx|' |
|
2769 to `\verb|yyy|'); `\verb|gap|' is the relative mip gap, in percents, |
|
2770 computed as $gap=|xxx-yyy|/(|xxx|+{\tt DBL\_EPSILON})\cdot 100\%$ (if |
|
2771 $gap$ is greater than $999.9\%$, it is not printed); `\verb|ppp|' is the |
|
2772 number of subproblems in the active list, `\verb|qqq|' is the number of |
|
2773 subproblems which have been already fathomed and therefore removed from |
|
2774 the branch-and-bound search tree. |
|
2775 |
|
2776 \subsubsection{Control parameters} |
|
2777 |
|
2778 This paragraph describes all control parameters currently used in the |
|
2779 MIP solver. Symbolic names of control parameters are names of |
|
2780 corresponding members in the structure \verb|glp_iocp|. |
|
2781 |
|
2782 \medskip |
|
2783 |
|
2784 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2785 \multicolumn{2}{@{}l}{{\tt int msg\_lev} (default: {\tt GLP\_MSG\_ALL})} |
|
2786 \\ |
|
2787 &Message level for terminal output:\\ |
|
2788 &\verb|GLP_MSG_OFF|---no output;\\ |
|
2789 &\verb|GLP_MSG_ERR|---error and warning messages only;\\ |
|
2790 &\verb|GLP_MSG_ON |---normal output;\\ |
|
2791 &\verb|GLP_MSG_ALL|---full output (including informational messages). |
|
2792 \\ |
|
2793 \end{tabular} |
|
2794 |
|
2795 \medskip |
|
2796 |
|
2797 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2798 \multicolumn{2}{@{}l}{{\tt int br\_tech} (default: {\tt GLP\_BR\_DTH})} |
|
2799 \\ |
|
2800 &Branching technique option:\\ |
|
2801 &\verb|GLP_BR_FFV|---first fractional variable;\\ |
|
2802 &\verb|GLP_BR_LFV|---last fractional variable;\\ |
|
2803 &\verb|GLP_BR_MFV|---most fractional variable;\\ |
|
2804 &\verb|GLP_BR_DTH|---heuristic by Driebeck and Tomlin;\\ |
|
2805 &\verb|GLP_BR_PCH|---hybrid pseudocost heuristic.\\ |
|
2806 \end{tabular} |
|
2807 |
|
2808 \medskip |
|
2809 |
|
2810 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2811 \multicolumn{2}{@{}l}{{\tt int bt\_tech} (default: {\tt GLP\_BT\_BLB})} |
|
2812 \\ |
|
2813 &Backtracking technique option:\\ |
|
2814 &\verb|GLP_BT_DFS|---depth first search;\\ |
|
2815 &\verb|GLP_BT_BFS|---breadth first search;\\ |
|
2816 &\verb|GLP_BT_BLB|---best local bound;\\ |
|
2817 &\verb|GLP_BT_BPH|---best projection heuristic.\\ |
|
2818 \end{tabular} |
|
2819 |
|
2820 \medskip |
|
2821 |
|
2822 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2823 \multicolumn{2}{@{}l}{{\tt int pp\_tech} (default: {\tt GLP\_PP\_ALL})} |
|
2824 \\ |
|
2825 &Preprocessing technique option:\\ |
|
2826 &\verb|GLP_PP_NONE|---disable preprocessing;\\ |
|
2827 &\verb|GLP_PP_ROOT|---perform preprocessing only on the root level;\\ |
|
2828 &\verb|GLP_PP_ALL |---perform preprocessing on all levels.\\ |
|
2829 \end{tabular} |
|
2830 |
|
2831 \medskip |
|
2832 |
|
2833 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2834 \multicolumn{2}{@{}l}{{\tt int fp\_heur} (default: {\tt GLP\_OFF})} |
|
2835 \\ |
|
2836 &Feasibility pump heuristic option:\\ |
|
2837 &\verb|GLP_ON |---enable applying the feasibility pump heuristic;\\ |
|
2838 &\verb|GLP_OFF|---disable applying the feasibility pump heuristic.\\ |
|
2839 \end{tabular} |
|
2840 |
|
2841 \medskip |
|
2842 |
|
2843 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2844 \multicolumn{2}{@{}l}{{\tt int gmi\_cuts} (default: {\tt GLP\_OFF})}\\ |
|
2845 &Gomory's mixed integer cut option:\\ |
|
2846 &\verb|GLP_ON |---enable generating Gomory's cuts;\\ |
|
2847 &\verb|GLP_OFF|---disable generating Gomory's cuts.\\ |
|
2848 \end{tabular} |
|
2849 |
|
2850 \medskip |
|
2851 |
|
2852 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2853 \multicolumn{2}{@{}l}{{\tt int mir\_cuts} (default: {\tt GLP\_OFF})}\\ |
|
2854 &Mixed integer rounding (MIR) cut option:\\ |
|
2855 &\verb|GLP_ON |---enable generating MIR cuts;\\ |
|
2856 &\verb|GLP_OFF|---disable generating MIR cuts.\\ |
|
2857 \end{tabular} |
|
2858 |
|
2859 \medskip |
|
2860 |
|
2861 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2862 \multicolumn{2}{@{}l}{{\tt int cov\_cuts} (default: {\tt GLP\_OFF})}\\ |
|
2863 &Mixed cover cut option:\\ |
|
2864 &\verb|GLP_ON |---enable generating mixed cover cuts;\\ |
|
2865 &\verb|GLP_OFF|---disable generating mixed cover cuts.\\ |
|
2866 \end{tabular} |
|
2867 |
|
2868 \medskip |
|
2869 |
|
2870 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2871 \multicolumn{2}{@{}l}{{\tt int clq\_cuts} (default: {\tt GLP\_OFF})}\\ |
|
2872 &Clique cut option:\\ |
|
2873 &\verb|GLP_ON |---enable generating clique cuts;\\ |
|
2874 &\verb|GLP_OFF|---disable generating clique cuts.\\ |
|
2875 \end{tabular} |
|
2876 |
|
2877 \medskip |
|
2878 |
|
2879 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2880 \multicolumn{2}{@{}l}{{\tt double tol\_int} (default: {\tt 1e-5})}\\ |
|
2881 &Absolute tolerance used to check if optimal solution to the current LP |
|
2882 relaxation is integer feasible. (Do not change this parameter without |
|
2883 detailed understanding its purpose.)\\ |
|
2884 \end{tabular} |
|
2885 |
|
2886 \medskip |
|
2887 |
|
2888 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2889 \multicolumn{2}{@{}l}{{\tt double tol\_obj} (default: {\tt 1e-7})}\\ |
|
2890 &Relative tolerance used to check if the objective value in optimal |
|
2891 solution to the current LP relaxation is not better than in the best |
|
2892 known integer feasible solution. (Do not change this parameter without |
|
2893 detailed understanding its purpose.)\\ |
|
2894 \end{tabular} |
|
2895 |
|
2896 \medskip |
|
2897 |
|
2898 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2899 \multicolumn{2}{@{}l}{{\tt double mip\_gap} (default: {\tt 0.0})}\\ |
|
2900 &The relative mip gap tolerance. If the relative mip gap for currently |
|
2901 known best integer feasible solution falls below this tolerance, the |
|
2902 solver terminates the search. This allows obtainig suboptimal integer |
|
2903 feasible solutions if solving the problem to optimality takes too long |
|
2904 time.\\ |
|
2905 \end{tabular} |
|
2906 |
|
2907 \medskip |
|
2908 |
|
2909 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2910 \multicolumn{2}{@{}l}{{\tt int tm\_lim} (default: {\tt INT\_MAX})}\\ |
|
2911 &Searching time limit, in milliseconds.\\ |
|
2912 \end{tabular} |
|
2913 |
|
2914 \medskip |
|
2915 |
|
2916 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2917 \multicolumn{2}{@{}l}{{\tt int out\_frq} (default: {\tt 5000})}\\ |
|
2918 &Output frequency, in milliseconds. This parameter specifies how |
|
2919 frequently the solver sends information about the solution process to |
|
2920 the terminal.\\ |
|
2921 \end{tabular} |
|
2922 |
|
2923 \medskip |
|
2924 |
|
2925 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2926 \multicolumn{2}{@{}l}{{\tt int out\_dly} (default: {\tt 10000})}\\ |
|
2927 &Output delay, in milliseconds. This parameter specifies how long the |
|
2928 solver should delay sending information about solution of the current |
|
2929 LP relaxation with the simplex method to the terminal.\\ |
|
2930 \end{tabular} |
|
2931 |
|
2932 \medskip |
|
2933 |
|
2934 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2935 \multicolumn{2}{@{}l} |
|
2936 {{\tt void (*cb\_func)(glp\_tree *tree, void *info)} |
|
2937 (default: {\tt NULL})}\\ |
|
2938 &Entry point to the user-defined callback routine. \verb|NULL| means |
|
2939 the advanced solver interface is not used. For more details see Chapter |
|
2940 ``Branch-and-Cut API Routines''.\\ |
|
2941 \end{tabular} |
|
2942 |
|
2943 \medskip |
|
2944 |
|
2945 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2946 \multicolumn{2}{@{}l}{{\tt void *cb\_info} (default: {\tt NULL})}\\ |
|
2947 &Transit pointer passed to the routine \verb|cb_func| (see above).\\ |
|
2948 \end{tabular} |
|
2949 |
|
2950 \medskip |
|
2951 |
|
2952 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2953 \multicolumn{2}{@{}l}{{\tt int cb\_size} (default: {\tt 0})}\\ |
|
2954 &The number of extra (up to 256) bytes allocated for each node of the |
|
2955 branch-and-bound tree to store application-specific data. On creating |
|
2956 a node these bytes are initialized by binary zeros.\\ |
|
2957 \end{tabular} |
|
2958 |
|
2959 \medskip |
|
2960 |
|
2961 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2962 \multicolumn{2}{@{}l}{{\tt int presolve} (default: {\tt GLP\_OFF})}\\ |
|
2963 &MIP presolver option:\\ |
|
2964 &\verb|GLP_ON |---enable using the MIP presolver;\\ |
|
2965 &\verb|GLP_OFF|---disable using the MIP presolver.\\ |
|
2966 \end{tabular} |
|
2967 |
|
2968 \medskip |
|
2969 |
|
2970 \noindent\begin{tabular}{@{}p{17pt}@{}p{120.5mm}@{}} |
|
2971 \multicolumn{2}{@{}l}{{\tt int binarize} (default: {\tt GLP\_OFF})}\\ |
|
2972 &Binarization option (used only if the presolver is enabled):\\ |
|
2973 &\verb|GLP_ON |---replace general integer variables by binary ones;\\ |
|
2974 &\verb|GLP_OFF|---do not use binarization.\\ |
|
2975 \end{tabular} |
|
2976 |
|
2977 \subsection{glp\_init\_iocp---initialize integer optimizer control |
|
2978 parameters} |
|
2979 |
|
2980 \subsubsection*{Synopsis} |
|
2981 |
|
2982 \begin{verbatim} |
|
2983 void glp_init_iocp(glp_iocp *parm); |
|
2984 \end{verbatim} |
|
2985 |
|
2986 \subsubsection*{Description} |
|
2987 |
|
2988 The routine \verb|glp_init_iocp| initializes control parameters, which |
|
2989 are used by the branch-and-cut solver, with default values. |
|
2990 |
|
2991 Default values of the control parameters are stored in a \verb|glp_iocp| |
|
2992 structure, which the parameter \verb|parm| points to. |
|
2993 |
|
2994 \subsection{glp\_mip\_status---determine status of MIP solution} |
|
2995 |
|
2996 \subsubsection*{Synopsis} |
|
2997 |
|
2998 \begin{verbatim} |
|
2999 int glp_mip_status(glp_prob *mip); |
|
3000 \end{verbatim} |
|
3001 |
|
3002 \subsubsection*{Returns} |
|
3003 |
|
3004 The routine \verb|glp_mip_status| reports the status of a MIP solution |
|
3005 found by the MIP solver as follows: |
|
3006 |
|
3007 \smallskip |
|
3008 |
|
3009 \begin{tabular}{@{}p{25mm}p{91.3mm}@{}} |
|
3010 \verb|GLP_UNDEF| & MIP solution is undefined. \\ |
|
3011 \verb|GLP_OPT| & MIP solution is integer optimal. \\ |
|
3012 \verb|GLP_FEAS| & MIP solution is integer feasible, however, its |
|
3013 optimality (or non-optimality) has not been proven, perhaps due to |
|
3014 premature termination of the search. \\ |
|
3015 \end{tabular} |
|
3016 |
|
3017 \begin{tabular}{@{}p{25mm}p{91.3mm}@{}} |
|
3018 \verb|GLP_NOFEAS| & problem has no integer feasible solution (proven by |
|
3019 the solver). \\ |
|
3020 \end{tabular} |
|
3021 |
|
3022 \subsection{glp\_mip\_obj\_val---retrieve objective value} |
|
3023 |
|
3024 \subsubsection*{Synopsis} |
|
3025 |
|
3026 \begin{verbatim} |
|
3027 double glp_mip_obj_val(glp_prob *mip); |
|
3028 \end{verbatim} |
|
3029 |
|
3030 \subsubsection*{Returns} |
|
3031 |
|
3032 The routine \verb|glp_mip_obj_val| returns value of the objective |
|
3033 function for MIP solution. |
|
3034 |
|
3035 \subsection{glp\_mip\_row\_val---retrieve row value} |
|
3036 |
|
3037 \subsubsection*{Synopsis} |
|
3038 |
|
3039 \begin{verbatim} |
|
3040 double glp_mip_row_val(glp_prob *mip, int i); |
|
3041 \end{verbatim} |
|
3042 |
|
3043 \subsubsection*{Returns} |
|
3044 |
|
3045 The routine \verb|glp_mip_row_val| returns value of the auxiliary |
|
3046 variable associated with \verb|i|-th row for MIP solution. |
|
3047 |
|
3048 \subsection{glp\_mip\_col\_val---retrieve column value} |
|
3049 |
|
3050 \subsubsection*{Synopsis} |
|
3051 |
|
3052 \begin{verbatim} |
|
3053 double glp_mip_col_val(glp_prob *mip, int j); |
|
3054 \end{verbatim} |
|
3055 |
|
3056 \subsubsection*{Returns} |
|
3057 |
|
3058 The routine \verb|glp_mip_col_val| returns value of the structural |
|
3059 variable associated with \verb|j|-th column for MIP solution. |
|
3060 |
|
3061 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
3062 |
|
3063 \newpage |
|
3064 |
|
3065 \section{Additional routines} |
|
3066 |
|
3067 \subsection{lpx\_check\_kkt---check Karush-Kuhn-Tucker optimality |
|
3068 conditions} |
|
3069 |
|
3070 \subsubsection*{Synopsis} |
|
3071 |
|
3072 \begin{verbatim} |
|
3073 void lpx_check_kkt(glp_prob *lp, int scaled, LPXKKT *kkt); |
|
3074 \end{verbatim} |
|
3075 |
|
3076 \subsubsection*{Description} |
|
3077 |
|
3078 The routine \verb|lpx_check_kkt| checks Karush-Kuhn-Tucker optimality |
|
3079 conditions for basic solution. It is assumed that both primal and dual |
|
3080 components of basic solution are valid. |
|
3081 |
|
3082 If the parameter \verb|scaled| is zero, the optimality conditions are |
|
3083 checked for the original, unscaled LP problem. Otherwise, if the |
|
3084 parameter \verb|scaled| is non-zero, the routine checks the conditions |
|
3085 for an internally scaled LP problem. |
|
3086 |
|
3087 The parameter \verb|kkt| is a pointer to the structure \verb|LPXKKT|, |
|
3088 to which the routine stores results of the check. Members of this |
|
3089 structure are shown in the table below. |
|
3090 |
|
3091 \begin{table}[h] |
|
3092 \begin{center} |
|
3093 \begin{tabular}{@{}c|l|l@{}} |
|
3094 Condition & Member & Comment \\ |
|
3095 \hline |
|
3096 (KKT.PE) & \verb|pe_ae_max| & |
|
3097 Largest absolute error \\ |
|
3098 & \verb|pe_ae_row| & |
|
3099 Number of row with largest absolute error \\ |
|
3100 & \verb|pe_re_max| & |
|
3101 Largest relative error \\ |
|
3102 & \verb|pe_re_row| & |
|
3103 Number of row with largest relative error \\ |
|
3104 & \verb|pe_quality| & |
|
3105 Quality of primal solution \\ |
|
3106 \hline |
|
3107 (KKT.PB) & \verb|pb_ae_max| & |
|
3108 Largest absolute error \\ |
|
3109 & \verb|pb_ae_ind| & |
|
3110 Number of variable with largest absolute error \\ |
|
3111 & \verb|pb_re_max| & |
|
3112 Largest relative error \\ |
|
3113 & \verb|pb_re_ind| & |
|
3114 Number of variable with largest relative error \\ |
|
3115 & \verb|pb_quality| & |
|
3116 Quality of primal feasibility \\ |
|
3117 \hline |
|
3118 (KKT.DE) & \verb|de_ae_max| & |
|
3119 Largest absolute error \\ |
|
3120 & \verb|de_ae_col| & |
|
3121 Number of column with largest absolute error \\ |
|
3122 & \verb|de_re_max| & |
|
3123 Largest relative error \\ |
|
3124 & \verb|de_re_col| & |
|
3125 Number of column with largest relative error \\ |
|
3126 & \verb|de_quality| & |
|
3127 Quality of dual solution \\ |
|
3128 \hline |
|
3129 (KKT.DB) & \verb|db_ae_max| & |
|
3130 Largest absolute error \\ |
|
3131 & \verb|db_ae_ind| & |
|
3132 Number of variable with largest absolute error \\ |
|
3133 & \verb|db_re_max| & |
|
3134 Largest relative error \\ |
|
3135 & \verb|db_re_ind| & |
|
3136 Number of variable with largest relative error \\ |
|
3137 & \verb|db_quality| & |
|
3138 Quality of dual feasibility \\ |
|
3139 \end{tabular} |
|
3140 \end{center} |
|
3141 \end{table} |
|
3142 |
|
3143 The routine performs all computations using only components of the |
|
3144 given LP problem and the current basic solution. |
|
3145 |
|
3146 \subsubsection*{Background} |
|
3147 |
|
3148 The first condition checked by the routine is: |
|
3149 $$x_R - A x_S = 0, \eqno{\rm (KKT.PE)}$$ |
|
3150 where $x_R$ is the subvector of auxiliary variables (rows), $x_S$ is the |
|
3151 subvector of structural variables (columns), $A$ is the constraint |
|
3152 matrix. This condition expresses the requirement that all primal |
|
3153 variables must satisfy to the system of equality constraints of the |
|
3154 original LP problem. In case of exact arithmetic this condition would be |
|
3155 satisfied for any basic solution; however, in case of inexact |
|
3156 (floating-point) arithmetic, this condition shows how accurate the |
|
3157 primal basic solution is, that depends on accuracy of a representation |
|
3158 of the basis matrix used by the simplex method routines. |
|
3159 |
|
3160 The second condition checked by the routine is: |
|
3161 $$l_k \leq x_k \leq u_k {\rm \ \ \ for\ all}\ k=1,\dots,m+n, |
|
3162 \eqno{\rm (KKT.PB)}$$ |
|
3163 where $x_k$ is auxiliary ($1\leq k\leq m$) or structural |
|
3164 ($m+1\leq k\leq m+n$) variable, $l_k$ and $u_k$ are, respectively, |
|
3165 lower and upper bounds of the variable $x_k$ (including cases of |
|
3166 infinite bounds). This condition expresses the requirement that all |
|
3167 primal variables must satisfy to bound constraints of the original LP |
|
3168 problem. Since in case of basic solution all non-basic variables are |
|
3169 placed on their bounds, actually the condition (KKT.PB) needs to be |
|
3170 checked for basic variables only. If the primal basic solution has |
|
3171 sufficient accuracy, this condition shows primal feasibility of the |
|
3172 solution. |
|
3173 |
|
3174 The third condition checked by the routine is: |
|
3175 $${\rm grad}\;Z = c = (\tilde{A})^T \pi + d,$$ |
|
3176 where $Z$ is the objective function, $c$ is the vector of objective |
|
3177 coefficients, $(\tilde{A})^T$ is a matrix transposed to the expanded |
|
3178 constraint matrix $\tilde{A} = (I|-A)$, $\pi$ is a vector of Lagrange |
|
3179 multipliers that correspond to equality constraints of the original LP |
|
3180 problem, $d$ is a vector of Lagrange multipliers that correspond to |
|
3181 bound constraints for all (auxiliary and structural) variables of the |
|
3182 original LP problem. Geometrically the third condition expresses the |
|
3183 requirement that the gradient of the objective function must belong to |
|
3184 the orthogonal complement of a linear subspace defined by the equality |
|
3185 and active bound constraints, i.e. that the gradient must be a linear |
|
3186 combination of normals to the constraint planes, where Lagrange |
|
3187 multipliers $\pi$ and $d$ are coefficients of that linear combination. |
|
3188 |
|
3189 To eliminate the vector $\pi$ the third condition can be rewritten as: |
|
3190 $$ |
|
3191 \left(\begin{array}{@{}c@{}}I \\ -A^T\end{array}\right) \pi = |
|
3192 \left(\begin{array}{@{}c@{}}d_R \\ d_S\end{array}\right) + |
|
3193 \left(\begin{array}{@{}c@{}}c_R \\ c_S\end{array}\right), |
|
3194 $$ |
|
3195 or, equivalently: |
|
3196 $$ |
|
3197 \begin{array}{r@{}c@{}c} |
|
3198 \pi + d_R&\ =\ &c_R, \\ |
|
3199 -A^T\pi + d_S&\ =\ &c_S. \\ |
|
3200 \end{array} |
|
3201 $$ |
|
3202 Then substituting the vector $\pi$ from the first equation into the |
|
3203 second one we have: |
|
3204 $$A^T (d_R - c_R) + (d_S - c_S) = 0, \eqno{\rm (KKT.DE)}$$ |
|
3205 where $d_R$ is the subvector of reduced costs of auxiliary variables |
|
3206 (rows), $d_S$ is the subvector of reduced costs of structural variables |
|
3207 (columns), $c_R$ and $c_S$ are subvectors of objective coefficients at, |
|
3208 respectively, auxiliary and structural variables, $A^T$ is a matrix |
|
3209 transposed to the constraint matrix of the original LP problem. In case |
|
3210 of exact arithmetic this condition would be satisfied for any basic |
|
3211 solution; however, in case of inexact (floating-point) arithmetic, this |
|
3212 condition shows how accurate the dual basic solution is, that depends on |
|
3213 accuracy of a representation of the basis matrix used by the simplex |
|
3214 method routines. |
|
3215 |
|
3216 The last, fourth condition checked by the routine is (KKT.DB): |
|
3217 |
|
3218 \medskip |
|
3219 |
|
3220 \begin{tabular}{r@{}c@{}ll} |
|
3221 &$\ d_k\ $& $=0,$&if $x_k$ is basic or free non-basic variable \\ |
|
3222 $0\leq$&$\ d_k\ $&$<+\infty$&if $x_k$ is non-basic on its lower |
|
3223 (minimization) \\ |
|
3224 &&&or upper (maximization) bound \\ |
|
3225 $-\infty<$&$\ d_k\ $&$\leq 0$&if $x_k$ is non-basic on its upper |
|
3226 (minimization) \\ |
|
3227 &&&or lower (maximization) bound \\ |
|
3228 $-\infty<$&$\ d_k\ $&$<+\infty$&if $x_k$ is non-basic fixed variable \\ |
|
3229 \end{tabular} |
|
3230 |
|
3231 \medskip |
|
3232 |
|
3233 \noindent |
|
3234 for all $k=1,\dots,m+n$, where $d_k$ is a reduced cost (Lagrange |
|
3235 multiplier) of auxiliary ($1\leq k\leq m$) or structural |
|
3236 ($m+1\leq k\leq m+n$) variable $x_k$. Geometrically this condition |
|
3237 expresses the requirement that constraints of the original problem must |
|
3238 "hold" the point preventing its movement along the anti-gradient (in |
|
3239 case of minimization) or the gradient (in case of maximization) of the |
|
3240 objective function. Since in case of basic solution reduced costs of |
|
3241 all basic variables are placed on their (zero) bounds, actually the |
|
3242 condition (KKT.DB) needs to be checked for non-basic variables only. |
|
3243 If the dual basic solution has sufficient accuracy, this condition shows |
|
3244 dual feasibility of the solution. |
|
3245 |
|
3246 Should note that the complete set of Karush-Kuhn-Tucker optimality |
|
3247 conditions also includes the fifth, so called complementary slackness |
|
3248 condition, which expresses the requirement that at least either a primal |
|
3249 variable $x_k$ or its dual counterpart $d_k$ must be on its bound for |
|
3250 all $k=1,\dots,m+n$. However, being always satisfied by definition for |
|
3251 any basic solution that condition is not checked by the routine. |
|
3252 |
|
3253 To check the first condition (KKT.PE) the routine computes a vector of |
|
3254 residuals: |
|
3255 $$g = x_R - A x_S,$$ |
|
3256 determines component of this vector that correspond to largest absolute |
|
3257 and relative errors: |
|
3258 |
|
3259 \medskip |
|
3260 |
|
3261 \hspace{30mm} |
|
3262 \verb|pe_ae_max| $\displaystyle{= \max_{1\leq i\leq m}|g_i|}$, |
|
3263 |
|
3264 \medskip |
|
3265 |
|
3266 \hspace{30mm} |
|
3267 \verb|pe_re_max| $\displaystyle{= \max_{1\leq i\leq m} |
|
3268 \frac{|g_i|}{1+|(x_R)_i|}}$, |
|
3269 |
|
3270 \medskip |
|
3271 |
|
3272 \noindent |
|
3273 and stores these quantities and corresponding row indices to the |
|
3274 structure \verb|LPXKKT|. |
|
3275 |
|
3276 To check the second condition (KKT.PB) the routine computes a vector |
|
3277 of residuals: |
|
3278 $$ |
|
3279 h_k = \left\{ |
|
3280 \begin{array}{ll} |
|
3281 0, & {\rm if}\ l_k \leq x_k \leq u_k \\ |
|
3282 x_k - l_k, & {\rm if}\ x_k < l_k \\ |
|
3283 x_k - u_k, & {\rm if}\ x_k > u_k \\ |
|
3284 \end{array} |
|
3285 \right. |
|
3286 $$ |
|
3287 for all $k=1,\dots,m+n$, determines components of this vector that |
|
3288 correspond to largest absolute and relative errors: |
|
3289 |
|
3290 \medskip |
|
3291 |
|
3292 \hspace{30mm} |
|
3293 \verb|pb_ae_max| $\displaystyle{= \max_{1\leq k \leq m+n}|h_k|}$, |
|
3294 |
|
3295 \medskip |
|
3296 |
|
3297 \hspace{30mm} |
|
3298 \verb|pb_re_max| $\displaystyle{= \max_{1\leq k \leq m+n} |
|
3299 \frac{|h_k|}{1+|x_k|}}$, |
|
3300 |
|
3301 \medskip |
|
3302 |
|
3303 \noindent |
|
3304 and stores these quantities and corresponding variable indices to the |
|
3305 structure \verb|LPXKKT|. |
|
3306 |
|
3307 To check the third condition (KKT.DE) the routine computes a vector of |
|
3308 residuals: |
|
3309 $$u = A^T (d_R - c_R) + (d_S - c_S),$$ |
|
3310 determines components of this vector that correspond to largest |
|
3311 absolute and relative errors: |
|
3312 |
|
3313 \medskip |
|
3314 |
|
3315 \hspace{30mm} |
|
3316 \verb|de_ae_max| $\displaystyle{= \max_{1\leq j\leq n}|u_j|}$, |
|
3317 |
|
3318 \medskip |
|
3319 |
|
3320 \hspace{30mm} |
|
3321 \verb|de_re_max| $\displaystyle{= \max_{1\leq j\leq n} |
|
3322 \frac{|u_j|}{1+|(d_S)_j - (c_S)_j|}}$, |
|
3323 |
|
3324 \medskip |
|
3325 |
|
3326 \noindent |
|
3327 and stores these quantities and corresponding column indices to the |
|
3328 structure \verb|LPXKKT|. |
|
3329 |
|
3330 To check the fourth condition (KKT.DB) the routine computes a vector |
|
3331 of residuals: |
|
3332 |
|
3333 $$ |
|
3334 v_k = \left\{ |
|
3335 \begin{array}{ll} |
|
3336 0, & {\rm if}\ d_k\ {\rm has\ correct\ sign} \\ |
|
3337 d_k, & {\rm if}\ d_k\ {\rm has\ wrong\ sign} \\ |
|
3338 \end{array} |
|
3339 \right. |
|
3340 $$ |
|
3341 for all $k=1,\dots,m+n$, determines components of this vector that |
|
3342 correspond to largest absolute and relative errors: |
|
3343 |
|
3344 \medskip |
|
3345 |
|
3346 \hspace{30mm} |
|
3347 \verb|db_ae_max| $\displaystyle{= \max_{1\leq k\leq m+n}|v_k|}$, |
|
3348 |
|
3349 \medskip |
|
3350 |
|
3351 \hspace{30mm} |
|
3352 \verb|db_re_max| $\displaystyle{= \max_{1\leq k\leq m+n} |
|
3353 \frac{|v_k|}{1+|d_k - c_k|}}$, |
|
3354 |
|
3355 \medskip |
|
3356 |
|
3357 \noindent |
|
3358 and stores these quantities and corresponding variable indices to the |
|
3359 structure \verb|LPXKKT|. |
|
3360 |
|
3361 Using the relative errors for all the four conditions listed above the |
|
3362 routine |
|
3363 \verb|lpx_check_kkt| also estimates a "quality" of the basic solution |
|
3364 from the standpoint of these conditions and stores corresponding |
|
3365 quality indicators to the structure \verb|LPXKKT|: |
|
3366 |
|
3367 \verb|pe_quality|---quality of primal solution; |
|
3368 |
|
3369 \verb|pb_quality|---quality of primal feasibility; |
|
3370 |
|
3371 \verb|de_quality|---quality of dual solution; |
|
3372 |
|
3373 \verb|db_quality|---quality of dual feasibility. |
|
3374 |
|
3375 Each of these indicators is assigned to one of the following four |
|
3376 values: |
|
3377 |
|
3378 \verb|'H'| means high quality, |
|
3379 |
|
3380 \verb|'M'| means medium quality, |
|
3381 |
|
3382 \verb|'L'| means low quality, or |
|
3383 |
|
3384 \verb|'?'| means wrong or infeasible solution. |
|
3385 |
|
3386 If all the indicators show high or medium quality (for an internally |
|
3387 scaled LP problem, i.e. when the parameter \verb|scaled| in a call to |
|
3388 the routine \verb|lpx_check_kkt| is non-zero), the user can be sure that |
|
3389 the obtained basic solution is quite accurate. |
|
3390 |
|
3391 If some of the indicators show low quality, the solution can still be |
|
3392 considered as relevant, though an additional analysis is needed |
|
3393 depending on which indicator shows low quality. |
|
3394 |
|
3395 If the indicator \verb|pe_quality| is assigned to \verb|'?'|, the |
|
3396 primal solution is wrong. If the indicator \verb|de_quality| is assigned |
|
3397 to \verb|'?'|, the dual solution is wrong. |
|
3398 |
|
3399 If the indicator \verb|db_quality| is assigned to \verb|'?'| while |
|
3400 other indicators show a good quality, this means that the current |
|
3401 basic solution being primal feasible is not dual feasible. Similarly, |
|
3402 if the indicator \verb|pb_quality| is assigned to \verb|'?'| while |
|
3403 other indicators are not, this means that the current basic solution |
|
3404 being dual feasible is not primal feasible. |
|
3405 |
|
3406 %* eof *% |