|
1 %* graphs.tex *% |
|
2 |
|
3 %*********************************************************************** |
|
4 % This code is part of GLPK (GNU Linear Programming Kit). |
|
5 % |
|
6 % Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, |
|
7 % 2009, 2010 Andrew Makhorin, Department for Applied Informatics, |
|
8 % Moscow Aviation Institute, Moscow, Russia. All rights reserved. |
|
9 % E-mail: <mao@gnu.org>. |
|
10 % |
|
11 % GLPK is free software: you can redistribute it and/or modify it |
|
12 % under the terms of the GNU General Public License as published by |
|
13 % the Free Software Foundation, either version 3 of the License, or |
|
14 % (at your option) any later version. |
|
15 % |
|
16 % GLPK is distributed in the hope that it will be useful, but WITHOUT |
|
17 % ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
|
18 % or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
|
19 % License for more details. |
|
20 % |
|
21 % You should have received a copy of the GNU General Public License |
|
22 % along with GLPK. If not, see <http://www.gnu.org/licenses/>. |
|
23 %*********************************************************************** |
|
24 |
|
25 \documentclass[11pt]{report} |
|
26 \usepackage{amssymb} |
|
27 \usepackage[dvipdfm,linktocpage,colorlinks,linkcolor=blue, |
|
28 urlcolor=blue]{hyperref} |
|
29 \usepackage[all]{xy} |
|
30 |
|
31 \renewcommand\contentsname{\sf\bfseries Contents} |
|
32 \renewcommand\chaptername{\sf\bfseries Chapter} |
|
33 \renewcommand\appendixname{\sf\bfseries Appendix} |
|
34 |
|
35 \begin{document} |
|
36 |
|
37 \thispagestyle{empty} |
|
38 |
|
39 \begin{center} |
|
40 |
|
41 \vspace*{1in} |
|
42 |
|
43 \begin{huge} |
|
44 \sf\bfseries GNU Linear Programming Kit |
|
45 \end{huge} |
|
46 |
|
47 \vspace{0.5in} |
|
48 |
|
49 \begin{LARGE} |
|
50 \sf Graph and Network Routines |
|
51 \end{LARGE} |
|
52 |
|
53 \vspace{0.5in} |
|
54 |
|
55 \begin{LARGE} |
|
56 \sf for GLPK Version 4.45 |
|
57 \end{LARGE} |
|
58 |
|
59 \vspace{0.5in} |
|
60 \begin{Large} |
|
61 \sf (DRAFT, December 2010) |
|
62 \end{Large} |
|
63 \end{center} |
|
64 |
|
65 \newpage |
|
66 |
|
67 \vspace*{1in} |
|
68 |
|
69 \vfill |
|
70 |
|
71 \noindent |
|
72 The GLPK package is part of the GNU Project released under the aegis of |
|
73 GNU. |
|
74 |
|
75 \medskip \noindent |
|
76 Copyright \copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, |
|
77 2008, 2009, 2010 Andrew Makhorin, Department for Applied Informatics, |
|
78 Moscow Aviation Institute, Moscow, Russia. All rights reserved. |
|
79 |
|
80 \medskip \noindent |
|
81 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA |
|
82 02110-1301, USA. |
|
83 |
|
84 \medskip \noindent |
|
85 Permission is granted to make and distribute verbatim copies of this |
|
86 manual provided the copyright notice and this permission notice are |
|
87 preserved on all copies. |
|
88 |
|
89 \medskip \noindent |
|
90 Permission is granted to copy and distribute modified versions of this |
|
91 manual under the conditions for verbatim copying, provided also that the |
|
92 entire resulting derived work is distributed under the terms of |
|
93 a permission notice identical to this one. |
|
94 |
|
95 \medskip \noindent |
|
96 Permission is granted to copy and distribute translations of this manual |
|
97 into another language, under the above conditions for modified versions. |
|
98 |
|
99 \tableofcontents |
|
100 |
|
101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
102 |
|
103 \chapter{Basic Graph API Routines} |
|
104 |
|
105 \section{Graph program object} |
|
106 |
|
107 In GLPK the base program object used to represent graphs and networks |
|
108 is a directed graph (digraph). |
|
109 |
|
110 Formally, {\it digraph} (or simply, {\it graph}) is a pair $G=(V,A)$, |
|
111 where $V$ is a set of {\it vertices}, and $A$ is a set |
|
112 {\it arcs}.\footnote{$A$ may be a multiset.} Each arc $a\in A$ is an |
|
113 ordered pair of vertices $a=(x,y)$, where $x\in V$ is called {\it tail |
|
114 vertex} of arc $a$, and $y\in V$ is called its {\it head vertex}. |
|
115 |
|
116 Representation of a graph in the program includes three structs defined |
|
117 by typedef in the header \verb|glpk.h|: |
|
118 |
|
119 \medskip |
|
120 |
|
121 $\bullet$ \verb|glp_graph|, which represents the graph in a whole, |
|
122 |
|
123 $\bullet$ \verb|glp_vertex|, which represents a vertex of the graph, and |
|
124 |
|
125 $\bullet$ \verb|glp_arc|, which represents an arc of the graph. |
|
126 |
|
127 \medskip |
|
128 |
|
129 All these three structs are ``semi-opaque'', i.e. the application |
|
130 program can directly access their fields through pointers, however, |
|
131 changing the fields directly is not allowed---all changes should be |
|
132 performed only with appropriate GLPK API routines. |
|
133 |
|
134 \newpage |
|
135 |
|
136 \newenvironment{comment} |
|
137 {\addtolength{\leftskip}{17pt}\noindent} |
|
138 {\par\addtolength{\leftskip}{-17pt}} |
|
139 |
|
140 \noindent |
|
141 {\bf glp\_graph.} The struct \verb|glp_graph| has the following |
|
142 fields available to the application program: |
|
143 |
|
144 \medskip |
|
145 |
|
146 \noindent |
|
147 \verb|char *name;| |
|
148 |
|
149 \begin{comment}Symbolic name assigned to the graph. It is a pointer to |
|
150 a null terminated character string of length from 1 to 255 characters. |
|
151 If no name is assigned to the graph, this field contains \verb|NULL|. |
|
152 \end{comment} |
|
153 |
|
154 \medskip |
|
155 |
|
156 \noindent |
|
157 \verb|int nv;| |
|
158 |
|
159 \begin{comment}The number of vertices in the graph, $nv\geq 0$. |
|
160 \end{comment} |
|
161 |
|
162 \medskip |
|
163 |
|
164 \noindent |
|
165 \verb|int na;| |
|
166 |
|
167 \begin{comment}The number of arcs in the graph, $na\geq 0$. |
|
168 \end{comment} |
|
169 |
|
170 \medskip |
|
171 |
|
172 \noindent |
|
173 \verb|glp_vertex **v;| |
|
174 |
|
175 \begin{comment}Pointer to an array containing the list of vertices. |
|
176 Element $v[0]$ is not used. Element $v[i]$, $1\leq i\leq nv$, is a |
|
177 pointer to $i$-th vertex of the graph. Note that on adding new vertices |
|
178 to the graph the field $v$ may be altered due to reallocation. However, |
|
179 pointers $v[i]$ are not changed while corresponding vertices exist in |
|
180 the graph. |
|
181 \end{comment} |
|
182 |
|
183 \medskip |
|
184 |
|
185 \noindent |
|
186 \verb|int v_size;| |
|
187 |
|
188 \begin{comment}Size of vertex data blocks, in bytes, |
|
189 $0\leq v\_size\leq 256$. (See also the field \verb|data| in the struct |
|
190 \verb|glp_vertex|.) |
|
191 \end{comment} |
|
192 |
|
193 \medskip |
|
194 |
|
195 \noindent |
|
196 \verb|int a_size;| |
|
197 |
|
198 \begin{comment}Size of arc data blocks, in bytes, |
|
199 $0\leq v\_size\leq 256$. (See also the field \verb|data| in the struct |
|
200 \verb|glp_arc|.) |
|
201 \end{comment} |
|
202 |
|
203 \bigskip |
|
204 |
|
205 \noindent |
|
206 {\bf glp\_vertex.} The struct \verb|glp_vertex| has the following |
|
207 fields available to the application program: |
|
208 |
|
209 \medskip |
|
210 |
|
211 \noindent |
|
212 \verb|int i;| |
|
213 |
|
214 \begin{comment}Ordinal number of the vertex, $1\leq i\leq nv$. Note |
|
215 that element $v[i]$ in the struct \verb|glp_graph| points to the vertex, |
|
216 whose ordinal number is $i$. |
|
217 \end{comment} |
|
218 |
|
219 \medskip |
|
220 |
|
221 \noindent |
|
222 \verb|char *name;| |
|
223 |
|
224 \begin{comment}Symbolic name assigned to the vertex. It is a pointer to |
|
225 a null terminated character string of length from 1 to 255 characters. |
|
226 If no name is assigned to the vertex, this field contains \verb|NULL|. |
|
227 \end{comment} |
|
228 |
|
229 \medskip |
|
230 |
|
231 \noindent |
|
232 \verb|void *data;| |
|
233 |
|
234 \begin{comment}Pointer to a data block associated with the vertex. This |
|
235 data block is automatically allocated on creating a new vertex and freed |
|
236 on deleting the vertex. If $v\_size=0$, the block is not allocated, and |
|
237 this field contains \verb|NULL|. |
|
238 \end{comment} |
|
239 |
|
240 \medskip |
|
241 |
|
242 \noindent |
|
243 \verb|void *temp;| |
|
244 |
|
245 \begin{comment}Working pointer, which may be used freely for any |
|
246 purposes. The application program can change this field directly. |
|
247 \end{comment} |
|
248 |
|
249 \medskip |
|
250 |
|
251 \noindent |
|
252 \verb|glp_arc *in;| |
|
253 |
|
254 \begin{comment}Pointer to the (unordered) list of incoming arcs. If the |
|
255 vertex has no incoming arcs, this field contains \verb|NULL|. |
|
256 \end{comment} |
|
257 |
|
258 \medskip |
|
259 |
|
260 \noindent |
|
261 \verb|glp_arc *out;| |
|
262 |
|
263 \begin{comment}Pointer to the (unordered) list of outgoing arcs. If the |
|
264 vertex has no outgoing arcs, this field contains \verb|NULL|. |
|
265 \end{comment} |
|
266 |
|
267 \bigskip |
|
268 |
|
269 \noindent |
|
270 {\bf glp\_arc.} The struct \verb|glp_arc| has the following fields |
|
271 available to the application program: |
|
272 |
|
273 \medskip |
|
274 |
|
275 \noindent |
|
276 \verb|glp_vertex *tail;| |
|
277 |
|
278 \begin{comment}Pointer to a vertex, which is tail endpoint of the arc. |
|
279 \end{comment} |
|
280 |
|
281 \medskip |
|
282 |
|
283 \noindent |
|
284 \verb|glp_vertex *head;| |
|
285 |
|
286 \begin{comment}Pointer to a vertex, which is head endpoint of the arc. |
|
287 \end{comment} |
|
288 |
|
289 \medskip |
|
290 |
|
291 \noindent |
|
292 \verb|void *data;| |
|
293 |
|
294 \begin{comment}Pointer to a data block associated with the arc. This |
|
295 data block is automatically allocated on creating a new arc and freed on |
|
296 deleting the arc. If $v\_size=0$, the block is not allocated, and this |
|
297 field contains \verb|NULL|. |
|
298 \end{comment} |
|
299 |
|
300 \medskip |
|
301 |
|
302 \noindent |
|
303 \verb|void *temp;| |
|
304 |
|
305 \begin{comment}Working pointer, which may be used freely for any |
|
306 purposes. The application program can change this field directly. |
|
307 \end{comment} |
|
308 |
|
309 \medskip |
|
310 |
|
311 \noindent |
|
312 \verb|glp_arc *t_next;| |
|
313 |
|
314 \begin{comment}Pointer to another arc, which has the same tail endpoint |
|
315 as this one. \verb|NULL| in this field indicates the end of the list of |
|
316 outgoing arcs. |
|
317 \end{comment} |
|
318 |
|
319 \medskip |
|
320 |
|
321 \noindent |
|
322 \verb|glp_arc *h_next;| |
|
323 |
|
324 \begin{comment}Pointer to another arc, which has the same head endpoint |
|
325 as this one. \verb|NULL| in this field indicates the end of the list of |
|
326 incoming arcs. |
|
327 \end{comment} |
|
328 |
|
329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
330 |
|
331 \newpage |
|
332 |
|
333 \section{Graph creating and modifying routines} |
|
334 |
|
335 \subsection{glp\_create\_graph---create graph} |
|
336 |
|
337 \subsubsection*{Synopsis} |
|
338 |
|
339 \begin{verbatim} |
|
340 glp_graph *glp_create_graph(int v_size, int a_size); |
|
341 \end{verbatim} |
|
342 |
|
343 \subsubsection*{Description} |
|
344 |
|
345 The routine \verb|glp_create_graph| creates a new graph, which |
|
346 initially is\linebreak empty, i.e. has no vertices and arcs. |
|
347 |
|
348 The parameter \verb|v_size| specifies the size of vertex data blocks, |
|
349 in bytes, $0\leq v\_size\leq 256$. |
|
350 |
|
351 The parameter \verb|a_size| specifies the size of arc data blocks, in |
|
352 bytes, $0\leq a\_size\leq 256$. |
|
353 |
|
354 \subsubsection*{Returns} |
|
355 |
|
356 The routine returns a pointer to the graph created. |
|
357 |
|
358 \subsection{glp\_set\_graph\_name---assign (change) graph name} |
|
359 |
|
360 \subsubsection*{Synopsis} |
|
361 |
|
362 \begin{verbatim} |
|
363 void glp_set_graph_name(glp_graph *G, const char *name); |
|
364 \end{verbatim} |
|
365 |
|
366 \subsubsection*{Description} |
|
367 |
|
368 The routine \verb|glp_set_graph_name| assigns a symbolic name specified |
|
369 by the character string \verb|name| (1 to 255 chars) to the graph. |
|
370 |
|
371 If the parameter \verb|name| is \verb|NULL| or an empty string, the |
|
372 routine erases the existing symbolic name of the graph. |
|
373 |
|
374 \newpage |
|
375 |
|
376 \subsection{glp\_add\_vertices---add new vertices to graph} |
|
377 |
|
378 \subsubsection*{Synopsis} |
|
379 |
|
380 \begin{verbatim} |
|
381 int glp_add_vertices(glp_graph *G, int nadd); |
|
382 \end{verbatim} |
|
383 |
|
384 \subsubsection*{Description} |
|
385 |
|
386 The routine \verb|glp_add_vertices| adds \verb|nadd| vertices to the |
|
387 specified graph. New vertices are always added to the end of the vertex |
|
388 list, so ordinal numbers of existing vertices remain unchanged. Note |
|
389 that this operation may change the field \verb|v| in the struct |
|
390 \verb|glp_graph| (pointer to the vertex array) due to reallocation. |
|
391 |
|
392 Being added each new vertex is isolated, i.e. has no incident arcs. |
|
393 |
|
394 If the size of vertex data blocks specified on creating the graph is |
|
395 non-zero, the routine also allocates a memory block of that size for |
|
396 each new vertex added, fills it by binary zeros, and stores a pointer to |
|
397 it in the field \verb|data| of the struct \verb|glp_vertex|. Otherwise, |
|
398 if the block size is zero, the field \verb|data| is set to \verb|NULL|. |
|
399 |
|
400 \subsubsection*{Returns} |
|
401 |
|
402 The routine \verb|glp_add_vertices| returns the ordinal number of the |
|
403 first new vertex added to the graph. |
|
404 |
|
405 \subsection{glp\_set\_vertex\_name---assign (change) vertex name} |
|
406 |
|
407 \subsubsection*{Synopsis} |
|
408 |
|
409 \begin{verbatim} |
|
410 void glp_set_vertex_name(glp_graph *G, int i, const char *name); |
|
411 \end{verbatim} |
|
412 |
|
413 \subsubsection*{Description} |
|
414 |
|
415 The routine \verb|glp_set_vertex_name| assigns a given symbolic name |
|
416 (1 up to 255 characters) to \verb|i|-th vertex of the specified graph. |
|
417 |
|
418 If the parameter \verb|name| is \verb|NULL| or empty string, the |
|
419 routine erases an existing name of \verb|i|-th vertex. |
|
420 |
|
421 \newpage |
|
422 |
|
423 \subsection{glp\_add\_arc---add new arc to graph} |
|
424 |
|
425 \subsubsection*{Synopsis} |
|
426 |
|
427 \begin{verbatim} |
|
428 glp_arc *glp_add_arc(glp_graph *G, int i, int j); |
|
429 \end{verbatim} |
|
430 |
|
431 \subsubsection*{Description} |
|
432 |
|
433 The routine \verb|glp_add_arc| adds one new arc to the specified graph. |
|
434 |
|
435 The parameters \verb|i| and \verb|j| specify the ordinal numbers of, |
|
436 resp., tail and head endpoints (vertices) of the arc. Note that |
|
437 self-loops and multiple arcs are allowed. |
|
438 |
|
439 If the size of arc data blocks specified on creating the graph is |
|
440 non-zero, the routine also allocates a memory block of that size, fills |
|
441 it by binary zeros, and stores a pointer to it in the field \verb|data| |
|
442 of the struct \verb|glp_arc|. Otherwise, if the block size is zero, the |
|
443 field \verb|data| is set to \verb|NULL|. |
|
444 |
|
445 \subsection{glp\_del\_vertices---delete vertices from graph} |
|
446 |
|
447 \subsubsection*{Synopsis} |
|
448 |
|
449 \begin{verbatim} |
|
450 void glp_del_vertices(glp_graph *G, int ndel, const int num[]); |
|
451 \end{verbatim} |
|
452 |
|
453 \subsubsection*{Description} |
|
454 |
|
455 The routine \verb|glp_del_vertices| deletes vertices along with all |
|
456 incident arcs from the specified graph. Ordinal numbers of vertices to |
|
457 be deleted should be placed in locations \verb|num[1]|, \dots, |
|
458 \verb|num[ndel]|, \verb|ndel| $>0$. |
|
459 |
|
460 Note that deleting vertices involves changing ordinal numbers of other |
|
461 vertices remaining in the graph. New ordinal numbers of the remaining |
|
462 vertices are assigned under the assumption that the original order of |
|
463 vertices is not changed. |
|
464 |
|
465 \subsection{glp\_del\_arc---delete arc from graph} |
|
466 |
|
467 \subsubsection*{Synopsis} |
|
468 |
|
469 \begin{verbatim} |
|
470 void glp_del_arc(glp_graph *G, glp_arc *a); |
|
471 \end{verbatim} |
|
472 |
|
473 \subsubsection*{Description} |
|
474 |
|
475 The routine \verb|glp_del_arc| deletes an arc from the specified graph. |
|
476 The arc to be deleted must exist. |
|
477 |
|
478 \subsection{glp\_erase\_graph---erase graph content} |
|
479 |
|
480 \subsubsection*{Synopsis} |
|
481 |
|
482 \begin{verbatim} |
|
483 void glp_erase_graph(glp_graph *G, int v_size, int a_size); |
|
484 \end{verbatim} |
|
485 |
|
486 \subsubsection*{Description} |
|
487 |
|
488 The routine \verb|glp_erase_graph| erases the content of the specified |
|
489 graph. The effect of this operation is the same as if the graph would be |
|
490 deleted with the routine \verb|glp_delete_graph| and then created anew |
|
491 with the routine \verb|glp_create_graph|, with exception that the handle |
|
492 (pointer) to the graph remains valid. |
|
493 |
|
494 The parameters \verb|v_size| and \verb|a_size| have the same meaning as |
|
495 for the routine \verb|glp_create_graph|. |
|
496 |
|
497 \subsection{glp\_delete\_graph---delete graph} |
|
498 |
|
499 \subsubsection*{Synopsis} |
|
500 |
|
501 \begin{verbatim} |
|
502 void glp_delete_graph(glp_graph *G); |
|
503 \end{verbatim} |
|
504 |
|
505 \subsubsection*{Description} |
|
506 |
|
507 The routine \verb|glp_delete_graph| deletes the specified graph and |
|
508 frees all the memory allocated to this program object. |
|
509 |
|
510 \newpage |
|
511 |
|
512 \section{Graph searching routines} |
|
513 |
|
514 \subsection{glp\_create\_v\_index---create vertex name index} |
|
515 |
|
516 \subsubsection*{Synopsis} |
|
517 |
|
518 \begin{verbatim} |
|
519 void glp_create_v_index(glp_graph *G); |
|
520 \end{verbatim} |
|
521 |
|
522 \subsubsection*{Description} |
|
523 |
|
524 The routine \verb|glp_create_v_index| creates the name index for the |
|
525 specified graph. The name index is an auxiliary data structure, which |
|
526 is intended to quickly (i.e. for logarithmic time) find vertices by |
|
527 their names. |
|
528 |
|
529 This routine can be called at any time. If the name index already |
|
530 exists, the routine does nothing. |
|
531 |
|
532 \subsection{glp\_find\_vertex---find vertex by its name} |
|
533 |
|
534 \subsubsection*{Synopsis} |
|
535 |
|
536 \begin{verbatim} |
|
537 int glp_find_vertex(glp_graph *G, const char *name); |
|
538 \end{verbatim} |
|
539 |
|
540 \subsubsection*{Returns} |
|
541 |
|
542 The routine \verb|glp_find_vertex| returns the ordinal number of |
|
543 a vertex, which is assigned (by the routine \verb|glp_set_vertex_name|) |
|
544 the specified symbolic \verb|name|. If no such vertex exists, the |
|
545 routine returns 0. |
|
546 |
|
547 \subsection{glp\_delete\_v\_index---delete vertex name index} |
|
548 |
|
549 \subsubsection*{Synopsis} |
|
550 |
|
551 \begin{verbatim} |
|
552 void glp_delete_v_index(glp_graph *G); |
|
553 \end{verbatim} |
|
554 |
|
555 \subsubsection*{Description} |
|
556 |
|
557 The routine \verb|glp_delete_v_index| deletes the name index previously |
|
558 created by the routine \verb|glp_create_v_index| and frees the memory |
|
559 allocated to this auxiliary data structure. |
|
560 |
|
561 This routine can be called at any time. If the name index does not |
|
562 exist, the routine does nothing. |
|
563 |
|
564 \newpage |
|
565 |
|
566 \section{Graph reading/writing routines} |
|
567 |
|
568 \subsection{glp\_read\_graph---read graph from plain text file} |
|
569 |
|
570 \subsubsection*{Synopsis} |
|
571 |
|
572 \begin{verbatim} |
|
573 int glp_read_graph(glp_graph *G, const char *fname); |
|
574 \end{verbatim} |
|
575 |
|
576 \subsubsection*{Description} |
|
577 |
|
578 The routine \verb|glp_read_graph| reads a graph from a plain text file, |
|
579 whose name is specified by the parameter \verb|fname|. Note that before |
|
580 reading data the current content of the graph object is completely |
|
581 erased with the routine \verb|glp_erase_graph|. |
|
582 |
|
583 For the file format see description of the routine |
|
584 \verb|glp_write_graph|. |
|
585 |
|
586 \subsubsection*{Returns} |
|
587 |
|
588 If the operation was successful, the routine returns zero. Otherwise |
|
589 it prints an error message and returns non-zero. |
|
590 |
|
591 \subsection{glp\_write\_graph---write graph to plain text file} |
|
592 |
|
593 \subsubsection*{Synopsis} |
|
594 |
|
595 \begin{verbatim} |
|
596 int glp_write_graph(glp_graph *G, const char *fname); |
|
597 \end{verbatim} |
|
598 |
|
599 \subsubsection*{Description} |
|
600 |
|
601 The routine \verb|glp_write_graph| writes the graph to a plain text |
|
602 file, whose name is specified by the parameter \verb|fname|. |
|
603 |
|
604 \subsubsection*{Returns} |
|
605 |
|
606 If the operation was successful, the routine returns zero. Otherwise |
|
607 it prints an error message and returns non-zero. |
|
608 |
|
609 \subsubsection*{File format} |
|
610 |
|
611 The file created by the routine \verb|glp_write_graph| is a plain text |
|
612 file, which contains the following information: |
|
613 |
|
614 \begin{verbatim} |
|
615 nv na |
|
616 i[1] j[1] |
|
617 i[2] j[2] |
|
618 . . . |
|
619 i[na] j[na] |
|
620 \end{verbatim} |
|
621 |
|
622 \noindent |
|
623 where: |
|
624 |
|
625 \noindent |
|
626 \verb|nv| is the number of vertices (nodes); |
|
627 |
|
628 \noindent |
|
629 \verb|na| is the number of arcs; |
|
630 |
|
631 \noindent |
|
632 \verb|i[k]|, $k=1,\dots,na$, is the index of tail vertex of arc $k$; |
|
633 |
|
634 \noindent |
|
635 \verb|j[k]|, $k=1,\dots,na$, is the index of head vertex of arc $k$. |
|
636 |
|
637 \subsection{glp\_read\_ccdata---read graph from text file in DIMACS |
|
638 clique/coloring format} |
|
639 |
|
640 \subsubsection*{Synopsis} |
|
641 |
|
642 \begin{verbatim} |
|
643 int glp_read_ccdata(glp_graph *G, int v_wgt, |
|
644 const char *fname); |
|
645 \end{verbatim} |
|
646 |
|
647 \subsubsection*{Description} |
|
648 |
|
649 The routine {\it glp\_read\_ccdata} reads a graph from a text file in |
|
650 DIMACS clique/coloring format. (Though this format is originally |
|
651 designed to represent data for the minimal vertex coloring and maximal |
|
652 clique problems, it may be used to represent general undirected and |
|
653 directed graphs, because the routine allows reading self-loops and |
|
654 multiple edges/arcs keeping the order of vertices specified for each |
|
655 edge/arc of the graph.) |
|
656 |
|
657 The parameter $G$ specifies the graph object to be read in. Note that |
|
658 before reading data the current content of the graph object is |
|
659 completely erased with the routine {\it glp\_erase\_graph}. |
|
660 |
|
661 The parameter {\it v\_wgt} specifies an offset of the field of type |
|
662 {\bf double} in the vertex data block, to which the routine stores the |
|
663 vertex weight. If {\it v\_wgt} $<0$, the vertex weights are not stored. |
|
664 |
|
665 The character string {\it fname} specifies the name of a text file to |
|
666 be read in. (If the file name ends with the suffix `\verb|.gz|', the |
|
667 file is assumed to be compressed, in which case the routine decompresses |
|
668 it ``on the fly''.) |
|
669 |
|
670 \subsubsection*{Returns} |
|
671 |
|
672 If the operation was successful, the routine returns zero. Otherwise, |
|
673 it prints an error message and returns non-zero. |
|
674 |
|
675 \subsubsection*{DIMACS clique/coloring format\footnote{This material is |
|
676 based on the paper ``Clique and Coloring Problems Graph Format'', which |
|
677 is publically available at |
|
678 {\tt http://dimacs.rutgers.edu/Challenges/}.}} |
|
679 |
|
680 The DIMACS input file is a plain ASCII text file. It contains |
|
681 {\it lines} of several types described below. A line is terminated with |
|
682 an end-of-line character. Fields in each line are separated by at least |
|
683 one blank space. Each line begins with a one-character designator to |
|
684 identify the line type. |
|
685 |
|
686 Note that DIMACS requires all numerical quantities to be integers in |
|
687 the range $[-2^{31},2^{31}-1]$ while GLPK allows the quantities to be |
|
688 floating-point numbers. |
|
689 |
|
690 \paragraph{Comment lines.} Comment lines give human-readable information |
|
691 about the file and are ignored by programs. Comment lines can appear |
|
692 anywhere in the file. Each comment line begins with a lower-case |
|
693 character \verb|c|. |
|
694 |
|
695 \begin{verbatim} |
|
696 c This is a comment line |
|
697 \end{verbatim} |
|
698 |
|
699 \paragraph{Problem line.} There is one problem line per data file. The |
|
700 problem line must appear before any node or edge descriptor lines. It |
|
701 has the following format: |
|
702 |
|
703 \begin{verbatim} |
|
704 p edge NODES EDGES |
|
705 \end{verbatim} |
|
706 |
|
707 \noindent |
|
708 The lower-case letter \verb|p| signifies that this is a problem line. |
|
709 The four-character problem designator \verb|edge| identifies the file |
|
710 as containing data for the minimal vertex coloring or maximal clique |
|
711 problem. The \verb|NODES| field contains an integer value specifying |
|
712 the number of vertices in the graph. The \verb|EDGES| field contains an |
|
713 integer value specifying the number of edges (arcs) in the graph. |
|
714 |
|
715 \paragraph{Vertex descriptors.} These lines give the weight assigned to |
|
716 a vertex of the graph. There is one vertex descriptor line for each |
|
717 vertex, with the following format. Vertices without a descriptor take on |
|
718 a default value of 1. |
|
719 |
|
720 \begin{verbatim} |
|
721 n ID VALUE |
|
722 \end{verbatim} |
|
723 |
|
724 \noindent |
|
725 The lower-case character \verb|n| signifies that this is a vertex |
|
726 descriptor line. The \verb|ID| field gives a vertex identification |
|
727 number, an integer between 1 and $n$, where $n$ is the number of |
|
728 vertices in the graph. The \verb|VALUE| field gives a vertex weight, |
|
729 which can either positive or negative (or zero). |
|
730 |
|
731 \paragraph{Edge descriptors.} There is one edge descriptor line for |
|
732 each edge (arc) of the graph, each with the following format: |
|
733 |
|
734 \begin{verbatim} |
|
735 e I J |
|
736 \end{verbatim} |
|
737 |
|
738 \noindent |
|
739 The lower-case character \verb|e| signifies that this is an edge |
|
740 descriptor line. For an edge (arc) $(i,j)$ the fields \verb|I| and |
|
741 \verb|J| specify its endpoints. |
|
742 |
|
743 \paragraph{Example.} The following example of an undirected graph: |
|
744 |
|
745 \bigskip |
|
746 |
|
747 \noindent\hfil |
|
748 \xymatrix %@C=32pt |
|
749 {&{v_1}\ar@{-}[ldd]\ar@{-}[dd]\ar@{-}[rd]\ar@{-}[rr]&&{v_2}\ar@{-}[ld] |
|
750 \ar@{-}[dd]\ar@{-}[rdd]&\\ |
|
751 &&{v_7}\ar@{-}[ld]\ar@{-}[rd]&&\\ |
|
752 {v_6}\ar@{-}[r]\ar@{-}[rdd]&{v_{10}}\ar@{-}[rr]\ar@{-}[rd]\ar@{-}[dd]&& |
|
753 {v_8}\ar@{-}[ld]\ar@{-}[dd]\ar@{-}[r]&{v_3}\ar@{-}[ldd]\\ |
|
754 &&{v_9}\ar@{-}[ld]\ar@{-}[rd]&&\\ |
|
755 &{v_5}\ar@{-}[rr]&&{v_4}&\\ |
|
756 } |
|
757 |
|
758 \bigskip |
|
759 |
|
760 \noindent |
|
761 might be coded in DIMACS clique/coloring format as follows: |
|
762 |
|
763 \begin{footnotesize} |
|
764 \begin{verbatim} |
|
765 c sample.col |
|
766 c |
|
767 c This is an example of the vertex coloring problem data |
|
768 c in DIMACS format. |
|
769 c |
|
770 p edge 10 21 |
|
771 c |
|
772 e 1 2 |
|
773 e 1 6 |
|
774 e 1 7 |
|
775 e 1 10 |
|
776 e 2 3 |
|
777 e 2 7 |
|
778 e 2 8 |
|
779 e 3 4 |
|
780 e 3 8 |
|
781 e 4 5 |
|
782 e 4 8 |
|
783 e 4 9 |
|
784 e 5 6 |
|
785 e 5 9 |
|
786 e 5 10 |
|
787 e 6 10 |
|
788 e 7 8 |
|
789 e 7 10 |
|
790 e 8 9 |
|
791 e 8 10 |
|
792 e 9 10 |
|
793 c |
|
794 c eof |
|
795 \end{verbatim} |
|
796 \end{footnotesize} |
|
797 |
|
798 \subsection{glp\_write\_ccdata---write graph to text file in DIMACS |
|
799 clique/coloring format} |
|
800 |
|
801 \subsubsection*{Synopsis} |
|
802 |
|
803 \begin{verbatim} |
|
804 int glp_write_ccdata(glp_graph *G, int v_wgt, |
|
805 const char *fname); |
|
806 \end{verbatim} |
|
807 |
|
808 \subsection*{Description} |
|
809 |
|
810 The routine {\it glp\_write\_ccdata} writes the graph object specified |
|
811 by the parameter $G$ to a text file in DIMACS clique/coloring format. |
|
812 (Though this format is originally designed to represent data for the |
|
813 minimal vertex coloring and maximal clique problems, it may be used to |
|
814 represent general undirected and directed graphs, because the routine |
|
815 allows writing self-loops and multiple edges/arcs keeping the order of |
|
816 vertices specified for each edge/arc of the graph.) |
|
817 |
|
818 The parameter {\it v\_wgt} specifies an offset of the field of type |
|
819 {\bf double} in the vertex data block, which contains the vertex weight. |
|
820 If {\it v\_wgt} $<0$, it is assumed that the weight of each vertex is 1. |
|
821 |
|
822 The character string {\it fname} specifies a name of the text file to be |
|
823 written out. (If the file name ends with suffix `\verb|.gz|', the file |
|
824 is assumed to be compressed, in which case the routine performs |
|
825 automatic compression on writing it.) |
|
826 |
|
827 \subsubsection*{Returns} |
|
828 |
|
829 If the operation was successful, the routine returns zero. Otherwise, |
|
830 it prints an error message and returns non-zero. |
|
831 |
|
832 \newpage |
|
833 |
|
834 \section{Graph analysis routines} |
|
835 |
|
836 \subsection{glp\_weak\_comp---find all weakly connected components of |
|
837 graph} |
|
838 |
|
839 \subsubsection*{Synopsis} |
|
840 |
|
841 \begin{verbatim} |
|
842 int glp_weak_comp(glp_graph *G, int v_num); |
|
843 \end{verbatim} |
|
844 |
|
845 \subsubsection*{Description} |
|
846 |
|
847 The routine \verb|glp_weak_comp| finds all weakly connected components |
|
848 of the specified graph. |
|
849 |
|
850 The parameter \verb|v_num| specifies an offset of the field of type |
|
851 \verb|int| in the vertex data block, to which the routine stores the |
|
852 number of a weakly connected component containing that vertex. If |
|
853 \verb|v_num| $<0$, no component numbers are stored. |
|
854 |
|
855 The components are numbered in arbitrary order from 1 to \verb|nc|, |
|
856 where \verb|nc| is the total number of components found, |
|
857 $0\leq$ \verb|nc| $\leq|V|$. |
|
858 |
|
859 \subsubsection*{Returns} |
|
860 |
|
861 The routine returns \verb|nc|, the total number of components found. |
|
862 |
|
863 \subsection{glp\_strong\_comp---find all strongly connected components |
|
864 of graph} |
|
865 |
|
866 \subsubsection*{Synopsis} |
|
867 |
|
868 \begin{verbatim} |
|
869 int glp_strong_comp(glp_graph *G, int v_num); |
|
870 \end{verbatim} |
|
871 |
|
872 \subsubsection*{Description} |
|
873 |
|
874 The routine \verb|glp_strong_comp| finds all strongly connected |
|
875 components of the specified graph. |
|
876 |
|
877 The parameter \verb|v_num| specifies an offset of the field of type |
|
878 \verb|int| in the vertex data block, to which the routine stores the |
|
879 number of a strongly connected component containing that vertex. If |
|
880 \verb|v_num| $<0$, no component numbers are stored. |
|
881 |
|
882 The components are numbered in arbitrary order from 1 to \verb|nc|, |
|
883 where \verb|nc| is the total number of components found, |
|
884 $0\leq$ \verb|nc| $\leq|V|$. However, the component numbering has the |
|
885 property that for every arc $(i\rightarrow j)$ in the graph the |
|
886 condition $num(i)\geq num(j)$ holds. |
|
887 |
|
888 \subsubsection*{Returns} |
|
889 |
|
890 The routine returns \verb|nc|, the total number of components found. |
|
891 |
|
892 \subsubsection*{References} |
|
893 |
|
894 I.~S.~Duff, J.~K.~Reid, Algorithm 529: Permutations to block triangular |
|
895 form, ACM Trans. on Math. Softw. 4 (1978), 189-92. |
|
896 |
|
897 \subsubsection*{Example} |
|
898 |
|
899 The following program reads a graph from a plain text file |
|
900 `\verb|graph.txt|' and finds all its strongly connected components. |
|
901 |
|
902 \begin{footnotesize} |
|
903 \begin{verbatim} |
|
904 #include <stddef.h> |
|
905 #include <stdio.h> |
|
906 #include <stdlib.h> |
|
907 #include <glpk.h> |
|
908 |
|
909 typedef struct { int num; } v_data; |
|
910 |
|
911 #define vertex(v) ((v_data *)((v)->data)) |
|
912 |
|
913 int main(void) |
|
914 { glp_graph *G; |
|
915 int i, nc; |
|
916 G = glp_create_graph(sizeof(v_data), 0); |
|
917 glp_read_graph(G, "graph.txt"); |
|
918 nc = glp_strong_comp(G, offsetof(v_data, num)); |
|
919 printf("nc = %d\n", nc); |
|
920 for (i = 1; i <= G->nv; i++) |
|
921 printf("num[%d] = %d\n", i, vertex(G->v[i])->num); |
|
922 glp_delete_graph(G); |
|
923 return 0; |
|
924 } |
|
925 \end{verbatim} |
|
926 \end{footnotesize} |
|
927 |
|
928 \noindent |
|
929 If the file `\verb|graph.txt|' contains the graph shown below: |
|
930 |
|
931 \bigskip |
|
932 |
|
933 \noindent\hfil |
|
934 \xymatrix |
|
935 {1\ar[r]&2\ar[r]&3\ar[r]\ar[dd]&4\ar[dd]\\ |
|
936 5\ar[u]&6\ar[l]\\ |
|
937 7\ar[u]&&8\ar[lu]\ar[ll]\ar[r]&9\ar[r]&10\ar[r]\ar[d]&11\ar[d]\\ |
|
938 12\ar[u]\ar[rru]\ar@/_/[rr]&&13\ar[ll]\ar[u]\ar[rr]&&14\ar[lu]&15\ar[l] |
|
939 \\ |
|
940 } |
|
941 |
|
942 \bigskip\bigskip |
|
943 |
|
944 \noindent |
|
945 the program output may look like follows: |
|
946 |
|
947 \begin{footnotesize} |
|
948 \begin{verbatim} |
|
949 Reading graph from `graph.txt'... |
|
950 Graph has 15 vertices and 30 arcs |
|
951 31 lines were read |
|
952 nc = 4 |
|
953 num[1] = 3 |
|
954 num[2] = 3 |
|
955 num[3] = 3 |
|
956 num[4] = 2 |
|
957 num[5] = 3 |
|
958 num[6] = 3 |
|
959 num[7] = 3 |
|
960 num[8] = 3 |
|
961 num[9] = 1 |
|
962 num[10] = 1 |
|
963 num[11] = 1 |
|
964 num[12] = 4 |
|
965 num[13] = 4 |
|
966 num[14] = 1 |
|
967 num[15] = 1 |
|
968 \end{verbatim} |
|
969 \end{footnotesize} |
|
970 |
|
971 \subsection{glp\_top\_sort---topological sorting of acyclic digraph} |
|
972 |
|
973 \subsubsection*{Synopsis} |
|
974 |
|
975 \begin{verbatim} |
|
976 int glp_top_sort(glp_graph *G, int v_num); |
|
977 \end{verbatim} |
|
978 |
|
979 \subsubsection*{Description} |
|
980 |
|
981 The routine \verb|glp_top_sort| performs topological sorting of |
|
982 vertices of the specified acyclic digraph. |
|
983 |
|
984 The parameter \verb|v_num| specifies an offset of the field of type |
|
985 \verb|int| in the vertex data block, to which the routine stores the |
|
986 vertex number assigned. If \verb|v_num| $<0$, vertex numbers are not |
|
987 stored. |
|
988 |
|
989 The vertices are numbered from 1 to $n$, where $n$ is the total number |
|
990 of vertices in the graph. The vertex numbering has the property that |
|
991 for every arc $(i\rightarrow j)$ in the graph the condition |
|
992 $num(i)<num(j)$ holds. Special case $num(i)=0$ means that vertex $i$ is |
|
993 not assigned a number, because the graph is {\it not} acyclic. |
|
994 |
|
995 \subsubsection*{Returns} |
|
996 |
|
997 If the graph is acyclic and therefore all the vertices have been |
|
998 assigned numbers, the routine \verb|glp_top_sort| returns zero. |
|
999 Otherwise, if the graph is not acyclic, the routine returns the number |
|
1000 of vertices which have not been numbered, i.e. for which $num(i)=0$. |
|
1001 |
|
1002 \subsubsection*{Example} |
|
1003 |
|
1004 The following program reads a digraph from a plain text file |
|
1005 `\verb|graph.txt|' and performs topological sorting of its vertices. |
|
1006 |
|
1007 \begin{footnotesize} |
|
1008 \begin{verbatim} |
|
1009 #include <stddef.h> |
|
1010 #include <stdio.h> |
|
1011 #include <stdlib.h> |
|
1012 #include <glpk.h> |
|
1013 |
|
1014 typedef struct { int num; } v_data; |
|
1015 |
|
1016 #define vertex(v) ((v_data *)((v)->data)) |
|
1017 |
|
1018 int main(void) |
|
1019 { glp_graph *G; |
|
1020 int i, cnt; |
|
1021 G = glp_create_graph(sizeof(v_data), 0); |
|
1022 glp_read_graph(G, "graph.txt"); |
|
1023 cnt = glp_top_sort(G, offsetof(v_data, num)); |
|
1024 printf("cnt = %d\n", cnt); |
|
1025 for (i = 1; i <= G->nv; i++) |
|
1026 printf("num[%d] = %d\n", i, vertex(G->v[i])->num); |
|
1027 glp_delete_graph(G); |
|
1028 return 0; |
|
1029 } |
|
1030 \end{verbatim} |
|
1031 \end{footnotesize} |
|
1032 |
|
1033 \noindent |
|
1034 If the file `\verb|graph.txt|' contains the graph shown below: |
|
1035 |
|
1036 \bigskip |
|
1037 |
|
1038 \noindent\hfil |
|
1039 \xymatrix @=20pt |
|
1040 { |
|
1041 1\ar[rrr]&&&2\ar[r]\ar[rddd]&3\ar[rd]&&&&\\ |
|
1042 &&&4\ar[ru]&&5\ar[r]&6\ar[rd]\ar[dd]&&\\ |
|
1043 7\ar[r]&8\ar[r]&9\ar[ruu]\ar[ru]\ar[r]\ar[rd]&10\ar[rr]\ar[rru]&& |
|
1044 11\ar[ru]&&12\ar[r]&13\\ |
|
1045 &&&14\ar[r]&15\ar[rrru]\ar[rr]&&16\ar[rru]\ar[rr]&&17\\ |
|
1046 } |
|
1047 |
|
1048 \bigskip\bigskip |
|
1049 |
|
1050 \noindent |
|
1051 the program output may look like follows: |
|
1052 |
|
1053 \begin{footnotesize} |
|
1054 \begin{verbatim} |
|
1055 Reading graph from `graph.txt'... |
|
1056 Graph has 17 vertices and 23 arcs |
|
1057 24 lines were read |
|
1058 cnt = 0 |
|
1059 num[1] = 8 |
|
1060 num[2] = 9 |
|
1061 num[3] = 10 |
|
1062 num[4] = 4 |
|
1063 num[5] = 11 |
|
1064 num[6] = 12 |
|
1065 num[7] = 1 |
|
1066 num[8] = 2 |
|
1067 num[9] = 3 |
|
1068 num[10] = 5 |
|
1069 num[11] = 6 |
|
1070 num[12] = 14 |
|
1071 num[13] = 16 |
|
1072 num[14] = 7 |
|
1073 num[15] = 13 |
|
1074 num[16] = 15 |
|
1075 num[17] = 17 |
|
1076 \end{verbatim} |
|
1077 \end{footnotesize} |
|
1078 |
|
1079 \noindent |
|
1080 The output corresponds to the following vertex numbering: |
|
1081 |
|
1082 \bigskip |
|
1083 |
|
1084 \noindent\hfil |
|
1085 \xymatrix @=20pt |
|
1086 { |
|
1087 8\ar[rrr]&&&9\ar[r]\ar[rddd]&10\ar[rd]&&&&\\ |
|
1088 &&&4\ar[ru]&&11\ar[r]&12\ar[rd]\ar[dd]&&\\ |
|
1089 1\ar[r]&2\ar[r]&3\ar[ruu]\ar[ru]\ar[r]\ar[rd]&5\ar[rr]\ar[rru]&& |
|
1090 6\ar[ru]&&14\ar[r]&16\\ |
|
1091 &&&7\ar[r]&13\ar[rrru]\ar[rr]&&15\ar[rru]\ar[rr]&&17\\ |
|
1092 } |
|
1093 |
|
1094 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1095 |
|
1096 \chapter{Network optimization API routines} |
|
1097 |
|
1098 \section{Minimum cost flow problem} |
|
1099 |
|
1100 \subsection{Background} |
|
1101 |
|
1102 The {\it minimum cost flow problem} (MCFP) is stated as follows. Let |
|
1103 there be given a directed graph (flow network) $G=(V,A)$, where $V$ is |
|
1104 a set of vertices (nodes), and $A\subseteq V\times V$ is a set of arcs. |
|
1105 Let for each node $i\in V$ there be given a quantity $b_i$ having the |
|
1106 following meaning: |
|
1107 |
|
1108 if $b_i>0$, then $|b_i|$ is a {\it supply} at node $i$, which shows |
|
1109 how many flow units are {\it generated} at node $i$ (or, equivalently, |
|
1110 entering the network through node $i$ from the outside); |
|
1111 |
|
1112 if $b_i<0$, then $|b_i|$ is a {\it demand} at node $i$, which shows how |
|
1113 many flow units are {\it lost} at node $i$ (or, equivalently, leaving |
|
1114 the network through node $i$ to the outside); |
|
1115 |
|
1116 if $b_i=0$, then $i$ is a {\it transshipment} node, at which the flow |
|
1117 is conserved, i.e. neither generated nor lost. |
|
1118 |
|
1119 Let also for each arc $a=(i,j)\in A$ there be given the following three |
|
1120 quantities: |
|
1121 |
|
1122 $l_{ij}$, a (non-negative) lower bound to the flow through arc $(i,j)$; |
|
1123 |
|
1124 $u_{ij}$, an upper bound to the flow through arc $(i,j)$, which is the |
|
1125 {\it arc capacity}; |
|
1126 |
|
1127 $c_{ij}$, a per-unit cost of the flow through arc $(i,j)$. |
|
1128 |
|
1129 The problem is to find flows $x_{ij}$ through every arc of the network, |
|
1130 which satisfy the specified bounds and the conservation constraints at |
|
1131 all nodes, and minimize the total flow cost. Here the conservation |
|
1132 constraint at a node means that the total flow entering this node |
|
1133 through its incoming arcs plus the supply at this node must be equal to |
|
1134 the total flow leaving this node through its outgoing arcs plus the |
|
1135 demand at this node. |
|
1136 |
|
1137 An example of the minimum cost flow problem is shown on Fig.~1. |
|
1138 |
|
1139 \bigskip |
|
1140 |
|
1141 \noindent\hfil |
|
1142 \xymatrix @C=48pt |
|
1143 {_{20}\ar@{~>}[d]& |
|
1144 v_2\ar[r]|{_{0,10,\$2}}\ar[dd]|{_{0,9,\$3}}& |
|
1145 v_3\ar[dd]|{_{2,12,\$1}}\ar[r]|{_{0,18,\$0}}& |
|
1146 v_8\ar[rd]|{_{0,20,\$9}}&\\ |
|
1147 v_1\ar[ru]|{_{0,14,\$0}}\ar[rd]|{_{0,23,\$0}}&&& |
|
1148 v_6\ar[d]|{_{0,7,\$0}}\ar[u]|{_{4,8,\$0}}& |
|
1149 v_9\ar@{~>}[d]\\ |
|
1150 &v_4\ar[r]|{_{0,26,\$0}}& |
|
1151 v_5\ar[luu]|{_{0,11,\$1}}\ar[ru]|{_{0,25,\$5}}\ar[r]|{_{0,4,\$7}}& |
|
1152 v_7\ar[ru]|{_{0,15,\$3}}&_{20}\\ |
|
1153 } |
|
1154 |
|
1155 \medskip |
|
1156 |
|
1157 \noindent\hfil |
|
1158 \begin{tabular}{ccc} |
|
1159 \xymatrix @C=48pt{v_i\ar[r]|{\ l,u,\$c\ }&v_j\\}& |
|
1160 \xymatrix{\hbox{\footnotesize supply}\ar@{~>}[r]&v_i\\}& |
|
1161 \xymatrix{v_i\ar@{~>}[r]&\hbox{\footnotesize demand}\\}\\ |
|
1162 \end{tabular} |
|
1163 |
|
1164 \bigskip |
|
1165 |
|
1166 \noindent\hfil |
|
1167 Fig.~1. An example of the minimum cost flow problem. |
|
1168 |
|
1169 \bigskip |
|
1170 |
|
1171 The minimum cost flow problem can be naturally formulated as the |
|
1172 following LP problem: |
|
1173 |
|
1174 \medskip |
|
1175 |
|
1176 \noindent |
|
1177 \hspace{.5in}minimize |
|
1178 $$z=\sum_{(i,j)\in A}c_{ij}x_{ij}\eqno(1)$$ |
|
1179 \hspace{.5in}subject to |
|
1180 $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}=b_i\ \ \ \hbox |
|
1181 {for all}\ i\in V\eqno(2)$$ |
|
1182 $$l_{ij}\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A |
|
1183 \eqno(3)$$ |
|
1184 |
|
1185 \newpage |
|
1186 |
|
1187 \subsection{glp\_read\_mincost---read minimum cost flow problem\\data |
|
1188 in DIMACS format} |
|
1189 |
|
1190 \subsubsection*{Synopsis} |
|
1191 |
|
1192 \begin{verbatim} |
|
1193 int glp_read_mincost(glp_graph *G, int v_rhs, int a_low, |
|
1194 int a_cap, int a_cost, const char *fname); |
|
1195 \end{verbatim} |
|
1196 |
|
1197 \subsubsection*{Description} |
|
1198 |
|
1199 The routine \verb|glp_read_mincost| reads the minimum cost flow problem |
|
1200 data from a text file in DIMACS format. |
|
1201 |
|
1202 The parameter \verb|G| specifies the graph object, to which the problem |
|
1203 data have to be stored. Note that before reading data the current |
|
1204 content of the graph object is completely erased with the routine |
|
1205 \verb|glp_erase_graph|. |
|
1206 |
|
1207 The parameter \verb|v_rhs| specifies an offset of the field of type |
|
1208 \verb|double| in the vertex data block, to which the routine stores |
|
1209 $b_i$, the supply/demand value. If \verb|v_rhs| $<0$, the value is not |
|
1210 stored. |
|
1211 |
|
1212 The parameter \verb|a_low| specifies an offset of the field of type |
|
1213 \verb|double| in the arc data block, to which the routine stores |
|
1214 $l_{ij}$, the lower bound to the arc flow. If \verb|a_low| $<0$, the |
|
1215 lower bound is not stored. |
|
1216 |
|
1217 The parameter \verb|a_cap| specifies an offset of the field of type |
|
1218 \verb|double| in the arc data block, to which the routine stores |
|
1219 $u_{ij}$, the upper bound to the arc flow (the arc capacity). If |
|
1220 \verb|a_cap| $<0$, the upper bound is not stored. |
|
1221 |
|
1222 The parameter \verb|a_cost| specifies an offset of the field of type |
|
1223 \verb|double| in the arc data block, to which the routine stores |
|
1224 $c_{ij}$, the per-unit cost of the arc flow. If \verb|a_cost| $<0$, the |
|
1225 cost is not stored. |
|
1226 |
|
1227 The character string \verb|fname| specifies the name of a text file to |
|
1228 be read in. (If the file name name ends with the suffix `\verb|.gz|', |
|
1229 the file is assumed to be compressed, in which case the routine |
|
1230 decompresses it ``on the fly''.) |
|
1231 |
|
1232 \subsubsection*{Returns} |
|
1233 |
|
1234 If the operation was successful, the routine returns zero. Otherwise, |
|
1235 it prints an error message and returns non-zero. |
|
1236 |
|
1237 \newpage |
|
1238 |
|
1239 \subsubsection*{Example} |
|
1240 |
|
1241 \begin{footnotesize} |
|
1242 \begin{verbatim} |
|
1243 typedef struct |
|
1244 { /* vertex data block */ |
|
1245 ... |
|
1246 double rhs; |
|
1247 ... |
|
1248 } v_data; |
|
1249 |
|
1250 typedef struct |
|
1251 { /* arc data block */ |
|
1252 ... |
|
1253 double low, cap, cost; |
|
1254 ... |
|
1255 } a_data; |
|
1256 |
|
1257 int main(void) |
|
1258 { glp_graph *G; |
|
1259 int ret; |
|
1260 G = glp_create_graph(sizeof(v_data), sizeof(a_data)); |
|
1261 ret = glp_read_mincost(G, offsetof(v_data, rhs), |
|
1262 offsetof(a_data, low), offsetof(a_data, cap), |
|
1263 offsetof(a_data, cost), "sample.min"); |
|
1264 if (ret != 0) goto ... |
|
1265 ... |
|
1266 } |
|
1267 \end{verbatim} |
|
1268 \end{footnotesize} |
|
1269 |
|
1270 \subsubsection*{DIMACS minimum cost flow problem format\footnote{This |
|
1271 material is based on the paper ``The First DIMACS International |
|
1272 Algorithm Implementation Challenge: Problem Definitions and |
|
1273 Specifications'', which is publically available at |
|
1274 {\tt http://dimacs.rutgers.edu/Challenges/}.}} |
|
1275 \label{subsecmincost} |
|
1276 |
|
1277 The DIMACS input file is a plain ASCII text file. It contains |
|
1278 {\it lines} of several types described below. A line is terminated with |
|
1279 an end-of-line character. Fields in each line are separated by at least |
|
1280 one blank space. Each line begins with a one-character designator to |
|
1281 identify the line type. |
|
1282 |
|
1283 Note that DIMACS requires all numerical quantities to be integers in |
|
1284 the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be |
|
1285 floating-point numbers. |
|
1286 |
|
1287 \newpage |
|
1288 |
|
1289 \paragraph{Comment lines.} Comment lines give human-readable information |
|
1290 about the file and are ignored by programs. Comment lines can appear |
|
1291 anywhere in the file. Each comment line begins with a lower-case |
|
1292 character \verb|c|. |
|
1293 |
|
1294 \begin{verbatim} |
|
1295 c This is a comment line |
|
1296 \end{verbatim} |
|
1297 |
|
1298 \paragraph{Problem line.} There is one problem line per data file. The |
|
1299 problem line must appear before any node or arc descriptor lines. It has |
|
1300 the following format: |
|
1301 |
|
1302 \begin{verbatim} |
|
1303 p min NODES ARCS |
|
1304 \end{verbatim} |
|
1305 |
|
1306 \noindent |
|
1307 The lower-case character \verb|p| signifies that this is a problem line. |
|
1308 The three-character problem designator \verb|min| identifies the file as |
|
1309 containing specification information for the minimum cost flow problem. |
|
1310 The \verb|NODES| field contains an integer value specifying the number |
|
1311 of nodes in the network. The \verb|ARCS| field contains an integer value |
|
1312 specifying the number of arcs in the network. |
|
1313 |
|
1314 \paragraph{Node descriptors.} All node descriptor lines must appear |
|
1315 before all arc descriptor lines. The node descriptor lines describe |
|
1316 supply and demand nodes, but not transshipment nodes. That is, only |
|
1317 nodes with non-zero node supply/demand values appear. There is one node |
|
1318 descriptor line for each such node, with the following format: |
|
1319 |
|
1320 \begin{verbatim} |
|
1321 n ID FLOW |
|
1322 \end{verbatim} |
|
1323 |
|
1324 \noindent |
|
1325 The lower-case character \verb|n| signifies that this is a node |
|
1326 descriptor line. The \verb|ID| field gives a node identification number, |
|
1327 an integer between 1 and \verb|NODES|. The \verb|FLOW| field gives the |
|
1328 amount of supply (if positive) or demand (if negative) at node |
|
1329 \verb|ID|. |
|
1330 |
|
1331 \paragraph{Arc descriptors.} There is one arc descriptor line for each |
|
1332 arc in the network. Arc descriptor lines are of the following format: |
|
1333 |
|
1334 \begin{verbatim} |
|
1335 a SRC DST LOW CAP COST |
|
1336 \end{verbatim} |
|
1337 |
|
1338 \noindent |
|
1339 The lower-case character \verb|a| signifies that this is an arc |
|
1340 descriptor line. For a directed arc $(i,j)$ the \verb|SRC| field gives |
|
1341 the identification number $i$ for the tail endpoint, and the \verb|DST| |
|
1342 field gives the identification number $j$ for the head endpoint. |
|
1343 Identification numbers are integers between 1 and \verb|NODES|. The |
|
1344 \verb|LOW| field specifies the minimum amount of flow that can be sent |
|
1345 along arc $(i,j)$, and the \verb|CAP| field gives the maximum amount of |
|
1346 flow that can be sent along arc $(i,j)$ in a feasible flow. The |
|
1347 \verb|COST| field contains the per-unit cost of flow sent along arc |
|
1348 $(i,j)$. |
|
1349 |
|
1350 \paragraph{Example.} Below here is an example of the data file in |
|
1351 DIMACS format corresponding to the minimum cost flow problem shown on |
|
1352 Fig~1. |
|
1353 |
|
1354 \begin{footnotesize} |
|
1355 \begin{verbatim} |
|
1356 c sample.min |
|
1357 c |
|
1358 c This is an example of the minimum cost flow problem data |
|
1359 c in DIMACS format. |
|
1360 c |
|
1361 p min 9 14 |
|
1362 c |
|
1363 n 1 20 |
|
1364 n 9 -20 |
|
1365 c |
|
1366 a 1 2 0 14 0 |
|
1367 a 1 4 0 23 0 |
|
1368 a 2 3 0 10 2 |
|
1369 a 2 4 0 9 3 |
|
1370 a 3 5 2 12 1 |
|
1371 a 3 8 0 18 0 |
|
1372 a 4 5 0 26 0 |
|
1373 a 5 2 0 11 1 |
|
1374 a 5 6 0 25 5 |
|
1375 a 5 7 0 4 7 |
|
1376 a 6 7 0 7 0 |
|
1377 a 6 8 4 8 0 |
|
1378 a 7 9 0 15 3 |
|
1379 a 8 9 0 20 9 |
|
1380 c |
|
1381 c eof |
|
1382 \end{verbatim} |
|
1383 \end{footnotesize} |
|
1384 |
|
1385 \newpage |
|
1386 |
|
1387 \subsection{glp\_write\_mincost---write minimum cost flow problem\\data |
|
1388 in DIMACS format} |
|
1389 |
|
1390 \subsubsection*{Synopsis} |
|
1391 |
|
1392 \begin{verbatim} |
|
1393 int glp_write_mincost(glp_graph *G, int v_rhs, int a_low, |
|
1394 int a_cap, int a_cost, const char *fname); |
|
1395 \end{verbatim} |
|
1396 |
|
1397 \subsubsection*{Description} |
|
1398 |
|
1399 The routine \verb|glp_write_mincost| writes the minimum cost flow |
|
1400 problem data to a text file in DIMACS format. |
|
1401 |
|
1402 The parameter \verb|G| is the graph (network) program object, which |
|
1403 specifies the minimum cost flow problem instance. |
|
1404 |
|
1405 The parameter \verb|v_rhs| specifies an offset of the field of type |
|
1406 \verb|double| in the vertex data block, which contains $b_i$, the |
|
1407 supply/demand value. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$ |
|
1408 for all nodes. |
|
1409 |
|
1410 The parameter \verb|a_low| specifies an offset of the field of type |
|
1411 \verb|double| in the arc data block, which contains $l_{ij}$, the lower |
|
1412 bound to the arc flow. If \verb|a_low| $<0$, it is assumed that |
|
1413 $l_{ij}=0$ for all arcs. |
|
1414 |
|
1415 The parameter \verb|a_cap| specifies an offset of the field of type |
|
1416 \verb|double| in the arc data block, which contains $u_{ij}$, the upper |
|
1417 bound to the arc flow (the arc capacity). If the upper bound is |
|
1418 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. |
|
1419 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that |
|
1420 $u_{ij}=1$ for all arcs. |
|
1421 |
|
1422 The parameter \verb|a_cost| specifies an offset of the field of type |
|
1423 \verb|double| in the arc data block, which contains $c_{ij}$, the |
|
1424 per-unit cost of the arc flow. If \verb|a_cost| $<0$, it is assumed that |
|
1425 $c_{ij}=0$ for all arcs. |
|
1426 |
|
1427 The character string \verb|fname| specifies a name of the text file to |
|
1428 be written out. (If the file name ends with suffix `\verb|.gz|', the |
|
1429 file is assumed to be compressed, in which case the routine performs |
|
1430 automatic compression on writing it.) |
|
1431 |
|
1432 \subsubsection*{Returns} |
|
1433 |
|
1434 If the operation was successful, the routine returns zero. Otherwise, |
|
1435 it prints an error message and returns non-zero. |
|
1436 |
|
1437 \newpage |
|
1438 |
|
1439 \subsection{glp\_mincost\_lp---convert minimum cost flow problem\\to LP} |
|
1440 |
|
1441 \subsubsection*{Synopsis} |
|
1442 |
|
1443 \begin{verbatim} |
|
1444 void glp_mincost_lp(glp_prob *lp, glp_graph *G, int names, |
|
1445 int v_rhs, int a_low, int a_cap, int a_cost); |
|
1446 \end{verbatim} |
|
1447 |
|
1448 \subsubsection*{Description} |
|
1449 |
|
1450 The routine \verb|glp_mincost_lp| builds LP problem (1)---(3), which |
|
1451 corresponds to the specified minimum cost flow problem. |
|
1452 |
|
1453 The parameter \verb|lp| is the resultant LP problem object to be built. |
|
1454 Note that on entry its current content is erased with the routine |
|
1455 \verb|glp_erase_prob|. |
|
1456 |
|
1457 The parameter \verb|G| is the graph (network) program object, which |
|
1458 specifies the minimum cost flow problem instance. |
|
1459 |
|
1460 The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the |
|
1461 routine uses symbolic names of the graph object components to assign |
|
1462 symbolic names to the LP problem object components. If the flag is |
|
1463 \verb|GLP_OFF|, no symbolic names are assigned. |
|
1464 |
|
1465 The parameter \verb|v_rhs| specifies an offset of the field of type |
|
1466 \verb|double| in the vertex data block, which contains $b_i$, the |
|
1467 supply/demand value. If \verb|v_rhs| $<0$, it is assumed that $b_i=0$ |
|
1468 for all nodes. |
|
1469 |
|
1470 The parameter \verb|a_low| specifies an offset of the field of type |
|
1471 \verb|double| in the arc data block, which contains $l_{ij}$, the lower |
|
1472 bound to the arc flow. If \verb|a_low| $<0$, it is assumed that |
|
1473 $l_{ij}=0$ for all arcs. |
|
1474 |
|
1475 The parameter \verb|a_cap| specifies an offset of the field of type |
|
1476 \verb|double| in the arc data block, which contains $u_{ij}$, the upper |
|
1477 bound to the arc flow (the arc capacity). If the upper bound is |
|
1478 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. |
|
1479 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that |
|
1480 $u_{ij}=1$ for all arcs. |
|
1481 |
|
1482 The parameter \verb|a_cost| specifies an offset of the field of type |
|
1483 \verb|double| in the arc data block, which contains $c_{ij}$, the |
|
1484 per-unit cost of the arc flow. If \verb|a_cost| $<0$, it is assumed that |
|
1485 $c_{ij}=0$ for all arcs. |
|
1486 |
|
1487 \subsubsection*{Example} |
|
1488 |
|
1489 The example program below reads the minimum cost problem instance in |
|
1490 DIMACS format from file `\verb|sample.min|', converts the instance to |
|
1491 LP, and then writes the resultant LP in CPLEX format to file |
|
1492 `\verb|mincost.lp|'. |
|
1493 |
|
1494 \newpage |
|
1495 |
|
1496 \begin{footnotesize} |
|
1497 \begin{verbatim} |
|
1498 #include <stddef.h> |
|
1499 #include <glpk.h> |
|
1500 |
|
1501 typedef struct { double rhs; } v_data; |
|
1502 typedef struct { double low, cap, cost; } a_data; |
|
1503 |
|
1504 int main(void) |
|
1505 { glp_graph *G; |
|
1506 glp_prob *lp; |
|
1507 G = glp_create_graph(sizeof(v_data), sizeof(a_data)); |
|
1508 glp_read_mincost(G, offsetof(v_data, rhs), |
|
1509 offsetof(a_data, low), offsetof(a_data, cap), |
|
1510 offsetof(a_data, cost), "sample.min"); |
|
1511 lp = glp_create_prob(); |
|
1512 glp_mincost_lp(lp, G, GLP_ON, offsetof(v_data, rhs), |
|
1513 offsetof(a_data, low), offsetof(a_data, cap), |
|
1514 offsetof(a_data, cost)); |
|
1515 glp_delete_graph(G); |
|
1516 glp_write_lp(lp, NULL, "mincost.lp"); |
|
1517 glp_delete_prob(lp); |
|
1518 return 0; |
|
1519 } |
|
1520 \end{verbatim} |
|
1521 \end{footnotesize} |
|
1522 |
|
1523 If `\verb|sample.min|' is the example data file from the subsection |
|
1524 describing the routine \verb|glp_read_mincost|, file `\verb|mincost.lp|' |
|
1525 may look like follows: |
|
1526 |
|
1527 \begin{footnotesize} |
|
1528 \begin{verbatim} |
|
1529 Minimize |
|
1530 obj: + 3 x(2,4) + 2 x(2,3) + x(3,5) + 7 x(5,7) + 5 x(5,6) |
|
1531 + x(5,2) + 3 x(7,9) + 9 x(8,9) |
|
1532 |
|
1533 Subject To |
|
1534 r_1: + x(1,2) + x(1,4) = 20 |
|
1535 r_2: - x(5,2) + x(2,3) + x(2,4) - x(1,2) = 0 |
|
1536 r_3: + x(3,5) + x(3,8) - x(2,3) = 0 |
|
1537 r_4: + x(4,5) - x(2,4) - x(1,4) = 0 |
|
1538 r_5: + x(5,2) + x(5,6) + x(5,7) - x(4,5) - x(3,5) = 0 |
|
1539 r_6: + x(6,7) + x(6,8) - x(5,6) = 0 |
|
1540 r_7: + x(7,9) - x(6,7) - x(5,7) = 0 |
|
1541 r_8: + x(8,9) - x(6,8) - x(3,8) = 0 |
|
1542 r_9: - x(8,9) - x(7,9) = -20 |
|
1543 |
|
1544 Bounds |
|
1545 0 <= x(1,4) <= 23 |
|
1546 0 <= x(1,2) <= 14 |
|
1547 0 <= x(2,4) <= 9 |
|
1548 0 <= x(2,3) <= 10 |
|
1549 0 <= x(3,8) <= 18 |
|
1550 2 <= x(3,5) <= 12 |
|
1551 0 <= x(4,5) <= 26 |
|
1552 0 <= x(5,7) <= 4 |
|
1553 0 <= x(5,6) <= 25 |
|
1554 0 <= x(5,2) <= 11 |
|
1555 4 <= x(6,8) <= 8 |
|
1556 0 <= x(6,7) <= 7 |
|
1557 0 <= x(7,9) <= 15 |
|
1558 0 <= x(8,9) <= 20 |
|
1559 |
|
1560 End |
|
1561 \end{verbatim} |
|
1562 \end{footnotesize} |
|
1563 |
|
1564 \subsection{glp\_mincost\_okalg---solve minimum cost flow problem with |
|
1565 out-of-kilter algorithm} |
|
1566 |
|
1567 \subsubsection*{Synopsis} |
|
1568 |
|
1569 \begin{verbatim} |
|
1570 int glp_mincost_okalg(glp_graph *G, int v_rhs, int a_low, |
|
1571 int a_cap, int a_cost, double *sol, int a_x, int v_pi); |
|
1572 \end{verbatim} |
|
1573 |
|
1574 \subsubsection*{Description} |
|
1575 |
|
1576 The routine \verb|glp_mincost_okalg| finds optimal solution to the |
|
1577 minimum cost flow problem with the out-of-kilter |
|
1578 algorithm.\footnote{GLPK implementation of the out-of-kilter algorithm |
|
1579 is based on the following book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson, |
|
1580 ``Flows in Networks,'' The RAND Corp., Report R-375-PR (August 1962), |
|
1581 Chap. III ``Minimal Cost Flow Problems,'' pp.~113-26.} Note that this |
|
1582 routine requires all the problem data to be integer-valued. |
|
1583 |
|
1584 The parameter \verb|G| is a graph (network) program object which |
|
1585 specifies the minimum cost flow problem instance to be solved. |
|
1586 |
|
1587 The parameter \verb|v_rhs| specifies an offset of the field of type |
|
1588 \verb|double| in the vertex data block, which contains $b_i$, the |
|
1589 supply/demand value. This value must be integer in the range |
|
1590 [$-$\verb|INT_MAX|, $+$\verb|INT_MAX|]. If \verb|v_rhs| $<0$, it is |
|
1591 assumed that $b_i=0$ for all nodes. |
|
1592 |
|
1593 The parameter \verb|a_low| specifies an offset of the field of type |
|
1594 \verb|double| in the arc data block, which contains $l_{ij}$, the lower |
|
1595 bound to the arc flow. This bound must be integer in the range |
|
1596 [$0$, \verb|INT_MAX|]. If \verb|a_low| $<0$, it is assumed that |
|
1597 $l_{ij}=0$ for all arcs. |
|
1598 |
|
1599 The parameter \verb|a_cap| specifies an offset of the field of type |
|
1600 \verb|double| in the arc data block, which contains $u_{ij}$, the upper |
|
1601 bound to the arc flow (the arc capacity). This bound must be integer in |
|
1602 the range [$l_{ij}$, \verb|INT_MAX|]. If \verb|a_cap| $<0$, it is |
|
1603 assumed that $u_{ij}=1$ for all arcs. |
|
1604 |
|
1605 The parameter \verb|a_cost| specifies an offset of the field of type |
|
1606 \verb|double| in the arc data block, which contains $c_{ij}$, the |
|
1607 per-unit cost of the arc flow. This value must be integer in the range |
|
1608 [$-$\verb|INT_MAX|, $+$\verb|INT_MAX|]. If \verb|a_cost| $<0$, it is |
|
1609 assumed that $c_{ij}=0$ for all arcs. |
|
1610 |
|
1611 The parameter \verb|sol| specifies a location, to which the routine |
|
1612 stores the objective value (that is, the total cost) found. If |
|
1613 \verb|sol| is NULL, the objective value is not stored. |
|
1614 |
|
1615 The parameter \verb|a_x| specifies an offset of the field of type |
|
1616 \verb|double| in the arc data block, to which the routine stores |
|
1617 $x_{ij}$, the arc flow found. If \verb|a_x| $<0$, the arc flow value is |
|
1618 not stored. |
|
1619 |
|
1620 The parameter \verb|v_pi| specifies an offset of the field of type |
|
1621 \verb|double| in the vertex data block, to which the routine stores |
|
1622 $\pi_i$, the node potential, which is the Lagrange multiplier for the |
|
1623 corresponding flow conservation equality constraint (see (2) in |
|
1624 Subsection ``Background''). If necessary, the application program may |
|
1625 use the node potentials to compute $\lambda_{ij}$, reduced costs of the |
|
1626 arc flows $x_{ij}$, which are the Lagrange multipliers for the arc flow |
|
1627 bound constraints (see (3) ibid.), using the following formula: |
|
1628 $$\lambda_{ij}=c_{ij}-(\pi_i-\pi_j),$$ |
|
1629 where $c_{ij}$ is the per-unit cost for arc $(i,j)$. |
|
1630 |
|
1631 Note that all solution components (the objective value, arc flows, and |
|
1632 node potentials) computed by the routine are always integer-valued. |
|
1633 |
|
1634 \subsubsection*{Returns} |
|
1635 |
|
1636 \def\arraystretch{1} |
|
1637 |
|
1638 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
1639 0 & Optimal solution found.\\ |
|
1640 \verb|GLP_ENOPFS| & No (primal) feasible solution exists.\\ |
|
1641 \verb|GLP_EDATA| & Unable to start the search, because some problem |
|
1642 data are either not integer-valued or out of range. This code is also |
|
1643 returned if the total supply, which is the sum of $b_i$ over all source |
|
1644 nodes (nodes with $b_i>0$), exceeds \verb|INT_MAX|.\\ |
|
1645 \end{tabular} |
|
1646 |
|
1647 \noindent |
|
1648 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
1649 \verb|GLP_ERANGE| & The search was prematurely terminated because of |
|
1650 integer overflow.\\ |
|
1651 \verb|GLP_EFAIL| & An error has been detected in the program logic. |
|
1652 (If this code is returned for your problem instance, please report to |
|
1653 \verb|<bug-glpk@gnu.org>|.)\\ |
|
1654 \end{tabular} |
|
1655 |
|
1656 \subsubsection*{Comments} |
|
1657 |
|
1658 By design the out-of-kilter algorithm is applicable only to networks, |
|
1659 where $b_i=0$ for {\it all} nodes, i.e. actually this algorithm finds a |
|
1660 minimal cost {\it circulation}. Due to this requirement the routine |
|
1661 \verb|glp_mincost_okalg| converts the original network to a network |
|
1662 suitable for the out-of-kilter algorithm in the following |
|
1663 way:\footnote{The conversion is performed internally and does not change |
|
1664 the original network program object passed to the routine.} |
|
1665 |
|
1666 1) it adds two auxiliary nodes $s$ and $t$; |
|
1667 |
|
1668 2) for each original node $i$ with $b_i>0$ the routine adds auxiliary |
|
1669 supply arc $(s\rightarrow i)$, flow $x_{si}$ through which is costless |
|
1670 ($c_{si}=0$) and fixed to $+b_i$ ($l_{si}=u_{si}=+b_i$); |
|
1671 |
|
1672 3) for each original node $i$ with $b_i<0$ the routine adds auxiliary |
|
1673 demand arc $(i\rightarrow t)$, flow $x_{it}$ through which is costless |
|
1674 ($c_{it}=0$) and fixed to $-b_i$ ($l_{it}=u_{it}=-b_i$); |
|
1675 |
|
1676 4) finally, the routine adds auxiliary feedback arc $(t\rightarrow s)$, |
|
1677 flow $x_{ts}$ through which is also costless ($c_{ts}=0$) and fixed to |
|
1678 $F$ ($l_{ts}=u_{ts}=F$), where $\displaystyle F=\sum_{b_i>0}b_i$ is the |
|
1679 total supply. |
|
1680 |
|
1681 \subsubsection*{Example} |
|
1682 |
|
1683 The example program below reads the minimum cost problem instance in |
|
1684 DIMACS format from file `\verb|sample.min|', solves it by using the |
|
1685 routine \verb|glp_mincost_okalg|, and writes the solution found to the |
|
1686 standard output. |
|
1687 |
|
1688 \begin{footnotesize} |
|
1689 \begin{verbatim} |
|
1690 #include <stddef.h> |
|
1691 #include <stdio.h> |
|
1692 #include <stdlib.h> |
|
1693 #include <glpk.h> |
|
1694 |
|
1695 typedef struct { double rhs, pi; } v_data; |
|
1696 typedef struct { double low, cap, cost, x; } a_data; |
|
1697 |
|
1698 #define node(v) ((v_data *)((v)->data)) |
|
1699 #define arc(a) ((a_data *)((a)->data)) |
|
1700 |
|
1701 int main(void) |
|
1702 { glp_graph *G; |
|
1703 glp_vertex *v, *w; |
|
1704 glp_arc *a; |
|
1705 int i, ret; |
|
1706 double sol; |
|
1707 G = glp_create_graph(sizeof(v_data), sizeof(a_data)); |
|
1708 glp_read_mincost(G, offsetof(v_data, rhs), |
|
1709 offsetof(a_data, low), offsetof(a_data, cap), |
|
1710 offsetof(a_data, cost), "sample.min"); |
|
1711 ret = glp_mincost_okalg(G, offsetof(v_data, rhs), |
|
1712 offsetof(a_data, low), offsetof(a_data, cap), |
|
1713 offsetof(a_data, cost), &sol, offsetof(a_data, x), |
|
1714 offsetof(v_data, pi)); |
|
1715 printf("ret = %d; sol = %5g\n", ret, sol); |
|
1716 for (i = 1; i <= G->nv; i++) |
|
1717 { v = G->v[i]; |
|
1718 printf("node %d: pi = %5g\n", i, node(v)->pi); |
|
1719 for (a = v->out; a != NULL; a = a->t_next) |
|
1720 { w = a->head; |
|
1721 printf("arc %d->%d: x = %5g; lambda = %5g\n", |
|
1722 v->i, w->i, arc(a)->x, |
|
1723 arc(a)->cost - (node(v)->pi - node(w)->pi)); |
|
1724 } |
|
1725 } |
|
1726 glp_delete_graph(G); |
|
1727 return 0; |
|
1728 } |
|
1729 \end{verbatim} |
|
1730 \end{footnotesize} |
|
1731 |
|
1732 If `\verb|sample.min|' is the example data file from the subsection |
|
1733 describing the routine \verb|glp_read_mincost|, the output may look like |
|
1734 follows: |
|
1735 |
|
1736 \begin{footnotesize} |
|
1737 \begin{verbatim} |
|
1738 Reading min-cost flow problem data from `sample.min'... |
|
1739 Flow network has 9 nodes and 14 arcs |
|
1740 24 lines were read |
|
1741 ret = 0; sol = 213 |
|
1742 node 1: pi = -12 |
|
1743 arc 1->4: x = 13; lambda = 0 |
|
1744 arc 1->2: x = 7; lambda = 0 |
|
1745 node 2: pi = -12 |
|
1746 arc 2->4: x = 0; lambda = 3 |
|
1747 arc 2->3: x = 7; lambda = 0 |
|
1748 node 3: pi = -14 |
|
1749 arc 3->8: x = 5; lambda = 0 |
|
1750 arc 3->5: x = 2; lambda = 3 |
|
1751 node 4: pi = -12 |
|
1752 arc 4->5: x = 13; lambda = 0 |
|
1753 node 5: pi = -12 |
|
1754 arc 5->7: x = 4; lambda = -1 |
|
1755 arc 5->6: x = 11; lambda = 0 |
|
1756 arc 5->2: x = 0; lambda = 1 |
|
1757 node 6: pi = -17 |
|
1758 arc 6->8: x = 4; lambda = 3 |
|
1759 arc 6->7: x = 7; lambda = -3 |
|
1760 node 7: pi = -20 |
|
1761 arc 7->9: x = 11; lambda = 0 |
|
1762 node 8: pi = -14 |
|
1763 arc 8->9: x = 9; lambda = 0 |
|
1764 node 9: pi = -23 |
|
1765 \end{verbatim} |
|
1766 \end{footnotesize} |
|
1767 |
|
1768 \subsection{glp\_netgen---Klingman's network problem generator} |
|
1769 |
|
1770 \subsubsection*{Synopsis} |
|
1771 |
|
1772 \begin{verbatim} |
|
1773 int glp_netgen(glp_graph *G, int v_rhs, int a_cap, int a_cost, |
|
1774 const int parm[1+15]); |
|
1775 \end{verbatim} |
|
1776 |
|
1777 \subsubsection*{Description} |
|
1778 |
|
1779 The routine \verb|glp_netgen| is a GLPK version of the network problem |
|
1780 generator developed by Dr.~Darwin~Klingman.\footnote{D.~Klingman, |
|
1781 A.~Napier, and J.~Stutz. NETGEN: A program for generating large scale |
|
1782 capacitated assignment, transportation, and minimum cost flow networks. |
|
1783 Management Science 20 (1974), 814-20.} It can create capacitated and |
|
1784 uncapacitated minimum cost flow (or transshipment), transportation, and |
|
1785 assignment problems. |
|
1786 |
|
1787 The parameter \verb|G| specifies the graph object, to which the |
|
1788 generated problem data have to be stored. Note that on entry the graph |
|
1789 object is erased with the routine \verb|glp_erase_graph|. |
|
1790 |
|
1791 The parameter \verb|v_rhs| specifies an offset of the field of type |
|
1792 \verb|double| in the vertex data block, to which the routine stores the |
|
1793 supply or demand value. If \verb|v_rhs| $<0$, the value is not stored. |
|
1794 |
|
1795 The parameter \verb|a_cap| specifies an offset of the field of type |
|
1796 \verb|double| in the arc data block, to which the routine stores the |
|
1797 arc capacity. If \verb|a_cap| $<0$, the capacity is not stored. |
|
1798 |
|
1799 The parameter \verb|a_cost| specifies an offset of the field of type |
|
1800 \verb|double| in the arc data block, to which the routine stores the |
|
1801 per-unit cost if the arc flow. If \verb|a_cost| $<0$, the cost is not |
|
1802 stored. |
|
1803 |
|
1804 The array \verb|parm| contains description of the network to be |
|
1805 generated: |
|
1806 |
|
1807 \begin{tabular}{@{}lll@{}} |
|
1808 \verb|parm[0] |& ¬ used\\ |
|
1809 \verb|parm[1] |&\verb|iseed |&8-digit positive random number seed\\ |
|
1810 \verb|parm[2] |&\verb|nprob |&8-digit problem id number\\ |
|
1811 \verb|parm[3] |&\verb|nodes |&total number of nodes\\ |
|
1812 \verb|parm[4] |&\verb|nsorc |&total number of source nodes\\ |
|
1813 &&(including transshipment nodes)\\ |
|
1814 \verb|parm[5] |&\verb|nsink |&total number of sink nodes\\ |
|
1815 &&(including transshipment nodes)\\ |
|
1816 \verb|parm[6] |&\verb|iarcs |&number of arc\\ |
|
1817 \verb|parm[7] |&\verb|mincst|&minimum cost for arcs\\ |
|
1818 \verb|parm[8] |&\verb|maxcst|&maximum cost for arcs\\ |
|
1819 \verb|parm[9] |&\verb|itsup |&total supply\\ |
|
1820 \end{tabular} |
|
1821 |
|
1822 \begin{tabular}{@{}lll@{}} |
|
1823 \verb|parm[10]|&\verb|ntsorc|&number of transshipment source nodes\\ |
|
1824 \verb|parm[11]|&\verb|ntsink|&number of transshipment sink nodes\\ |
|
1825 \verb|parm[12]|&\verb|iphic |&percentage of skeleton arcs to be given |
|
1826 the maxi-\\&&mum cost\\ |
|
1827 \verb|parm[13]|&\verb|ipcap |&percentage of arcs to be capacitated\\ |
|
1828 \verb|parm[14]|&\verb|mincap|&minimum upper bound for capacitated arcs\\ |
|
1829 \verb|parm[15]|&\verb|maxcap|&maximum upper bound for capacitated arcs\\ |
|
1830 \end{tabular} |
|
1831 |
|
1832 \subsubsection*{Notes} |
|
1833 |
|
1834 \noindent\indent |
|
1835 1. The routine generates a transportation problem if: |
|
1836 $${\tt nsorc}+{\tt nsink}={\tt nodes}, |
|
1837 \ {\tt ntsorc}=0,\ \mbox{and}\ {\tt ntsink}=0.$$ |
|
1838 |
|
1839 2. The routine generates an assignment problem if the requirements for |
|
1840 a transportation problem are met and: |
|
1841 $${\tt nsorc}={\tt nsink}\ \mbox{and}\ {\tt itsup}={\tt nsorc}.$$ |
|
1842 |
|
1843 3. The routine always generates connected graphs. So, if the number of |
|
1844 requested arcs has been reached and the generated instance is not fully |
|
1845 connected, the routine generates a few remaining arcs to ensure |
|
1846 connectedness. Thus, the actual number of arcs generated by the routine |
|
1847 may be greater than the requested number of arcs. |
|
1848 |
|
1849 \subsubsection*{Returns} |
|
1850 |
|
1851 If the instance was successfully generated, the routine |
|
1852 \verb|glp_netgen| returns zero; otherwise, if specified parameters are |
|
1853 inconsistent, the routine returns a non-zero error code. |
|
1854 |
|
1855 \subsection{glp\_gridgen---grid-like network problem generator} |
|
1856 |
|
1857 \subsubsection*{Synopsis} |
|
1858 |
|
1859 \begin{verbatim} |
|
1860 int glp_gridgen(glp_graph *G, int v_rhs, int a_cap, int a_cost, |
|
1861 const int parm[1+14]); |
|
1862 \end{verbatim} |
|
1863 |
|
1864 \subsubsection*{Description} |
|
1865 |
|
1866 The routine \verb|glp_gridgen| is a GLPK version of the grid-like |
|
1867 network problem generator developed by Yusin Lee and Jim |
|
1868 Orlin.\footnote{Y.~Lee and J.~Orlin. GRIDGEN generator., 1991. The |
|
1869 original code is publically available from |
|
1870 {\tt<ftp://dimacs.rutgers.edu/pub/netflow/generators/network/gridgen>}.} |
|
1871 |
|
1872 The parameter \verb|G| specifies the graph object, to which the |
|
1873 generated problem data have to be stored. Note that on entry the graph |
|
1874 object is erased with the routine \verb|glp_erase_graph|. |
|
1875 |
|
1876 The parameter \verb|v_rhs| specifies an offset of the field of type |
|
1877 \verb|double| in the vertex data block, to which the routine stores the |
|
1878 supply or demand value. If \verb|v_rhs| $<0$, the value is not stored. |
|
1879 |
|
1880 The parameter \verb|a_cap| specifies an offset of the field of type |
|
1881 \verb|double| in the arc data block, to which the routine stores the |
|
1882 arc capacity. If \verb|a_cap| $<0$, the capacity is not stored. |
|
1883 |
|
1884 The parameter \verb|a_cost| specifies an offset of the field of type |
|
1885 \verb|double| in the arc data block, to which the routine stores the |
|
1886 per-unit cost if the arc flow. If \verb|a_cost| $<0$, the cost is not |
|
1887 stored. |
|
1888 |
|
1889 The array \verb|parm| contains parameters of the network to be |
|
1890 generated: |
|
1891 |
|
1892 \begin{tabular}{@{}ll@{}} |
|
1893 \verb|parm[0] |¬ used\\ |
|
1894 \verb|parm[1] |&two-ways arcs indicator:\\ |
|
1895 &1 --- if links in both direction should be generated\\ |
|
1896 &0 --- otherwise\\ |
|
1897 \verb|parm[2] |&random number seed (a positive integer)\\ |
|
1898 \verb|parm[3] |&number of nodes (the number of nodes generated might |
|
1899 be\\&slightly different to make the network a grid)\\ |
|
1900 \verb|parm[4] |&grid width\\ |
|
1901 \verb|parm[5] |&number of sources\\ |
|
1902 \verb|parm[6] |&number of sinks\\ |
|
1903 \verb|parm[7] |&average degree\\ |
|
1904 \verb|parm[8] |&total flow\\ |
|
1905 \verb|parm[9] |&distribution of arc costs:\\ |
|
1906 &1 --- uniform\\ |
|
1907 &2 --- exponential\\ |
|
1908 \verb|parm[10]|&lower bound for arc cost (uniform)\\ |
|
1909 &$100\lambda$ (exponential)\\ |
|
1910 \verb|parm[11]|&upper bound for arc cost (uniform)\\ |
|
1911 ¬ used (exponential)\\ |
|
1912 \verb|parm[12]|&distribution of arc capacities:\\ |
|
1913 &1 --- uniform\\ |
|
1914 &2 --- exponential\\ |
|
1915 \verb|parm[13]|&lower bound for arc capacity (uniform)\\ |
|
1916 &$100\lambda$ (exponential)\\ |
|
1917 \verb|parm[14]|&upper bound for arc capacity (uniform)\\ |
|
1918 ¬ used (exponential)\\ |
|
1919 \end{tabular} |
|
1920 |
|
1921 \subsubsection*{Returns} |
|
1922 |
|
1923 If the instance was successfully generated, the routine |
|
1924 \verb|glp_gridgen| returns zero; otherwise, if specified parameters are |
|
1925 inconsistent, the routine returns a non-zero error code. |
|
1926 |
|
1927 \subsubsection*{Comments\footnote{This material is based on comments |
|
1928 to the original version of GRIDGEN.}} |
|
1929 |
|
1930 This network generator generates a grid-like network plus a super node. |
|
1931 In additional to the arcs connecting the nodes in the grid, there is an |
|
1932 arc from each supply node to the super node and from the super node to |
|
1933 each demand node to guarantee feasiblity. These arcs have very high |
|
1934 costs and very big capacities. |
|
1935 |
|
1936 The idea of this network generator is as follows: First, a grid of |
|
1937 $n_1\times n_2$ is generated. For example, $5\times 3$. The nodes are |
|
1938 numbered as 1 to 15, and the supernode is numbered as $n_1\times n_2+1$. |
|
1939 Then arcs between adjacent nodes are generated. For these arcs, the user |
|
1940 is allowed to specify either to generate two-way arcs or one-way arcs. |
|
1941 If two-way arcs are to be generated, two arcs, one in each direction, |
|
1942 will be generated between each adjacent node pairs. Otherwise, only one |
|
1943 arc will be generated. If this is the case, the arcs will be generated |
|
1944 in alterntive directions as shown below. |
|
1945 |
|
1946 \bigskip |
|
1947 |
|
1948 \noindent\hfil |
|
1949 \xymatrix |
|
1950 {1\ar[r]\ar[d]&2\ar[r]&3\ar[r]\ar[d]&4\ar[r]&5\ar[d]\\ |
|
1951 6\ar[d]&7\ar[l]\ar[u]&8\ar[l]\ar[d]&9\ar[l]\ar[u]&10\ar[l]\ar[d]\\ |
|
1952 11\ar[r]&12\ar[r]\ar[u]&13\ar[r]&14\ar[r]\ar[u]&15\\ |
|
1953 } |
|
1954 |
|
1955 \bigskip |
|
1956 |
|
1957 Then the arcs between the super node and the source/sink nodes are added |
|
1958 as mentioned before. If the number of arcs still doesn't reach the |
|
1959 requirement, additional arcs will be added by uniformly picking random |
|
1960 node pairs. There is no checking to prevent multiple arcs between any |
|
1961 pair of nodes. However, there will be no self-arcs (arcs that poins back |
|
1962 to its tail node) in the network. |
|
1963 |
|
1964 The source and sink nodes are selected uniformly in the network, and |
|
1965 the imbalances of each source/sink node are also assigned by uniform |
|
1966 distribution. |
|
1967 |
|
1968 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
1969 |
|
1970 \newpage |
|
1971 |
|
1972 \section{Maximum flow problem} |
|
1973 |
|
1974 \subsection{Background} |
|
1975 |
|
1976 The {\it maximum flow problem} (MAXFLOW) is stated as follows. Let |
|
1977 there be given a directed graph (flow network) $G=(V,A)$, where $V$ is |
|
1978 a set of vertices (nodes), and $A\subseteq V\times V$ is a set of arcs. |
|
1979 Let also for each arc $a=(i,j)\in A$ there be given its capacity |
|
1980 $u_{ij}$. The problem is, for given {\it source} node $s\in V$ and |
|
1981 {\it sink} node $t\in V$, to find flows $x_{ij}$ through every arc of |
|
1982 the network, which satisfy the specified arc capacities and the |
|
1983 conservation constraints at all nodes, and maximize the total flow $F$ |
|
1984 through the network from $s$ to $t$. Here the conservation constraint |
|
1985 at a node means that the total flow entering this node through its |
|
1986 incoming arcs (plus $F$, if it is the source node) must be equal to the |
|
1987 total flow leaving this node through its outgoing arcs (plus $F$, if it |
|
1988 is the sink node). |
|
1989 |
|
1990 An example of the maximum flow problem, where $s=v_1$ and $t=v_9$, is |
|
1991 shown on Fig.~2. |
|
1992 |
|
1993 \bigskip |
|
1994 |
|
1995 \noindent\hfil |
|
1996 \xymatrix @C=48pt |
|
1997 {_{F}\ar@{~>}[d]& |
|
1998 v_2\ar[r]|{_{10}}\ar[dd]|{_{9}}& |
|
1999 v_3\ar[dd]|{_{12}}\ar[r]|{_{18}}& |
|
2000 v_8\ar[rd]|{_{20}}&\\ |
|
2001 v_1\ar[ru]|{_{14}}\ar[rd]|{_{23}}&&& |
|
2002 v_6\ar[d]|{_{7}}\ar[u]|{_{8}}& |
|
2003 v_9\ar@{~>}[d]\\ |
|
2004 &v_4\ar[r]|{_{26}}& |
|
2005 v_5\ar[luu]|{_{11}}\ar[ru]|{_{25}}\ar[r]|{_{4}}& |
|
2006 v_7\ar[ru]|{_{15}}&_{F}\\ |
|
2007 } |
|
2008 |
|
2009 \bigskip |
|
2010 |
|
2011 \noindent\hfil |
|
2012 Fig.~2. An example of the maximum flow problem. |
|
2013 |
|
2014 \bigskip |
|
2015 |
|
2016 The maximum flow problem can be naturally formulated as the following |
|
2017 LP problem: |
|
2018 |
|
2019 \medskip |
|
2020 |
|
2021 \noindent |
|
2022 \hspace{.5in}maximize |
|
2023 $$F\eqno(4)$$ |
|
2024 \hspace{.5in}subject to |
|
2025 $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}=\left\{ |
|
2026 \begin{array}{@{\ }rl} |
|
2027 +F,&\hbox{for}\ i=s\\ |
|
2028 0,&\hbox{for all}\ i\in V\backslash\{s,t\}\\ |
|
2029 -F,&\hbox{for}\ i=t\\ |
|
2030 \end{array} |
|
2031 \right.\eqno(5) |
|
2032 $$ |
|
2033 $$0\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A |
|
2034 \eqno(6)$$ |
|
2035 |
|
2036 \medskip |
|
2037 |
|
2038 \noindent |
|
2039 where $F\geq 0$ is an additional variable playing the role of the |
|
2040 objective. |
|
2041 |
|
2042 \newpage |
|
2043 |
|
2044 Another LP formulation of the maximum flow problem, which does not |
|
2045 include the variable $F$, is the following: |
|
2046 |
|
2047 \medskip |
|
2048 |
|
2049 \noindent |
|
2050 \hspace{.5in}maximize |
|
2051 $$z=\sum_{(s,j)\in A}x_{sj}-\sum_{(j,s)\in A}x_{js}\ (=F)\eqno(7)$$ |
|
2052 \hspace{.5in}subject to |
|
2053 $$\sum_{(i,j)\in A}x_{ij}-\sum_{(j,i)\in A}x_{ji}\left\{ |
|
2054 \begin{array}{@{\ }rl} |
|
2055 \geq 0,&\hbox{for}\ i=s\\ |
|
2056 =0,&\hbox{for all}\ i\in V\backslash\{s,t\}\\ |
|
2057 \leq 0,&\hbox{for}\ i=t\\ |
|
2058 \end{array} |
|
2059 \right.\eqno(8) |
|
2060 $$ |
|
2061 $$0\leq x_{ij}\leq u_{ij}\ \ \ \hbox{for all}\ (i,j)\in A |
|
2062 \eqno(9)$$ |
|
2063 |
|
2064 \subsection{glp\_read\_maxflow---read maximum flow problem data\\in |
|
2065 DIMACS format} |
|
2066 |
|
2067 \subsubsection*{Synopsis} |
|
2068 |
|
2069 \begin{verbatim} |
|
2070 int glp_read_maxflow(glp_graph *G, int *s, int *t, int a_cap, |
|
2071 const char *fname); |
|
2072 \end{verbatim} |
|
2073 |
|
2074 \subsubsection*{Description} |
|
2075 |
|
2076 The routine \verb|glp_read_maxflow| reads the maximum flow problem |
|
2077 data from a text file in DIMACS format. |
|
2078 |
|
2079 The parameter \verb|G| specifies the graph object, to which the problem |
|
2080 data have to be stored. Note that before reading data the current |
|
2081 content of the graph object is completely erased with the routine |
|
2082 \verb|glp_erase_graph|. |
|
2083 |
|
2084 The pointer \verb|s| specifies a location, to which the routine stores |
|
2085 the ordinal number of the source node. If \verb|s| is \verb|NULL|, the |
|
2086 source node number is not stored. |
|
2087 |
|
2088 The pointer \verb|t| specifies a location, to which the routine stores |
|
2089 the ordinal number of the sink node. If \verb|t| is \verb|NULL|, the |
|
2090 sink node number is not stored. |
|
2091 |
|
2092 The parameter \verb|a_cap| specifies an offset of the field of type |
|
2093 \verb|double| in the arc data block, to which the routine stores |
|
2094 $u_{ij}$, the arc capacity. If \verb|a_cap| $<0$, the arc capacity is |
|
2095 not stored. |
|
2096 |
|
2097 The character string \verb|fname| specifies the name of a text file to |
|
2098 be read in. (If the file name name ends with the suffix `\verb|.gz|', |
|
2099 the file is assumed to be compressed, in which case the routine |
|
2100 decompresses it ``on the fly''.) |
|
2101 |
|
2102 \subsubsection*{Returns} |
|
2103 |
|
2104 If the operation was successful, the routine returns zero. Otherwise, |
|
2105 it prints an error message and returns non-zero. |
|
2106 |
|
2107 \subsubsection*{Example} |
|
2108 |
|
2109 \begin{footnotesize} |
|
2110 \begin{verbatim} |
|
2111 typedef struct |
|
2112 { /* arc data block */ |
|
2113 ... |
|
2114 double cap; |
|
2115 ... |
|
2116 } a_data; |
|
2117 |
|
2118 int main(void) |
|
2119 { glp_graph *G; |
|
2120 int s, t, ret; |
|
2121 G = glp_create_graph(..., sizeof(a_data)); |
|
2122 ret = glp_read_maxflow(G, &s, &t, offsetof(a_data, cap), |
|
2123 "sample.max"); |
|
2124 if (ret != 0) goto ... |
|
2125 ... |
|
2126 } |
|
2127 \end{verbatim} |
|
2128 \end{footnotesize} |
|
2129 |
|
2130 \subsubsection*{DIMACS maximum flow problem format\footnote{This |
|
2131 material is based on the paper ``The First DIMACS International |
|
2132 Algorithm Implementation Challenge: Problem Definitions and |
|
2133 Specifications'', which is publically available at |
|
2134 {\tt http://dimacs.rutgers.edu/Challenges/}.}} |
|
2135 \label{subsecmaxflow} |
|
2136 |
|
2137 The DIMACS input file is a plain ASCII text file. It contains |
|
2138 {\it lines} of several types described below. A line is terminated with |
|
2139 an end-of-line character. Fields in each line are separated by at least |
|
2140 one blank space. Each line begins with a one-character designator to |
|
2141 identify the line type. |
|
2142 |
|
2143 Note that DIMACS requires all numerical quantities to be integers in |
|
2144 the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be |
|
2145 floating-point numbers. |
|
2146 |
|
2147 \paragraph{Comment lines.} Comment lines give human-readable information |
|
2148 about the file and are ignored by programs. Comment lines can appear |
|
2149 anywhere in the file. Each comment line begins with a lower-case |
|
2150 character \verb|c|. |
|
2151 |
|
2152 \begin{verbatim} |
|
2153 c This is a comment line |
|
2154 \end{verbatim} |
|
2155 |
|
2156 \newpage |
|
2157 |
|
2158 \paragraph{Problem line.} There is one problem line per data file. The |
|
2159 problem line must appear before any node or arc descriptor lines. It has |
|
2160 the following format: |
|
2161 |
|
2162 \begin{verbatim} |
|
2163 p max NODES ARCS |
|
2164 \end{verbatim} |
|
2165 |
|
2166 \noindent |
|
2167 The lower-case character \verb|p| signifies that this is a problem line. |
|
2168 The three-character problem designator \verb|max| identifies the file as |
|
2169 containing specification information for the maximum flow problem. The |
|
2170 \verb|NODES| field contains an integer value specifying the number of |
|
2171 nodes in the network. The \verb|ARCS| field contains an integer value |
|
2172 specifying the number of arcs in the network. |
|
2173 |
|
2174 \paragraph{Node descriptors.} Two node descriptor lines for the source |
|
2175 and sink nodes must appear before all arc descriptor lines. They may |
|
2176 appear in either order, each with the following format: |
|
2177 |
|
2178 \begin{verbatim} |
|
2179 n ID WHICH |
|
2180 \end{verbatim} |
|
2181 |
|
2182 \noindent |
|
2183 The lower-case character \verb|n| signifies that this a node descriptor |
|
2184 line. The \verb|ID| field gives a node identification number, an integer |
|
2185 between 1 and \verb|NODES|. The \verb|WHICH| field gives either a |
|
2186 lower-case \verb|s| or \verb|t|, designating the source and sink, |
|
2187 respectively. |
|
2188 |
|
2189 \paragraph{Arc descriptors.} There is one arc descriptor line for each |
|
2190 arc in the network. Arc descriptor lines are of the following format: |
|
2191 |
|
2192 \begin{verbatim} |
|
2193 a SRC DST CAP |
|
2194 \end{verbatim} |
|
2195 |
|
2196 \noindent |
|
2197 The lower-case character \verb|a| signifies that this is an arc |
|
2198 descriptor line. For a directed arc $(i,j)$ the \verb|SRC| field gives |
|
2199 the identification number $i$ for the tail endpoint, and the \verb|DST| |
|
2200 field gives the identification number $j$ for the head endpoint. |
|
2201 Identification numbers are integers between 1 and \verb|NODES|. The |
|
2202 \verb|CAP| field gives the arc capacity, i.e. maximum amount of flow |
|
2203 that can be sent along arc $(i,j)$ in a feasible flow. |
|
2204 |
|
2205 \paragraph{Example.} Below here is an example of the data file in |
|
2206 DIMACS format corresponding to the maximum flow problem shown on Fig~2. |
|
2207 |
|
2208 \newpage |
|
2209 |
|
2210 \begin{footnotesize} |
|
2211 \begin{verbatim} |
|
2212 c sample.max |
|
2213 c |
|
2214 c This is an example of the maximum flow problem data |
|
2215 c in DIMACS format. |
|
2216 c |
|
2217 p max 9 14 |
|
2218 c |
|
2219 n 1 s |
|
2220 n 9 t |
|
2221 c |
|
2222 a 1 2 14 |
|
2223 a 1 4 23 |
|
2224 a 2 3 10 |
|
2225 a 2 4 9 |
|
2226 a 3 5 12 |
|
2227 a 3 8 18 |
|
2228 a 4 5 26 |
|
2229 a 5 2 11 |
|
2230 a 5 6 25 |
|
2231 a 5 7 4 |
|
2232 a 6 7 7 |
|
2233 a 6 8 8 |
|
2234 a 7 9 15 |
|
2235 a 8 9 20 |
|
2236 c |
|
2237 c eof |
|
2238 \end{verbatim} |
|
2239 \end{footnotesize} |
|
2240 |
|
2241 \subsection{glp\_write\_maxflow---write maximum flow problem data\\ |
|
2242 in DIMACS format} |
|
2243 |
|
2244 \subsubsection*{Synopsis} |
|
2245 |
|
2246 \begin{verbatim} |
|
2247 int glp_write_maxflow(glp_graph *G, int s, int t, int a_cap, |
|
2248 const char *fname); |
|
2249 \end{verbatim} |
|
2250 |
|
2251 \subsubsection*{Description} |
|
2252 |
|
2253 The routine \verb|glp_write_maxflow| writes the maximum flow problem |
|
2254 data to a text file in DIMACS format. |
|
2255 |
|
2256 The parameter \verb|G| is the graph (network) program object, which |
|
2257 specifies the maximum flow problem instance. |
|
2258 |
|
2259 The parameter \verb|s| specifies the ordinal number of the source node. |
|
2260 |
|
2261 The parameter \verb|t| specifies the ordinal number of the sink node. |
|
2262 |
|
2263 The parameter \verb|a_cap| specifies an offset of the field of type |
|
2264 \verb|double| in the arc data block, which contains $u_{ij}$, the upper |
|
2265 bound to the arc flow (the arc capacity). If the upper bound is |
|
2266 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. |
|
2267 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that |
|
2268 $u_{ij}=1$ for all arcs. |
|
2269 |
|
2270 The character string \verb|fname| specifies a name of the text file to |
|
2271 be written out. (If the file name ends with suffix `\verb|.gz|', the |
|
2272 file is assumed to be compressed, in which case the routine performs |
|
2273 automatic compression on writing it.) |
|
2274 |
|
2275 \subsubsection*{Returns} |
|
2276 |
|
2277 If the operation was successful, the routine returns zero. Otherwise, |
|
2278 it prints an error message and returns non-zero. |
|
2279 |
|
2280 \subsection{glp\_maxflow\_lp---convert maximum flow problem to LP} |
|
2281 |
|
2282 \subsubsection*{Synopsis} |
|
2283 |
|
2284 \begin{verbatim} |
|
2285 void glp_maxflow_lp(glp_prob *lp, glp_graph *G, int names, |
|
2286 int s, int t, int a_cap); |
|
2287 \end{verbatim} |
|
2288 |
|
2289 \subsubsection*{Description} |
|
2290 |
|
2291 The routine \verb|glp_maxflow_lp| builds LP problem (7)---(9), which |
|
2292 corresponds to the specified maximum flow problem. |
|
2293 |
|
2294 The parameter \verb|lp| is the resultant LP problem object to be built. |
|
2295 Note that on entry its current content is erased with the routine |
|
2296 \verb|glp_erase_prob|. |
|
2297 |
|
2298 The parameter \verb|G| is the graph (network) program object, which |
|
2299 specifies the maximum flow problem instance. |
|
2300 |
|
2301 The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the |
|
2302 routine uses symbolic names of the graph object components to assign |
|
2303 symbolic names to the LP problem object components. If the flag is |
|
2304 \verb|GLP_OFF|, no symbolic names are assigned. |
|
2305 |
|
2306 The parameter \verb|s| specifies the ordinal number of the source node. |
|
2307 |
|
2308 The parameter \verb|t| specifies the ordinal number of the sink node. |
|
2309 |
|
2310 The parameter \verb|a_cap| specifies an offset of the field of type |
|
2311 \verb|double| in the arc data block, which contains $u_{ij}$, the upper |
|
2312 bound to the arc flow (the arc capacity). If the upper bound is |
|
2313 specified as \verb|DBL_MAX|, it is assumed that $u_{ij}=\infty$, i.e. |
|
2314 the arc is uncapacitated. If \verb|a_cap| $<0$, it is assumed that |
|
2315 $u_{ij}=1$ for all arcs. |
|
2316 |
|
2317 \subsubsection*{Example} |
|
2318 |
|
2319 The example program below reads the maximum flow problem in DIMACS |
|
2320 format from file `\verb|sample.max|', converts the instance to LP, and |
|
2321 then writes the resultant LP in CPLEX format to file |
|
2322 `\verb|maxflow.lp|'. |
|
2323 |
|
2324 \begin{footnotesize} |
|
2325 \begin{verbatim} |
|
2326 #include <stddef.h> |
|
2327 #include <glpk.h> |
|
2328 |
|
2329 int main(void) |
|
2330 { glp_graph *G; |
|
2331 glp_prob *lp; |
|
2332 int s, t; |
|
2333 G = glp_create_graph(0, sizeof(double)); |
|
2334 glp_read_maxflow(G, &s, &t, 0, "sample.max"); |
|
2335 lp = glp_create_prob(); |
|
2336 glp_maxflow_lp(lp, G, GLP_ON, s, t, 0); |
|
2337 glp_delete_graph(G); |
|
2338 glp_write_lp(lp, NULL, "maxflow.lp"); |
|
2339 glp_delete_prob(lp); |
|
2340 return 0; |
|
2341 } |
|
2342 \end{verbatim} |
|
2343 \end{footnotesize} |
|
2344 |
|
2345 If `\verb|sample.max|' is the example data file from the previous |
|
2346 subsection, the output `\verb|maxflow.lp|' may look like follows: |
|
2347 |
|
2348 \begin{footnotesize} |
|
2349 \begin{verbatim} |
|
2350 Maximize |
|
2351 obj: + x(1,4) + x(1,2) |
|
2352 |
|
2353 Subject To |
|
2354 r_1: + x(1,2) + x(1,4) >= 0 |
|
2355 r_2: - x(5,2) + x(2,3) + x(2,4) - x(1,2) = 0 |
|
2356 r_3: + x(3,5) + x(3,8) - x(2,3) = 0 |
|
2357 r_4: + x(4,5) - x(2,4) - x(1,4) = 0 |
|
2358 r_5: + x(5,2) + x(5,6) + x(5,7) - x(4,5) - x(3,5) = 0 |
|
2359 r_6: + x(6,7) + x(6,8) - x(5,6) = 0 |
|
2360 r_7: + x(7,9) - x(6,7) - x(5,7) = 0 |
|
2361 r_8: + x(8,9) - x(6,8) - x(3,8) = 0 |
|
2362 r_9: - x(8,9) - x(7,9) <= 0 |
|
2363 |
|
2364 Bounds |
|
2365 0 <= x(1,4) <= 23 |
|
2366 0 <= x(1,2) <= 14 |
|
2367 0 <= x(2,4) <= 9 |
|
2368 0 <= x(2,3) <= 10 |
|
2369 0 <= x(3,8) <= 18 |
|
2370 0 <= x(3,5) <= 12 |
|
2371 0 <= x(4,5) <= 26 |
|
2372 0 <= x(5,7) <= 4 |
|
2373 0 <= x(5,6) <= 25 |
|
2374 0 <= x(5,2) <= 11 |
|
2375 0 <= x(6,8) <= 8 |
|
2376 0 <= x(6,7) <= 7 |
|
2377 0 <= x(7,9) <= 15 |
|
2378 0 <= x(8,9) <= 20 |
|
2379 |
|
2380 End |
|
2381 \end{verbatim} |
|
2382 \end{footnotesize} |
|
2383 |
|
2384 \subsection{glp\_maxflow\_ffalg---solve maximum flow problem with |
|
2385 Ford-Fulkerson algorithm} |
|
2386 |
|
2387 \subsubsection*{Synopsis} |
|
2388 |
|
2389 \begin{verbatim} |
|
2390 int glp_maxflow_ffalg(glp_graph *G, int s, int t, int a_cap, |
|
2391 double *sol, int a_x, int v_cut); |
|
2392 \end{verbatim} |
|
2393 |
|
2394 \subsubsection*{Description} |
|
2395 |
|
2396 The routine \verb|glp_mincost_ffalg| finds optimal solution to the |
|
2397 maximum flow problem with the Ford-Fulkerson algorithm.\footnote{GLPK |
|
2398 implementation of the Ford-Fulkerson algorithm is based on the following |
|
2399 book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson, ``Flows in Networks,'' The |
|
2400 RAND Corp., Report\linebreak R-375-PR (August 1962), Chap. I |
|
2401 ``Static Maximal Flow,'' pp.~30-33.} Note that this routine requires all |
|
2402 the problem data to be integer-valued. |
|
2403 |
|
2404 The parameter \verb|G| is a graph (network) program object which |
|
2405 specifies the maximum flow problem instance to be solved. |
|
2406 |
|
2407 The parameter $s$ specifies the ordinal number of the source node. |
|
2408 |
|
2409 The parameter $t$ specifies the ordinal number of the sink node. |
|
2410 |
|
2411 The parameter \verb|a_cap| specifies an offset of the field of type |
|
2412 \verb|double| in the arc data block, which contains $u_{ij}$, the upper |
|
2413 bound to the arc flow (the arc capacity). This bound must be integer in |
|
2414 the range [0, \verb|INT_MAX|]. If \verb|a_cap| $<0$, it is assumed that |
|
2415 $u_{ij}=1$ for all arcs. |
|
2416 |
|
2417 The parameter \verb|sol| specifies a location, to which the routine |
|
2418 stores the objective value (that is, the total flow from $s$ to $t$) |
|
2419 found. If \verb|sol| is NULL, the objective value is not stored. |
|
2420 |
|
2421 The parameter \verb|a_x| specifies an offset of the field of type |
|
2422 \verb|double| in the arc data block, to which the routine stores |
|
2423 $x_{ij}$, the arc flow found. If \verb|a_x| $<0$, the arc flow values |
|
2424 are not stored. |
|
2425 |
|
2426 The parameter \verb|v_cut| specifies an offset of the field of type |
|
2427 \verb|int| in the vertex data block, to which the routine stores node |
|
2428 flags corresponding to the optimal solution found: if the node flag is |
|
2429 1, the node is labelled, and if the node flag is 0, the node is |
|
2430 unlabelled. The calling program may use these node flags to determine |
|
2431 the {\it minimal cut}, which is a subset of arcs whose one endpoint is |
|
2432 labelled and other is not. If \verb|v_cut| $<0$, the node flags are not |
|
2433 stored. |
|
2434 |
|
2435 Note that all solution components (the objective value and arc flows) |
|
2436 computed by the routine are always integer-valued. |
|
2437 |
|
2438 \subsubsection*{Returns} |
|
2439 |
|
2440 \def\arraystretch{1} |
|
2441 |
|
2442 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
2443 0 & Optimal solution found.\\ |
|
2444 \verb|GLP_EDATA| & Unable to start the search, because some problem |
|
2445 data are either not integer-valued or out of range.\\ |
|
2446 \end{tabular} |
|
2447 |
|
2448 \subsubsection*{Example} |
|
2449 |
|
2450 The example program shown below reads the maximum flow problem instance |
|
2451 in DIMACS format from file `\verb|sample.max|', solves it using the |
|
2452 routine \verb|glp_maxflow_ffalg|, and write the solution found to the |
|
2453 standard output. |
|
2454 |
|
2455 \begin{footnotesize} |
|
2456 \begin{verbatim} |
|
2457 #include <stddef.h> |
|
2458 #include <stdio.h> |
|
2459 #include <stdlib.h> |
|
2460 #include <glpk.h> |
|
2461 |
|
2462 typedef struct { int cut; } v_data; |
|
2463 typedef struct { double cap, x; } a_data; |
|
2464 |
|
2465 #define node(v) ((v_data *)((v)->data)) |
|
2466 #define arc(a) ((a_data *)((a)->data)) |
|
2467 |
|
2468 int main(void) |
|
2469 { glp_graph *G; |
|
2470 glp_vertex *v, *w; |
|
2471 glp_arc *a; |
|
2472 int i, s, t, ret; |
|
2473 double sol; |
|
2474 G = glp_create_graph(sizeof(v_data), sizeof(a_data)); |
|
2475 glp_read_maxflow(G, &s, &t, offsetof(a_data, cap), |
|
2476 "sample.max"); |
|
2477 ret = glp_maxflow_ffalg(G, s, t, offsetof(a_data, cap), |
|
2478 &sol, offsetof(a_data, x), offsetof(v_data, cut)); |
|
2479 printf("ret = %d; sol = %5g\n", ret, sol); |
|
2480 for (i = 1; i <= G->nv; i++) |
|
2481 { v = G->v[i]; |
|
2482 for (a = v->out; a != NULL; a = a->t_next) |
|
2483 { w = a->head; |
|
2484 printf("x[%d->%d] = %5g (%d)\n", v->i, w->i, |
|
2485 arc(a)->x, node(v)->cut ^ node(w)->cut); |
|
2486 } |
|
2487 } |
|
2488 glp_delete_graph(G); |
|
2489 return 0; |
|
2490 } |
|
2491 \end{verbatim} |
|
2492 \end{footnotesize} |
|
2493 |
|
2494 If `\verb|sample.max|' is the example data file from the subsection |
|
2495 describing the routine \verb|glp_read_maxflow|, the output may look like |
|
2496 follows: |
|
2497 |
|
2498 \begin{footnotesize} |
|
2499 \begin{verbatim} |
|
2500 Reading maximum flow problem data from `sample.max'... |
|
2501 Flow network has 9 nodes and 14 arcs |
|
2502 24 lines were read |
|
2503 ret = 0; sol = 29 |
|
2504 x[1->4] = 19 (0) |
|
2505 x[1->2] = 10 (0) |
|
2506 x[2->4] = 0 (0) |
|
2507 x[2->3] = 10 (1) |
|
2508 x[3->8] = 10 (0) |
|
2509 x[3->5] = 0 (1) |
|
2510 x[4->5] = 19 (0) |
|
2511 x[5->7] = 4 (1) |
|
2512 x[5->6] = 15 (0) |
|
2513 x[5->2] = 0 (0) |
|
2514 x[6->8] = 8 (1) |
|
2515 x[6->7] = 7 (1) |
|
2516 x[7->9] = 11 (0) |
|
2517 x[8->9] = 18 (0) |
|
2518 \end{verbatim} |
|
2519 \end{footnotesize} |
|
2520 |
|
2521 \newpage |
|
2522 |
|
2523 \subsection{glp\_rmfgen---Goldfarb's maximum flow problem generator} |
|
2524 |
|
2525 \subsubsection*{Synopsis} |
|
2526 |
|
2527 \begin{verbatim} |
|
2528 int glp_rmfgen(glp_graph *G, int *s, int *t, int a_cap, |
|
2529 const int parm[1+5]); |
|
2530 \end{verbatim} |
|
2531 |
|
2532 \subsubsection*{Description} |
|
2533 |
|
2534 The routine \verb|glp_rmfgen| is a GLPK version of the maximum flow |
|
2535 problem generator developed by D.~Goldfarb and |
|
2536 M.~Grigoriadis.\footnote{D.~Goldfarb and M.~D.~Grigoriadis, |
|
2537 ``A computational comparison of the Dinic and network simplex methods |
|
2538 for maximum flow.'' Annals of Op. Res. 13 (1988), |
|
2539 pp.~83-123.}$^{,}$\footnote{U.~Derigs and W.~Meier, ``Implementing |
|
2540 Goldberg's max-flow algorithm: A computational investigation.'' |
|
2541 Zeitschrift f\"ur Operations Research 33 (1989), |
|
2542 pp.~383-403.}$^{,}$\footnote{The original code of RMFGEN implemented by |
|
2543 Tamas Badics is publically available from |
|
2544 {\tt <ftp://dimacs.rutgers.edu/pub/netflow/generators/network/genrmf>}.} |
|
2545 |
|
2546 The parameter \verb|G| specifies the graph object, to which the |
|
2547 generated problem data have to be stored. Note that on entry the graph |
|
2548 object is erased with the routine \verb|glp_erase_graph|. |
|
2549 |
|
2550 The pointers \verb|s| and \verb|t| specify locations, to which the |
|
2551 routine stores the source and sink node numbers, respectively. If |
|
2552 \verb|s| or \verb|t| is \verb|NULL|, corresponding node number is not |
|
2553 stored. |
|
2554 |
|
2555 The parameter \verb|a_cap| specifies an offset of the field of type |
|
2556 \verb|double| in the arc data block, to which the routine stores the arc |
|
2557 capacity. If \verb|a_cap| $<0$, the capacity is not stored. |
|
2558 |
|
2559 The array \verb|parm| contains description of the network to be |
|
2560 generated: |
|
2561 |
|
2562 \begin{tabular}{@{}lll@{}} |
|
2563 \verb|parm[0]|& ¬ used\\ |
|
2564 \verb|parm[1]|&\verb|seed|&random number seed (a positive integer)\\ |
|
2565 \verb|parm[2]|&\verb|a |&frame size\\ |
|
2566 \verb|parm[3]|&\verb|b |&depth\\ |
|
2567 \verb|parm[4]|&\verb|c1 |&minimal arc capacity\\ |
|
2568 \verb|parm[5]|&\verb|c2 |&maximal arc capacity\\ |
|
2569 \end{tabular} |
|
2570 |
|
2571 \subsubsection*{Returns} |
|
2572 |
|
2573 If the instance was successfully generated, the routine |
|
2574 \verb|glp_netgen| returns zero; otherwise, if specified parameters are |
|
2575 inconsistent, the routine returns a non-zero error code. |
|
2576 |
|
2577 \newpage |
|
2578 |
|
2579 \subsubsection*{Comments\footnote{This material is based on comments |
|
2580 to the original version of RMFGEN.}} |
|
2581 |
|
2582 The generated network is as follows. It has $b$ pieces of frames of |
|
2583 size $a\times a$. (So alltogether the number of vertices is |
|
2584 $a\times a\times b$.) |
|
2585 |
|
2586 In each frame all the vertices are connected with their neighbours |
|
2587 (forth and back). In addition the vertices of a frame are connected |
|
2588 one to one with the vertices of next frame using a random permutation |
|
2589 of those vertices. |
|
2590 |
|
2591 The source is the lower left vertex of the first frame, the sink is |
|
2592 the upper right vertex of the $b$-th frame. |
|
2593 |
|
2594 \begin{verbatim} |
|
2595 t |
|
2596 +-------+ |
|
2597 | .| |
|
2598 | . | |
|
2599 / | / | |
|
2600 +-------+/ -+ b |
|
2601 | | |/. |
|
2602 a | -v- |/ |
|
2603 | | |/ |
|
2604 +-------+ 1 |
|
2605 s a |
|
2606 \end{verbatim} |
|
2607 |
|
2608 The capacities are randomly chosen integers from the range of |
|
2609 $[c_1,c_2]$ in the case of interconnecting edges, and $c_2\cdot a^2$ |
|
2610 for the in-frame edges. |
|
2611 |
|
2612 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
2613 |
|
2614 \newpage |
|
2615 |
|
2616 \section{Assignment problem} |
|
2617 |
|
2618 \subsection{Background} |
|
2619 |
|
2620 Let there be given an undirected bipartite graph $G=(R\cup S,E)$, where |
|
2621 $R$ and $S$ are disjoint sets of vertices (nodes), and |
|
2622 $E\subseteq R\times S$ is a set of edges. Let also for each edge |
|
2623 $e=(i,j)\in E$ there be given its cost $c_{ij}$. A {\it matching} |
|
2624 (which in case of bipartite graph is also called {\it assignment}) |
|
2625 $M\subseteq E$ in $G$ is a set of pairwise non-adjacent edges, that is, |
|
2626 no two edges in $M$ share a common vertex. A matching, which matches |
|
2627 all vertices of the graph, is called a {\it perfect matching}. |
|
2628 Obviously, a perfect matching in bipartite graph $G=(R\cup S,E)$ |
|
2629 defines some bijection $R\leftrightarrow S$. |
|
2630 |
|
2631 The {\it assignment problem} has two different variants. In the first |
|
2632 variant the problem is to find matching (assignment) $M$, which |
|
2633 maximizes the sum: |
|
2634 $$\sum_{(i,j)\in M}c_{ij}\eqno(10)$$ |
|
2635 (so this variant is also called the {\it maximum weighted bipartite |
|
2636 matching problem} or, if all $c_{ij}=1$, the {\it maximum cardinality |
|
2637 bipartite matching problem}). In the second, classic variant the |
|
2638 problem is to find {\it perfect} matching (assignment) $M$, which |
|
2639 minimizes or maximizes the sum (10). |
|
2640 |
|
2641 An example of the assignment problem, which is the maximum weighted |
|
2642 bipartite matching problem, is shown on Fig. 3. |
|
2643 |
|
2644 The maximum weighted bipartite matching problem can be naturally |
|
2645 formulated as the following LP problem: |
|
2646 |
|
2647 \medskip |
|
2648 |
|
2649 \noindent |
|
2650 \hspace{.5in}maximize |
|
2651 $$z=\sum_{(i,j)\in E}c_{ij}x_{ij}\eqno(11)$$ |
|
2652 \hspace{.5in}subject to |
|
2653 $$\sum_{(i,j)\in E}x_{ij}\leq 1\ \ \ \hbox{for all}\ i\in R\eqno(12)$$ |
|
2654 $$\sum_{(i,j)\in E}x_{ij}\leq 1\ \ \ \hbox{for all}\ j\in S\eqno(13)$$ |
|
2655 $$\ \ \ \ \ \ \ \ 0\leq x_{ij}\leq 1\ \ \ \hbox{for all}\ (i,j)\in E |
|
2656 \eqno(14)$$ |
|
2657 |
|
2658 \medskip |
|
2659 |
|
2660 \noindent |
|
2661 where $x_{ij}=1$ means that $(i,j)\in M$, and $x_{ij}=0$ means that |
|
2662 $(i,j)\notin M$.\footnote{The constraint matrix of LP formulation |
|
2663 (11)---(14) is totally unimodular, due to which $x_{ij}\in\{0,1\}$ for |
|
2664 any basic solution.} |
|
2665 |
|
2666 \newpage |
|
2667 |
|
2668 \bigskip |
|
2669 |
|
2670 \noindent\hfil |
|
2671 \xymatrix @C=48pt |
|
2672 {v_1\ar@{-}[rr]|{_{13}}\ar@{-}[rrd]|{_{21}}\ar@{-}[rrddd]|(.2){_{20}}&& |
|
2673 v_9\\ |
|
2674 v_2\ar@{-}[rr]|{_{12}}\ar@{-}[rrdd]|(.3){_{8}} |
|
2675 \ar@{-}[rrddd]|(.4){_{26}}&&v_{10}\\ |
|
2676 v_3\ar@{-}[rr]|(.2){_{22}}\ar@{-}[rrdd]|(.3){_{11}}&&v_{11}\\ |
|
2677 v_4\ar@{-}[rruuu]|(.6){_{12}}\ar@{-}[rr]|(.2){_{36}} |
|
2678 \ar@{-}[rrdd]|(.7){_{25}}&&v_{12}\\ |
|
2679 v_5\ar@{-}[rruu]|(.42){_{41}}\ar@{-}[rru]|(.4){_{40}} |
|
2680 \ar@{-}[rr]|(.75){_{11}}\ar@{-}[rrd]|(.6){_{4}}\ar@{-}[rrdd]|{_{8}} |
|
2681 \ar@{-}[rrddd]|{_{35}}\ar@{-}[rrdddd]|{_{32}}&&v_{13}\\ |
|
2682 v_6\ar@{-}[rruuuuu]|(.7){_{13}}&&v_{14}\\ |
|
2683 v_7\ar@{-}[rruuuuu]|(.15){_{19}}&&v_{15}\\ |
|
2684 v_8\ar@{-}[rruuuuuu]|(.25){_{39}}\ar@{-}[rruuuuu]|(.65){_{15}}&& |
|
2685 v_{16}\\ |
|
2686 &&v_{17}\\ |
|
2687 } |
|
2688 |
|
2689 \bigskip |
|
2690 |
|
2691 \noindent\hfil |
|
2692 Fig.~3. An example of the assignment problem. |
|
2693 |
|
2694 \bigskip |
|
2695 |
|
2696 Similarly, the perfect assignment problem can be naturally formulated |
|
2697 as the following LP problem: |
|
2698 |
|
2699 \medskip |
|
2700 |
|
2701 \noindent |
|
2702 \hspace{.5in}minimize (or maximize) |
|
2703 $$z=\sum_{(i,j)\in E}c_{ij}x_{ij}\eqno(15)$$ |
|
2704 \hspace{.5in}subject to |
|
2705 $$\sum_{(i,j)\in E}x_{ij}=1\ \ \ \hbox{for all}\ i\in R\eqno(16)$$ |
|
2706 $$\sum_{(i,j)\in E}x_{ij}=1\ \ \ \hbox{for all}\ j\in S\eqno(17)$$ |
|
2707 $$\ \ \ \ \ \ \ \ 0\leq x_{ij}\leq 1\ \ \ \hbox{for all}\ (i,j)\in E |
|
2708 \eqno(18)$$ |
|
2709 |
|
2710 \medskip |
|
2711 |
|
2712 \noindent |
|
2713 where variables $x_{ij}$ have the same meaning as for (11)---(14) |
|
2714 above. |
|
2715 |
|
2716 \newpage |
|
2717 |
|
2718 In GLPK an undirected bipartite graph $G=(R\cup S,E)$ is represented as |
|
2719 directed graph $\overline{G}=(V,A)$, where $V=R\cup S$ and |
|
2720 $A=\{(i,j):(i,j)\in E\}$, i.e. every edge $(i,j)\in E$ in $G$ |
|
2721 corresponds to arc $(i\rightarrow j)\in A$ in $\overline{G}$. |
|
2722 |
|
2723 \subsection{glp\_read\_asnprob---read assignment problem data in\\DIMACS |
|
2724 format} |
|
2725 |
|
2726 \subsubsection*{Synopsis} |
|
2727 |
|
2728 \begin{verbatim} |
|
2729 int glp_read_asnprob(glp_graph *G, int v_set, int a_cost, |
|
2730 const char *fname); |
|
2731 \end{verbatim} |
|
2732 |
|
2733 \subsubsection*{Description} |
|
2734 |
|
2735 The routine \verb|glp_read_asnprob| reads the assignment problem data |
|
2736 from a text file in DIMACS format. |
|
2737 |
|
2738 The parameter \verb|G| specifies the graph object, to which the problem |
|
2739 data have to be stored. Note that before reading data the current |
|
2740 content of the graph object is completely erased with the routine |
|
2741 \verb|glp_erase_graph|. |
|
2742 |
|
2743 The parameter \verb|v_set| specifies an offset of the field of type |
|
2744 \verb|int| in the vertex data block, to which the routine stores the |
|
2745 node set indicator: |
|
2746 |
|
2747 0 --- the node is in set $R$; |
|
2748 |
|
2749 1 --- the node is in set $S$. |
|
2750 |
|
2751 \noindent |
|
2752 If \verb|v_set| $<0$, the node set indicator is not stored. |
|
2753 |
|
2754 The parameter \verb|a_cost| specifies an offset of the field of type |
|
2755 \verb|double| in the arc data block, to which the routine stores the |
|
2756 edge cost $c_{ij}$. If \verb|a_cost| $<0$, the edge cost is not stored. |
|
2757 |
|
2758 The character string \verb|fname| specifies the name of a text file to |
|
2759 be read in. (If the file name name ends with the suffix `\verb|.gz|', |
|
2760 the file is assumed to be compressed, in which case the routine |
|
2761 decompresses it ``on the fly''.) |
|
2762 |
|
2763 \subsubsection*{Returns} |
|
2764 |
|
2765 If the operation was successful, the routine returns zero. Otherwise, |
|
2766 it prints an error message and returns non-zero. |
|
2767 |
|
2768 \newpage |
|
2769 |
|
2770 \subsubsection*{Example} |
|
2771 |
|
2772 \begin{footnotesize} |
|
2773 \begin{verbatim} |
|
2774 typedef struct |
|
2775 { /* vertex data block */ |
|
2776 ... |
|
2777 int set; |
|
2778 ... |
|
2779 } v_data; |
|
2780 |
|
2781 typedef struct |
|
2782 { /* arc data block */ |
|
2783 ... |
|
2784 double cost; |
|
2785 ... |
|
2786 } a_data; |
|
2787 |
|
2788 int main(void) |
|
2789 { glp_graph *G; |
|
2790 int ret; |
|
2791 G = glp_create_graph(sizeof(v_data), sizeof(a_data)); |
|
2792 ret = glp_read_asnprob(G, offsetof(v_data, set), |
|
2793 offsetof(a_data, cost), "sample.asn"); |
|
2794 if (ret != 0) goto ... |
|
2795 ... |
|
2796 } |
|
2797 \end{verbatim} |
|
2798 \end{footnotesize} |
|
2799 |
|
2800 \subsubsection*{DIMACS assignment problem format\footnote{This |
|
2801 material is based on the paper ``The First DIMACS International |
|
2802 Algorithm Implementation Challenge: Problem Definitions and |
|
2803 Specifications'', which is publically available at |
|
2804 {\tt http://dimacs.rutgers.edu/Challenges/}.}} |
|
2805 \label{subsecasnprob} |
|
2806 |
|
2807 The DIMACS input file is a plain ASCII text file. It contains |
|
2808 {\it lines} of several types described below. A line is terminated with |
|
2809 an end-of-line character. Fields in each line are separated by at least |
|
2810 one blank space. Each line begins with a one-character designator to |
|
2811 identify the line type. |
|
2812 |
|
2813 Note that DIMACS requires all numerical quantities to be integers in |
|
2814 the range $[-2^{31},\ 2^{31}-1]$ while GLPK allows the quantities to be |
|
2815 floating-point numbers. |
|
2816 |
|
2817 \paragraph{Comment lines.} Comment lines give human-readable information |
|
2818 about the file and are ignored by programs. Comment lines can appear |
|
2819 anywhere in the file. Each comment line begins with a lower-case |
|
2820 character \verb|c|. |
|
2821 |
|
2822 \begin{verbatim} |
|
2823 c This is a comment line |
|
2824 \end{verbatim} |
|
2825 |
|
2826 \newpage |
|
2827 |
|
2828 \paragraph{Problem line.} There is one problem line per data file. The |
|
2829 problem line must appear before any node or arc descriptor lines. It has |
|
2830 the following format: |
|
2831 |
|
2832 \begin{verbatim} |
|
2833 p asn NODES EDGES |
|
2834 \end{verbatim} |
|
2835 |
|
2836 \noindent |
|
2837 The lower-case character \verb|p| signifies that this is a problem line. |
|
2838 The three-character problem designator \verb|asn| identifies the file as |
|
2839 containing specification information for the assignment problem. |
|
2840 The \verb|NODES| field contains an integer value specifying the total |
|
2841 number of nodes in the graph (i.e. in both sets $R$ and $S$). The |
|
2842 \verb|EDGES| field contains an integer value specifying the number of |
|
2843 edges in the graph. |
|
2844 |
|
2845 \paragraph{Node descriptors.} All node descriptor lines must appear |
|
2846 before all edge descriptor lines. The node descriptor lines lists the |
|
2847 nodes in set $R$ only, and all other nodes are assumed to be in set |
|
2848 $S$. There is one node descriptor line for each such node, with the |
|
2849 following format: |
|
2850 |
|
2851 \begin{verbatim} |
|
2852 n ID |
|
2853 \end{verbatim} |
|
2854 |
|
2855 \noindent |
|
2856 The lower-case character \verb|n| signifies that this is a node |
|
2857 descriptor line. The \verb|ID| field gives a node identification number, |
|
2858 an integer between 1 and \verb|NODES|. |
|
2859 |
|
2860 \paragraph{Edge descriptors.} There is one edge descriptor line for |
|
2861 each edge in the graph. Edge descriptor lines are of the following |
|
2862 format: |
|
2863 |
|
2864 \begin{verbatim} |
|
2865 a SRC DST COST |
|
2866 \end{verbatim} |
|
2867 |
|
2868 \noindent |
|
2869 The lower-case character \verb|a| signifies that this is an edge |
|
2870 descriptor line. For each edge $(i,j)$, where $i\in R$ and $j\in S$, |
|
2871 the \verb|SRC| field gives the identification number of vertex $i$, and |
|
2872 the \verb|DST| field gives the identification number of vertex $j$. |
|
2873 Identification numbers are integers between 1 and \verb|NODES|. The |
|
2874 \verb|COST| field contains the cost of edge $(i,j)$. |
|
2875 |
|
2876 \paragraph{Example.} Below here is an example of the data file in |
|
2877 DIMACS format corresponding to the assignment problem shown on Fig~3. |
|
2878 |
|
2879 \newpage |
|
2880 |
|
2881 \begin{footnotesize} |
|
2882 \begin{verbatim} |
|
2883 c sample.asn |
|
2884 c |
|
2885 c This is an example of the assignment problem data |
|
2886 c in DIMACS format. |
|
2887 c |
|
2888 p asn 17 22 |
|
2889 c |
|
2890 n 1 |
|
2891 n 2 |
|
2892 n 3 |
|
2893 n 4 |
|
2894 n 5 |
|
2895 n 6 |
|
2896 n 7 |
|
2897 n 8 |
|
2898 c |
|
2899 a 1 9 13 |
|
2900 a 1 10 21 |
|
2901 a 1 12 20 |
|
2902 a 2 10 12 |
|
2903 a 2 12 8 |
|
2904 a 2 13 26 |
|
2905 a 3 11 22 |
|
2906 a 3 13 11 |
|
2907 a 4 9 12 |
|
2908 a 4 12 36 |
|
2909 a 4 14 25 |
|
2910 a 5 11 41 |
|
2911 a 5 12 40 |
|
2912 a 5 13 11 |
|
2913 a 5 14 4 |
|
2914 a 5 15 8 |
|
2915 a 5 16 35 |
|
2916 a 5 17 32 |
|
2917 a 6 9 13 |
|
2918 a 7 10 19 |
|
2919 a 8 10 39 |
|
2920 a 8 11 15 |
|
2921 c |
|
2922 c eof |
|
2923 \end{verbatim} |
|
2924 \end{footnotesize} |
|
2925 |
|
2926 \newpage |
|
2927 |
|
2928 \subsection{glp\_write\_asnprob---write assignment problem data in\\ |
|
2929 DIMACS format} |
|
2930 |
|
2931 \subsubsection*{Synopsis} |
|
2932 |
|
2933 \begin{verbatim} |
|
2934 int glp_write_asnprob(glp_graph *G, int v_set, int a_cost, |
|
2935 const char *fname); |
|
2936 \end{verbatim} |
|
2937 |
|
2938 \subsubsection*{Description} |
|
2939 |
|
2940 The routine \verb|glp_write_asnprob| writes the assignment problem data |
|
2941 to a text file in DIMACS format. |
|
2942 |
|
2943 The parameter \verb|G| is the graph program object, which specifies the |
|
2944 assignment problem instance. |
|
2945 |
|
2946 The parameter \verb|v_set| specifies an offset of the field of type |
|
2947 \verb|int| in the vertex data block, which contains the node set |
|
2948 indicator: |
|
2949 |
|
2950 0 --- the node is in set $R$; |
|
2951 |
|
2952 1 --- the node is in set $S$. |
|
2953 |
|
2954 \noindent |
|
2955 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs |
|
2956 is in set $R$, and a node having no outgoing arcs is in set $S$. |
|
2957 |
|
2958 The parameter \verb|a_cost| specifies an offset of the field of type |
|
2959 \verb|double| in the arc data block, which contains $c_{ij}$, the edge |
|
2960 cost. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ for all |
|
2961 edges. |
|
2962 |
|
2963 The character string \verb|fname| specifies a name of the text file to |
|
2964 be written out. (If the file name ends with suffix `\verb|.gz|', the |
|
2965 file is assumed to be compressed, in which case the routine performs |
|
2966 automatic compression on writing it.) |
|
2967 |
|
2968 \subsubsection*{Note} |
|
2969 |
|
2970 The routine \verb|glp_write_asnprob| does not check that the specified |
|
2971 graph object correctly represents a bipartite graph. To make sure that |
|
2972 the problem data are correct, use the routine \verb|glp_check_asnprob|. |
|
2973 |
|
2974 \subsubsection*{Returns} |
|
2975 |
|
2976 If the operation was successful, the routine returns zero. Otherwise, |
|
2977 it prints an error message and returns non-zero. |
|
2978 |
|
2979 \newpage |
|
2980 |
|
2981 \subsection{glp\_check\_asnprob---check correctness of assignment |
|
2982 problem data} |
|
2983 |
|
2984 \subsubsection*{Synopsis} |
|
2985 |
|
2986 \begin{verbatim} |
|
2987 int glp_check_asnprob(glp_graph *G, int v_set); |
|
2988 \end{verbatim} |
|
2989 |
|
2990 \subsubsection*{Description} |
|
2991 |
|
2992 The routine \verb|glp_check_asnprob| checks that the specified graph |
|
2993 object \verb|G| correctly represents a bipartite graph. |
|
2994 |
|
2995 The parameter \verb|v_set| specifies an offset of the field of type |
|
2996 \verb|int| in the vertex data block, which contains the node set |
|
2997 indicator: |
|
2998 |
|
2999 0 --- the node is in set $R$; |
|
3000 |
|
3001 1 --- the node is in set $S$. |
|
3002 |
|
3003 \noindent |
|
3004 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs |
|
3005 is in set $R$, and a node having no outgoing arcs is in set $S$. |
|
3006 |
|
3007 \subsubsection*{Returns} |
|
3008 |
|
3009 The routine \verb|glp_check_asnprob| may return the following codes: |
|
3010 |
|
3011 0 --- the data are correct; |
|
3012 |
|
3013 1 --- the set indicator of some node is 0, however, that node has one |
|
3014 or more incoming arcs; |
|
3015 |
|
3016 2 --- the set indicator of some node is 1, however, that node has one |
|
3017 or more outgoing arcs; |
|
3018 |
|
3019 3 --- the set indicator of some node is invalid (neither 0 nor 1); |
|
3020 |
|
3021 4 --- some node has both incoming and outgoing arcs. |
|
3022 |
|
3023 \subsection{glp\_asnprob\_lp---convert assignment problem to LP} |
|
3024 |
|
3025 \subsubsection*{Synopsis} |
|
3026 |
|
3027 \begin{verbatim} |
|
3028 int glp_asnprob_lp(glp_prob *P, int form, glp_graph *G, |
|
3029 int names, int v_set, int a_cost); |
|
3030 \end{verbatim} |
|
3031 |
|
3032 \subsubsection*{Description} |
|
3033 |
|
3034 The routine \verb|glp_asnprob_lp| builds LP problem, which corresponds |
|
3035 to the specified assignment problem. |
|
3036 |
|
3037 The parameter \verb|lp| is the resultant LP problem object to be built. |
|
3038 Note that on entry its current content is erased with the routine |
|
3039 \verb|glp_erase_prob|. |
|
3040 |
|
3041 The parameter \verb|form| defines which LP formulation should be used: |
|
3042 |
|
3043 \verb|GLP_ASN_MIN| --- perfect matching (15)---(18), minimization; |
|
3044 |
|
3045 \verb|GLP_ASN_MAX| --- perfect matching (15)---(18), maximization; |
|
3046 |
|
3047 \verb|GLP_ASN_MMP| --- maximum weighted matching (11)---(14). |
|
3048 |
|
3049 The parameter \verb|G| is the graph program object, which specifies the |
|
3050 assignment problem instance. |
|
3051 |
|
3052 The parameter \verb|names| is a flag. If it is \verb|GLP_ON|, the |
|
3053 routine uses symbolic names of the graph object components to assign |
|
3054 symbolic names to the LP problem object components. If the \verb|flag| |
|
3055 is \verb|GLP_OFF|, no symbolic names are assigned. |
|
3056 |
|
3057 The parameter \verb|v_set| specifies an offset of the field of type |
|
3058 \verb|int| in the vertex data block, which contains the node set |
|
3059 indicator: |
|
3060 |
|
3061 0 --- the node is in set $R$; |
|
3062 |
|
3063 1 --- the node is in set $S$. |
|
3064 |
|
3065 \noindent |
|
3066 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs |
|
3067 is in set $R$, and a node having no outgoing arcs is in set $S$. |
|
3068 |
|
3069 The parameter \verb|a_cost| specifies an offset of the field of type |
|
3070 \verb|double| in the arc data block, which contains $c_{ij}$, the edge |
|
3071 cost. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ for all |
|
3072 edges. |
|
3073 |
|
3074 \subsubsection*{Returns} |
|
3075 |
|
3076 If the LP problem has been successfully built, the routine |
|
3077 \verb|glp_asnprob_lp| returns zero, otherwise, non-zero (see the |
|
3078 routine \verb|glp_check_asnprob|). |
|
3079 |
|
3080 \subsubsection*{Example} |
|
3081 |
|
3082 The example program below reads the assignment problem instance in |
|
3083 DIMACS format from file `\verb|sample.asn|', converts the instance to |
|
3084 LP (11)---(14), and writes the resultant LP in CPLEX format to file |
|
3085 `\verb|matching.lp|'. |
|
3086 |
|
3087 \begin{footnotesize} |
|
3088 \begin{verbatim} |
|
3089 #include <stddef.h> |
|
3090 #include <glpk.h> |
|
3091 |
|
3092 typedef struct { int set; } v_data; |
|
3093 typedef struct { double cost; } a_data; |
|
3094 |
|
3095 int main(void) |
|
3096 { glp_graph *G; |
|
3097 glp_prob *P; |
|
3098 G = glp_create_graph(sizeof(v_data), sizeof(a_data)); |
|
3099 glp_read_asnprob(G, offsetof(v_data, set), |
|
3100 offsetof(a_data, cost), "sample.asn"); |
|
3101 P = glp_create_prob(); |
|
3102 glp_asnprob_lp(P, GLP_ASN_MMP, G, GLP_ON, |
|
3103 offsetof(v_data, set), offsetof(a_data, cost)); |
|
3104 glp_delete_graph(G); |
|
3105 glp_write_lp(P, NULL, "matching.lp"); |
|
3106 glp_delete_prob(P); |
|
3107 return 0; |
|
3108 } |
|
3109 \end{verbatim} |
|
3110 \end{footnotesize} |
|
3111 |
|
3112 If `\verb|sample.asn|' is the example data file from the subsection |
|
3113 describing the routine \verb|glp_read_asnprob|, file |
|
3114 `\verb|matching.lp|' may look like follows: |
|
3115 |
|
3116 \begin{footnotesize} |
|
3117 \begin{verbatim} |
|
3118 Maximize |
|
3119 obj: + 20 x(1,12) + 21 x(1,10) + 13 x(1,9) + 26 x(2,13) + 8 x(2,12) |
|
3120 + 12 x(2,10) + 11 x(3,13) + 22 x(3,11) + 25 x(4,14) + 36 x(4,12) |
|
3121 + 12 x(4,9) + 32 x(5,17) + 35 x(5,16) + 8 x(5,15) + 4 x(5,14) |
|
3122 + 11 x(5,13) + 40 x(5,12) + 41 x(5,11) + 13 x(6,9) + 19 x(7,10) |
|
3123 + 15 x(8,11) + 39 x(8,10) |
|
3124 |
|
3125 Subject To |
|
3126 r_1: + x(1,9) + x(1,10) + x(1,12) <= 1 |
|
3127 r_2: + x(2,10) + x(2,12) + x(2,13) <= 1 |
|
3128 r_3: + x(3,11) + x(3,13) <= 1 |
|
3129 r_4: + x(4,9) + x(4,12) + x(4,14) <= 1 |
|
3130 r_5: + x(5,11) + x(5,12) + x(5,13) + x(5,14) + x(5,15) + x(5,16) |
|
3131 + x(5,17) <= 1 |
|
3132 r_6: + x(6,9) <= 1 |
|
3133 r_7: + x(7,10) <= 1 |
|
3134 r_8: + x(8,10) + x(8,11) <= 1 |
|
3135 r_9: + x(6,9) + x(4,9) + x(1,9) <= 1 |
|
3136 r_10: + x(8,10) + x(7,10) + x(2,10) + x(1,10) <= 1 |
|
3137 r_11: + x(8,11) + x(5,11) + x(3,11) <= 1 |
|
3138 r_12: + x(5,12) + x(4,12) + x(2,12) + x(1,12) <= 1 |
|
3139 r_13: + x(5,13) + x(3,13) + x(2,13) <= 1 |
|
3140 r_14: + x(5,14) + x(4,14) <= 1 |
|
3141 r_15: + x(5,15) <= 1 |
|
3142 r_16: + x(5,16) <= 1 |
|
3143 r_17: + x(5,17) <= 1 |
|
3144 |
|
3145 Bounds |
|
3146 0 <= x(1,12) <= 1 |
|
3147 0 <= x(1,10) <= 1 |
|
3148 0 <= x(1,9) <= 1 |
|
3149 0 <= x(2,13) <= 1 |
|
3150 0 <= x(2,12) <= 1 |
|
3151 0 <= x(2,10) <= 1 |
|
3152 0 <= x(3,13) <= 1 |
|
3153 0 <= x(3,11) <= 1 |
|
3154 0 <= x(4,14) <= 1 |
|
3155 0 <= x(4,12) <= 1 |
|
3156 0 <= x(4,9) <= 1 |
|
3157 0 <= x(5,17) <= 1 |
|
3158 0 <= x(5,16) <= 1 |
|
3159 0 <= x(5,15) <= 1 |
|
3160 0 <= x(5,14) <= 1 |
|
3161 0 <= x(5,13) <= 1 |
|
3162 0 <= x(5,12) <= 1 |
|
3163 0 <= x(5,11) <= 1 |
|
3164 0 <= x(6,9) <= 1 |
|
3165 0 <= x(7,10) <= 1 |
|
3166 0 <= x(8,11) <= 1 |
|
3167 0 <= x(8,10) <= 1 |
|
3168 |
|
3169 End |
|
3170 \end{verbatim} |
|
3171 \end{footnotesize} |
|
3172 |
|
3173 \subsection{glp\_asnprob\_okalg---solve assignment problem with |
|
3174 out-of-kilter algorithm} |
|
3175 |
|
3176 \subsubsection*{Synopsis} |
|
3177 |
|
3178 \begin{verbatim} |
|
3179 int glp_asnprob_okalg(int form, glp_graph *G, int v_set, |
|
3180 int a_cost, double *sol, int a_x); |
|
3181 \end{verbatim} |
|
3182 |
|
3183 \subsubsection*{Description} |
|
3184 |
|
3185 The routine \verb|glp_mincost_okalg| finds optimal solution to the |
|
3186 assignment problem with the out-of-kilter |
|
3187 algorithm.\footnote{GLPK implementation of the out-of-kilter algorithm |
|
3188 is based on the following book: L.~R.~Ford,~Jr., and D.~R.~Fulkerson, |
|
3189 ``Flows in Networks,'' The RAND Corp., Report R-375-PR (August 1962), |
|
3190 Chap. III ``Minimal Cost Flow Problems,'' pp.~113-26.} Note that this |
|
3191 routine requires all the problem data to be integer-valued. |
|
3192 |
|
3193 The parameter \verb|form| defines which LP formulation should be used: |
|
3194 |
|
3195 \verb|GLP_ASN_MIN| --- perfect matching (15)---(18), minimization; |
|
3196 |
|
3197 \verb|GLP_ASN_MAX| --- perfect matching (15)---(18), maximization; |
|
3198 |
|
3199 \verb|GLP_ASN_MMP| --- maximum weighted matching (11)---(14). |
|
3200 |
|
3201 The parameter \verb|G| is the graph program object, which specifies the |
|
3202 assignment problem instance. |
|
3203 |
|
3204 The parameter \verb|v_set| specifies an offset of the field of type |
|
3205 \verb|int| in the vertex data block, which contains the node set |
|
3206 indicator: |
|
3207 |
|
3208 0 --- the node is in set $R$; |
|
3209 |
|
3210 1 --- the node is in set $S$. |
|
3211 |
|
3212 \newpage |
|
3213 |
|
3214 \noindent |
|
3215 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs |
|
3216 is in set $R$, and a node having no outgoing arcs is in set $S$. |
|
3217 |
|
3218 The parameter \verb|a_cost| specifies an offset of the field of type |
|
3219 \verb|double| in the arc data block, which contains $c_{ij}$, the edge |
|
3220 cost. This value must be integer in the range [\verb|-INT_MAX|, |
|
3221 \verb|+INT_MAX|]. If \verb|a_cost| $<0$, it is assumed that $c_{ij}=1$ |
|
3222 for all edges. |
|
3223 |
|
3224 The parameter \verb|sol| specifies a location, to which the routine |
|
3225 stores the objective value (that is, the total cost) found. |
|
3226 If \verb|sol| is \verb|NULL|, the objective value is not stored. |
|
3227 |
|
3228 The parameter \verb|a_x| specifies an offset of the field of type |
|
3229 \verb|int| in the arc data block, to which the routine stores $x_{ij}$. |
|
3230 If \verb|a_x| $<0$, this value is not stored. |
|
3231 |
|
3232 \subsubsection*{Returns} |
|
3233 |
|
3234 \def\arraystretch{1} |
|
3235 |
|
3236 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
3237 0 & Optimal solution found.\\ |
|
3238 \verb|GLP_ENOPFS| & No (primal) feasible solution exists.\\ |
|
3239 \verb|GLP_EDATA| & Unable to start the search, because the assignment |
|
3240 problem data are either incorrect (this error is detected by the |
|
3241 routine \verb|glp_check_asnprob|), not integer-valued or out of range.\\ |
|
3242 \verb|GLP_ERANGE| & The search was prematurely terminated because of |
|
3243 integer overflow.\\ |
|
3244 \verb|GLP_EFAIL| & An error has been detected in the program logic. |
|
3245 (If this code is returned for your problem instance, please report to |
|
3246 \verb|<bug-glpk@gnu.org>|.)\\ |
|
3247 \end{tabular} |
|
3248 |
|
3249 \subsubsection*{Comments} |
|
3250 |
|
3251 Since the out-of-kilter algorithm is designed to find a minimal cost |
|
3252 circulation, the routine \verb|glp_asnprob_okalg| converts the original |
|
3253 graph to a network suitable for this algorithm in the following |
|
3254 way:\footnote{The conversion is performed internally and does not change |
|
3255 the original graph program object passed to the routine.} |
|
3256 |
|
3257 1) it replaces each edge $(i,j)$ by arc $(i\rightarrow j)$, |
|
3258 flow $x_{ij}$ through which has zero lower bound ($l_{ij}=0$), unity |
|
3259 upper bound ($u_{ij}=1$), and per-unit cost $+c_{ij}$ (in case of |
|
3260 \verb|GLP_ASN_MIN|), or $-c_{ij}$ (in case of \verb|GLP_ASN_MAX| and |
|
3261 \verb|GLP_ASN_MMP|); |
|
3262 |
|
3263 2) then it adds one auxiliary feedback node $k$; |
|
3264 |
|
3265 \newpage |
|
3266 |
|
3267 3) for each original node $i\in R$ the routine adds auxiliary supply |
|
3268 arc $(k\rightarrow i)$, flow $x_{ki}$ through which is costless |
|
3269 ($c_{ki}=0$) and either fixed at 1 ($l_{ki}=u_{ki}=1$, in case of |
|
3270 \verb|GLP_ASN_MIN| and \verb|GLP_ASN_MAX|) or has zero lower bound and |
|
3271 unity upper bound ($l_{ij}=0$, $u_{ij}=1$, in case of |
|
3272 \verb|GLP_ASN_MMP|); |
|
3273 |
|
3274 4) similarly, for each original node $j\in S$ the routine adds |
|
3275 auxiliary demand arc $(j\rightarrow k)$, flow $x_{jk}$ through which is |
|
3276 costless ($c_{jk}=0$) and either fixed at 1 ($l_{jk}=u_{jk}=1$, in case |
|
3277 of \verb|GLP_ASN_MIN| and \verb|GLP_ASN_MAX|) or has zero lower bound |
|
3278 and unity upper bound ($l_{jk}=0$, $u_{jk}=1$, in case of |
|
3279 \verb|GLP_ASN_MMP|). |
|
3280 |
|
3281 \subsubsection*{Example} |
|
3282 |
|
3283 The example program shown below reads the assignment problem instance |
|
3284 in DIMACS format from file `\verb|sample.asn|', solves it by using the |
|
3285 routine \verb|glp_asnprob_okalg|, and writes the solution found to the |
|
3286 standard output. |
|
3287 |
|
3288 \begin{footnotesize} |
|
3289 \begin{verbatim} |
|
3290 #include <stddef.h> |
|
3291 #include <stdio.h> |
|
3292 #include <stdlib.h> |
|
3293 #include <glpk.h> |
|
3294 |
|
3295 typedef struct { int set; } v_data; |
|
3296 typedef struct { double cost; int x; } e_data; |
|
3297 |
|
3298 #define node(v) ((v_data *)((v)->data)) |
|
3299 #define edge(e) ((e_data *)((e)->data)) |
|
3300 |
|
3301 int main(void) |
|
3302 { glp_graph *G; |
|
3303 glp_vertex *v; |
|
3304 glp_arc *e; |
|
3305 int i, ret; |
|
3306 double sol; |
|
3307 G = glp_create_graph(sizeof(v_data), sizeof(e_data)); |
|
3308 glp_read_asnprob(G, offsetof(v_data, set), |
|
3309 offsetof(e_data, cost), "sample.asn"); |
|
3310 ret = glp_asnprob_okalg(GLP_ASN_MMP, G, |
|
3311 offsetof(v_data, set), offsetof(e_data, cost), &sol, |
|
3312 offsetof(e_data, x)); |
|
3313 printf("ret = %d; sol = %5g\n", ret, sol); |
|
3314 for (i = 1; i <= G->nv; i++) |
|
3315 { v = G->v[i]; |
|
3316 for (e = v->out; e != NULL; e = e->t_next) |
|
3317 printf("edge %2d %2d: x = %d; c = %g\n", |
|
3318 e->tail->i, e->head->i, edge(e)->x, edge(e)->cost); |
|
3319 } |
|
3320 glp_delete_graph(G); |
|
3321 return 0; |
|
3322 } |
|
3323 \end{verbatim} |
|
3324 \end{footnotesize} |
|
3325 |
|
3326 If `\verb|sample.asn|' is the example data file from the subsection |
|
3327 describing the routine \verb|glp_read_asnprob|, the output may look |
|
3328 like follows: |
|
3329 |
|
3330 \begin{footnotesize} |
|
3331 \begin{verbatim} |
|
3332 Reading assignment problem data from `sample.asn'... |
|
3333 Assignment problem has 8 + 9 = 17 nodes and 22 arcs |
|
3334 38 lines were read |
|
3335 ret = 0; sol = 180 |
|
3336 edge 1 12: x = 1; c = 20 |
|
3337 edge 1 10: x = 0; c = 21 |
|
3338 edge 1 9: x = 0; c = 13 |
|
3339 edge 2 13: x = 1; c = 26 |
|
3340 edge 2 12: x = 0; c = 8 |
|
3341 edge 2 10: x = 0; c = 12 |
|
3342 edge 3 13: x = 0; c = 11 |
|
3343 edge 3 11: x = 1; c = 22 |
|
3344 edge 4 14: x = 1; c = 25 |
|
3345 edge 4 12: x = 0; c = 36 |
|
3346 edge 4 9: x = 0; c = 12 |
|
3347 edge 5 17: x = 0; c = 32 |
|
3348 edge 5 16: x = 1; c = 35 |
|
3349 edge 5 15: x = 0; c = 8 |
|
3350 edge 5 14: x = 0; c = 4 |
|
3351 edge 5 13: x = 0; c = 11 |
|
3352 edge 5 12: x = 0; c = 40 |
|
3353 edge 5 11: x = 0; c = 41 |
|
3354 edge 6 9: x = 1; c = 13 |
|
3355 edge 7 10: x = 0; c = 19 |
|
3356 edge 8 11: x = 0; c = 15 |
|
3357 edge 8 10: x = 1; c = 39 |
|
3358 \end{verbatim} |
|
3359 \end{footnotesize} |
|
3360 |
|
3361 \newpage |
|
3362 |
|
3363 \subsection{glp\_asnprob\_hall---find bipartite matching of maximum |
|
3364 cardinality} |
|
3365 |
|
3366 \subsubsection*{Synopsis} |
|
3367 |
|
3368 \begin{verbatim} |
|
3369 int glp_asnprob_hall(glp_graph *G, int v_set, int a_x); |
|
3370 \end{verbatim} |
|
3371 |
|
3372 \subsubsection*{Description} |
|
3373 |
|
3374 The routine \verb|glp_asnprob_hall| finds a matching of maximal |
|
3375 cardinality in the specified bipartite graph. It uses a version of the |
|
3376 Fortran routine \verb|MC21A| developed by |
|
3377 I.~S.~Duff\footnote{I.~S.~Duff, Algorithm 575: Permutations for |
|
3378 zero-free diagonal, ACM Trans. on Math. Softw. 7 (1981), pp.~387-390.}, |
|
3379 which implements Hall's algorithm.\footnote{M.~Hall, ``An Algorithm for |
|
3380 Distinct Representatives,'' Am. Math. Monthly 63 (1956), pp.~716-717.} |
|
3381 |
|
3382 The parameter \verb|G| is a pointer to the graph program object. |
|
3383 |
|
3384 The parameter \verb|v_set| specifies an offset of the field of type |
|
3385 \verb|int| in the vertex data block, which contains the node set |
|
3386 indicator: |
|
3387 |
|
3388 0 --- the node is in set $R$; |
|
3389 |
|
3390 1 --- the node is in set $S$. |
|
3391 |
|
3392 \noindent |
|
3393 If \verb|v_set| $<0$, it is assumed that a node having no incoming arcs |
|
3394 is in set $R$, and a node having no outgoing arcs is in set $S$. |
|
3395 |
|
3396 The parameter \verb|a_x| specifies an offset of the field of type |
|
3397 \verb|int| in the arc data block, to which the routine stores $x_{ij}$. |
|
3398 If \verb|a_x| $<0$, this value is not stored. |
|
3399 |
|
3400 \subsubsection*{Returns} |
|
3401 |
|
3402 The routine \verb|glp_asnprob_hall| returns the cardinality of the |
|
3403 matching found. However, if the specified graph is incorrect (as |
|
3404 detected by the routine \verb|glp_check_asnprob|), this routine returns |
|
3405 a negative value. |
|
3406 |
|
3407 \subsubsection*{Comments} |
|
3408 |
|
3409 The same solution may be obtained with the routine |
|
3410 \verb|glp_asnprob_okalg| (for LP formulation \verb|GLP_ASN_MMP| and |
|
3411 all edge costs equal to 1). However, the routine \verb|glp_asnprob_hall| |
|
3412 is much faster. |
|
3413 |
|
3414 \newpage |
|
3415 |
|
3416 \subsubsection*{Example} |
|
3417 |
|
3418 The example program shown below reads the assignment problem instance |
|
3419 in DIMACS format from file `\verb|sample.asn|', finds a bipartite |
|
3420 matching of maximal cardinality by using the routine |
|
3421 \verb|glp_asnprob_hall|, and writes the solution found to the standard |
|
3422 output. |
|
3423 |
|
3424 \begin{footnotesize} |
|
3425 \begin{verbatim} |
|
3426 #include <stddef.h> |
|
3427 #include <stdio.h> |
|
3428 #include <stdlib.h> |
|
3429 #include <glpk.h> |
|
3430 |
|
3431 typedef struct { int set; } v_data; |
|
3432 typedef struct { int x; } e_data; |
|
3433 |
|
3434 #define node(v) ((v_data *)((v)->data)) |
|
3435 #define edge(e) ((e_data *)((e)->data)) |
|
3436 |
|
3437 int main(void) |
|
3438 { glp_graph *G; |
|
3439 glp_vertex *v; |
|
3440 glp_arc *e; |
|
3441 int i, card; |
|
3442 G = glp_create_graph(sizeof(v_data), sizeof(e_data)); |
|
3443 glp_read_asnprob(G, offsetof(v_data, set), -1, |
|
3444 "sample.asn"); |
|
3445 card = glp_asnprob_hall(G, offsetof(v_data, set), |
|
3446 offsetof(e_data, x)); |
|
3447 printf("card = %d\n", card); |
|
3448 for (i = 1; i <= G->nv; i++) |
|
3449 { v = G->v[i]; |
|
3450 for (e = v->out; e != NULL; e = e->t_next) |
|
3451 printf("edge %2d %2d: x = %d\n", |
|
3452 e->tail->i, e->head->i, edge(e)->x); |
|
3453 } |
|
3454 glp_delete_graph(G); |
|
3455 return 0; |
|
3456 } |
|
3457 \end{verbatim} |
|
3458 \end{footnotesize} |
|
3459 |
|
3460 If `\verb|sample.asn|' is the example data file from the subsection |
|
3461 describing the routine \verb|glp_read_asnprob|, the output may look |
|
3462 like follows: |
|
3463 |
|
3464 \begin{footnotesize} |
|
3465 \begin{verbatim} |
|
3466 Reading assignment problem data from `sample.asn'... |
|
3467 Assignment problem has 8 + 9 = 17 nodes and 22 arcs |
|
3468 38 lines were read |
|
3469 card = 7 |
|
3470 edge 1 12: x = 1 |
|
3471 edge 1 10: x = 0 |
|
3472 edge 1 9: x = 0 |
|
3473 edge 2 13: x = 1 |
|
3474 edge 2 12: x = 0 |
|
3475 edge 2 10: x = 0 |
|
3476 edge 3 13: x = 0 |
|
3477 edge 3 11: x = 1 |
|
3478 edge 4 14: x = 1 |
|
3479 edge 4 12: x = 0 |
|
3480 edge 4 9: x = 0 |
|
3481 edge 5 17: x = 1 |
|
3482 edge 5 16: x = 0 |
|
3483 edge 5 15: x = 0 |
|
3484 edge 5 14: x = 0 |
|
3485 edge 5 13: x = 0 |
|
3486 edge 5 12: x = 0 |
|
3487 edge 5 11: x = 0 |
|
3488 edge 6 9: x = 1 |
|
3489 edge 7 10: x = 1 |
|
3490 edge 8 11: x = 0 |
|
3491 edge 8 10: x = 0 |
|
3492 \end{verbatim} |
|
3493 \end{footnotesize} |
|
3494 |
|
3495 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
3496 |
|
3497 \newpage |
|
3498 |
|
3499 \section{Critical path problem} |
|
3500 |
|
3501 \subsection{Background} |
|
3502 |
|
3503 The {\it critical path problem} (CPP) is stated as follows. Let there |
|
3504 be given a project $J$, which a set of jobs (tasks, activities, etc.). |
|
3505 Performing each job $i\in J$ requires time $t_i\geq 0$. Besides, over |
|
3506 the set $J$ there is given a precedence relation $R\subseteq J\times J$, |
|
3507 where $(i,j)\in R$ means that job $i$ immediately precedes job $j$, i.e. |
|
3508 performing job $j$ cannot start until job $i$ has been completely |
|
3509 performed. The problem is to find starting times $x_i$ for each job |
|
3510 $i\in J$, which satisfy to the precedence relation and minimize the |
|
3511 total duration (makespan) of the project. |
|
3512 |
|
3513 The following is an example of the critical path problem: |
|
3514 |
|
3515 \begin{center} |
|
3516 \begin{tabular}{|c|l|c|c|} |
|
3517 \hline |
|
3518 Job&Desription&Time&Predecessors\\ |
|
3519 \hline |
|
3520 A&Excavate&3&---\\ |
|
3521 B&Lay foundation&4&A\\ |
|
3522 C&Rough plumbing&3&B\\ |
|
3523 D&Frame&10&B\\ |
|
3524 E&Finish exterior&8&D\\ |
|
3525 F&Install HVAC&4&D\\ |
|
3526 G&Rough electric&6&D\\ |
|
3527 H&Sheet rock&8&C, E, F, G\\ |
|
3528 I&Install cabinets&5&H\\ |
|
3529 J&Paint&5&H\\ |
|
3530 K&Final plumbing&4&I\\ |
|
3531 L&Final electric&2&J\\ |
|
3532 M&Install flooring&4&K, L\\ |
|
3533 \hline |
|
3534 \end{tabular} |
|
3535 \end{center} |
|
3536 |
|
3537 Obviously, the project along with the precedence relation can be |
|
3538 represented as a directed graph $G=(J,R)$ called {\it project network}, |
|
3539 where each node $i\in J$ corresponds to a job, and arc |
|
3540 $(i\rightarrow j)\in R$ means that job $i$ immediately precedes job |
|
3541 $j$.\footnote{There exists another network representation of the |
|
3542 critical path problem, where jobs correspond to arcs while nodes |
|
3543 correspond to events introduced to express the precedence relation. |
|
3544 That representation, however, is much less convenient than the one, |
|
3545 where jobs are represented as nodes of the network.} The project network |
|
3546 for the example above is shown on Fig.~4. |
|
3547 |
|
3548 May note that the project network must be acyclic; otherwise, it would |
|
3549 be impossible to satisfy to the precedence relation for any job that |
|
3550 belongs to a cycle. |
|
3551 |
|
3552 \newpage |
|
3553 |
|
3554 \xymatrix |
|
3555 {&&&C|3\ar[rd]&&I|5\ar[r]&K|4\ar[rd]&\\ |
|
3556 A|3\ar[r]&B|4\ar[rru]\ar[rd]&&E|8\ar[r]&H|8\ar[ru]\ar[rd]&&&M|4\\ |
|
3557 &&D|10\ar[ru]\ar[r]\ar[rd]&F|4\ar[ru]&&J|5\ar[r]&L|2\ar[ru]&\\ |
|
3558 &&&G|6\ar[ruu]&&&&\\ |
|
3559 } |
|
3560 |
|
3561 \bigskip |
|
3562 |
|
3563 \noindent\hfil |
|
3564 Fig.~4. An example of the project network. |
|
3565 |
|
3566 \bigskip |
|
3567 |
|
3568 The critical path problem can be naturally formulated as the following |
|
3569 LP problem: |
|
3570 |
|
3571 \medskip |
|
3572 |
|
3573 \noindent |
|
3574 \hspace{.5in}minimize |
|
3575 $$z\eqno(19)$$ |
|
3576 \hspace{.5in}subject to |
|
3577 $$x_i+t_i\leq z\ \ \ \hbox{for all}\ i\in J\ \ \ \ \eqno(20)$$ |
|
3578 $$x_i+t_i\leq x_j\ \ \ \hbox{for all}\ (i,j)\in R\eqno(21)$$ |
|
3579 $$x_i\geq 0\ \ \ \ \ \ \ \hbox{for all}\ i\in J\ \ \eqno(22)$$ |
|
3580 |
|
3581 The inequality constraints (21), which are active in the optimal |
|
3582 solution, define so called {\it critical path} having the following |
|
3583 property: the minimal project duration $z$ can be decreased only by |
|
3584 decreasing the times $t_j$ for jobs on the critical path, and delaying |
|
3585 any critical job delays the entire project. |
|
3586 |
|
3587 \subsection{glp\_cpp---solve critical path problem} |
|
3588 |
|
3589 \subsubsection{Synopsis} |
|
3590 |
|
3591 \begin{verbatim} |
|
3592 double glp_cpp(glp_graph *G, int v_t, int v_es, int v_ls); |
|
3593 \end{verbatim} |
|
3594 |
|
3595 \subsubsection{Description} |
|
3596 |
|
3597 The routine \verb|glp_cpp| solves the critical path problem represented |
|
3598 in the form of the project network. |
|
3599 |
|
3600 The parameter \verb|G| is a pointer to the graph object, which |
|
3601 specifies the project network. This graph must be acyclic. Multiple |
|
3602 arcs are allowed being considered as single arcs. |
|
3603 |
|
3604 The parameter \verb|v_t| specifies an offset of the field of type |
|
3605 \verb|double| in the vertex data block, which contains time $t_i\geq 0$ |
|
3606 needed to perform corresponding job $j\in J$. If \verb|v_t| $<0$, it is |
|
3607 assumed that $t_i=1$ for all jobs. |
|
3608 |
|
3609 The parameter \verb|v_es| specifies an offset of the field of type |
|
3610 \verb|double| in the vertex data block, to which the routine stores |
|
3611 the {\it earliest start time} for corresponding job. If \verb|v_es| |
|
3612 $<0$, this time is not stored. |
|
3613 |
|
3614 The parameter \verb|v_ls| specifies an offset of the field of type |
|
3615 \verb|double| in the vertex data block, to which the routine stores |
|
3616 the {\it latest start time} for corresponding job. If \verb|v_ls| |
|
3617 $<0$, this time is not stored. |
|
3618 |
|
3619 The difference between the latest and earliest start times of some job |
|
3620 is called its {\it time reserve}. Delaying a job within its time reserve |
|
3621 does not affect the project duration, so if the time reserve is zero, |
|
3622 the corresponding job is critical. |
|
3623 |
|
3624 \subsubsection{Returns} |
|
3625 |
|
3626 The routine \verb|glp_cpp| returns the minimal project duration, i.e. |
|
3627 minimal time needed to perform all jobs in the project. |
|
3628 |
|
3629 \subsubsection{Example} |
|
3630 |
|
3631 The example program below solves the critical path problem shown on |
|
3632 Fig.~4 by using the routine \verb|glp_cpp| and writes the solution found |
|
3633 to the standard output. |
|
3634 |
|
3635 \begin{footnotesize} |
|
3636 \begin{verbatim} |
|
3637 #include <stddef.h> |
|
3638 #include <stdio.h> |
|
3639 #include <stdlib.h> |
|
3640 #include <glpk.h> |
|
3641 |
|
3642 typedef struct { double t, es, ls; } v_data; |
|
3643 |
|
3644 #define node(v) ((v_data *)((v)->data)) |
|
3645 |
|
3646 int main(void) |
|
3647 { glp_graph *G; |
|
3648 int i; |
|
3649 double t, es, ef, ls, lf, total; |
|
3650 G = glp_create_graph(sizeof(v_data), 0); |
|
3651 glp_add_vertices(G, 13); |
|
3652 node(G->v[1])->t = 3; /* A: Excavate */ |
|
3653 node(G->v[2])->t = 4; /* B: Lay foundation */ |
|
3654 node(G->v[3])->t = 3; /* C: Rough plumbing */ |
|
3655 node(G->v[4])->t = 10; /* D: Frame */ |
|
3656 node(G->v[5])->t = 8; /* E: Finish exterior */ |
|
3657 node(G->v[6])->t = 4; /* F: Install HVAC */ |
|
3658 node(G->v[7])->t = 6; /* G: Rough elecrtic */ |
|
3659 node(G->v[8])->t = 8; /* H: Sheet rock */ |
|
3660 node(G->v[9])->t = 5; /* I: Install cabinets */ |
|
3661 node(G->v[10])->t = 5; /* J: Paint */ |
|
3662 node(G->v[11])->t = 4; /* K: Final plumbing */ |
|
3663 node(G->v[12])->t = 2; /* L: Final electric */ |
|
3664 node(G->v[13])->t = 4; /* M: Install flooring */ |
|
3665 glp_add_arc(G, 1, 2); /* A precedes B */ |
|
3666 glp_add_arc(G, 2, 3); /* B precedes C */ |
|
3667 glp_add_arc(G, 2, 4); /* B precedes D */ |
|
3668 glp_add_arc(G, 4, 5); /* D precedes E */ |
|
3669 glp_add_arc(G, 4, 6); /* D precedes F */ |
|
3670 glp_add_arc(G, 4, 7); /* D precedes G */ |
|
3671 glp_add_arc(G, 3, 8); /* C precedes H */ |
|
3672 glp_add_arc(G, 5, 8); /* E precedes H */ |
|
3673 glp_add_arc(G, 6, 8); /* F precedes H */ |
|
3674 glp_add_arc(G, 7, 8); /* G precedes H */ |
|
3675 glp_add_arc(G, 8, 9); /* H precedes I */ |
|
3676 glp_add_arc(G, 8, 10); /* H precedes J */ |
|
3677 glp_add_arc(G, 9, 11); /* I precedes K */ |
|
3678 glp_add_arc(G, 10, 12); /* J precedes L */ |
|
3679 glp_add_arc(G, 11, 13); /* K precedes M */ |
|
3680 glp_add_arc(G, 12, 13); /* L precedes M */ |
|
3681 total = glp_cpp(G, offsetof(v_data, t), offsetof(v_data, es), |
|
3682 offsetof(v_data, ls)); |
|
3683 printf("Minimal project duration is %.2f\n\n", total); |
|
3684 printf("Job Time ES EF LS LF\n"); |
|
3685 printf("--- ------ ------ ------ ------ ------\n"); |
|
3686 for (i = 1; i <= G->nv; i++) |
|
3687 { t = node(G->v[i])->t; |
|
3688 es = node(G->v[i])->es; |
|
3689 ef = es + node(G->v[i])->t; |
|
3690 ls = node(G->v[i])->ls; |
|
3691 lf = ls + node(G->v[i])->t; |
|
3692 printf("%3d %6.2f %s %6.2f %6.2f %6.2f %6.2f\n", |
|
3693 i, t, ls - es < 0.001 ? "*" : " ", es, ef, ls, lf); |
|
3694 } |
|
3695 glp_delete_graph(G); |
|
3696 return 0; |
|
3697 } |
|
3698 \end{verbatim} |
|
3699 \end{footnotesize} |
|
3700 |
|
3701 The output from the example program shown below includes job number, |
|
3702 the time needed to perform a job, earliest start time (\verb|ES|), |
|
3703 earliest finish time (\verb|EF|), latest start time (\verb|LS|), and |
|
3704 latest finish time (\verb|LF|) for each job in the project. Critical |
|
3705 jobs are marked by asterisks. |
|
3706 |
|
3707 \newpage |
|
3708 |
|
3709 \begin{footnotesize} |
|
3710 \begin{verbatim} |
|
3711 Minimal project duration is 46.00 |
|
3712 |
|
3713 Job Time ES EF LS LF |
|
3714 --- ------ ------ ------ ------ ------ |
|
3715 1 3.00 * 0.00 3.00 0.00 3.00 |
|
3716 2 4.00 * 3.00 7.00 3.00 7.00 |
|
3717 3 3.00 7.00 10.00 22.00 25.00 |
|
3718 4 10.00 * 7.00 17.00 7.00 17.00 |
|
3719 5 8.00 * 17.00 25.00 17.00 25.00 |
|
3720 6 4.00 17.00 21.00 21.00 25.00 |
|
3721 7 6.00 17.00 23.00 19.00 25.00 |
|
3722 8 8.00 * 25.00 33.00 25.00 33.00 |
|
3723 9 5.00 * 33.00 38.00 33.00 38.00 |
|
3724 10 5.00 33.00 38.00 35.00 40.00 |
|
3725 11 4.00 * 38.00 42.00 38.00 42.00 |
|
3726 12 2.00 38.00 40.00 40.00 42.00 |
|
3727 13 4.00 * 42.00 46.00 42.00 46.00 |
|
3728 \end{verbatim} |
|
3729 \end{footnotesize} |
|
3730 |
|
3731 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
3732 |
|
3733 \chapter{Graph Optimization API Routines} |
|
3734 |
|
3735 \section{Maximum clique problem} |
|
3736 |
|
3737 \subsection{Background} |
|
3738 |
|
3739 The {\it maximum clique problem (MCP)} is a classic combinatorial |
|
3740 optimization problem. Given an undirected graph $G=(V,E)$, where $V$ is |
|
3741 a set of vertices, and $E$ is a set of edges, this problem is to find |
|
3742 the largest {\it clique} $C\subseteq G$, i.e. the largest induced |
|
3743 complete subgraph. A generalization of this problem is the {\it maximum |
|
3744 weight clique problem (MWCP)}, which is to find a clique $C\subseteq G$ |
|
3745 of the largest weight $\displaystyle\sum_{v\in C}w(v)\rightarrow\max$, |
|
3746 where $w(v)$ is a weight of vertex $v\in V$. |
|
3747 |
|
3748 An example of the maximum weight clique problem is shown on Fig.~5. |
|
3749 |
|
3750 \begin{figure} |
|
3751 \noindent\hfil |
|
3752 \begin{tabular}{c} |
|
3753 {\xymatrix %@C=16pt |
|
3754 {&&&{v_1}\ar@{-}[lllddd]\ar@{-}[llddddd]\ar@{-}[dddddd] |
|
3755 \ar@{-}[rrrddd]&&&\\ |
|
3756 &{v_2}\ar@{-}[rrrr]\ar@{-}[rrrrdddd]\ar@{-}[rrddddd]\ar@{-}[dddd]&&&& |
|
3757 {v_3}\ar@{-}[llllldd]\ar@{-}[lllldddd]\ar@{-}[dddd]&\\ |
|
3758 &&&&&&\\ |
|
3759 {v_4}\ar@{-}[rrrrrr]\ar@{-}[rrrddd]&&&&&&{v_5}\ar@{-}[lllddd] |
|
3760 \ar@{-}[ldd]\\ |
|
3761 &&&&&&\\ |
|
3762 &{v_6}\ar@{-}[rrrr]&&&&{v_7}&\\ |
|
3763 &&&{v_8}&&&\\ |
|
3764 }} |
|
3765 \end{tabular} |
|
3766 \begin{tabular}{r@{\ }c@{\ }l} |
|
3767 $w(v_1)$&=&3\\$w(v_2)$&=&4\\$w(v_3)$&=&8\\$w(v_4)$&=&1\\ |
|
3768 $w(v_5)$&=&5\\$w(v_6)$&=&2\\$w(v_7)$&=&1\\$w(v_8)$&=&3\\ |
|
3769 \end{tabular} |
|
3770 |
|
3771 \begin{center} |
|
3772 Fig.~5. An example of the maximum weight clique problem. |
|
3773 \end{center} |
|
3774 \end{figure} |
|
3775 |
|
3776 \subsection{glp\_wclique\_exact---find maximum weight clique with exact |
|
3777 algorithm} |
|
3778 |
|
3779 \subsubsection*{Synopsis} |
|
3780 |
|
3781 \begin{verbatim} |
|
3782 int glp_wclique_exact(glp_graph *G, int v_wgt, double *sol, |
|
3783 int v_set); |
|
3784 \end{verbatim} |
|
3785 |
|
3786 \subsection*{Description} |
|
3787 |
|
3788 The routine {\it glp\_wclique\_exact} finds a maximum weight clique in |
|
3789 the specified undirected graph with the exact algorithm developed by |
|
3790 Patric \"Osterg{\aa}rd.\footnote{P.~R.~J.~\"Osterg{\aa}rd, A new |
|
3791 algorithm for the maximum-weight clique problem, Nordic J. of Computing, |
|
3792 Vol.~8, No.~4, 2001, pp.~424--36.} |
|
3793 |
|
3794 The parameter $G$ is the program object, which specifies an undirected |
|
3795 graph. Each arc $(x\rightarrow y)$ in $G$ is considered as edge |
|
3796 $(x,y)$, self-loops are ignored, and multiple edges, if present, are |
|
3797 replaced (internally) by simple edges. |
|
3798 |
|
3799 The parameter {\it v\_wgt} specifies an offset of the field of type |
|
3800 {\bf double} in the vertex data block, which contains a weight of |
|
3801 corresponding vertex. Vertex weights must be integer-valued in the |
|
3802 range $[0,$ {\it INT\_MAX}$]$. If {\it v\_wgt} $<0$, it is assumed that |
|
3803 all vertices of the graph have the weight 1. |
|
3804 |
|
3805 The parameter {\it sol} specifies a location, to which the routine |
|
3806 stores the weight of the clique found (the clique weight is the sum |
|
3807 of weights of all vertices included in the clique.) If {\it sol} is |
|
3808 {\it NULL}, the solution is not stored. |
|
3809 |
|
3810 The parameter {\it v\_set} specifies an offset of the field of type |
|
3811 {\bf int} in the vertex data block, to which the routines stores a |
|
3812 vertex flag: 1 means that the corresponding vertex is included in the |
|
3813 clique found, and 0 otherwise. If {\it v\_set} $<0$, vertex flags are |
|
3814 not stored. |
|
3815 |
|
3816 \subsubsection*{Returns} |
|
3817 |
|
3818 \def\arraystretch{1} |
|
3819 |
|
3820 \begin{tabular}{@{}p{25mm}p{97.3mm}@{}} |
|
3821 0 & Optimal solution found.\\ |
|
3822 \verb|GLP_EDATA| & Unable to start the search, because some vertex |
|
3823 weights are either not integer-valued or out of range. This code is |
|
3824 also returned if the sum of weights of all vertices exceeds |
|
3825 {\it INT\_MAX}. \\ |
|
3826 \end{tabular} |
|
3827 |
|
3828 \subsubsection*{Notes} |
|
3829 |
|
3830 \noindent\indent |
|
3831 1. The routine {\it glp\_wclique\_exact} finds exact solution. Since |
|
3832 both MCP and MWCP problems are NP-complete, the algorithm may require |
|
3833 exponential time in worst cases. |
|
3834 |
|
3835 2. Internally the specified graph is converted to an adjacency matrix |
|
3836 in {\it dense} format. This requires about $|V|^2/16$ bytes of memory, |
|
3837 where $|V|$ is the number of vertices in the graph. |
|
3838 |
|
3839 \subsubsection*{Example} |
|
3840 |
|
3841 The example program shown below reads a MWCP instance in DIMACS |
|
3842 clique/coloring format from file `\verb|sample.clq|', finds the clique |
|
3843 of largest weight, and writes the solution found to the standard output. |
|
3844 |
|
3845 \begin{footnotesize} |
|
3846 \begin{verbatim} |
|
3847 #include <stddef.h> |
|
3848 #include <stdio.h> |
|
3849 #include <stdlib.h> |
|
3850 #include <glpk.h> |
|
3851 |
|
3852 typedef struct { double wgt; int set; } v_data; |
|
3853 |
|
3854 #define vertex(v) ((v_data *)((v)->data)) |
|
3855 |
|
3856 int main(void) |
|
3857 { glp_graph *G; |
|
3858 glp_vertex *v; |
|
3859 int i, ret; |
|
3860 double sol; |
|
3861 G = glp_create_graph(sizeof(v_data), 0); |
|
3862 glp_read_ccdata(G, offsetof(v_data, wgt), "sample.clq"); |
|
3863 ret = glp_wclique_exact(G, offsetof(v_data, wgt), &sol, |
|
3864 offsetof(v_data, set)); |
|
3865 printf("ret = %d; sol = %g\n", ret, sol); |
|
3866 for (i = 1; i <= G->nv; i++) |
|
3867 { v = G->v[i]; |
|
3868 printf("vertex %d: weight = %g, flag = %d\n", |
|
3869 i, vertex(v)->wgt, vertex(v)->set); |
|
3870 } |
|
3871 glp_delete_graph(G); |
|
3872 return 0; |
|
3873 } |
|
3874 \end{verbatim} |
|
3875 \end{footnotesize} |
|
3876 |
|
3877 \noindent |
|
3878 For the example shown on Fig.~5 the data file may look like follows: |
|
3879 |
|
3880 \begin{footnotesize} |
|
3881 \begin{verbatim} |
|
3882 c sample.clq |
|
3883 c |
|
3884 c This is an example of the maximum weight clique |
|
3885 c problem in DIMACS clique/coloring format. |
|
3886 c |
|
3887 p edge 8 16 |
|
3888 n 1 3 |
|
3889 n 2 4 |
|
3890 n 3 8 |
|
3891 n 5 5 |
|
3892 n 6 2 |
|
3893 n 8 3 |
|
3894 e 1 4 |
|
3895 e 1 5 |
|
3896 e 1 6 |
|
3897 e 1 8 |
|
3898 e 2 3 |
|
3899 e 2 6 |
|
3900 e 2 7 |
|
3901 e 2 8 |
|
3902 e 3 4 |
|
3903 e 3 6 |
|
3904 e 3 7 |
|
3905 e 4 5 |
|
3906 e 4 8 |
|
3907 e 5 7 |
|
3908 e 5 8 |
|
3909 e 6 7 |
|
3910 c |
|
3911 c eof |
|
3912 \end{verbatim} |
|
3913 \end{footnotesize} |
|
3914 |
|
3915 \noindent |
|
3916 The corresponding output from the example program is the following: |
|
3917 |
|
3918 \begin{footnotesize} |
|
3919 \begin{verbatim} |
|
3920 Reading graph from `sample.clq'... |
|
3921 Graph has 8 vertices and 16 edges |
|
3922 28 lines were read |
|
3923 ret = 0; sol = 15 |
|
3924 vertex 1: weight = 3, flag = 0 |
|
3925 vertex 2: weight = 4, flag = 1 |
|
3926 vertex 3: weight = 8, flag = 1 |
|
3927 vertex 4: weight = 1, flag = 0 |
|
3928 vertex 5: weight = 5, flag = 0 |
|
3929 vertex 6: weight = 2, flag = 1 |
|
3930 vertex 7: weight = 1, flag = 1 |
|
3931 vertex 8: weight = 3, flag = 0 |
|
3932 \end{verbatim} |
|
3933 \end{footnotesize} |
|
3934 |
|
3935 \end{document} |