COIN-OR::LEMON - Graph Library

Ticket #391: 391-2-fb932bcfd803.patch

File 391-2-fb932bcfd803.patch, 1.9 KB (added by Peter Kovacs, 14 years ago)
  • lemon/network_simplex.h

    # HG changeset patch
    # User Peter Kovacs <kpeter@inf.elte.hu>
    # Date 1283637483 -7200
    # Node ID fb932bcfd803e4ed14c9d750d924a09eb230aadd
    # Parent  dca9eed2c375a0121a33e12412ae4be3e6dceed5
    Improve arc mixing in NS and enable it by default (#391)
    
    diff --git a/lemon/network_simplex.h b/lemon/network_simplex.h
    a b  
    636636    /// The constructor of the class.
    637637    ///
    638638    /// \param graph The digraph the algorithm runs on.
    639     /// \param arc_mixing Indicate if the arcs have to be stored in a
     639    /// \param arc_mixing Indicate if the arcs will be stored in a
    640640    /// mixed order in the internal data structure.
    641     /// In special cases, it could lead to better overall performance,
    642     /// but it is usually slower. Therefore it is disabled by default.
    643     NetworkSimplex(const GR& graph, bool arc_mixing = false) :
     641    /// In general, it leads to similar performance as using the original
     642    /// arc order, but it makes the algorithm more robust and in special
     643    /// cases, even significantly faster. Therefore, it is enabled by default.
     644    NetworkSimplex(const GR& graph, bool arc_mixing = true) :
    644645      _graph(graph), _node_id(graph), _arc_id(graph),
    645646      _arc_mixing(arc_mixing),
    646647      MAX(std::numeric_limits<Value>::max()),
     
    930931      }
    931932      if (_arc_mixing) {
    932933        // Store the arcs in a mixed order
    933         int k = std::max(int(std::sqrt(double(_arc_num))), 10);
     934        const int skip = std::max(_arc_num / _node_num, 3);
    934935        int i = 0, j = 0;
    935936        for (ArcIt a(_graph); a != INVALID; ++a) {
    936937          _arc_id[a] = i;
    937938          _source[i] = _node_id[_graph.source(a)];
    938939          _target[i] = _node_id[_graph.target(a)];
    939           if ((i += k) >= _arc_num) i = ++j;
     940          if ((i += skip) >= _arc_num) i = ++j;
    940941        }
    941942      } else {
    942943        // Store the arcs in the original order