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 values.
68 typedef typename SupplyMap::Value Flow;
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<Flow> 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<Flow> 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 values.
191 typedef typename Traits::Flow Flow;
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<Flow> 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) const {
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 Flow 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.
562 Node last_activated=INVALID;
563 while((act=_level->highestActive())!=INVALID) {
564 int actlevel=(*_level)[act];
565 int mlevel=_node_num;
566 Flow exc=(*_excess)[act];
568 for(OutArcIt e(_g,act);e!=INVALID; ++e) {
569 Node v = _g.target(e);
570 Flow fc=(*_up)[e]-(*_flow)[e];
571 if(!_tol.positive(fc)) continue;
572 if((*_level)[v]<actlevel) {
573 if(!_tol.less(fc, exc)) {
574 _flow->set(e, (*_flow)[e] + exc);
575 (*_excess)[v] += exc;
576 if(!_level->active(v) && _tol.positive((*_excess)[v]))
579 _level->deactivate(act);
583 _flow->set(e, (*_up)[e]);
585 if(!_level->active(v) && _tol.positive((*_excess)[v]))
590 else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
592 for(InArcIt e(_g,act);e!=INVALID; ++e) {
593 Node v = _g.source(e);
594 Flow fc=(*_flow)[e]-(*_lo)[e];
595 if(!_tol.positive(fc)) continue;
596 if((*_level)[v]<actlevel) {
597 if(!_tol.less(fc, exc)) {
598 _flow->set(e, (*_flow)[e] - exc);
599 (*_excess)[v] += exc;
600 if(!_level->active(v) && _tol.positive((*_excess)[v]))
603 _level->deactivate(act);
607 _flow->set(e, (*_lo)[e]);
609 if(!_level->active(v) && _tol.positive((*_excess)[v]))
614 else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
617 (*_excess)[act] = exc;
618 if(!_tol.positive(exc)) _level->deactivate(act);
619 else if(mlevel==_node_num) {
620 _level->liftHighestActiveToTop();
625 _level->liftHighestActive(mlevel+1);
626 if(_level->onLevel(actlevel)==0) {
637 /// Runs the algorithm.
639 /// This function runs the algorithm.
641 /// \return \c true if a feasible circulation is found.
643 /// \note Apart from the return value, c.run() is just a shortcut of
644 /// the following code.
656 /// \name Query Functions
657 /// The results of the circulation algorithm can be obtained using
658 /// these functions.\n
659 /// Either \ref run() or \ref start() should be called before
664 /// \brief Returns the flow on the given arc.
666 /// Returns the flow on the given arc.
668 /// \pre Either \ref run() or \ref init() must be called before
669 /// using this function.
670 Flow flow(const Arc& arc) const {
671 return (*_flow)[arc];
674 /// \brief Returns a const reference to the flow map.
676 /// Returns a const reference to the arc map storing the found flow.
678 /// \pre Either \ref run() or \ref init() must be called before
679 /// using this function.
680 const FlowMap& flowMap() const {
685 \brief Returns \c true if the given node is in a barrier.
687 Barrier is a set \e B of nodes for which
689 \f[ \sum_{uv\in A: u\in B} upper(uv) -
690 \sum_{uv\in A: v\in B} lower(uv) < \sum_{v\in B} sup(v) \f]
692 holds. The existence of a set with this property prooves that a
693 feasible circualtion cannot exist.
695 This function returns \c true if the given node is in the found
696 barrier. If a feasible circulation is found, the function
697 gives back \c false for every node.
699 \pre Either \ref run() or \ref init() must be called before
705 bool barrier(const Node& node) const
707 return (*_level)[node] >= _el;
710 /// \brief Gives back a barrier.
712 /// This function sets \c bar to the characteristic vector of the
713 /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
714 /// node map with \c bool (or convertible) value type.
716 /// If a feasible circulation is found, the function gives back an
717 /// empty set, so \c bar[v] will be \c false for all nodes \c v.
719 /// \note This function calls \ref barrier() for each node,
720 /// so it runs in O(n) time.
722 /// \pre Either \ref run() or \ref init() must be called before
723 /// using this function.
726 /// \sa checkBarrier()
727 template<class BarrierMap>
728 void barrierMap(BarrierMap &bar) const
730 for(NodeIt n(_g);n!=INVALID;++n)
731 bar.set(n, (*_level)[n] >= _el);
736 /// \name Checker Functions
737 /// The feasibility of the results can be checked using
738 /// these functions.\n
739 /// Either \ref run() or \ref start() should be called before
744 ///Check if the found flow is a feasible circulation
746 ///Check if the found flow is a feasible circulation,
748 bool checkFlow() const {
749 for(ArcIt e(_g);e!=INVALID;++e)
750 if((*_flow)[e]<(*_lo)[e]||(*_flow)[e]>(*_up)[e]) return false;
751 for(NodeIt n(_g);n!=INVALID;++n)
753 Flow dif=-(*_supply)[n];
754 for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e];
755 for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e];
756 if(_tol.negative(dif)) return false;
761 ///Check whether or not the last execution provides a barrier
763 ///Check whether or not the last execution provides a barrier.
766 bool checkBarrier() const
769 Flow inf_cap = std::numeric_limits<Flow>::has_infinity ?
770 std::numeric_limits<Flow>::infinity() :
771 std::numeric_limits<Flow>::max();
772 for(NodeIt n(_g);n!=INVALID;++n)
774 delta-=(*_supply)[n];
775 for(ArcIt e(_g);e!=INVALID;++e)
779 if(barrier(s)&&!barrier(t)) {
780 if (_tol.less(inf_cap - (*_up)[e], delta)) return false;
783 else if(barrier(t)&&!barrier(s)) delta-=(*_lo)[e];
785 return _tol.negative(delta);