doc/graph_orientation.dox
author kpeter
Mon, 18 Feb 2008 03:32:06 +0000
changeset 2575 e866e288cba6
parent 2454 c4554a95b0d3
permissions -rw-r--r--
Major improvements in NetworkSimplex.

Main changes:
- Use -potenital[] instead of potential[] to conform to the usual
terminology.
- Use function parameter instead of #define commands to select pivot rule.
- Use much faster implementation for the candidate list pivot rule.
It is about 5-20 times faster now.
- Add a new pivot rule called "Limited Search" that is a modified
version of "Block Search". It is about 25 percent faster on rather
sparse graphs.
- By default "Limited Search" is used for sparse graphs and
"Block Search" is used otherwise. This combined method is the most
efficient on every input class.
- Change the name of private members to start with "_".
- Change the name of function parameters not to start with "_".
- Remove unnecessary documentation for private members.
- Many doc improvements.
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2008
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 namespace lemon {
    20 /**
    21 
    22 \ingroup demos
    23 \file graph_orientation.cc
    24 \brief Graph orientation with lower bound requirement on the
    25 in-degree of the nodes.
    26 
    27 This demo shows an adaptation of the well-known "preflow push" algorithm to
    28 a simple graph orientation problem.
    29 
    30 The input of the problem is a(n undirected) graph and an integer value
    31 <i>f(n)</i> assigned to each node \e n. The task is to find an orientation
    32 of the edges for which the number of edge arriving at each node \e n is at
    33 least least <i>f(n)</i>.
    34 
    35 In fact, the algorithm reads a directed graph and computes a set of edges to
    36 be reversed in order to achieve the in-degree requirement.
    37 This input is given using 
    38 \ref graph-io-page ".lgf (Lemon Graph Format)" file. It should contain
    39 three node maps. The one called "f" contains the in-degree requirements, while
    40 "coordinate_x" and "coordinate_y" indicate the position of the nodes. These
    41 latter ones are used to generate the output, which is a <tt>.eps</tt> file.
    42 
    43 
    44 \section go-alg-dec The C++ source file
    45 
    46 Here you find how to solve the problem above using lemon.
    47 
    48 \subsection go-alg-head Headers and convenience typedefs
    49 
    50 First we include some important headers.
    51 
    52 The first one defines \ref lemon::ListGraph "ListGraph",
    53 the "Swiss army knife" graph implementation.
    54 \dontinclude graph_orientation.cc
    55 \skipline list_graph
    56 
    57 The next is  to read a \ref graph-io-page ".lgf" (Lemon Graph Format) file.
    58 \skipline reader
    59 
    60 This provides us with some special purpose graph \ref maps "maps".
    61 \skipline iterable
    62 
    63 The following header defines a simple data structure to store and manipulate
    64 planar coordinates. It will be used to draw the result.
    65 \skipline dim2
    66 
    67 And finally, this header contains a simple graph drawing utility.
    68 \skipline eps
    69 
    70 As we don't want to type in \ref lemon "lemon::" million times, the
    71 following line seems to be useful.
    72 \skipline namespace
    73 
    74 The following macro will also save a lot of typing by defining some
    75 convenience <tt>typedef</tt>s.
    76 
    77 \skipline TYPEDEF
    78 
    79 Actually, the macro above would be equivalent with the following
    80 <tt>typedef</tt>s.
    81 
    82 \code
    83 typedef ListGraph::Node Node;
    84 typedef ListGraph::NodeIt NodeIt;
    85 typedef ListGraph::Edge Edge;
    86 typedef ListGraph::EdgeIt EdgeIt;
    87 typedef ListGraph::OutEdgeIt OutEdgeIt;
    88 typedef ListGraph::InEdgeIt InEdgeIt;
    89 \endcode
    90 
    91 \subsection go-alg-main The main() function
    92 
    93 Well, we are ready to start <tt>main()</tt>.
    94 \skip main
    95 \until {
    96 
    97 First we check whether the program is called with exactly one parameter.
    98 If it isn't, we print a short help message end exit.
    99 The vast majority of people would probably skip this block.
   100 \skip if
   101 \until }
   102 
   103 Now, we read a graph \c g, and a map \c f containing
   104 the in-deg requirements from a \ref graph-io-page ".lgf (Lemon Graph Format)"
   105 file. To generate the output picture, we also read the node titles (\c label)
   106 and
   107 coordinates (\c coords).
   108 So, first we create the graph
   109 \skipline ListGraph
   110 and the corresponding NodeMaps.
   111 \skipline NodeMap
   112 \until coords
   113 \note The graph must be given to the maps' constructor.
   114 
   115 Then, the following block will read these data from the file, or exit if
   116 the file is missing or corrupt.
   117 \skip try
   118 \until }
   119 \until }
   120 
   121 The algorithm needs an integer value assigned to each node. We call this "level" and the nodes are on level 0 at the
   122 beginning of the execution.
   123 
   124 \skipline level
   125 
   126 The deficiency (\c def) of a node is the in-degree requirement minus the 
   127 actual in-degree.
   128 
   129 \skip def
   130 \until subMap
   131 
   132 A node is \e active if its deficiency is positive (i.e. if it doesn't meet
   133 the degree requirement).
   134 \skip active
   135 \until def
   136 
   137 We also store a bool map indicating which edges are reverted.
   138 Actually this map called \c rev is only
   139 used to draw these edges with different color in the output picture. The
   140 algorithm updates this map, but will not use it otherwise.
   141 \skip rev
   142 \until reversed
   143 
   144 The variable \c nodeNum will refer to the number of nodes.
   145 \skipline nodeNum
   146 
   147 Here comes the algorithm itself. 
   148 In each iteration we choose an active node (\c act will do it for us).
   149 If there is
   150 no such a node, then the orientation is feasible so we are done.
   151 \skip act
   152 \until while
   153 
   154 Then we check if there exists an edge leaving this node and
   155 stepping down exactly
   156 one level.
   157 \skip OutEdge
   158 \until while
   159 
   160 If there exists, we decrease the "activity" of the node \c act by reverting
   161 this egde.
   162 Fortunately, \ref lemon::ListGraph "ListGraph"
   163 has a special function \ref lemon::ListGraph::reverseEdge() "reverseEdge()"
   164 that makes this easy.
   165 We also have to update the maps \c def and
   166 \c rev.
   167 \skipline if
   168 \skip if
   169 \until }
   170 Otherwise (i.e. if there is no edge stepping down one level) we lift up the
   171 current active node \c act. If it reaches level \c nodeNum, then there
   172 exists no appropriate orientation so we stop.
   173 \skipline else
   174 \skipline if
   175 \skipline return
   176 \until }
   177 \until }
   178 \until }
   179 
   180 Believe it or not, this algorithm works and runs fast.
   181 
   182 Finally, we print the obtained orientation. Note, how the different
   183 \c bool values of
   184 \c rev are transformed into different \ref lemon::Color "RGB color"s
   185 using the class
   186 \ref lemon::Palette "Palette"
   187 and the \ref map_adaptors "map adaptor" called
   188 \ref lemon::ComposeMap "composeMap".
   189 
   190 \skip graphToEps
   191 \until run
   192 
   193 
   194 \until end of main
   195 
   196 Finally here are again the list of the used include files (because I can't turn
   197 this section off.)
   198 
   199 */
   200 
   201 }