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 algorithm.
455 /// Sets the tolerance used by algorithm.
456 Circulation& tolerance(const Tolerance& tolerance) {
461 /// \brief Returns a const reference to the tolerance.
463 /// Returns a const reference to the tolerance.
464 const Tolerance& tolerance() const {
468 /// \name Execution Control
469 /// The simplest way to execute the algorithm is to call \ref run().\n
470 /// If you need more control on the initial solution or the execution,
471 /// first you have to call one of the \ref init() functions, then
472 /// the \ref start() function.
476 /// Initializes the internal data structures.
478 /// Initializes the internal data structures and sets all flow values
479 /// to the lower bound.
482 LEMON_DEBUG(checkBoundMaps(),
483 "Upper bounds must be greater or equal to the lower bounds");
487 for(NodeIt n(_g);n!=INVALID;++n) {
488 (*_excess)[n] = (*_supply)[n];
491 for (ArcIt e(_g);e!=INVALID;++e) {
492 _flow->set(e, (*_lo)[e]);
493 (*_excess)[_g.target(e)] += (*_flow)[e];
494 (*_excess)[_g.source(e)] -= (*_flow)[e];
497 // global relabeling tested, but in general case it provides
498 // worse performance for random digraphs
500 for(NodeIt n(_g);n!=INVALID;++n)
501 _level->initAddItem(n);
502 _level->initFinish();
503 for(NodeIt n(_g);n!=INVALID;++n)
504 if(_tol.positive((*_excess)[n]))
508 /// Initializes the internal data structures using a greedy approach.
510 /// Initializes the internal data structures using a greedy approach
511 /// to construct the initial solution.
514 LEMON_DEBUG(checkBoundMaps(),
515 "Upper bounds must be greater or equal to the lower bounds");
519 for(NodeIt n(_g);n!=INVALID;++n) {
520 (*_excess)[n] = (*_supply)[n];
523 for (ArcIt e(_g);e!=INVALID;++e) {
524 if (!_tol.less(-(*_excess)[_g.target(e)], (*_up)[e])) {
525 _flow->set(e, (*_up)[e]);
526 (*_excess)[_g.target(e)] += (*_up)[e];
527 (*_excess)[_g.source(e)] -= (*_up)[e];
528 } else if (_tol.less(-(*_excess)[_g.target(e)], (*_lo)[e])) {
529 _flow->set(e, (*_lo)[e]);
530 (*_excess)[_g.target(e)] += (*_lo)[e];
531 (*_excess)[_g.source(e)] -= (*_lo)[e];
533 Value fc = -(*_excess)[_g.target(e)];
535 (*_excess)[_g.target(e)] = 0;
536 (*_excess)[_g.source(e)] -= fc;
541 for(NodeIt n(_g);n!=INVALID;++n)
542 _level->initAddItem(n);
543 _level->initFinish();
544 for(NodeIt n(_g);n!=INVALID;++n)
545 if(_tol.positive((*_excess)[n]))
549 ///Executes the algorithm
551 ///This function executes the algorithm.
553 ///\return \c true if a feasible circulation is found.
561 while((act=_level->highestActive())!=INVALID) {
562 int actlevel=(*_level)[act];
563 int mlevel=_node_num;
564 Value exc=(*_excess)[act];
566 for(OutArcIt e(_g,act);e!=INVALID; ++e) {
567 Node v = _g.target(e);
568 Value fc=(*_up)[e]-(*_flow)[e];
569 if(!_tol.positive(fc)) continue;
570 if((*_level)[v]<actlevel) {
571 if(!_tol.less(fc, exc)) {
572 _flow->set(e, (*_flow)[e] + exc);
573 (*_excess)[v] += exc;
574 if(!_level->active(v) && _tol.positive((*_excess)[v]))
577 _level->deactivate(act);
581 _flow->set(e, (*_up)[e]);
583 if(!_level->active(v) && _tol.positive((*_excess)[v]))
588 else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
590 for(InArcIt e(_g,act);e!=INVALID; ++e) {
591 Node v = _g.source(e);
592 Value fc=(*_flow)[e]-(*_lo)[e];
593 if(!_tol.positive(fc)) continue;
594 if((*_level)[v]<actlevel) {
595 if(!_tol.less(fc, exc)) {
596 _flow->set(e, (*_flow)[e] - exc);
597 (*_excess)[v] += exc;
598 if(!_level->active(v) && _tol.positive((*_excess)[v]))
601 _level->deactivate(act);
605 _flow->set(e, (*_lo)[e]);
607 if(!_level->active(v) && _tol.positive((*_excess)[v]))
612 else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
615 (*_excess)[act] = exc;
616 if(!_tol.positive(exc)) _level->deactivate(act);
617 else if(mlevel==_node_num) {
618 _level->liftHighestActiveToTop();
623 _level->liftHighestActive(mlevel+1);
624 if(_level->onLevel(actlevel)==0) {
635 /// Runs the algorithm.
637 /// This function runs the algorithm.
639 /// \return \c true if a feasible circulation is found.
641 /// \note Apart from the return value, c.run() is just a shortcut of
642 /// the following code.
654 /// \name Query Functions
655 /// The results of the circulation algorithm can be obtained using
656 /// these functions.\n
657 /// Either \ref run() or \ref start() should be called before
662 /// \brief Returns the flow value on the given arc.
664 /// Returns the flow value on the given arc.
666 /// \pre Either \ref run() or \ref init() must be called before
667 /// using this function.
668 Value flow(const Arc& arc) const {
669 return (*_flow)[arc];
672 /// \brief Returns a const reference to the flow map.
674 /// Returns a const reference to the arc map storing the found flow.
676 /// \pre Either \ref run() or \ref init() must be called before
677 /// using this function.
678 const FlowMap& flowMap() const {
683 \brief Returns \c true if the given node is in a barrier.
685 Barrier is a set \e B of nodes for which
687 \f[ \sum_{uv\in A: u\in B} upper(uv) -
688 \sum_{uv\in A: v\in B} lower(uv) < \sum_{v\in B} sup(v) \f]
690 holds. The existence of a set with this property prooves that a
691 feasible circualtion cannot exist.
693 This function returns \c true if the given node is in the found
694 barrier. If a feasible circulation is found, the function
695 gives back \c false for every node.
697 \pre Either \ref run() or \ref init() must be called before
703 bool barrier(const Node& node) const
705 return (*_level)[node] >= _el;
708 /// \brief Gives back a barrier.
710 /// This function sets \c bar to the characteristic vector of the
711 /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
712 /// node map with \c bool (or convertible) value type.
714 /// If a feasible circulation is found, the function gives back an
715 /// empty set, so \c bar[v] will be \c false for all nodes \c v.
717 /// \note This function calls \ref barrier() for each node,
718 /// so it runs in O(n) time.
720 /// \pre Either \ref run() or \ref init() must be called before
721 /// using this function.
724 /// \sa checkBarrier()
725 template<class BarrierMap>
726 void barrierMap(BarrierMap &bar) const
728 for(NodeIt n(_g);n!=INVALID;++n)
729 bar.set(n, (*_level)[n] >= _el);
734 /// \name Checker Functions
735 /// The feasibility of the results can be checked using
736 /// these functions.\n
737 /// Either \ref run() or \ref start() should be called before
742 ///Check if the found flow is a feasible circulation
744 ///Check if the found flow is a feasible circulation,
746 bool checkFlow() const {
747 for(ArcIt e(_g);e!=INVALID;++e)
748 if((*_flow)[e]<(*_lo)[e]||(*_flow)[e]>(*_up)[e]) return false;
749 for(NodeIt n(_g);n!=INVALID;++n)
751 Value dif=-(*_supply)[n];
752 for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e];
753 for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e];
754 if(_tol.negative(dif)) return false;
759 ///Check whether or not the last execution provides a barrier
761 ///Check whether or not the last execution provides a barrier.
764 bool checkBarrier() const
767 Value inf_cap = std::numeric_limits<Value>::has_infinity ?
768 std::numeric_limits<Value>::infinity() :
769 std::numeric_limits<Value>::max();
770 for(NodeIt n(_g);n!=INVALID;++n)
772 delta-=(*_supply)[n];
773 for(ArcIt e(_g);e!=INVALID;++e)
777 if(barrier(s)&&!barrier(t)) {
778 if (_tol.less(inf_cap - (*_up)[e], delta)) return false;
781 else if(barrier(t)&&!barrier(s)) delta-=(*_lo)[e];
783 return _tol.negative(delta);