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 |