1 | %* glpk03.tex *% |
---|
2 | |
---|
3 | \chapter{Utility API routines} |
---|
4 | |
---|
5 | \section{Problem data reading/writing routines} |
---|
6 | |
---|
7 | \subsection{glp\_read\_mps---read problem data in MPS format} |
---|
8 | |
---|
9 | \subsubsection*{Synopsis} |
---|
10 | |
---|
11 | \begin{verbatim} |
---|
12 | int glp_read_mps(glp_prob *lp, int fmt, const void *parm, |
---|
13 | const char *fname); |
---|
14 | \end{verbatim} |
---|
15 | |
---|
16 | \subsubsection*{Description} |
---|
17 | |
---|
18 | The routine \verb|glp_read_mps| reads problem data in MPS format from a |
---|
19 | text file. (The MPS format is described in Appendix \ref{champs}, page |
---|
20 | \pageref{champs}.) |
---|
21 | |
---|
22 | The parameter \verb|fmt| specifies the MPS format version as follows: |
---|
23 | |
---|
24 | \begin{tabular}{@{}ll} |
---|
25 | \verb|GLP_MPS_DECK| & fixed (ancient) MPS format; \\ |
---|
26 | \verb|GLP_MPS_FILE| & free (modern) MPS format. \\ |
---|
27 | \end{tabular} |
---|
28 | |
---|
29 | The parameter \verb|parm| is reserved for use in the future and must be |
---|
30 | specified as \verb|NULL|. |
---|
31 | |
---|
32 | The character string \verb|fname| specifies a name of the text file to |
---|
33 | be read in. (If the file name ends with suffix `\verb|.gz|', the file is |
---|
34 | assumed to be compressed, in which case the routine \verb|glp_read_mps| |
---|
35 | decompresses it ``on the fly''.) |
---|
36 | |
---|
37 | Note that before reading data the current content of the problem object |
---|
38 | is completely erased with the routine \verb|glp_erase_prob|. |
---|
39 | |
---|
40 | \subsubsection*{Returns} |
---|
41 | |
---|
42 | If the operation was successful, the routine \verb|glp_read_mps| |
---|
43 | returns zero. Otherwise, it prints an error message and returns |
---|
44 | non-zero. |
---|
45 | |
---|
46 | \subsection{glp\_write\_mps---write problem data in MPS format} |
---|
47 | |
---|
48 | \subsubsection*{Synopsis} |
---|
49 | |
---|
50 | \begin{verbatim} |
---|
51 | int glp_write_mps(glp_prob *lp, int fmt, const void *parm, |
---|
52 | const char *fname); |
---|
53 | \end{verbatim} |
---|
54 | |
---|
55 | \subsubsection*{Description} |
---|
56 | |
---|
57 | The routine \verb|glp_write_mps| writes problem data in MPS format to a |
---|
58 | text file. (The MPS format is described in Appendix \ref{champs}, page |
---|
59 | \pageref{champs}.) |
---|
60 | |
---|
61 | The parameter \verb|fmt| specifies the MPS format version as follows: |
---|
62 | |
---|
63 | \begin{tabular}{@{}ll} |
---|
64 | \verb|GLP_MPS_DECK| & fixed (ancient) MPS format; \\ |
---|
65 | \verb|GLP_MPS_FILE| & free (modern) MPS format. \\ |
---|
66 | \end{tabular} |
---|
67 | |
---|
68 | The parameter \verb|parm| is reserved for use in the future and must be |
---|
69 | specified as \verb|NULL|. |
---|
70 | |
---|
71 | The character string \verb|fname| specifies a name of the text file to |
---|
72 | be written out. (If the file name ends with suffix `\verb|.gz|', the |
---|
73 | file is assumed to be compressed, in which case the routine |
---|
74 | \verb|glp_write_mps| performs automatic compression on writing it.) |
---|
75 | |
---|
76 | \subsubsection*{Returns} |
---|
77 | |
---|
78 | If the operation was successful, the routine \verb|glp_write_mps| |
---|
79 | returns zero. Otherwise, it prints an error message and returns |
---|
80 | non-zero. |
---|
81 | |
---|
82 | \subsection{glp\_read\_lp---read problem data in CPLEX LP format} |
---|
83 | |
---|
84 | \subsubsection*{Synopsis} |
---|
85 | |
---|
86 | \begin{verbatim} |
---|
87 | int glp_read_lp(glp_prob *lp, const void *parm, |
---|
88 | const char *fname); |
---|
89 | \end{verbatim} |
---|
90 | |
---|
91 | \subsubsection*{Description} |
---|
92 | |
---|
93 | The routine \verb|glp_read_lp| reads problem data in CPLEX LP format |
---|
94 | from a text file. (The CPLEX LP format is described in Appendix |
---|
95 | \ref{chacplex}, page \pageref{chacplex}.) |
---|
96 | |
---|
97 | The parameter \verb|parm| is reserved for use in the future and must be |
---|
98 | specified as \verb|NULL|. |
---|
99 | |
---|
100 | The character string \verb|fname| specifies a name of the text file to |
---|
101 | be read in. (If the file name ends with suffix `\verb|.gz|', the file is |
---|
102 | assumed to be compressed, in which case the routine \verb|glp_read_lp| |
---|
103 | decompresses it ``on the fly''.) |
---|
104 | |
---|
105 | Note that before reading data the current content of the problem object |
---|
106 | is completely erased with the routine \verb|glp_erase_prob|. |
---|
107 | |
---|
108 | \subsubsection*{Returns} |
---|
109 | |
---|
110 | If the operation was successful, the routine \verb|glp_read_lp| returns |
---|
111 | zero. Otherwise, it prints an error message and returns non-zero. |
---|
112 | |
---|
113 | \subsection{glp\_write\_lp---write problem data in CPLEX LP format} |
---|
114 | |
---|
115 | \subsubsection*{Synopsis} |
---|
116 | |
---|
117 | \begin{verbatim} |
---|
118 | int glp_write_lp(glp_prob *lp, const void *parm, |
---|
119 | const char *fname); |
---|
120 | \end{verbatim} |
---|
121 | |
---|
122 | \subsubsection*{Description} |
---|
123 | |
---|
124 | The routine \verb|glp_write_lp| writes problem data in CPLEX LP format |
---|
125 | to a text file. (The CPLEX LP format is described in Appendix |
---|
126 | \ref{chacplex}, page \pageref{chacplex}.) |
---|
127 | |
---|
128 | The parameter \verb|parm| is reserved for use in the future and must be |
---|
129 | specified as \verb|NULL|. |
---|
130 | |
---|
131 | The character string \verb|fname| specifies a name of the text file to |
---|
132 | be written out. (If the file name ends with suffix `\verb|.gz|', the |
---|
133 | file is assumed to be compressed, in which case the routine |
---|
134 | \verb|glp_write_lp| performs automatic compression on writing it.) |
---|
135 | |
---|
136 | \subsubsection*{Returns} |
---|
137 | |
---|
138 | If the operation was successful, the routine \verb|glp_write_lp| |
---|
139 | returns zero. Otherwise, it prints an error message and returns |
---|
140 | non-zero. |
---|
141 | |
---|
142 | \subsection{glp\_read\_prob---read problem data in GLPK format} |
---|
143 | |
---|
144 | \subsubsection*{Synopsis} |
---|
145 | |
---|
146 | \begin{verbatim} |
---|
147 | int glp_read_prob(glp_prob *P, int flags, const char *fname); |
---|
148 | \end{verbatim} |
---|
149 | |
---|
150 | \subsubsection*{Description} |
---|
151 | |
---|
152 | The routine \verb|glp_read_prob| reads problem data in the GLPK LP/MIP |
---|
153 | format from a text file. (For description of the GLPK LP/MIP format see |
---|
154 | below.) |
---|
155 | |
---|
156 | The parameter \verb|flags| is reserved for use in the future and should |
---|
157 | be specified as zero. |
---|
158 | |
---|
159 | The character string \verb|fname| specifies a name of the text file to |
---|
160 | be read in. (If the file name ends with suffix `\verb|.gz|', the file |
---|
161 | is assumed to be compressed, in which case the routine |
---|
162 | \verb|glp_read_prob| decompresses it ``on the fly''.) |
---|
163 | |
---|
164 | Note that before reading data the current content of the problem object |
---|
165 | is completely erased with the routine \verb|glp_erase_prob|. |
---|
166 | |
---|
167 | \subsubsection*{Returns} |
---|
168 | |
---|
169 | If the operation was successful, the routine \verb|glp_read_prob| |
---|
170 | returns zero. Otherwise, it prints an error message and returns |
---|
171 | non-zero. |
---|
172 | |
---|
173 | \subsubsection*{GLPK LP/MIP format} |
---|
174 | |
---|
175 | The GLPK LP/MIP format is a DIMACS-like format.\footnote{The DIMACS |
---|
176 | formats were developed by the Center for Discrete Mathematics and |
---|
177 | Theoretical Computer Science (DIMACS) to facilitate exchange of problem |
---|
178 | data. For details see: {\tt <http://dimacs.rutgers.edu/Challenges/>}. } |
---|
179 | The file in this format is a plain ASCII text file containing lines of |
---|
180 | several types described below. A line is terminated with the end-of-line |
---|
181 | character. Fields in each line are separated by at least one blank |
---|
182 | space. Each line begins with a one-character designator to identify the |
---|
183 | line type. |
---|
184 | |
---|
185 | The first line of the data file must be the problem line (except |
---|
186 | optional comment lines, which may precede the problem line). The last |
---|
187 | line of the data file must be the end line. Other lines may follow in |
---|
188 | arbitrary order, however, duplicate lines are not allowed. |
---|
189 | |
---|
190 | \paragraph{Comment lines.} Comment lines give human-readable |
---|
191 | information about the data file and are ignored by GLPK routines. |
---|
192 | Comment lines can appear anywhere in the data file. Each comment line |
---|
193 | begins with the lower-case character \verb|c|. |
---|
194 | |
---|
195 | \begin{verbatim} |
---|
196 | c This is an example of comment line |
---|
197 | \end{verbatim} |
---|
198 | |
---|
199 | \paragraph{Problem line.} There must be exactly one problem line in the |
---|
200 | data file. This line must appear before any other lines except comment |
---|
201 | lines and has the following format: |
---|
202 | |
---|
203 | \begin{verbatim} |
---|
204 | p CLASS DIR ROWS COLS NONZ |
---|
205 | \end{verbatim} |
---|
206 | |
---|
207 | The lower-case letter \verb|p| specifies that this is the problem line. |
---|
208 | |
---|
209 | The \verb|CLASS| field defines the problem class and can contain either |
---|
210 | the keyword \verb|lp| (that means linear programming problem) or |
---|
211 | \verb|mip| (that means mixed integer programming problem). |
---|
212 | |
---|
213 | The \verb|DIR| field defines the optimization direction (that is, the |
---|
214 | objective function sense) and can contain either the keyword \verb|min| |
---|
215 | (that means minimization) or \verb|max| (that means maximization). |
---|
216 | |
---|
217 | The \verb|ROWS|, \verb|COLS|, and \verb|NONZ| fields contain |
---|
218 | non-negative integer values specifying, respectively, the number of |
---|
219 | rows (constraints), columns (variables), and non-zero constraint |
---|
220 | coefficients in the problem instance. Note that \verb|NONZ| value does |
---|
221 | not account objective coefficients. |
---|
222 | |
---|
223 | \paragraph{Row descriptors.} There must be at most one row descriptor |
---|
224 | line in the data file for each row (constraint). This line has one of |
---|
225 | the following formats: |
---|
226 | |
---|
227 | \begin{verbatim} |
---|
228 | i ROW f |
---|
229 | i ROW l RHS |
---|
230 | i ROW u RHS |
---|
231 | i ROW d RHS1 RHS2 |
---|
232 | i ROW s RHS |
---|
233 | \end{verbatim} |
---|
234 | |
---|
235 | The lower-case letter \verb|i| specifies that this is the row |
---|
236 | descriptor line. |
---|
237 | |
---|
238 | The \verb|ROW| field specifies the row ordinal number, an integer |
---|
239 | between 1 and $m$, where $m$ is the number of rows in the problem |
---|
240 | instance. |
---|
241 | |
---|
242 | The next lower-case letter specifies the row type as follows: |
---|
243 | |
---|
244 | \verb|f| --- free (unbounded) row: $-\infty<\sum a_jx_j<+\infty$; |
---|
245 | |
---|
246 | \verb|l| --- inequality constraint of `$\geq$' type: |
---|
247 | $\sum a_jx_j\geq b$; |
---|
248 | |
---|
249 | \verb|u| --- inequality constraint of `$\leq$' type: |
---|
250 | $\sum a_jx_j\leq b$; |
---|
251 | |
---|
252 | \verb|d| --- double-sided inequality constraint: |
---|
253 | $b_1\leq\sum a_jx_j\leq b_2$; |
---|
254 | |
---|
255 | \verb|s| --- equality constraint: $\sum a_jx_j=b$. |
---|
256 | |
---|
257 | The \verb|RHS| field contains a floaing-point value specifying the |
---|
258 | row right-hand side. The \verb|RHS1| and \verb|RHS2| fields contain |
---|
259 | floating-point values specifying, respectively, the lower and upper |
---|
260 | right-hand sides for the double-sided row. |
---|
261 | |
---|
262 | If for some row its descriptor line does not appear in the data file, |
---|
263 | by default that row is assumed to be an equality constraint with zero |
---|
264 | right-hand side. |
---|
265 | |
---|
266 | \paragraph{Column descriptors.} There must be at most one column |
---|
267 | descriptor line in the data file for each column (variable). This line |
---|
268 | has one of the following formats depending on the problem class |
---|
269 | specified in the problem line: |
---|
270 | |
---|
271 | \bigskip |
---|
272 | |
---|
273 | \begin{tabular}{@{}l@{\hspace*{40pt}}l} |
---|
274 | LP class & MIP class \\ |
---|
275 | \hline |
---|
276 | \verb|j COL f| & \verb|j COL KIND f| \\ |
---|
277 | \verb|j COL l BND| & \verb|j COL KIND l BND| \\ |
---|
278 | \verb|j COL u BND| & \verb|j COL KIND u BND| \\ |
---|
279 | \verb|j COL d BND1 BND2| & \verb|j COL KIND d BND1 BND2| \\ |
---|
280 | \verb|j COL s BND| & \verb|j COL KIND s BND| \\ |
---|
281 | \end{tabular} |
---|
282 | |
---|
283 | \bigskip |
---|
284 | |
---|
285 | The lower-case letter \verb|j| specifies that this is the column |
---|
286 | descriptor line. |
---|
287 | |
---|
288 | The \verb|COL| field specifies the column ordinal number, an integer |
---|
289 | between 1 and $n$, where $n$ is the number of columns in the problem |
---|
290 | instance. |
---|
291 | |
---|
292 | The \verb|KIND| field is used only for MIP problems and specifies the |
---|
293 | column kind as follows: |
---|
294 | |
---|
295 | \verb|c| --- continuous column; |
---|
296 | |
---|
297 | \verb|i| --- integer column; |
---|
298 | |
---|
299 | \verb|b| --- binary column (in this case all remaining fields must be |
---|
300 | omitted). |
---|
301 | |
---|
302 | The next lower-case letter specifies the column type as follows: |
---|
303 | |
---|
304 | \verb|f| --- free (unbounded) column: $-\infty<x<+\infty$; |
---|
305 | |
---|
306 | \verb|l| --- column with lower bound: $x\geq l$; |
---|
307 | |
---|
308 | \verb|u| --- column with upper bound: $x\leq u$; |
---|
309 | |
---|
310 | \verb|d| --- double-bounded column: $l\leq x\leq u$; |
---|
311 | |
---|
312 | \verb|s| --- fixed column: $x=s$. |
---|
313 | |
---|
314 | The \verb|BND| field contains a floating-point value that specifies the |
---|
315 | column bound. The \verb|BND1| and \verb|BND2| fields contain |
---|
316 | floating-point values specifying, respectively, the lower and upper |
---|
317 | bounds for the double-bounded column. |
---|
318 | |
---|
319 | If for some column its descriptor line does not appear in the file, by |
---|
320 | default that column is assumed to be non-negative (in case of LP class) |
---|
321 | or binary (in case of MIP class). |
---|
322 | |
---|
323 | \paragraph{Coefficient descriptors.} There must be exactly one |
---|
324 | coefficient descriptor line in the data file for each non-zero |
---|
325 | objective or constraint coefficient. This line has the following format: |
---|
326 | |
---|
327 | \begin{verbatim} |
---|
328 | a ROW COL VAL |
---|
329 | \end{verbatim} |
---|
330 | |
---|
331 | The lower-case letter \verb|a| specifies that this is the coefficient |
---|
332 | descriptor line. |
---|
333 | |
---|
334 | For objective coefficients the \verb|ROW| field must contain 0. For |
---|
335 | constraint coefficients the \verb|ROW| field specifies the row ordinal |
---|
336 | number, an integer between 1 and $m$, where $m$ is the number of rows |
---|
337 | in the problem instance. |
---|
338 | |
---|
339 | The \verb|COL| field specifies the column ordinal number, an integer |
---|
340 | between 1 and $n$, where $n$ is the number of columns in the problem |
---|
341 | instance. |
---|
342 | |
---|
343 | If both the \verb|ROW| and \verb|COL| fields contain 0, the line |
---|
344 | specifies the constant term (``shift'') of the objective function |
---|
345 | rather than objective coefficient. |
---|
346 | |
---|
347 | The \verb|VAL| field contains a floating-point coefficient value (it is |
---|
348 | allowed to specify zero value in this field). |
---|
349 | |
---|
350 | The number of constraint coefficient descriptor lines must be exactly |
---|
351 | the same as specified in the field \verb|NONZ| of the problem line. |
---|
352 | |
---|
353 | \paragraph{Symbolic name descriptors.} There must be at most one |
---|
354 | symbolic name descriptor line for the problem instance, objective |
---|
355 | function, each row (constraint), and each column (variable). This line |
---|
356 | has one of the following formats: |
---|
357 | |
---|
358 | \begin{verbatim} |
---|
359 | n p NAME |
---|
360 | n z NAME |
---|
361 | n i ROW NAME |
---|
362 | n j COL NAME |
---|
363 | \end{verbatim} |
---|
364 | |
---|
365 | The lower-case letter \verb|n| specifies that this is the symbolic name |
---|
366 | descriptor line. |
---|
367 | |
---|
368 | The next lower-case letter specifies which object should be assigned a |
---|
369 | symbolic name: |
---|
370 | |
---|
371 | \verb|p| --- problem instance; |
---|
372 | |
---|
373 | \verb|z| --- objective function; |
---|
374 | |
---|
375 | \verb|i| --- row (constraint); |
---|
376 | |
---|
377 | \verb|j| --- column (variable). |
---|
378 | |
---|
379 | The \verb|ROW| field specifies the row ordinal number, an integer |
---|
380 | between 1 and $m$, where $m$ is the number of rows in the problem |
---|
381 | instance. |
---|
382 | |
---|
383 | The \verb|COL| field specifies the column ordinal number, an integer |
---|
384 | between 1 and $n$, where $n$ is the number of columns in the problem |
---|
385 | instance. |
---|
386 | |
---|
387 | The \verb|NAME| field contains the symbolic name, a sequence from 1 to |
---|
388 | 255 arbitrary graphic ASCII characters, assigned to corresponding |
---|
389 | object. |
---|
390 | |
---|
391 | \paragraph{End line.} There must be exactly one end line in the data |
---|
392 | file. This line must appear last in the file and has the following |
---|
393 | format: |
---|
394 | |
---|
395 | \begin{verbatim} |
---|
396 | e |
---|
397 | \end{verbatim} |
---|
398 | |
---|
399 | The lower-case letter \verb|e| specifies that this is the end line. |
---|
400 | Anything that follows the end line is ignored by GLPK routines. |
---|
401 | |
---|
402 | \subsubsection*{Example of data file in GLPK LP/MIP format} |
---|
403 | |
---|
404 | The following example of a data file in GLPK LP/MIP format specifies |
---|
405 | the same LP problem as in Subsection ``Example of MPS file''. |
---|
406 | |
---|
407 | \begin{center} |
---|
408 | \footnotesize\tt |
---|
409 | \begin{tabular}{l@{\hspace*{50pt}}} |
---|
410 | p lp min 8 7 48 \\ |
---|
411 | n p PLAN \\ |
---|
412 | n z VALUE \\ |
---|
413 | i 1 f \\ |
---|
414 | n i 1 VALUE \\ |
---|
415 | i 2 s 2000 \\ |
---|
416 | n i 2 YIELD \\ |
---|
417 | i 3 u 60 \\ |
---|
418 | n i 3 FE \\ |
---|
419 | i 4 u 100 \\ |
---|
420 | n i 4 CU \\ |
---|
421 | i 5 u 40 \\ |
---|
422 | n i 5 MN \\ |
---|
423 | i 6 u 30 \\ |
---|
424 | n i 6 MG \\ |
---|
425 | i 7 l 1500 \\ |
---|
426 | n i 7 AL \\ |
---|
427 | i 8 d 250 300 \\ |
---|
428 | n i 8 SI \\ |
---|
429 | j 1 d 0 200 \\ |
---|
430 | n j 1 BIN1 \\ |
---|
431 | j 2 d 0 2500 \\ |
---|
432 | n j 2 BIN2 \\ |
---|
433 | j 3 d 400 800 \\ |
---|
434 | n j 3 BIN3 \\ |
---|
435 | j 4 d 100 700 \\ |
---|
436 | n j 4 BIN4 \\ |
---|
437 | j 5 d 0 1500 \\ |
---|
438 | n j 5 BIN5 \\ |
---|
439 | n j 6 ALUM \\ |
---|
440 | n j 7 SILICON \\ |
---|
441 | a 0 1 0.03 \\ |
---|
442 | a 0 2 0.08 \\ |
---|
443 | a 0 3 0.17 \\ |
---|
444 | a 0 4 0.12 \\ |
---|
445 | a 0 5 0.15 \\ |
---|
446 | a 0 6 0.21 \\ |
---|
447 | a 0 7 0.38 \\ |
---|
448 | a 1 1 0.03 \\ |
---|
449 | a 1 2 0.08 \\ |
---|
450 | a 1 3 0.17 \\ |
---|
451 | a 1 4 0.12 \\ |
---|
452 | a 1 5 0.15 \\ |
---|
453 | a 1 6 0.21 \\ |
---|
454 | \end{tabular} |
---|
455 | \begin{tabular}{|@{\hspace*{80pt}}l} |
---|
456 | a 1 7 0.38 \\ |
---|
457 | a 2 1 1 \\ |
---|
458 | a 2 2 1 \\ |
---|
459 | a 2 3 1 \\ |
---|
460 | a 2 4 1 \\ |
---|
461 | a 2 5 1 \\ |
---|
462 | a 2 6 1 \\ |
---|
463 | a 2 7 1 \\ |
---|
464 | a 3 1 0.15 \\ |
---|
465 | a 3 2 0.04 \\ |
---|
466 | a 3 3 0.02 \\ |
---|
467 | a 3 4 0.04 \\ |
---|
468 | a 3 5 0.02 \\ |
---|
469 | a 3 6 0.01 \\ |
---|
470 | a 3 7 0.03 \\ |
---|
471 | a 4 1 0.03 \\ |
---|
472 | a 4 2 0.05 \\ |
---|
473 | a 4 3 0.08 \\ |
---|
474 | a 4 4 0.02 \\ |
---|
475 | a 4 5 0.06 \\ |
---|
476 | a 4 6 0.01 \\ |
---|
477 | a 5 1 0.02 \\ |
---|
478 | a 5 2 0.04 \\ |
---|
479 | a 5 3 0.01 \\ |
---|
480 | a 5 4 0.02 \\ |
---|
481 | a 5 5 0.02 \\ |
---|
482 | a 6 1 0.02 \\ |
---|
483 | a 6 2 0.03 \\ |
---|
484 | a 6 5 0.01 \\ |
---|
485 | a 7 1 0.7 \\ |
---|
486 | a 7 2 0.75 \\ |
---|
487 | a 7 3 0.8 \\ |
---|
488 | a 7 4 0.75 \\ |
---|
489 | a 7 5 0.8 \\ |
---|
490 | a 7 6 0.97 \\ |
---|
491 | a 8 1 0.02 \\ |
---|
492 | a 8 2 0.06 \\ |
---|
493 | a 8 3 0.08 \\ |
---|
494 | a 8 4 0.12 \\ |
---|
495 | a 8 5 0.02 \\ |
---|
496 | a 8 6 0.01 \\ |
---|
497 | a 8 7 0.97 \\ |
---|
498 | e o f \\ |
---|
499 | \\ |
---|
500 | \end{tabular} |
---|
501 | \end{center} |
---|
502 | |
---|
503 | \newpage |
---|
504 | |
---|
505 | \subsection{glp\_write\_prob---write problem data in GLPK format} |
---|
506 | |
---|
507 | \subsubsection*{Synopsis} |
---|
508 | |
---|
509 | \begin{verbatim} |
---|
510 | int glp_write_prob(glp_prob *P, int flags, const char *fname); |
---|
511 | \end{verbatim} |
---|
512 | |
---|
513 | \subsubsection*{Description} |
---|
514 | |
---|
515 | The routine \verb|glp_write_prob| writes problem data in the GLPK |
---|
516 | LP/MIP format to a text file. (For description of the GLPK LP/MIP |
---|
517 | format see Subsection ``Read problem data in GLPK format''.) |
---|
518 | |
---|
519 | The parameter \verb|flags| is reserved for use in the future and should |
---|
520 | be specified as zero. |
---|
521 | |
---|
522 | The character string \verb|fname| specifies a name of the text file to |
---|
523 | be written out. (If the file name ends with suffix `\verb|.gz|', the |
---|
524 | file is assumed to be compressed, in which case the routine |
---|
525 | \verb|glp_write_prob| performs automatic compression on writing it.) |
---|
526 | |
---|
527 | \subsubsection*{Returns} |
---|
528 | |
---|
529 | If the operation was successful, the routine \verb|glp_read_prob| |
---|
530 | returns zero. Otherwise, it prints an error message and returns |
---|
531 | non-zero. |
---|
532 | |
---|
533 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
534 | |
---|
535 | \newpage |
---|
536 | |
---|
537 | \section{Routines for processing MathProg models} |
---|
538 | |
---|
539 | \subsection{Introduction} |
---|
540 | |
---|
541 | GLPK supports the {\it GNU MathProg modeling language}.\footnote{The |
---|
542 | GNU MathProg modeling language is a subset of the AMPL language. For |
---|
543 | its detailed description see the document ``Modeling Language GNU |
---|
544 | MathProg: Language Reference'' included in the GLPK distribution.} |
---|
545 | As a rule, models written in MathProg are solved with the GLPK LP/MIP |
---|
546 | stand-alone solver \verb|glpsol| (see Appendix D) and do not need any |
---|
547 | programming with API routines. However, for various reasons the user |
---|
548 | may need to process MathProg models directly in his/her application |
---|
549 | program, in which case he/she may use API routines described in this |
---|
550 | section. These routines provide an interface to the {\it MathProg |
---|
551 | translator}, a component of GLPK, which translates MathProg models into |
---|
552 | an internal code and then interprets (executes) this code. |
---|
553 | |
---|
554 | The processing of a model written in GNU MathProg includes several |
---|
555 | steps, which should be performed in the following order: |
---|
556 | |
---|
557 | \begin{enumerate} |
---|
558 | \item{\it Allocating the workspace.} |
---|
559 | The translator allocates the workspace, an internal data structure used |
---|
560 | on all subsequent steps. |
---|
561 | \item{\it Reading model section.} The translator reads model section |
---|
562 | and, optionally, data section from a specified text file and translates |
---|
563 | them into the internal code. If necessary, on this step data section |
---|
564 | may be ignored. |
---|
565 | \item{\it Reading data section(s).} The translator reads one or more |
---|
566 | data sections from specified text file(s) and translates them into the |
---|
567 | internal code. |
---|
568 | \item{\it Generating the model.} The translator executes the internal |
---|
569 | code to evaluate the content of the model objects such as sets, |
---|
570 | parameters, variables, constraints, and objectives. On this step the |
---|
571 | execution is suspended at the solve statement. |
---|
572 | \item {\it Building the problem object.} The translator obtains all |
---|
573 | necessary information from the workspace and builds the standard |
---|
574 | problem object (that is, the program object of type \verb|glp_prob|). |
---|
575 | \item{\it Solving the problem.} On this step the problem object built |
---|
576 | on the previous step is passed to a solver, which solves the problem |
---|
577 | instance and stores its solution back to the problem object. |
---|
578 | \item{\it Postsolving the model.} The translator copies the solution |
---|
579 | from the problem object to the workspace and then executes the internal |
---|
580 | code from the solve statement to the end of the model. (If model has |
---|
581 | no solve statement, the translator does nothing on this step.) |
---|
582 | \item{\it Freeing the workspace.} The translator frees all the memory |
---|
583 | allocated to the workspace. |
---|
584 | \end{enumerate} |
---|
585 | |
---|
586 | Note that the MathProg translator performs no error correction, so if |
---|
587 | any of steps 2 to 7 fails (due to errors in the model), the application |
---|
588 | program should terminate processing and go to step 8. |
---|
589 | |
---|
590 | \subsubsection*{Example 1} |
---|
591 | |
---|
592 | In this example the program reads model and data sections from input |
---|
593 | file \verb|egypt.mod|\footnote{This is an example model included in |
---|
594 | the GLPK distribution.} and writes the model to output file |
---|
595 | \verb|egypt.mps| in free MPS format (see Appendix B). No solution is |
---|
596 | performed. |
---|
597 | |
---|
598 | \begin{small} |
---|
599 | \begin{verbatim} |
---|
600 | /* mplsamp1.c */ |
---|
601 | |
---|
602 | #include <stdio.h> |
---|
603 | #include <stdlib.h> |
---|
604 | #include <glpk.h> |
---|
605 | |
---|
606 | int main(void) |
---|
607 | { glp_prob *lp; |
---|
608 | glp_tran *tran; |
---|
609 | int ret; |
---|
610 | lp = glp_create_prob(); |
---|
611 | tran = glp_mpl_alloc_wksp(); |
---|
612 | ret = glp_mpl_read_model(tran, "egypt.mod", 0); |
---|
613 | if (ret != 0) |
---|
614 | { fprintf(stderr, "Error on translating model\n"); |
---|
615 | goto skip; |
---|
616 | } |
---|
617 | ret = glp_mpl_generate(tran, NULL); |
---|
618 | if (ret != 0) |
---|
619 | { fprintf(stderr, "Error on generating model\n"); |
---|
620 | goto skip; |
---|
621 | } |
---|
622 | glp_mpl_build_prob(tran, lp); |
---|
623 | ret = glp_write_mps(lp, GLP_MPS_FILE, NULL, "egypt.mps"); |
---|
624 | if (ret != 0) |
---|
625 | fprintf(stderr, "Error on writing MPS file\n"); |
---|
626 | skip: glp_mpl_free_wksp(tran); |
---|
627 | glp_delete_prob(lp); |
---|
628 | return 0; |
---|
629 | } |
---|
630 | |
---|
631 | /* eof */ |
---|
632 | \end{verbatim} |
---|
633 | \end{small} |
---|
634 | |
---|
635 | \subsubsection*{Example 2} |
---|
636 | |
---|
637 | In this example the program reads model section from file |
---|
638 | \verb|sudoku.mod|\footnote{This is an example model which is included |
---|
639 | in the GLPK distribution along with alternative data file |
---|
640 | {\tt sudoku.dat}.} ignoring data section in this file, reads alternative |
---|
641 | data section from file \verb|sudoku.dat|, solves the problem instance |
---|
642 | and passes the solution found back to the model. |
---|
643 | |
---|
644 | \begin{small} |
---|
645 | \begin{verbatim} |
---|
646 | /* mplsamp2.c */ |
---|
647 | |
---|
648 | #include <stdio.h> |
---|
649 | #include <stdlib.h> |
---|
650 | #include <glpk.h> |
---|
651 | |
---|
652 | int main(void) |
---|
653 | { glp_prob *mip; |
---|
654 | glp_tran *tran; |
---|
655 | int ret; |
---|
656 | mip = glp_create_prob(); |
---|
657 | tran = glp_mpl_alloc_wksp(); |
---|
658 | ret = glp_mpl_read_model(tran, "sudoku.mod", 1); |
---|
659 | if (ret != 0) |
---|
660 | { fprintf(stderr, "Error on translating model\n"); |
---|
661 | goto skip; |
---|
662 | } |
---|
663 | ret = glp_mpl_read_data(tran, "sudoku.dat"); |
---|
664 | if (ret != 0) |
---|
665 | { fprintf(stderr, "Error on translating data\n"); |
---|
666 | goto skip; |
---|
667 | } |
---|
668 | ret = glp_mpl_generate(tran, NULL); |
---|
669 | if (ret != 0) |
---|
670 | { fprintf(stderr, "Error on generating model\n"); |
---|
671 | goto skip; |
---|
672 | } |
---|
673 | glp_mpl_build_prob(tran, mip); |
---|
674 | glp_simplex(mip, NULL); |
---|
675 | glp_intopt(mip, NULL); |
---|
676 | ret = glp_mpl_postsolve(tran, mip, GLP_MIP); |
---|
677 | if (ret != 0) |
---|
678 | fprintf(stderr, "Error on postsolving model\n"); |
---|
679 | skip: glp_mpl_free_wksp(tran); |
---|
680 | glp_delete_prob(mip); |
---|
681 | return 0; |
---|
682 | } |
---|
683 | |
---|
684 | /* eof */ |
---|
685 | \end{verbatim} |
---|
686 | \end{small} |
---|
687 | |
---|
688 | \subsection{glp\_mpl\_alloc\_wksp---allocate the translator workspace} |
---|
689 | |
---|
690 | \subsubsection*{Synopsis} |
---|
691 | |
---|
692 | \begin{verbatim} |
---|
693 | glp_tran *glp_mpl_alloc_wksp(void); |
---|
694 | \end{verbatim} |
---|
695 | |
---|
696 | \subsubsection*{Description} |
---|
697 | |
---|
698 | The routine \verb|glp_mpl_alloc_wksp| allocates the MathProg translator |
---|
699 | work\-space. (Note that multiple instances of the workspace may be |
---|
700 | allocated, if necessary.) |
---|
701 | |
---|
702 | \subsubsection*{Returns} |
---|
703 | |
---|
704 | The routine returns a pointer to the workspace, which should be used in |
---|
705 | all subsequent operations. |
---|
706 | |
---|
707 | \subsection{glp\_mpl\_read\_model---read and translate model section} |
---|
708 | |
---|
709 | \subsubsection*{Synopsis} |
---|
710 | |
---|
711 | \begin{verbatim} |
---|
712 | int glp_mpl_read_model(glp_tran *tran, const char *fname, |
---|
713 | int skip); |
---|
714 | \end{verbatim} |
---|
715 | |
---|
716 | \subsubsection*{Description} |
---|
717 | |
---|
718 | The routine \verb|glp_mpl_read_model| reads model section and, |
---|
719 | optionally, data section, which may follow the model section, from a |
---|
720 | text file, whose name is the character string \verb|fname|, performs |
---|
721 | translation of model statements and data blocks, and stores all the |
---|
722 | information in the workspace. |
---|
723 | |
---|
724 | The parameter \verb|skip| is a flag. If the input file contains the |
---|
725 | data section and this flag is non-zero, the data section is not read as |
---|
726 | if there were no data section and a warning message is printed. This |
---|
727 | allows reading data section(s) from other file(s). |
---|
728 | |
---|
729 | \subsubsection*{Returns} |
---|
730 | |
---|
731 | If the operation is successful, the routine returns zero. Otherwise |
---|
732 | the routine prints an error message and returns non-zero. |
---|
733 | |
---|
734 | \subsection{glp\_mpl\_read\_data---read and translate data section} |
---|
735 | |
---|
736 | \subsubsection*{Synopsis} |
---|
737 | |
---|
738 | \begin{verbatim} |
---|
739 | int glp_mpl_read_data(glp_tran *tran, const char *fname); |
---|
740 | \end{verbatim} |
---|
741 | |
---|
742 | \subsubsection*{Description} |
---|
743 | |
---|
744 | The routine \verb|glp_mpl_read_data| reads data section from a text |
---|
745 | file, whose name is the character string \verb|fname|, performs |
---|
746 | translation of data blocks, and stores the data read in the translator |
---|
747 | workspace. If necessary, this routine may be called more than once. |
---|
748 | |
---|
749 | \subsubsection*{Returns} |
---|
750 | |
---|
751 | If the operation is successful, the routine returns zero. Otherwise |
---|
752 | the routine prints an error message and returns non-zero. |
---|
753 | |
---|
754 | \subsection{glp\_mpl\_generate---generate the model} |
---|
755 | |
---|
756 | \subsubsection*{Synopsis} |
---|
757 | |
---|
758 | \begin{verbatim} |
---|
759 | int glp_mpl_generate(glp_tran *tran, const char *fname); |
---|
760 | \end{verbatim} |
---|
761 | |
---|
762 | \subsubsection*{Description} |
---|
763 | |
---|
764 | The routine \verb|glp_mpl_generate| generates the model using its |
---|
765 | description stored in the translator workspace. This operation means |
---|
766 | generating all variables, constraints, and objectives, executing check |
---|
767 | and display statements, which precede the solve statement (if it is |
---|
768 | presented). |
---|
769 | |
---|
770 | The character string \verb|fname| specifies the name of an output text |
---|
771 | file, to which output produced by display statements should be written. |
---|
772 | If \verb|fname| is \verb|NULL|, the output is sent to the terminal. |
---|
773 | |
---|
774 | \subsubsection*{Returns} |
---|
775 | |
---|
776 | If the operation is successful, the routine returns zero. Otherwise |
---|
777 | the routine prints an error message and returns non-zero. |
---|
778 | |
---|
779 | \subsection{glp\_mpl\_build\_prob---build problem instance from the |
---|
780 | model} |
---|
781 | |
---|
782 | \subsubsection*{Synopsis} |
---|
783 | |
---|
784 | \begin{verbatim} |
---|
785 | void glp_mpl_build_prob(glp_tran *tran, glp_prob *prob); |
---|
786 | \end{verbatim} |
---|
787 | |
---|
788 | \subsubsection*{Description} |
---|
789 | |
---|
790 | The routine \verb|glp_mpl_build_prob| obtains all necessary information |
---|
791 | from the translator workspace and stores it in the specified problem |
---|
792 | object \verb|prob|. Note that before building the current content of |
---|
793 | the problem object is erased with the routine \verb|glp_erase_prob|. |
---|
794 | |
---|
795 | \subsection{glp\_mpl\_postsolve---postsolve the model} |
---|
796 | |
---|
797 | \subsubsection*{Synopsis} |
---|
798 | |
---|
799 | \begin{verbatim} |
---|
800 | int glp_mpl_postsolve(glp_tran *tran, glp_prob *prob, |
---|
801 | int sol); |
---|
802 | \end{verbatim} |
---|
803 | |
---|
804 | \subsubsection*{Description} |
---|
805 | |
---|
806 | The routine \verb|glp_mpl_postsolve| copies the solution from the |
---|
807 | specified problem object \verb|prob| to the translator workspace and |
---|
808 | then executes all the remaining model statements, which follow the |
---|
809 | solve statement. |
---|
810 | |
---|
811 | The parameter \verb|sol| specifies which solution should be copied |
---|
812 | from the problem object to the workspace as follows: |
---|
813 | |
---|
814 | \begin{tabular}{@{}ll} |
---|
815 | \verb|GLP_SOL| & basic solution; \\ |
---|
816 | \verb|GLP_IPT| & interior-point solution; \\ |
---|
817 | \verb|GLP_MIP| & mixed integer solution. \\ |
---|
818 | \end{tabular} |
---|
819 | |
---|
820 | \subsubsection*{Returns} |
---|
821 | |
---|
822 | If the operation is successful, the routine returns zero. Otherwise |
---|
823 | the routine prints an error message and returns non-zero. |
---|
824 | |
---|
825 | \subsection{glp\_mpl\_free\_wksp---free the translator workspace} |
---|
826 | |
---|
827 | \subsubsection*{Synopsis} |
---|
828 | |
---|
829 | \begin{verbatim} |
---|
830 | void glp_mpl_free_wksp(glp_tran *tran); |
---|
831 | \end{verbatim} |
---|
832 | |
---|
833 | \subsubsection*{Description} |
---|
834 | |
---|
835 | The routine \verb|glp_mpl_free_wksp| frees all the memory allocated to |
---|
836 | the translator workspace. It also frees all other resources, which are |
---|
837 | still used by the translator. |
---|
838 | |
---|
839 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
840 | |
---|
841 | \newpage |
---|
842 | |
---|
843 | \section{Problem solution reading/writing routines} |
---|
844 | |
---|
845 | \subsection{glp\_print\_sol---write basic solution in printable format} |
---|
846 | |
---|
847 | \subsubsection*{Synopsis} |
---|
848 | |
---|
849 | \begin{verbatim} |
---|
850 | int glp_print_sol(glp_prob *lp, const char *fname); |
---|
851 | \end{verbatim} |
---|
852 | |
---|
853 | \subsubsection*{Description} |
---|
854 | |
---|
855 | The routine \verb|glp_print_sol writes| the current basic solution of |
---|
856 | an LP problem, which is specified by the pointer \verb|lp|, to a text |
---|
857 | file, whose name is the character string \verb|fname|, in printable |
---|
858 | format. |
---|
859 | |
---|
860 | Information reported by the routine \verb|glp_print_sol| is intended |
---|
861 | mainly for visual analysis. |
---|
862 | |
---|
863 | \subsubsection*{Returns} |
---|
864 | |
---|
865 | If no errors occurred, the routine returns zero. Otherwise the routine |
---|
866 | prints an error message and returns non-zero. |
---|
867 | |
---|
868 | \subsection{glp\_read\_sol---read basic solution from text file} |
---|
869 | |
---|
870 | \subsubsection*{Synopsis} |
---|
871 | |
---|
872 | \begin{verbatim} |
---|
873 | int glp_read_sol(glp_prob *lp, const char *fname); |
---|
874 | \end{verbatim} |
---|
875 | |
---|
876 | \subsubsection*{Description} |
---|
877 | |
---|
878 | The routine \verb|glp_read_sol| reads basic solution from a text file |
---|
879 | whose name is specified by the parameter \verb|fname| into the problem |
---|
880 | object. |
---|
881 | |
---|
882 | For the file format see description of the routine \verb|glp_write_sol|. |
---|
883 | |
---|
884 | \subsubsection*{Returns} |
---|
885 | |
---|
886 | On success the routine returns zero, otherwise non-zero. |
---|
887 | |
---|
888 | \newpage |
---|
889 | |
---|
890 | \subsection{glp\_write\_sol---write basic solution to text file} |
---|
891 | |
---|
892 | \subsubsection*{Synopsis} |
---|
893 | |
---|
894 | \begin{verbatim} |
---|
895 | int glp_write_sol(glp_prob *lp, const char *fname); |
---|
896 | \end{verbatim} |
---|
897 | |
---|
898 | \subsubsection*{Description} |
---|
899 | |
---|
900 | The routine \verb|glp_write_sol| writes the current basic solution to a |
---|
901 | text file whose name is specified by the parameter \verb|fname|. This |
---|
902 | file can be read back with the routine \verb|glp_read_sol|. |
---|
903 | |
---|
904 | \subsubsection*{Returns} |
---|
905 | |
---|
906 | On success the routine returns zero, otherwise non-zero. |
---|
907 | |
---|
908 | \subsubsection*{File format} |
---|
909 | |
---|
910 | The file created by the routine \verb|glp_write_sol| is a plain text |
---|
911 | file, which contains the following information: |
---|
912 | |
---|
913 | \begin{verbatim} |
---|
914 | m n |
---|
915 | p_stat d_stat obj_val |
---|
916 | r_stat[1] r_prim[1] r_dual[1] |
---|
917 | . . . |
---|
918 | r_stat[m] r_prim[m] r_dual[m] |
---|
919 | c_stat[1] c_prim[1] c_dual[1] |
---|
920 | . . . |
---|
921 | c_stat[n] c_prim[n] c_dual[n] |
---|
922 | \end{verbatim} |
---|
923 | |
---|
924 | \noindent |
---|
925 | where: |
---|
926 | |
---|
927 | \noindent |
---|
928 | $m$ is the number of rows (auxiliary variables); |
---|
929 | |
---|
930 | \noindent |
---|
931 | $n$ is the number of columns (structural variables); |
---|
932 | |
---|
933 | \noindent |
---|
934 | \verb|p_stat| is the primal status of the basic solution |
---|
935 | (\verb|GLP_UNDEF| = 1, \verb|GLP_FEAS| = 2, \verb|GLP_INFEAS| = 3, or |
---|
936 | \verb|GLP_NOFEAS| = 4); |
---|
937 | |
---|
938 | \noindent |
---|
939 | \verb|d_stat| is the dual status of the basic solution |
---|
940 | (\verb|GLP_UNDEF| = 1, \verb|GLP_FEAS| = 2, \verb|GLP_INFEAS| = 3, or |
---|
941 | \verb|GLP_NOFEAS| = 4); |
---|
942 | |
---|
943 | \noindent |
---|
944 | \verb|obj_val| is the objective value; |
---|
945 | |
---|
946 | \noindent |
---|
947 | \verb|r_stat[i]|, $i=1,\dots,m$, is the status of $i$-th row |
---|
948 | (\verb|GLP_BS| = 1, \verb|GLP_NL| = 2, \verb|GLP_NU| = 3, |
---|
949 | \verb|GLP_NF| = 4, or \verb|GLP_NS| = 5); |
---|
950 | |
---|
951 | \noindent |
---|
952 | \verb|r_prim[i]|, $i=1,\dots,m$, is the primal value of $i$-th row; |
---|
953 | |
---|
954 | \noindent |
---|
955 | \verb|r_dual[i]|, $i=1,\dots,m$, is the dual value of $i$-th row; |
---|
956 | |
---|
957 | \noindent |
---|
958 | \verb|c_stat[j]|, $j=1,\dots,n$, is the status of $j$-th column |
---|
959 | (\verb|GLP_BS| = 1, \verb|GLP_NL| = 2, \verb|GLP_NU| = 3, |
---|
960 | \verb|GLP_NF| = 4, or \verb|GLP_NS| = 5); |
---|
961 | |
---|
962 | \noindent |
---|
963 | \verb|c_prim[j]|, $j=1,\dots,n$, is the primal value of $j$-th column; |
---|
964 | |
---|
965 | \noindent |
---|
966 | \verb|c_dual[j]|, $j=1,\dots,n$, is the dual value of $j$-th column. |
---|
967 | |
---|
968 | \subsection{glp\_print\_ipt---write interior-point solution in |
---|
969 | printable format} |
---|
970 | |
---|
971 | \subsubsection*{Synopsis} |
---|
972 | |
---|
973 | \begin{verbatim} |
---|
974 | int glp_print_ipt(glp_prob *lp, const char *fname); |
---|
975 | \end{verbatim} |
---|
976 | |
---|
977 | \subsubsection*{Description} |
---|
978 | |
---|
979 | The routine \verb|glp_print_ipt| writes the current interior point |
---|
980 | solution of an LP problem, which the parameter \verb|lp| points to, to |
---|
981 | a text file, whose name is the character string \verb|fname|, in |
---|
982 | printable format. |
---|
983 | |
---|
984 | Information reported by the routine \verb|glp_print_ipt| is intended |
---|
985 | mainly for visual analysis. |
---|
986 | |
---|
987 | \subsubsection*{Returns} |
---|
988 | |
---|
989 | If no errors occurred, the routine returns zero. Otherwise the routine |
---|
990 | prints an error message and returns non-zero. |
---|
991 | |
---|
992 | \subsection{glp\_read\_ipt---read interior-point solution from text |
---|
993 | file} |
---|
994 | |
---|
995 | \subsubsection*{Synopsis} |
---|
996 | |
---|
997 | \begin{verbatim} |
---|
998 | int glp_read_ipt(glp_prob *lp, const char *fname); |
---|
999 | \end{verbatim} |
---|
1000 | |
---|
1001 | \subsubsection*{Description} |
---|
1002 | |
---|
1003 | The routine \verb|glp_read_ipt| reads interior-point solution from a |
---|
1004 | text file whose name is specified by the parameter \verb|fname| into the |
---|
1005 | problem object. |
---|
1006 | |
---|
1007 | For the file format see description of the routine \verb|glp_write_ipt|. |
---|
1008 | |
---|
1009 | \subsubsection*{Returns} |
---|
1010 | |
---|
1011 | On success the routine returns zero, otherwise non-zero. |
---|
1012 | |
---|
1013 | \subsection{glp\_write\_ipt---write interior-point solution to text |
---|
1014 | file} |
---|
1015 | |
---|
1016 | \subsubsection*{Synopsis} |
---|
1017 | |
---|
1018 | \begin{verbatim} |
---|
1019 | int glp_write_ipt(glp_prob *lp, const char *fname); |
---|
1020 | \end{verbatim} |
---|
1021 | |
---|
1022 | \subsubsection*{Description} |
---|
1023 | |
---|
1024 | The routine \verb|glp_write_ipt| writes the current interior-point |
---|
1025 | solution to a text file whose name is specified by the parameter |
---|
1026 | \verb|fname|. This file can be read back with the routine |
---|
1027 | \verb|glp_read_ipt|. |
---|
1028 | |
---|
1029 | \subsubsection*{Returns} |
---|
1030 | |
---|
1031 | On success the routine returns zero, otherwise non-zero. |
---|
1032 | |
---|
1033 | \subsubsection*{File format} |
---|
1034 | |
---|
1035 | The file created by the routine \verb|glp_write_ipt| is a plain text |
---|
1036 | file, which contains the following information: |
---|
1037 | |
---|
1038 | \begin{verbatim} |
---|
1039 | m n |
---|
1040 | stat obj_val |
---|
1041 | r_prim[1] r_dual[1] |
---|
1042 | . . . |
---|
1043 | r_prim[m] r_dual[m] |
---|
1044 | c_prim[1] c_dual[1] |
---|
1045 | . . . |
---|
1046 | c_prim[n] c_dual[n] |
---|
1047 | \end{verbatim} |
---|
1048 | |
---|
1049 | \noindent |
---|
1050 | where: |
---|
1051 | |
---|
1052 | \noindent |
---|
1053 | $m$ is the number of rows (auxiliary variables); |
---|
1054 | |
---|
1055 | \noindent |
---|
1056 | $n$ is the number of columns (structural variables); |
---|
1057 | |
---|
1058 | \noindent |
---|
1059 | \verb|stat| is the solution status (\verb|GLP_UNDEF| = 1 or |
---|
1060 | \verb|GLP_OPT| = 5); |
---|
1061 | |
---|
1062 | \noindent |
---|
1063 | \verb|obj_val| is the objective value; |
---|
1064 | |
---|
1065 | \noindent |
---|
1066 | \verb|r_prim[i]|, $i=1,\dots,m$, is the primal value of $i$-th row; |
---|
1067 | |
---|
1068 | \noindent |
---|
1069 | \verb|r_dual[i]|, $i=1,\dots,m$, is the dual value of $i$-th row; |
---|
1070 | |
---|
1071 | \noindent |
---|
1072 | \verb|c_prim[j]|, $j=1,\dots,n$, is the primal value of $j$-th column; |
---|
1073 | |
---|
1074 | \noindent |
---|
1075 | \verb|c_dual[j]|, $j=1,\dots,n$, is the dual value of $j$-th column. |
---|
1076 | |
---|
1077 | \subsection{glp\_print\_mip---write MIP solution in printable format} |
---|
1078 | |
---|
1079 | \subsubsection*{Synopsis} |
---|
1080 | |
---|
1081 | \begin{verbatim} |
---|
1082 | int glp_print_mip(glp_prob *lp, const char *fname); |
---|
1083 | \end{verbatim} |
---|
1084 | |
---|
1085 | \subsubsection*{Description} |
---|
1086 | |
---|
1087 | The routine \verb|glp_print_mip| writes a best known integer solution |
---|
1088 | of a MIP problem, which is specified by the pointer \verb|lp|, to a text |
---|
1089 | file, whose name is the character string \verb|fname|, in printable |
---|
1090 | format. |
---|
1091 | |
---|
1092 | Information reported by the routine \verb|glp_print_mip| is intended |
---|
1093 | mainly for visual analysis. |
---|
1094 | |
---|
1095 | \subsubsection*{Returns} |
---|
1096 | |
---|
1097 | If no errors occurred, the routine returns zero. Otherwise the routine |
---|
1098 | prints an error message and returns non-zero. |
---|
1099 | |
---|
1100 | \newpage |
---|
1101 | |
---|
1102 | \subsection{glp\_read\_mip---read MIP solution from text file} |
---|
1103 | |
---|
1104 | \subsubsection*{Synopsis} |
---|
1105 | |
---|
1106 | \begin{verbatim} |
---|
1107 | int glp_read_mip(glp_prob *mip, const char *fname); |
---|
1108 | \end{verbatim} |
---|
1109 | |
---|
1110 | \subsubsection*{Description} |
---|
1111 | |
---|
1112 | The routine \verb|glp_read_mip| reads MIP solution from a text file |
---|
1113 | whose name is specified by the parameter \verb|fname| into the problem |
---|
1114 | object. |
---|
1115 | |
---|
1116 | For the file format see description of the routine \verb|glp_write_mip|. |
---|
1117 | |
---|
1118 | \subsubsection*{Returns} |
---|
1119 | |
---|
1120 | On success the routine returns zero, otherwise non-zero. |
---|
1121 | |
---|
1122 | \subsection{glp\_write\_mip---write MIP solution to text file} |
---|
1123 | |
---|
1124 | \subsubsection*{Synopsis} |
---|
1125 | |
---|
1126 | \begin{verbatim} |
---|
1127 | int glp_write_mip(glp_prob *mip, const char *fname); |
---|
1128 | \end{verbatim} |
---|
1129 | |
---|
1130 | \subsubsection*{Description} |
---|
1131 | |
---|
1132 | The routine \verb|glp_write_mip| writes the current MIP solution to a |
---|
1133 | text file whose name is specified by the parameter \verb|fname|. This |
---|
1134 | file can be read back with the routine \verb|glp_read_mip|. |
---|
1135 | |
---|
1136 | \subsubsection*{Returns} |
---|
1137 | |
---|
1138 | On success the routine returns zero, otherwise non-zero. |
---|
1139 | |
---|
1140 | \subsubsection*{File format} |
---|
1141 | |
---|
1142 | The file created by the routine \verb|glp_write_sol| is a plain text |
---|
1143 | file, which contains the following information: |
---|
1144 | |
---|
1145 | \begin{verbatim} |
---|
1146 | m n |
---|
1147 | stat obj_val |
---|
1148 | r_val[1] |
---|
1149 | . . . |
---|
1150 | r_val[m] |
---|
1151 | c_val[1] |
---|
1152 | . . . |
---|
1153 | c_val[n] |
---|
1154 | \end{verbatim} |
---|
1155 | |
---|
1156 | \noindent |
---|
1157 | where: |
---|
1158 | |
---|
1159 | \noindent |
---|
1160 | $m$ is the number of rows (auxiliary variables); |
---|
1161 | |
---|
1162 | \noindent |
---|
1163 | $n$ is the number of columns (structural variables); |
---|
1164 | |
---|
1165 | \noindent |
---|
1166 | \verb|stat| is the solution status (\verb|GLP_UNDEF| = 1, |
---|
1167 | \verb|GLP_FEAS| = 2, \verb|GLP_NOFEAS| = 4, or \verb|GLP_OPT| = 5); |
---|
1168 | |
---|
1169 | \noindent |
---|
1170 | \verb|obj_val| is the objective value; |
---|
1171 | |
---|
1172 | \noindent |
---|
1173 | \verb|r_val[i]|, $i=1,\dots,m$, is the value of $i$-th row; |
---|
1174 | |
---|
1175 | \noindent |
---|
1176 | \verb|c_val[j]|, $j=1,\dots,n$, is the value of $j$-th column. |
---|
1177 | |
---|
1178 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
1179 | |
---|
1180 | \newpage |
---|
1181 | |
---|
1182 | \section{Post-optimal analysis routines} |
---|
1183 | |
---|
1184 | \subsection{glp\_print\_ranges---print sensitivity analysis report} |
---|
1185 | |
---|
1186 | \subsubsection*{Synopsis} |
---|
1187 | |
---|
1188 | \begin{verbatim} |
---|
1189 | int glp_print_ranges(glp_prob *P, int len, const int list[], |
---|
1190 | int flags, const char *fname); |
---|
1191 | \end{verbatim} |
---|
1192 | |
---|
1193 | \subsubsection*{Description} |
---|
1194 | |
---|
1195 | The routine \verb|glp_print_ranges| performs sensitivity analysis of |
---|
1196 | current optimal basic solution and writes the analysis report in |
---|
1197 | human-readable format to a text file, whose name is the character |
---|
1198 | string {\it fname}. (Detailed description of the report structure is |
---|
1199 | given below.) |
---|
1200 | |
---|
1201 | The parameter {\it len} specifies the length of the row/column list. |
---|
1202 | |
---|
1203 | The array {\it list} specifies ordinal number of rows and columns to be |
---|
1204 | analyzed. The ordinal numbers should be passed in locations |
---|
1205 | {\it list}[1], {\it list}[2], \dots, {\it list}[{\it len}]. Ordinal |
---|
1206 | numbers from 1 to $m$ refer to rows, and ordinal numbers from $m+1$ to |
---|
1207 | $m+n$ refer to columns, where $m$ and $n$ are, resp., the total number |
---|
1208 | of rows and columns in the problem object. Rows and columns appear in |
---|
1209 | the analysis report in the same order as they follow in the array list. |
---|
1210 | |
---|
1211 | It is allowed to specify $len=0$, in which case the array {\it list} is |
---|
1212 | not used (so it can be specified as \verb|NULL|), and the routine |
---|
1213 | performs analysis for all rows and columns of the problem object. |
---|
1214 | |
---|
1215 | The parameter {\it flags} is reserved for use in the future and must be |
---|
1216 | specified as zero. |
---|
1217 | |
---|
1218 | On entry to the routine \verb|glp_print_ranges| the current basic |
---|
1219 | solution must be optimal and the basis factorization must exist. |
---|
1220 | The application program can check that with the routine |
---|
1221 | \verb|glp_bf_exists|, and if the factorization does |
---|
1222 | not exist, compute it with the routine \verb|glp_factorize|. Note that |
---|
1223 | if the LP preprocessor is not used, on normal exit from the simplex |
---|
1224 | solver routine \verb|glp_simplex| the basis factorization always exists. |
---|
1225 | |
---|
1226 | \subsubsection*{Returns} |
---|
1227 | |
---|
1228 | If the operation was successful, the routine \verb|glp_print_ranges| |
---|
1229 | returns zero. Otherwise, it prints an error message and returns |
---|
1230 | non-zero. |
---|
1231 | |
---|
1232 | \subsubsection*{Analysis report example} |
---|
1233 | |
---|
1234 | An example of the sensitivity analysis report is shown on the next two |
---|
1235 | pages. This example corresponds to the example of LP problem described |
---|
1236 | in Subsection ``Example of MPS file''. |
---|
1237 | |
---|
1238 | \subsubsection*{Structure of the analysis report} |
---|
1239 | |
---|
1240 | For each row and column specified in the array {\it list} the routine |
---|
1241 | prints two lines containing generic information and analysis |
---|
1242 | information, which depends on the status of corresponding row or column. |
---|
1243 | |
---|
1244 | Note that analysis of a row is analysis of its auxiliary variable, |
---|
1245 | which is equal to the row linear form $\sum a_jx_j$, and analysis of |
---|
1246 | a column is analysis of corresponding structural variable. Therefore, |
---|
1247 | formally, on performing the sensitivity analysis there is no difference |
---|
1248 | between rows and columns. |
---|
1249 | |
---|
1250 | \bigskip |
---|
1251 | |
---|
1252 | \noindent |
---|
1253 | {\it Generic information} |
---|
1254 | |
---|
1255 | \medskip |
---|
1256 | |
---|
1257 | \noindent |
---|
1258 | {\tt No.} is the row or column ordinal number in the problem object. |
---|
1259 | Rows are numbered from 1 to $m$, and columns are numbered from 1 to $n$, |
---|
1260 | where $m$ and $n$ are, resp., the total number of rows and columns in |
---|
1261 | the problem object. |
---|
1262 | |
---|
1263 | \medskip |
---|
1264 | |
---|
1265 | \noindent |
---|
1266 | {\tt Row name} is the symbolic name assigned to the row. If the row has |
---|
1267 | no name assigned, this field contains blanks. |
---|
1268 | |
---|
1269 | \medskip |
---|
1270 | |
---|
1271 | \noindent |
---|
1272 | {\tt Column name} is the symbolic name assigned to the column. If the |
---|
1273 | column has no name assigned, this field contains blanks. |
---|
1274 | |
---|
1275 | \medskip |
---|
1276 | |
---|
1277 | \noindent |
---|
1278 | {\tt St} is the status of the row or column in the optimal solution: |
---|
1279 | |
---|
1280 | {\tt BS} --- non-active constraint (row), basic column; |
---|
1281 | |
---|
1282 | {\tt NL} --- inequality constraint having its lower right-hand side |
---|
1283 | active (row), non-basic column having its lower bound active; |
---|
1284 | |
---|
1285 | {\tt NU} --- inequality constraint having its upper right-hand side |
---|
1286 | active (row), non-basic column having its upper bound active; |
---|
1287 | |
---|
1288 | {\tt NS} --- active equality constraint (row), non-basic fixed column. |
---|
1289 | |
---|
1290 | {\tt NF} --- active free row, non-basic free (unbounded) column. (This |
---|
1291 | case means that the optimal solution is dual degenerate.) |
---|
1292 | |
---|
1293 | \medskip |
---|
1294 | |
---|
1295 | \noindent |
---|
1296 | {\tt Activity} is the (primal) value of the auxiliary variable (row) or |
---|
1297 | structural variable (column) in the optimal solution. |
---|
1298 | |
---|
1299 | \medskip |
---|
1300 | |
---|
1301 | \noindent |
---|
1302 | {\tt Slack} is the (primal) value of the row slack variable. |
---|
1303 | |
---|
1304 | \medskip |
---|
1305 | |
---|
1306 | \noindent |
---|
1307 | {\tt Obj coef} is the objective coefficient of the column (structural |
---|
1308 | variable). |
---|
1309 | |
---|
1310 | \begin{landscape} |
---|
1311 | \begin{scriptsize} |
---|
1312 | \begin{verbatim} |
---|
1313 | GLPK 4.42 - SENSITIVITY ANALYSIS REPORT Page 1 |
---|
1314 | |
---|
1315 | Problem: PLAN |
---|
1316 | Objective: VALUE = 296.2166065 (MINimum) |
---|
1317 | |
---|
1318 | No. Row name St Activity Slack Lower bound Activity Obj coef Obj value at Limiting |
---|
1319 | Marginal Upper bound range range break point variable |
---|
1320 | ------ ------------ -- ------------- ------------- ------------- ------------- ------------- ------------- ------------ |
---|
1321 | 1 VALUE BS 296.21661 -296.21661 -Inf 299.25255 -1.00000 . MN |
---|
1322 | . +Inf 296.21661 +Inf +Inf |
---|
1323 | |
---|
1324 | 2 YIELD NS 2000.00000 . 2000.00000 1995.06864 -Inf 296.28365 BIN3 |
---|
1325 | -.01360 2000.00000 2014.03479 +Inf 296.02579 CU |
---|
1326 | |
---|
1327 | 3 FE NU 60.00000 . -Inf 55.89016 -Inf 306.77162 BIN4 |
---|
1328 | -2.56823 60.00000 62.69978 2.56823 289.28294 BIN3 |
---|
1329 | |
---|
1330 | 4 CU BS 83.96751 16.03249 -Inf 93.88467 -.30613 270.51157 MN |
---|
1331 | . 100.00000 79.98213 .21474 314.24798 BIN5 |
---|
1332 | |
---|
1333 | 5 MN NU 40.00000 . -Inf 34.42336 -Inf 299.25255 BIN4 |
---|
1334 | -.54440 40.00000 41.68691 .54440 295.29825 BIN3 |
---|
1335 | |
---|
1336 | 6 MG BS 19.96029 10.03971 -Inf 24.74427 -1.79618 260.36433 BIN1 |
---|
1337 | . 30.00000 9.40292 .28757 301.95652 MN |
---|
1338 | |
---|
1339 | 7 AL NL 1500.00000 . 1500.00000 1485.78425 -.25199 292.63444 CU |
---|
1340 | .25199 +Inf 1504.92126 +Inf 297.45669 BIN3 |
---|
1341 | |
---|
1342 | 8 SI NL 250.00000 50.00000 250.00000 235.32871 -.48520 289.09812 CU |
---|
1343 | .48520 300.00000 255.06073 +Inf 298.67206 BIN3 |
---|
1344 | \end{verbatim} |
---|
1345 | \end{scriptsize} |
---|
1346 | \end{landscape} |
---|
1347 | |
---|
1348 | \begin{landscape} |
---|
1349 | \begin{scriptsize} |
---|
1350 | \begin{verbatim} |
---|
1351 | GLPK 4.42 - SENSITIVITY ANALYSIS REPORT Page 2 |
---|
1352 | |
---|
1353 | Problem: PLAN |
---|
1354 | Objective: VALUE = 296.2166065 (MINimum) |
---|
1355 | |
---|
1356 | No. Column name St Activity Obj coef Lower bound Activity Obj coef Obj value at Limiting |
---|
1357 | Marginal Upper bound range range break point variable |
---|
1358 | ------ ------------ -- ------------- ------------- ------------- ------------- ------------- ------------- ------------ |
---|
1359 | 1 BIN1 NL . .03000 . -28.82475 -.22362 288.90594 BIN4 |
---|
1360 | .25362 200.00000 33.88040 +Inf 304.80951 BIN4 |
---|
1361 | |
---|
1362 | 2 BIN2 BS 665.34296 .08000 . 802.22222 .01722 254.44822 BIN1 |
---|
1363 | . 2500.00000 313.43066 .08863 301.95652 MN |
---|
1364 | |
---|
1365 | 3 BIN3 BS 490.25271 .17000 400.00000 788.61314 .15982 291.22807 MN |
---|
1366 | . 800.00000 -347.42857 .17948 300.86548 BIN5 |
---|
1367 | |
---|
1368 | 4 BIN4 BS 424.18773 .12000 100.00000 710.52632 .10899 291.54745 MN |
---|
1369 | . 700.00000 -256.15524 .14651 307.46010 BIN1 |
---|
1370 | |
---|
1371 | 5 BIN5 NL . .15000 . -201.78739 .13544 293.27940 BIN3 |
---|
1372 | .01456 1500.00000 58.79586 +Inf 297.07244 BIN3 |
---|
1373 | |
---|
1374 | 6 ALUM BS 299.63899 .21000 . 358.26772 .18885 289.87879 AL |
---|
1375 | . +Inf 112.40876 .22622 301.07527 MN |
---|
1376 | |
---|
1377 | 7 SILICON BS 120.57762 .38000 . 124.27093 .14828 268.27586 BIN5 |
---|
1378 | . +Inf 85.54745 .46667 306.66667 MN |
---|
1379 | |
---|
1380 | End of report |
---|
1381 | \end{verbatim} |
---|
1382 | \end{scriptsize} |
---|
1383 | \end{landscape} |
---|
1384 | |
---|
1385 | \noindent |
---|
1386 | {\tt Marginal} is the reduced cost (dual activity) of the auxiliary |
---|
1387 | variable (row) or structural variable (column). |
---|
1388 | |
---|
1389 | \medskip |
---|
1390 | |
---|
1391 | \noindent |
---|
1392 | {\tt Lower bound} is the lower right-hand side (row) or lower bound |
---|
1393 | (column). If the row or column has no lower bound, this field contains |
---|
1394 | {\tt -Inf}. |
---|
1395 | |
---|
1396 | \medskip |
---|
1397 | |
---|
1398 | \noindent |
---|
1399 | {\tt Upper bound} is the upper right-hand side (row) or upper bound |
---|
1400 | (column). If the row or column has no upper bound, this field contains |
---|
1401 | {\tt +Inf}. |
---|
1402 | |
---|
1403 | \bigskip |
---|
1404 | |
---|
1405 | \noindent |
---|
1406 | {\it Sensitivity analysis of active bounds} |
---|
1407 | |
---|
1408 | \medskip |
---|
1409 | |
---|
1410 | \noindent |
---|
1411 | The sensitivity analysis of active bounds is performed only for rows, |
---|
1412 | which are active constraints, and only for non-basic columns, because |
---|
1413 | inactive constraints and basic columns have no active bounds. |
---|
1414 | |
---|
1415 | For every auxiliary (row) or structural (column) non-basic variable the |
---|
1416 | routine starts changing its active bound in both direction. The first |
---|
1417 | of the two lines in the report corresponds to decreasing, and the |
---|
1418 | second line corresponds to increasing of the active bound. Since the |
---|
1419 | variable being analyzed is non-basic, its activity, which is equal to |
---|
1420 | its active bound, also starts changing. This changing leads to changing |
---|
1421 | of basic (auxiliary and structural) variables, which depend on the |
---|
1422 | non-basic variable. The current basis remains primal feasible and |
---|
1423 | therefore optimal while values of all basic variables are primal |
---|
1424 | feasible, i.e. are within their bounds. Therefore, if some basic |
---|
1425 | variable called the {\it limiting variable} reaches its (lower or |
---|
1426 | upper) bound first, before any other basic variables, it thereby limits |
---|
1427 | further changing of the non-basic variable, because otherwise the |
---|
1428 | current basis would become primal infeasible. The point, at which this |
---|
1429 | happens, is called the {\it break point}. Note that there are two break |
---|
1430 | points: the lower break point, which corresponds to decreasing of the |
---|
1431 | non-basic variable, and the upper break point, which corresponds to |
---|
1432 | increasing of the non-basic variable. |
---|
1433 | |
---|
1434 | In the analysis report values of the non-basic variable (i.e. of its |
---|
1435 | active bound) being analyzed at both lower and upper break points are |
---|
1436 | printed in the field `{\tt Activity range}'. Corresponding values of |
---|
1437 | the objective function are printed in the field `{\tt Obj value at |
---|
1438 | break point}', and symbolic names of corresponding limiting basic |
---|
1439 | variables are printed in the field `{\tt Limiting variable}'. |
---|
1440 | If the active bound can decrease or/and increase unlimitedly, the field |
---|
1441 | `{\tt Activity range}' contains {\tt -Inf} or/and {\tt +Inf}, resp. |
---|
1442 | |
---|
1443 | For example (see the example report above), row SI is a double-sided |
---|
1444 | constraint, which is active on its lower bound (right-hand side), and |
---|
1445 | its activity in the optimal solution being equal to the lower bound is |
---|
1446 | 250. The activity range for this row is $[235.32871,255.06073]$. This |
---|
1447 | means that the basis remains optimal while the lower bound is |
---|
1448 | increasing up to 255.06073, and further increasing is limited by |
---|
1449 | (structural) variable BIN3. If the lower bound reaches this upper break |
---|
1450 | point, the objective value becomes equal to 298.67206. |
---|
1451 | |
---|
1452 | Note that if the basis does not change, the objective function depends |
---|
1453 | on the non-basic variable linearly, and the per-unit change of the |
---|
1454 | objective function is the reduced cost (marginal value) of the |
---|
1455 | non-basic variable. |
---|
1456 | |
---|
1457 | \bigskip |
---|
1458 | |
---|
1459 | \noindent |
---|
1460 | {\it Sensitivity analysis of objective coefficients at non-basic |
---|
1461 | variables} |
---|
1462 | |
---|
1463 | \medskip |
---|
1464 | |
---|
1465 | \noindent |
---|
1466 | The sensitivity analysis of the objective coefficient at a non-basic |
---|
1467 | variable is quite simple, because in this case change in the objective |
---|
1468 | coefficient leads to equivalent change in the reduced cost (marginal |
---|
1469 | value). |
---|
1470 | |
---|
1471 | For every auxiliary (row) or structural (column) non-basic variable the |
---|
1472 | routine starts changing its objective coefficient in both direction. |
---|
1473 | (Note that auxiliary variables are not included in the objective |
---|
1474 | function and therefore always have zero objective coefficients.) The |
---|
1475 | first of the two lines in the report corresponds to decreasing, and the |
---|
1476 | second line corresponds to increasing of the objective coefficient. |
---|
1477 | This changing leads to changing of the reduced cost of the non-basic |
---|
1478 | variable to be analyzed and does affect reduced costs of all other |
---|
1479 | non-basic variables. The current basis remains dual feasible and |
---|
1480 | therefore optimal while the reduced cost keeps its sign. Therefore, if |
---|
1481 | the reduced cost reaches zero, it limits further changing of the |
---|
1482 | objective coefficient (if only the non-basic variable is non-fixed). |
---|
1483 | |
---|
1484 | In the analysis report minimal and maximal values of the objective |
---|
1485 | coefficient, on which the basis remains optimal, are printed in the |
---|
1486 | field `\verb|Obj coef range|'. If the objective coefficient can |
---|
1487 | decrease or/and increase unlimitedly, this field contains {\tt -Inf} |
---|
1488 | or/and {\tt +Inf}, resp. |
---|
1489 | |
---|
1490 | For example (see the example report above), column BIN5 is non-basic |
---|
1491 | having its lower bound active. Its objective coefficient is 0.15, and |
---|
1492 | reduced cost in the optimal solution 0.01456. The column lower bound |
---|
1493 | remains active while the column reduced cost remains non-negative, |
---|
1494 | thus, minimal value of the objective coefficient, on which the current |
---|
1495 | basis still remains optimal, is $0.15-0.01456=0.13644$, that is |
---|
1496 | indicated in the field `\verb|Obj coef range|'. |
---|
1497 | |
---|
1498 | \bigskip |
---|
1499 | |
---|
1500 | \noindent |
---|
1501 | {\it Sensitivity analysis of objective coefficients at basic variables} |
---|
1502 | |
---|
1503 | \medskip |
---|
1504 | |
---|
1505 | \noindent |
---|
1506 | To perform sensitivity analysis for every auxiliary (row) or structural |
---|
1507 | (column) variable the routine starts changing its objective coefficient |
---|
1508 | in both direction. (Note that auxiliary variables are not included in |
---|
1509 | the objective function and therefore always have zero objective |
---|
1510 | coefficients.) The first of the two lines in the report corresponds to |
---|
1511 | decreasing, and the second line corresponds to increasing of the |
---|
1512 | objective coefficient. This changing leads to changing of reduced costs |
---|
1513 | of non-basic variables. The current basis remains dual feasible and |
---|
1514 | therefore optimal while reduced costs of all non-basic variables |
---|
1515 | (except fixed variables) keep their signs. Therefore, if the reduced |
---|
1516 | cost of some non-basic non-fixed variable called the {\it limiting |
---|
1517 | variable} reaches zero first, before reduced cost of any other |
---|
1518 | non-basic non-fixed variable, it thereby limits further changing of the |
---|
1519 | objective coefficient, because otherwise the current basis would become |
---|
1520 | dual infeasible (non-optimal). The point, at which this happens, is |
---|
1521 | called the {\it break point}. Note that there are two break points: the |
---|
1522 | lower break point, which corresponds to decreasing of the objective |
---|
1523 | coefficient, and the upper break point, which corresponds to increasing |
---|
1524 | of the objective coefficient. Let the objective coefficient reach its |
---|
1525 | limit value and continue changing a bit further in the same direction |
---|
1526 | that makes the current basis dual infeasible (non-optimal). Then the |
---|
1527 | reduced cost of the non-basic limiting variable becomes ``a bit'' dual |
---|
1528 | infeasible that forces the limiting variable to enter the basis |
---|
1529 | replacing there some basic variable, which leaves the basis to keep its |
---|
1530 | primal feasibility. It should be understood that if we change the |
---|
1531 | current basis in this way exactly at the break point, both the current |
---|
1532 | and adjacent bases will be optimal with the same objective value, |
---|
1533 | because at the break point the limiting variable has zero reduced cost. |
---|
1534 | On the other hand, in the adjacent basis the value of the limiting |
---|
1535 | variable changes, because there it becomes basic, that leads to |
---|
1536 | changing of the value of the basic variable being analyzed. Note that |
---|
1537 | on determining the adjacent basis the bounds of the analyzed basic |
---|
1538 | variable are ignored as if it were a free (unbounded) variable, so it |
---|
1539 | cannot leave the current basis. |
---|
1540 | |
---|
1541 | In the analysis report lower and upper limits of the objective |
---|
1542 | coefficient at the basic variable being analyzed, when the basis |
---|
1543 | remains optimal, are printed in the field `{\tt Obj coef range}'. |
---|
1544 | Corresponding values of the objective function at both lower and upper |
---|
1545 | break points are printed in the field `{\tt Obj value at break point}', |
---|
1546 | symbolic names of corresponding non-basic limiting variables are |
---|
1547 | printed in the field `{\tt Limiting variable}', and values of the basic |
---|
1548 | variable, which it would take on in the adjacent bases (as was |
---|
1549 | explained above) are printed in the field `{\tt Activity range}'. |
---|
1550 | If the objective coefficient can increase or/and decrease unlimitedly, |
---|
1551 | the field `{\tt Obj coef range}' contains {\tt -Inf} and/or {\tt +Inf}, |
---|
1552 | resp. It also may happen that no dual feasible adjacent basis exists |
---|
1553 | (i.e. on entering the basis the limiting variable can increase or |
---|
1554 | decrease unlimitedly), in which case the field `{\tt Activity range}' |
---|
1555 | contains {\tt -Inf} and/or {\tt +Inf}. |
---|
1556 | |
---|
1557 | \newpage |
---|
1558 | |
---|
1559 | For example (see the example report above), structural variable |
---|
1560 | (column) BIN3 is basic, its optimal value is 490.25271, and its |
---|
1561 | objective coefficient is 0.17. The objective coefficient range for this |
---|
1562 | column is $[0.15982,0.17948]$. This means that the basis remains |
---|
1563 | optimal while the objective coefficient is decreasing down to 0.15982, |
---|
1564 | and further decreasing is limited by (auxiliary) variable MN. If we |
---|
1565 | make the objective coefficient a bit less than 0.15982, the limiting |
---|
1566 | variable MN will enter the basis, and in that adjacent basis the |
---|
1567 | structural variable BIN3 will take on new optimal value 788.61314. At |
---|
1568 | the lower break point, where the objective coefficient is exactly |
---|
1569 | 0.15982, the objective function takes on the value 291.22807 in both |
---|
1570 | the current and adjacent bases. |
---|
1571 | |
---|
1572 | Note that if the basis does not change, the objective function depends |
---|
1573 | on the objective coefficient at the basic variable linearly, and the |
---|
1574 | per-unit change of the objective function is the value of the basic |
---|
1575 | variable. |
---|
1576 | |
---|
1577 | %* eof *% |
---|