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 *% |
---|