doc/quicktour.dox
changeset 1531 a3b20dd847b5
parent 1528 1aa71600000c
child 1534 b86aad11f842
equal deleted inserted replaced
12:403f8709498b 13:f18f7b06179c
    40 (file): this will also be shown. LEMON supports the DIMACS file formats to
    40 (file): this will also be shown. LEMON supports the DIMACS file formats to
    41 store network optimization problems, but more importantly we also have our own
    41 store network optimization problems, but more importantly we also have our own
    42 file format that gives a more flexible way to store data related to network
    42 file format that gives a more flexible way to store data related to network
    43 optimization.
    43 optimization.
    44 
    44 
    45 <ol> <li>The following code fragment shows how to fill a graph with
    45 <ol> <li>The following code shows how to build a graph from scratch
    46 data. It creates a complete graph on 4 nodes. The type Listgraph is one of the
    46 and iterate on its nodes and edges.  This example also shows how to
    47 LEMON graph types: the typedefs in the beginning are for convenience and we
    47 give a map on the edges of the graph.  The type Listgraph is one of
    48 will suppose them later as well.  
    48 the LEMON graph types: the typedefs in the beginning are for
       
    49 convenience and we will assume them later as well.
    49 
    50 
    50 \dontinclude hello_lemon.cc
    51 \include hello_lemon.cc
    51 \skip ListGraph
       
    52 \until addEdge
       
    53 
    52 
    54 See the whole program in file \ref hello_lemon.cc in \c demo subdir of
    53 See the whole program in file \ref hello_lemon.cc in the \c demo subdir of
    55 LEMON package.
    54 LEMON package.
    56 
    55 
    57     If you want to read more on the LEMON graph structures and
    56     If you want to read more on the LEMON graph structures and
    58 concepts, read the page about \ref graphs "graphs".
    57 concepts, read the page about \ref graphs "graphs".
       
    58 
       
    59 
       
    60 <li>LEMON has an own file format for storing graphs, maps on edges/nodes and some other things. Instead of any explanation let us give a
       
    61 short example file in this format: read the detailed description of the LEMON
       
    62 graph file format and input-output routines here: \ref graph-io-page.
       
    63 
       
    64 So here is a file describing a graph of 6 nodes (0 to 5), two nodemaps
       
    65 (called \c coordinates_x and \c coordinates_y), several edges, an edge map
       
    66 called \c capacity and two designated nodes (called \c source and \c target).
       
    67 
       
    68 \include sample.lgf
       
    69 
       
    70 Finally let us give a simple example that reads a graph from a file and writes
       
    71 it to the standard output.
       
    72 
       
    73 \include reader_writer_demo.cc
       
    74 
       
    75 See the whole program in file \ref reader_writer_demo.cc.
    59 
    76 
    60 <li> The following code shows how to read a graph from a stream
    77 <li> The following code shows how to read a graph from a stream
    61 (e.g. a file) in the DIMACS file format (find the documentation of the
    78 (e.g. a file) in the DIMACS file format (find the documentation of the
    62 DIMACS file formats on the web).
    79 DIMACS file formats on the web).
    63 
    80 
    71 other things (minimum cost flow instances etc.) in DIMACS format and
    88 other things (minimum cost flow instances etc.) in DIMACS format and
    72 use these in LEMON: to see the details read the documentation of the
    89 use these in LEMON: to see the details read the documentation of the
    73 \ref dimacs.h "Dimacs file format reader". There you will also find
    90 \ref dimacs.h "Dimacs file format reader". There you will also find
    74 the details about the output routines into files of the DIMACS format.
    91 the details about the output routines into files of the DIMACS format.
    75 
    92 
    76 <li>DIMACS formats could not give us the flexibility we needed,
       
    77 so we worked out our own file format. Instead of any explanation let us give a
       
    78 short example file in this format: read the detailed description of the LEMON
       
    79 graph file format and input-output routines \ref graph-io-page here.
       
    80 
       
    81 So here is a file describing a graph of 10 nodes (0 to 9), two nodemaps
       
    82 (called \c coordinates_x and \c coordinates_y), several edges, an edge map
       
    83 called \c length and two designated nodes (called \c source and \c target).
       
    84 
       
    85 \todo Maybe a shorter example would be better here.
       
    86 
       
    87 \include route.lgf
       
    88 
       
    89 Finally let us give a simple example that reads a graph from a file and writes
       
    90 it to the standard output.
       
    91 
       
    92 \include reader_writer_demo.cc
       
    93 
       
    94 See the whole program in file \ref reader_writer_demo.cc.
       
    95 
       
    96 \todo This is still under construction!
       
    97 
       
    98 </ol>
    93 </ol>
    99 <li> If you want to solve some transportation problems in a network then 
    94 <li> If you want to solve some transportation problems in a network then 
   100 you will want to find shortest paths between nodes of a graph. This is 
    95 you will want to find shortest paths between nodes of a graph. This is 
   101 usually solved using Dijkstra's algorithm. A utility
    96 usually solved using Dijkstra's algorithm. A utility
   102 that solves this is  the \ref lemon::Dijkstra "LEMON Dijkstra class".
    97 that solves this is  the \ref lemon::Dijkstra "LEMON Dijkstra class".
   103 The following code is a simple program using the 
    98 The following code is a simple program using the 
   104 \ref lemon::Dijkstra "LEMON Dijkstra class" and it also shows how to define a map on the edges (the length
    99 \ref lemon::Dijkstra "LEMON Dijkstra class": it calculates the shortest path between node \c s and \c t in a graph \c g.
   105 function):
   100 We omit the part reading the graph  \c g and the length map \c len.
   106 
   101 
   107 \dontinclude dijkstra_demo.cc
   102 \dontinclude dijkstra_demo.cc
   108 \skip ListGraph
   103 \skip ListGraph
       
   104 \until Graph g
       
   105 ...
       
   106 \skip Dijkstra algorithm
   109 \until std::cout << g.id(s)
   107 \until std::cout << g.id(s)
   110 
   108 
   111 See the whole program in \ref dijkstra_demo.cc.
   109 See the whole program in \ref dijkstra_demo.cc.
   112 
   110 
   113 The first part of the code is self-explanatory: we build the graph and set the
   111 Some explanation: after instantiating a member of the Dijkstra class
   114 length values of the edges. Then we instantiate a member of the Dijkstra class
   112 we run the Dijkstra algorithm from node \c s. After this we read some
   115 and run the Dijkstra algorithm from node \c s. After this we read some of the
   113 of the results.  You can do much more with the Dijkstra class, for
   116 results. 
   114 example you can run it step by step and gain full control of the
   117 You can do much more with the Dijkstra class, for example you can run it step
   115 execution. For a detailed description, see the documentation of the
   118 by step and gain full control of the execution. For a detailed description, see the documentation of the \ref lemon::Dijkstra "LEMON Dijkstra class".
   116 \ref lemon::Dijkstra "LEMON Dijkstra class".
   119 
   117 
   120 
   118 
   121 <li> If you want to design a network and want to minimize the total length
   119 <li> If you want to design a network and want to minimize the total length
   122 of wires then you might be looking for a <b>minimum spanning tree</b> in
   120 of wires then you might be looking for a <b>minimum spanning tree</b> in
   123 an undirected graph. This can be found using the Kruskal algorithm: the 
   121 an undirected graph. This can be found using the Kruskal algorithm: the 
   152 
   150 
   153 <ol>
   151 <ol>
   154 <li>The following code shows how to solve an LP problem using the LEMON lp
   152 <li>The following code shows how to solve an LP problem using the LEMON lp
   155 interface. The code together with the comments is self-explanatory.
   153 interface. The code together with the comments is self-explanatory.
   156 
   154 
   157 \code
   155 \dontinclude lp_demo.cc
   158 
   156 \skip A default solver is taken
   159   //A default solver is taken
   157 \until End of LEMON style code
   160   LpDefault lp;
       
   161   typedef LpDefault::Row Row;
       
   162   typedef LpDefault::Col Col;
       
   163   
       
   164 
       
   165   //This will be a maximization
       
   166   lp.max();
       
   167 
       
   168   //We add coloumns (variables) to our problem
       
   169   Col x1 = lp.addCol();
       
   170   Col x2 = lp.addCol();
       
   171   Col x3 = lp.addCol();
       
   172 
       
   173   //Constraints
       
   174   lp.addRow(x1+x2+x3 <=100);  
       
   175   lp.addRow(10*x1+4*x2+5*x3<=600);  
       
   176   lp.addRow(2*x1+2*x2+6*x3<=300);  
       
   177   //Nonnegativity of the variables
       
   178   lp.colLowerBound(x1, 0);
       
   179   lp.colLowerBound(x2, 0);
       
   180   lp.colLowerBound(x3, 0);
       
   181   //Objective function
       
   182   lp.setObj(10*x1+6*x2+4*x3);
       
   183   
       
   184   //Call the routine of the underlying LP solver
       
   185   lp.solve();
       
   186 
       
   187   //Print results
       
   188   if (lp.primalStatus()==LpSolverBase::OPTIMAL){
       
   189     printf("Z = %g; x1 = %g; x2 = %g; x3 = %g\n", 
       
   190 	   lp.primalValue(), 
       
   191 	   lp.primal(x1), lp.primal(x2), lp.primal(x3));
       
   192   }
       
   193   else{
       
   194     std::cout<<"Optimal solution not found!"<<std::endl;
       
   195   }
       
   196 
       
   197 
       
   198 \endcode
       
   199 
   158 
   200 See the whole code in \ref lp_demo.cc.
   159 See the whole code in \ref lp_demo.cc.
   201 
   160 
   202 <li>The second example shows how easy it is to formalize a max-flow
   161 <li>The second example shows how easy it is to formalize a max-flow
   203 problem as an LP problem using the LEMON LP interface: we are looking
   162 problem as an LP problem using the LEMON LP interface: we are looking
   208 
   167 
   209 In the following code we suppose that we already have the graph \c g,
   168 In the following code we suppose that we already have the graph \c g,
   210 the capacity map \c cap, the source node \c s and the target node \c t
   169 the capacity map \c cap, the source node \c s and the target node \c t
   211 in the memory. We will also omit the typedefs.
   170 in the memory. We will also omit the typedefs.
   212 
   171 
   213 \code
   172 \dontinclude lp_maxflow_demo.cc
   214   //Define a map on the edges for the variables of the LP problem
   173 \skip Define a map on the edges for the variables of the LP problem
   215   typename G::template EdgeMap<LpDefault::Col> x(g);
   174 \until lp.max();
   216   lp.addColSet(x);
   175 \skip Solve with the underlying solver
   217   
   176 \until lp.solve();
   218   //Nonnegativity and capacity constraints
       
   219   for(EdgeIt e(g);e!=INVALID;++e) {
       
   220     lp.colUpperBound(x[e],cap[e]);
       
   221     lp.colLowerBound(x[e],0);
       
   222   }
       
   223 
   177 
   224 
       
   225   //Flow conservation constraints for the nodes (except for 's' and 't')
       
   226   for(NodeIt n(g);n!=INVALID;++n) if(n!=s&&n!=t) {
       
   227     LpDefault::Expr ex;
       
   228     for(InEdgeIt  e(g,n);e!=INVALID;++e) ex+=x[e];
       
   229     for(OutEdgeIt e(g,n);e!=INVALID;++e) ex-=x[e];
       
   230     lp.addRow(ex==0);
       
   231   }
       
   232   
       
   233   //Objective function: the flow value entering 't'
       
   234   {
       
   235     LpDefault::Expr ex;
       
   236     for(InEdgeIt  e(g,t);e!=INVALID;++e) ex+=x[e];
       
   237     for(OutEdgeIt e(g,t);e!=INVALID;++e) ex-=x[e];
       
   238     lp.setObj(ex);
       
   239   }
       
   240 
       
   241   //Maximization
       
   242   lp.max();
       
   243 
       
   244   //Solve with the underlying solver
       
   245   lp.solve();
       
   246 
       
   247 \endcode
       
   248 
   178 
   249 The complete program can be found in file \ref lp_maxflow_demo.cc. After compiling run it in the form:
   179 The complete program can be found in file \ref lp_maxflow_demo.cc. After compiling run it in the form:
   250 
   180 
   251 <tt>./lp_maxflow_demo < sample.lgf</tt>
   181 <tt>./lp_maxflow_demo < sample.lgf</tt>
   252 
   182