[Lemon-commits] Peter Kovacs: Entirely rework cycle canceling al...
Lemon HG
hg at lemon.cs.elte.hu
Mon Dec 14 06:17:46 CET 2009
details: http://lemon.cs.elte.hu/hg/lemon/rev/aef153f430e1
changeset: 881:aef153f430e1
user: Peter Kovacs <kpeter [at] inf.elte.hu>
date: Fri Nov 13 00:10:33 2009 +0100
description:
Entirely rework cycle canceling algorithms (#180)
- Move the cycle canceling algorithms (CycleCanceling,
CancelAndTighten) into one class (CycleCanceling).
- Add a Method parameter to the run() function to be able to select
the used cycle canceling method.
- Use the new interface similarly to NetworkSimplex.
- Rework the implementations using an efficient internal structure
for handling the residual network. This improvement made the
codes much faster.
- Handle GEQ supply type (LEQ is not supported).
- Handle infinite upper bounds.
- Handle negative costs (for arcs of finite upper bound).
- Extend the documentation.
diffstat:
lemon/Makefile.am | 1 -
lemon/cancel_and_tighten.h | 797 ----------------------------
lemon/cycle_canceling.h | 1321 +++++++++++++++++++++++++++++++++-------------
3 files changed, 949 insertions(+), 1170 deletions(-)
diffs (truncated from 2297 to 300 lines):
diff --git a/lemon/Makefile.am b/lemon/Makefile.am
--- a/lemon/Makefile.am
+++ b/lemon/Makefile.am
@@ -62,7 +62,6 @@
lemon/bin_heap.h \
lemon/binom_heap.h \
lemon/bucket_heap.h \
- lemon/cancel_and_tighten.h \
lemon/capacity_scaling.h \
lemon/cbc.h \
lemon/circulation.h \
diff --git a/lemon/cancel_and_tighten.h b/lemon/cancel_and_tighten.h
deleted file mode 100644
--- a/lemon/cancel_and_tighten.h
+++ /dev/null
@@ -1,797 +0,0 @@
-/* -*- C++ -*-
- *
- * This file is a part of LEMON, a generic C++ optimization library
- *
- * Copyright (C) 2003-2008
- * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
- * (Egervary Research Group on Combinatorial Optimization, EGRES).
- *
- * Permission to use, modify and distribute this software is granted
- * provided that this copyright notice appears in all copies. For
- * precise terms see the accompanying LICENSE file.
- *
- * This software is provided "AS IS" with no warranty of any kind,
- * express or implied, and with no claim as to its suitability for any
- * purpose.
- *
- */
-
-#ifndef LEMON_CANCEL_AND_TIGHTEN_H
-#define LEMON_CANCEL_AND_TIGHTEN_H
-
-/// \ingroup min_cost_flow
-///
-/// \file
-/// \brief Cancel and Tighten algorithm for finding a minimum cost flow.
-
-#include <vector>
-
-#include <lemon/circulation.h>
-#include <lemon/bellman_ford.h>
-#include <lemon/howard.h>
-#include <lemon/adaptors.h>
-#include <lemon/tolerance.h>
-#include <lemon/math.h>
-
-#include <lemon/static_graph.h>
-
-namespace lemon {
-
- /// \addtogroup min_cost_flow
- /// @{
-
- /// \brief Implementation of the Cancel and Tighten algorithm for
- /// finding a minimum cost flow.
- ///
- /// \ref CancelAndTighten implements the Cancel and Tighten algorithm for
- /// finding a minimum cost flow.
- ///
- /// \tparam Digraph The digraph type the algorithm runs on.
- /// \tparam LowerMap The type of the lower bound map.
- /// \tparam CapacityMap The type of the capacity (upper bound) map.
- /// \tparam CostMap The type of the cost (length) map.
- /// \tparam SupplyMap The type of the supply map.
- ///
- /// \warning
- /// - Arc capacities and costs should be \e non-negative \e integers.
- /// - Supply values should be \e signed \e integers.
- /// - The value types of the maps should be convertible to each other.
- /// - \c CostMap::Value must be signed type.
- ///
- /// \author Peter Kovacs
- template < typename Digraph,
- typename LowerMap = typename Digraph::template ArcMap<int>,
- typename CapacityMap = typename Digraph::template ArcMap<int>,
- typename CostMap = typename Digraph::template ArcMap<int>,
- typename SupplyMap = typename Digraph::template NodeMap<int> >
- class CancelAndTighten
- {
- TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
-
- typedef typename CapacityMap::Value Capacity;
- typedef typename CostMap::Value Cost;
- typedef typename SupplyMap::Value Supply;
- typedef typename Digraph::template ArcMap<Capacity> CapacityArcMap;
- typedef typename Digraph::template NodeMap<Supply> SupplyNodeMap;
-
- typedef ResidualDigraph< const Digraph,
- CapacityArcMap, CapacityArcMap > ResDigraph;
-
- public:
-
- /// The type of the flow map.
- typedef typename Digraph::template ArcMap<Capacity> FlowMap;
- /// The type of the potential map.
- typedef typename Digraph::template NodeMap<Cost> PotentialMap;
-
- private:
-
- /// \brief Map adaptor class for handling residual arc costs.
- ///
- /// Map adaptor class for handling residual arc costs.
- class ResidualCostMap : public MapBase<typename ResDigraph::Arc, Cost>
- {
- typedef typename ResDigraph::Arc Arc;
-
- private:
-
- const CostMap &_cost_map;
-
- public:
-
- ///\e
- ResidualCostMap(const CostMap &cost_map) : _cost_map(cost_map) {}
-
- ///\e
- Cost operator[](const Arc &e) const {
- return ResDigraph::forward(e) ? _cost_map[e] : -_cost_map[e];
- }
-
- }; //class ResidualCostMap
-
- /// \brief Map adaptor class for handling reduced arc costs.
- ///
- /// Map adaptor class for handling reduced arc costs.
- class ReducedCostMap : public MapBase<Arc, Cost>
- {
- private:
-
- const Digraph &_gr;
- const CostMap &_cost_map;
- const PotentialMap &_pot_map;
-
- public:
-
- ///\e
- ReducedCostMap( const Digraph &gr,
- const CostMap &cost_map,
- const PotentialMap &pot_map ) :
- _gr(gr), _cost_map(cost_map), _pot_map(pot_map) {}
-
- ///\e
- inline Cost operator[](const Arc &e) const {
- return _cost_map[e] + _pot_map[_gr.source(e)]
- - _pot_map[_gr.target(e)];
- }
-
- }; //class ReducedCostMap
-
- struct BFOperationTraits {
- static double zero() { return 0; }
-
- static double infinity() {
- return std::numeric_limits<double>::infinity();
- }
-
- static double plus(const double& left, const double& right) {
- return left + right;
- }
-
- static bool less(const double& left, const double& right) {
- return left + 1e-6 < right;
- }
- }; // class BFOperationTraits
-
- private:
-
- // The digraph the algorithm runs on
- const Digraph &_graph;
- // The original lower bound map
- const LowerMap *_lower;
- // The modified capacity map
- CapacityArcMap _capacity;
- // The original cost map
- const CostMap &_cost;
- // The modified supply map
- SupplyNodeMap _supply;
- bool _valid_supply;
-
- // Arc map of the current flow
- FlowMap *_flow;
- bool _local_flow;
- // Node map of the current potentials
- PotentialMap *_potential;
- bool _local_potential;
-
- // The residual digraph
- ResDigraph *_res_graph;
- // The residual cost map
- ResidualCostMap _res_cost;
-
- public:
-
- /// \brief General constructor (with lower bounds).
- ///
- /// General constructor (with lower bounds).
- ///
- /// \param digraph The digraph the algorithm runs on.
- /// \param lower The lower bounds of the arcs.
- /// \param capacity The capacities (upper bounds) of the arcs.
- /// \param cost The cost (length) values of the arcs.
- /// \param supply The supply values of the nodes (signed).
- CancelAndTighten( const Digraph &digraph,
- const LowerMap &lower,
- const CapacityMap &capacity,
- const CostMap &cost,
- const SupplyMap &supply ) :
- _graph(digraph), _lower(&lower), _capacity(digraph), _cost(cost),
- _supply(digraph), _flow(NULL), _local_flow(false),
- _potential(NULL), _local_potential(false),
- _res_graph(NULL), _res_cost(_cost)
- {
- // Check the sum of supply values
- Supply sum = 0;
- for (NodeIt n(_graph); n != INVALID; ++n) {
- _supply[n] = supply[n];
- sum += _supply[n];
- }
- _valid_supply = sum == 0;
-
- // Remove non-zero lower bounds
- for (ArcIt e(_graph); e != INVALID; ++e) {
- _capacity[e] = capacity[e];
- if (lower[e] != 0) {
- _capacity[e] -= lower[e];
- _supply[_graph.source(e)] -= lower[e];
- _supply[_graph.target(e)] += lower[e];
- }
- }
- }
-/*
- /// \brief General constructor (without lower bounds).
- ///
- /// General constructor (without lower bounds).
- ///
- /// \param digraph The digraph the algorithm runs on.
- /// \param capacity The capacities (upper bounds) of the arcs.
- /// \param cost The cost (length) values of the arcs.
- /// \param supply The supply values of the nodes (signed).
- CancelAndTighten( const Digraph &digraph,
- const CapacityMap &capacity,
- const CostMap &cost,
- const SupplyMap &supply ) :
- _graph(digraph), _lower(NULL), _capacity(capacity), _cost(cost),
- _supply(supply), _flow(NULL), _local_flow(false),
- _potential(NULL), _local_potential(false),
- _res_graph(NULL), _res_cost(_cost)
- {
- // Check the sum of supply values
- Supply sum = 0;
- for (NodeIt n(_graph); n != INVALID; ++n) sum += _supply[n];
- _valid_supply = sum == 0;
- }
-
- /// \brief Simple constructor (with lower bounds).
- ///
- /// Simple constructor (with lower bounds).
- ///
- /// \param digraph The digraph the algorithm runs on.
- /// \param lower The lower bounds of the arcs.
- /// \param capacity The capacities (upper bounds) of the arcs.
- /// \param cost The cost (length) values of the arcs.
- /// \param s The source node.
- /// \param t The target node.
- /// \param flow_value The required amount of flow from node \c s
- /// to node \c t (i.e. the supply of \c s and the demand of \c t).
- CancelAndTighten( const Digraph &digraph,
- const LowerMap &lower,
- const CapacityMap &capacity,
- const CostMap &cost,
- Node s, Node t,
- Supply flow_value ) :
- _graph(digraph), _lower(&lower), _capacity(capacity), _cost(cost),
- _supply(digraph, 0), _flow(NULL), _local_flow(false),
- _potential(NULL), _local_potential(false),
- _res_graph(NULL), _res_cost(_cost)
- {
- // Remove non-zero lower bounds
- _supply[s] = flow_value;
- _supply[t] = -flow_value;
- for (ArcIt e(_graph); e != INVALID; ++e) {
- if (lower[e] != 0) {
- _capacity[e] -= lower[e];
- _supply[_graph.source(e)] -= lower[e];
- _supply[_graph.target(e)] += lower[e];
- }
- }
- _valid_supply = true;
- }
-
- /// \brief Simple constructor (without lower bounds).
- ///
- /// Simple constructor (without lower bounds).
- ///
- /// \param digraph The digraph the algorithm runs on.
More information about the Lemon-commits
mailing list