1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 * |
2 * |
3 * This file is a part of LEMON, a generic C++ optimization library. |
3 * This file is a part of LEMON, a generic C++ optimization library. |
4 * |
4 * |
5 * Copyright (C) 2003-2009 |
5 * Copyright (C) 2003-2011 |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
8 * |
8 * |
9 * Permission to use, modify and distribute this software is granted |
9 * Permission to use, modify and distribute this software is granted |
10 * provided that this copyright notice appears in all copies. For |
10 * provided that this copyright notice appears in all copies. For |
57 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. |
57 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. |
58 typedef UM UpperMap; |
58 typedef UM UpperMap; |
59 |
59 |
60 /// \brief The type of supply map. |
60 /// \brief The type of supply map. |
61 /// |
61 /// |
62 /// The type of the map that stores the signed supply values of the |
62 /// The type of the map that stores the signed supply values of the |
63 /// nodes. |
63 /// nodes. |
64 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. |
64 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. |
65 typedef SM SupplyMap; |
65 typedef SM SupplyMap; |
66 |
66 |
67 /// \brief The type of the flow and supply values. |
67 /// \brief The type of the flow and supply values. |
68 typedef typename SupplyMap::Value Value; |
68 typedef typename SupplyMap::Value Value; |
132 solution of the following problem. |
132 solution of the following problem. |
133 |
133 |
134 \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) |
134 \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) |
135 \geq sup(u) \quad \forall u\in V, \f] |
135 \geq sup(u) \quad \forall u\in V, \f] |
136 \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f] |
136 \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f] |
137 |
137 |
138 The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be |
138 The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be |
139 zero or negative in order to have a feasible solution (since the sum |
139 zero or negative in order to have a feasible solution (since the sum |
140 of the expressions on the left-hand side of the inequalities is zero). |
140 of the expressions on the left-hand side of the inequalities is zero). |
141 It means that the total demand must be greater or equal to the total |
141 It means that the total demand must be greater or equal to the total |
142 supply and all the supplies have to be carried out from the supply nodes, |
142 supply and all the supplies have to be carried out from the supply nodes, |
143 but there could be demands that are not satisfied. |
143 but there could be demands that are not satisfied. |
144 If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand |
144 If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand |
145 constraints have to be satisfied with equality, i.e. all demands |
145 constraints have to be satisfied with equality, i.e. all demands |
146 have to be satisfied and all supplies have to be used. |
146 have to be satisfied and all supplies have to be used. |
147 |
147 |
148 If you need the opposite inequalities in the supply/demand constraints |
148 If you need the opposite inequalities in the supply/demand constraints |
149 (i.e. the total demand is less than the total supply and all the demands |
149 (i.e. the total demand is less than the total supply and all the demands |
150 have to be satisfied while there could be supplies that are not used), |
150 have to be satisfied while there could be supplies that are not used), |
151 then you could easily transform the problem to the above form by reversing |
151 then you could easily transform the problem to the above form by reversing |
152 the direction of the arcs and taking the negative of the supply values |
152 the direction of the arcs and taking the negative of the supply values |
323 |
323 |
324 /// The constructor of the class. |
324 /// The constructor of the class. |
325 /// |
325 /// |
326 /// \param graph The digraph the algorithm runs on. |
326 /// \param graph The digraph the algorithm runs on. |
327 /// \param lower The lower bounds for the flow values on the arcs. |
327 /// \param lower The lower bounds for the flow values on the arcs. |
328 /// \param upper The upper bounds (capacities) for the flow values |
328 /// \param upper The upper bounds (capacities) for the flow values |
329 /// on the arcs. |
329 /// on the arcs. |
330 /// \param supply The signed supply values of the nodes. |
330 /// \param supply The signed supply values of the nodes. |
331 Circulation(const Digraph &graph, const LowerMap &lower, |
331 Circulation(const Digraph &graph, const LowerMap &lower, |
332 const UpperMap &upper, const SupplyMap &supply) |
332 const UpperMap &upper, const SupplyMap &supply) |
333 : _g(graph), _lo(&lower), _up(&upper), _supply(&supply), |
333 : _g(graph), _lo(&lower), _up(&upper), _supply(&supply), |