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] |& &not 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] |&not 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 &not 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 &not 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]|& &not 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}