lemon-project-template-glpk
comparison deps/glpk/doc/glpk02.tex @ 11:4fc6ad2fb8a6
Test GLPK in src/main.cc
author | Alpar Juttner <alpar@cs.elte.hu> |
---|---|
date | Sun, 06 Nov 2011 21:43:29 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:9afd438bb9eb |
---|---|
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 *% |