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