1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2009
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
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.
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
19 #ifndef LEMON_CIRCULATION_H
20 #define LEMON_CIRCULATION_H
22 #include <lemon/tolerance.h>
23 #include <lemon/elevator.h>
28 ///\brief Push-relabel algorithm for finding a feasible circulation.
32 /// \brief Default traits class of Circulation class.
34 /// Default traits class of Circulation class.
36 /// \tparam GR Type of the digraph the algorithm runs on.
37 /// \tparam LM The type of the lower bound map.
38 /// \tparam UM The type of the upper bound (capacity) map.
39 /// \tparam SM The type of the supply map.
40 template <typename GR, typename LM,
41 typename UM, typename SM>
42 struct CirculationDefaultTraits {
44 /// \brief The type of the digraph the algorithm runs on.
47 /// \brief The type of the lower bound map.
49 /// The type of the map that stores the lower bounds on the arcs.
50 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
53 /// \brief The type of the upper bound (capacity) map.
55 /// The type of the map that stores the upper bounds (capacities)
57 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
60 /// \brief The type of supply map.
62 /// The type of the map that stores the signed supply values of the
64 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
67 /// \brief The type of the flow and supply values.
68 typedef typename SupplyMap::Value Value;
70 /// \brief The type of the map that stores the flow values.
72 /// The type of the map that stores the flow values.
73 /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
75 typedef typename Digraph::template ArcMap<Value> FlowMap;
77 /// \brief Instantiates a FlowMap.
79 /// This function instantiates a \ref FlowMap.
80 /// \param digraph The digraph for which we would like to define
82 static FlowMap* createFlowMap(const Digraph& digraph) {
83 return new FlowMap(digraph);
86 /// \brief The elevator type used by the algorithm.
88 /// The elevator type used by the algorithm.
91 /// \sa LinkedElevator
92 typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
94 /// \brief Instantiates an Elevator.
96 /// This function instantiates an \ref Elevator.
97 /// \param digraph The digraph for which we would like to define
99 /// \param max_level The maximum level of the elevator.
100 static Elevator* createElevator(const Digraph& digraph, int max_level) {
101 return new Elevator(digraph, max_level);
104 /// \brief The tolerance used by the algorithm
106 /// The tolerance used by the algorithm to handle inexact computation.
107 typedef lemon::Tolerance<Value> Tolerance;
112 \brief Push-relabel algorithm for the network circulation problem.
115 This class implements a push-relabel algorithm for the \e network
116 \e circulation problem.
117 It is to find a feasible circulation when lower and upper bounds
118 are given for the flow values on the arcs and lower bounds are
119 given for the difference between the outgoing and incoming flow
122 The exact formulation of this problem is the following.
123 Let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$
124 \f$upper: A\rightarrow\mathbf{R}\cup\{\infty\}\f$ denote the lower and
125 upper bounds on the arcs, for which \f$lower(uv) \leq upper(uv)\f$
126 holds for all \f$uv\in A\f$, and \f$sup: V\rightarrow\mathbf{R}\f$
127 denotes the signed supply values of the nodes.
128 If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
129 supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
130 \f$-sup(u)\f$ demand.
131 A feasible circulation is an \f$f: A\rightarrow\mathbf{R}\f$
132 solution of the following problem.
134 \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
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]
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
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
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.
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
146 have to be satisfied and all supplies have to be used.
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
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
152 the direction of the arcs and taking the negative of the supply values
153 (e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
155 This algorithm either calculates a feasible circulation, or provides
156 a \ref barrier() "barrier", which prooves that a feasible soultion
159 Note that this algorithm also provides a feasible solution for the
160 \ref min_cost_flow "minimum cost flow problem".
162 \tparam GR The type of the digraph the algorithm runs on.
163 \tparam LM The type of the lower bound map. The default
164 map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
165 \tparam UM The type of the upper bound (capacity) map.
166 The default map type is \c LM.
167 \tparam SM The type of the supply map. The default map type is
168 \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>".
171 template< typename GR,
177 template< typename GR,
178 typename LM = typename GR::template ArcMap<int>,
180 typename SM = typename GR::template NodeMap<typename UM::Value>,
181 typename TR = CirculationDefaultTraits<GR, LM, UM, SM> >
186 ///The \ref CirculationDefaultTraits "traits class" of the algorithm.
188 ///The type of the digraph the algorithm runs on.
189 typedef typename Traits::Digraph Digraph;
190 ///The type of the flow and supply values.
191 typedef typename Traits::Value Value;
193 ///The type of the lower bound map.
194 typedef typename Traits::LowerMap LowerMap;
195 ///The type of the upper bound (capacity) map.
196 typedef typename Traits::UpperMap UpperMap;
197 ///The type of the supply map.
198 typedef typename Traits::SupplyMap SupplyMap;
199 ///The type of the flow map.
200 typedef typename Traits::FlowMap FlowMap;
202 ///The type of the elevator.
203 typedef typename Traits::Elevator Elevator;
204 ///The type of the tolerance.
205 typedef typename Traits::Tolerance Tolerance;
209 TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
216 const SupplyMap *_supply;
224 typedef typename Digraph::template NodeMap<Value> ExcessMap;
232 typedef Circulation Create;
234 ///\name Named Template Parameters
238 template <typename T>
239 struct SetFlowMapTraits : public Traits {
241 static FlowMap *createFlowMap(const Digraph&) {
242 LEMON_ASSERT(false, "FlowMap is not initialized");
243 return 0; // ignore warnings
247 /// \brief \ref named-templ-param "Named parameter" for setting
250 /// \ref named-templ-param "Named parameter" for setting FlowMap
252 template <typename T>
254 : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
255 SetFlowMapTraits<T> > {
256 typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
257 SetFlowMapTraits<T> > Create;
260 template <typename T>
261 struct SetElevatorTraits : public Traits {
263 static Elevator *createElevator(const Digraph&, int) {
264 LEMON_ASSERT(false, "Elevator is not initialized");
265 return 0; // ignore warnings
269 /// \brief \ref named-templ-param "Named parameter" for setting
272 /// \ref named-templ-param "Named parameter" for setting Elevator
273 /// type. If this named parameter is used, then an external
274 /// elevator object must be passed to the algorithm using the
275 /// \ref elevator(Elevator&) "elevator()" function before calling
276 /// \ref run() or \ref init().
277 /// \sa SetStandardElevator
278 template <typename T>
280 : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
281 SetElevatorTraits<T> > {
282 typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
283 SetElevatorTraits<T> > Create;
286 template <typename T>
287 struct SetStandardElevatorTraits : public Traits {
289 static Elevator *createElevator(const Digraph& digraph, int max_level) {
290 return new Elevator(digraph, max_level);
294 /// \brief \ref named-templ-param "Named parameter" for setting
295 /// Elevator type with automatic allocation
297 /// \ref named-templ-param "Named parameter" for setting Elevator
298 /// type with automatic allocation.
299 /// The Elevator should have standard constructor interface to be
300 /// able to automatically created by the algorithm (i.e. the
301 /// digraph and the maximum level should be passed to it).
302 /// However an external elevator object could also be passed to the
303 /// algorithm with the \ref elevator(Elevator&) "elevator()" function
304 /// before calling \ref run() or \ref init().
306 template <typename T>
307 struct SetStandardElevator
308 : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
309 SetStandardElevatorTraits<T> > {
310 typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
311 SetStandardElevatorTraits<T> > Create;
324 /// The constructor of the class.
326 /// \param graph The digraph the algorithm runs on.
327 /// \param lower The lower bounds for the flow values on the arcs.
328 /// \param upper The upper bounds (capacities) for the flow values
330 /// \param supply The signed supply values of the nodes.
331 Circulation(const Digraph &graph, const LowerMap &lower,
332 const UpperMap &upper, const SupplyMap &supply)
333 : _g(graph), _lo(&lower), _up(&upper), _supply(&supply),
334 _flow(NULL), _local_flow(false), _level(NULL), _local_level(false),
345 bool checkBoundMaps() {
346 for (ArcIt e(_g);e!=INVALID;++e) {
347 if (_tol.less((*_up)[e], (*_lo)[e])) return false;
352 void createStructures() {
353 _node_num = _el = countNodes(_g);
356 _flow = Traits::createFlowMap(_g);
360 _level = Traits::createElevator(_g, _node_num);
364 _excess = new ExcessMap(_g);
368 void destroyStructures() {
382 /// Sets the lower bound map.
384 /// Sets the lower bound map.
385 /// \return <tt>(*this)</tt>
386 Circulation& lowerMap(const LowerMap& map) {
391 /// Sets the upper bound (capacity) map.
393 /// Sets the upper bound (capacity) map.
394 /// \return <tt>(*this)</tt>
395 Circulation& upperMap(const UpperMap& map) {
400 /// Sets the supply map.
402 /// Sets the supply map.
403 /// \return <tt>(*this)</tt>
404 Circulation& supplyMap(const SupplyMap& map) {
409 /// \brief Sets the flow map.
411 /// Sets the flow map.
412 /// If you don't use this function before calling \ref run() or
413 /// \ref init(), an instance will be allocated automatically.
414 /// The destructor deallocates this automatically allocated map,
416 /// \return <tt>(*this)</tt>
417 Circulation& flowMap(FlowMap& map) {
426 /// \brief Sets the elevator used by algorithm.
428 /// Sets the elevator used by algorithm.
429 /// If you don't use this function before calling \ref run() or
430 /// \ref init(), an instance will be allocated automatically.
431 /// The destructor deallocates this automatically allocated elevator,
433 /// \return <tt>(*this)</tt>
434 Circulation& elevator(Elevator& elevator) {
437 _local_level = false;
443 /// \brief Returns a const reference to the elevator.
445 /// Returns a const reference to the elevator.
447 /// \pre Either \ref run() or \ref init() must be called before
448 /// using this function.
449 const Elevator& elevator() const {
453 /// \brief Sets the tolerance used by the algorithm.
455 /// Sets the tolerance object used by the algorithm.
456 /// \return <tt>(*this)</tt>
457 Circulation& tolerance(const Tolerance& tolerance) {
462 /// \brief Returns a const reference to the tolerance.
464 /// Returns a const reference to the tolerance object used by
466 const Tolerance& tolerance() const {
470 /// \name Execution Control
471 /// The simplest way to execute the algorithm is to call \ref run().\n
472 /// If you need more control on the initial solution or the execution,
473 /// first you have to call one of the \ref init() functions, then
474 /// the \ref start() function.
478 /// Initializes the internal data structures.
480 /// Initializes the internal data structures and sets all flow values
481 /// to the lower bound.
484 LEMON_DEBUG(checkBoundMaps(),
485 "Upper bounds must be greater or equal to the lower bounds");
489 for(NodeIt n(_g);n!=INVALID;++n) {
490 (*_excess)[n] = (*_supply)[n];
493 for (ArcIt e(_g);e!=INVALID;++e) {
494 _flow->set(e, (*_lo)[e]);
495 (*_excess)[_g.target(e)] += (*_flow)[e];
496 (*_excess)[_g.source(e)] -= (*_flow)[e];
499 // global relabeling tested, but in general case it provides
500 // worse performance for random digraphs
502 for(NodeIt n(_g);n!=INVALID;++n)
503 _level->initAddItem(n);
504 _level->initFinish();
505 for(NodeIt n(_g);n!=INVALID;++n)
506 if(_tol.positive((*_excess)[n]))
510 /// Initializes the internal data structures using a greedy approach.
512 /// Initializes the internal data structures using a greedy approach
513 /// to construct the initial solution.
516 LEMON_DEBUG(checkBoundMaps(),
517 "Upper bounds must be greater or equal to the lower bounds");
521 for(NodeIt n(_g);n!=INVALID;++n) {
522 (*_excess)[n] = (*_supply)[n];
525 for (ArcIt e(_g);e!=INVALID;++e) {
526 if (!_tol.less(-(*_excess)[_g.target(e)], (*_up)[e])) {
527 _flow->set(e, (*_up)[e]);
528 (*_excess)[_g.target(e)] += (*_up)[e];
529 (*_excess)[_g.source(e)] -= (*_up)[e];
530 } else if (_tol.less(-(*_excess)[_g.target(e)], (*_lo)[e])) {
531 _flow->set(e, (*_lo)[e]);
532 (*_excess)[_g.target(e)] += (*_lo)[e];
533 (*_excess)[_g.source(e)] -= (*_lo)[e];
535 Value fc = -(*_excess)[_g.target(e)];
537 (*_excess)[_g.target(e)] = 0;
538 (*_excess)[_g.source(e)] -= fc;
543 for(NodeIt n(_g);n!=INVALID;++n)
544 _level->initAddItem(n);
545 _level->initFinish();
546 for(NodeIt n(_g);n!=INVALID;++n)
547 if(_tol.positive((*_excess)[n]))
551 ///Executes the algorithm
553 ///This function executes the algorithm.
555 ///\return \c true if a feasible circulation is found.
564 Node last_activated=INVALID;
565 while((act=_level->highestActive())!=INVALID) {
566 int actlevel=(*_level)[act];
567 int mlevel=_node_num;
568 Value exc=(*_excess)[act];
570 for(OutArcIt e(_g,act);e!=INVALID; ++e) {
571 Node v = _g.target(e);
572 Value fc=(*_up)[e]-(*_flow)[e];
573 if(!_tol.positive(fc)) continue;
574 if((*_level)[v]<actlevel) {
575 if(!_tol.less(fc, exc)) {
576 _flow->set(e, (*_flow)[e] + exc);
577 (*_excess)[v] += exc;
578 if(!_level->active(v) && _tol.positive((*_excess)[v]))
581 _level->deactivate(act);
585 _flow->set(e, (*_up)[e]);
587 if(!_level->active(v) && _tol.positive((*_excess)[v]))
592 else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
594 for(InArcIt e(_g,act);e!=INVALID; ++e) {
595 Node v = _g.source(e);
596 Value fc=(*_flow)[e]-(*_lo)[e];
597 if(!_tol.positive(fc)) continue;
598 if((*_level)[v]<actlevel) {
599 if(!_tol.less(fc, exc)) {
600 _flow->set(e, (*_flow)[e] - exc);
601 (*_excess)[v] += exc;
602 if(!_level->active(v) && _tol.positive((*_excess)[v]))
605 _level->deactivate(act);
609 _flow->set(e, (*_lo)[e]);
611 if(!_level->active(v) && _tol.positive((*_excess)[v]))
616 else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
619 (*_excess)[act] = exc;
620 if(!_tol.positive(exc)) _level->deactivate(act);
621 else if(mlevel==_node_num) {
622 _level->liftHighestActiveToTop();
627 _level->liftHighestActive(mlevel+1);
628 if(_level->onLevel(actlevel)==0) {
639 /// Runs the algorithm.
641 /// This function runs the algorithm.
643 /// \return \c true if a feasible circulation is found.
645 /// \note Apart from the return value, c.run() is just a shortcut of
646 /// the following code.
658 /// \name Query Functions
659 /// The results of the circulation algorithm can be obtained using
660 /// these functions.\n
661 /// Either \ref run() or \ref start() should be called before
666 /// \brief Returns the flow value on the given arc.
668 /// Returns the flow value on the given arc.
670 /// \pre Either \ref run() or \ref init() must be called before
671 /// using this function.
672 Value flow(const Arc& arc) const {
673 return (*_flow)[arc];
676 /// \brief Returns a const reference to the flow map.
678 /// Returns a const reference to the arc map storing the found flow.
680 /// \pre Either \ref run() or \ref init() must be called before
681 /// using this function.
682 const FlowMap& flowMap() const {
687 \brief Returns \c true if the given node is in a barrier.
689 Barrier is a set \e B of nodes for which
691 \f[ \sum_{uv\in A: u\in B} upper(uv) -
692 \sum_{uv\in A: v\in B} lower(uv) < \sum_{v\in B} sup(v) \f]
694 holds. The existence of a set with this property prooves that a
695 feasible circualtion cannot exist.
697 This function returns \c true if the given node is in the found
698 barrier. If a feasible circulation is found, the function
699 gives back \c false for every node.
701 \pre Either \ref run() or \ref init() must be called before
707 bool barrier(const Node& node) const
709 return (*_level)[node] >= _el;
712 /// \brief Gives back a barrier.
714 /// This function sets \c bar to the characteristic vector of the
715 /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
716 /// node map with \c bool (or convertible) value type.
718 /// If a feasible circulation is found, the function gives back an
719 /// empty set, so \c bar[v] will be \c false for all nodes \c v.
721 /// \note This function calls \ref barrier() for each node,
722 /// so it runs in O(n) time.
724 /// \pre Either \ref run() or \ref init() must be called before
725 /// using this function.
728 /// \sa checkBarrier()
729 template<class BarrierMap>
730 void barrierMap(BarrierMap &bar) const
732 for(NodeIt n(_g);n!=INVALID;++n)
733 bar.set(n, (*_level)[n] >= _el);
738 /// \name Checker Functions
739 /// The feasibility of the results can be checked using
740 /// these functions.\n
741 /// Either \ref run() or \ref start() should be called before
746 ///Check if the found flow is a feasible circulation
748 ///Check if the found flow is a feasible circulation,
750 bool checkFlow() const {
751 for(ArcIt e(_g);e!=INVALID;++e)
752 if((*_flow)[e]<(*_lo)[e]||(*_flow)[e]>(*_up)[e]) return false;
753 for(NodeIt n(_g);n!=INVALID;++n)
755 Value dif=-(*_supply)[n];
756 for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e];
757 for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e];
758 if(_tol.negative(dif)) return false;
763 ///Check whether or not the last execution provides a barrier
765 ///Check whether or not the last execution provides a barrier.
768 bool checkBarrier() const
771 Value inf_cap = std::numeric_limits<Value>::has_infinity ?
772 std::numeric_limits<Value>::infinity() :
773 std::numeric_limits<Value>::max();
774 for(NodeIt n(_g);n!=INVALID;++n)
776 delta-=(*_supply)[n];
777 for(ArcIt e(_g);e!=INVALID;++e)
781 if(barrier(s)&&!barrier(t)) {
782 if (_tol.less(inf_cap - (*_up)[e], delta)) return false;
785 else if(barrier(t)&&!barrier(s)) delta-=(*_lo)[e];
787 return _tol.negative(delta);