COIN-OR::LEMON - Graph Library

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/network_simplex.h

    r840 r830  
    165165
    166166    typedef std::vector<int> IntVector;
     167    typedef std::vector<char> CharVector;
    167168    typedef std::vector<Value> ValueVector;
    168169    typedef std::vector<Cost> CostVector;
    169     typedef std::vector<char> BoolVector;
    170     // Note: vector<char> is used instead of vector<bool> for efficiency reasons
    171170
    172171    // State constants for arcs
     
    215214    IntVector _last_succ;
    216215    IntVector _dirty_revs;
    217     BoolVector _forward;
    218     BoolVector _state;
     216    CharVector _forward;
     217    CharVector _state;
    219218    int _root;
    220219
     
    247246      const IntVector  &_target;
    248247      const CostVector &_cost;
    249       const BoolVector &_state;
     248      const CharVector &_state;
    250249      const CostVector &_pi;
    251250      int &_in_arc;
     
    268267      bool findEnteringArc() {
    269268        Cost c;
    270         for (int e = _next_arc; e != _search_arc_num; ++e) {
     269        for (int e = _next_arc; e < _search_arc_num; ++e) {
    271270          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    272271          if (c < 0) {
     
    276275          }
    277276        }
    278         for (int e = 0; e != _next_arc; ++e) {
     277        for (int e = 0; e < _next_arc; ++e) {
    279278          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    280279          if (c < 0) {
     
    299298      const IntVector  &_target;
    300299      const CostVector &_cost;
    301       const BoolVector &_state;
     300      const CharVector &_state;
    302301      const CostVector &_pi;
    303302      int &_in_arc;
     
    316315      bool findEnteringArc() {
    317316        Cost c, min = 0;
    318         for (int e = 0; e != _search_arc_num; ++e) {
     317        for (int e = 0; e < _search_arc_num; ++e) {
    319318          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    320319          if (c < min) {
     
    338337      const IntVector  &_target;
    339338      const CostVector &_cost;
    340       const BoolVector &_state;
     339      const CharVector &_state;
    341340      const CostVector &_pi;
    342341      int &_in_arc;
     
    357356      {
    358357        // The main parameters of the pivot rule
    359         const double BLOCK_SIZE_FACTOR = 1.0;
     358        const double BLOCK_SIZE_FACTOR = 0.5;
    360359        const int MIN_BLOCK_SIZE = 10;
    361360
     
    370369        int cnt = _block_size;
    371370        int e;
    372         for (e = _next_arc; e != _search_arc_num; ++e) {
     371        for (e = _next_arc; e < _search_arc_num; ++e) {
    373372          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    374373          if (c < min) {
     
    381380          }
    382381        }
    383         for (e = 0; e != _next_arc; ++e) {
     382        for (e = 0; e < _next_arc; ++e) {
    384383          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    385384          if (c < min) {
     
    411410      const IntVector  &_target;
    412411      const CostVector &_cost;
    413       const BoolVector &_state;
     412      const CharVector &_state;
    414413      const CostVector &_pi;
    415414      int &_in_arc;
     
    472471        min = 0;
    473472        _curr_length = 0;
    474         for (e = _next_arc; e != _search_arc_num; ++e) {
     473        for (e = _next_arc; e < _search_arc_num; ++e) {
    475474          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    476475          if (c < 0) {
     
    483482          }
    484483        }
    485         for (e = 0; e != _next_arc; ++e) {
     484        for (e = 0; e < _next_arc; ++e) {
    486485          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
    487486          if (c < 0) {
     
    514513      const IntVector  &_target;
    515514      const CostVector &_cost;
    516       const BoolVector &_state;
     515      const CharVector &_state;
    517516      const CostVector &_pi;
    518517      int &_in_arc;
     
    567566        // Check the current candidate list
    568567        int e;
    569         for (int i = 0; i != _curr_length; ++i) {
     568        for (int i = 0; i < _curr_length; ++i) {
    570569          e = _candidates[i];
    571570          _cand_cost[e] = _state[e] *
     
    580579        int limit = _head_length;
    581580
    582         for (e = _next_arc; e != _search_arc_num; ++e) {
     581        for (e = _next_arc; e < _search_arc_num; ++e) {
    583582          _cand_cost[e] = _state[e] *
    584583            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
     
    592591          }
    593592        }
    594         for (e = 0; e != _next_arc; ++e) {
     593        for (e = 0; e < _next_arc; ++e) {
    595594          _cand_cost[e] = _state[e] *
    596595            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
     
    13621361
    13631362      // Update _rev_thread using the new _thread values
    1364       for (int i = 0; i != int(_dirty_revs.size()); ++i) {
     1363      for (int i = 0; i < int(_dirty_revs.size()); ++i) {
    13651364        u = _dirty_revs[i];
    13661365        _rev_thread[_thread[u]] = u;
     
    14321431        _pi[u] += sigma;
    14331432      }
    1434     }
    1435 
    1436     // Heuristic initial pivots
    1437     bool initialPivots() {
    1438       Value curr, total = 0;
    1439       std::vector<Node> supply_nodes, demand_nodes;
    1440       for (NodeIt u(_graph); u != INVALID; ++u) {
    1441         curr = _supply[_node_id[u]];
    1442         if (curr > 0) {
    1443           total += curr;
    1444           supply_nodes.push_back(u);
    1445         }
    1446         else if (curr < 0) {
    1447           demand_nodes.push_back(u);
    1448         }
    1449       }
    1450       if (_sum_supply > 0) total -= _sum_supply;
    1451       if (total <= 0) return true;
    1452 
    1453       IntVector arc_vector;
    1454       if (_sum_supply >= 0) {
    1455         if (supply_nodes.size() == 1 && demand_nodes.size() == 1) {
    1456           // Perform a reverse graph search from the sink to the source
    1457           typename GR::template NodeMap<bool> reached(_graph, false);
    1458           Node s = supply_nodes[0], t = demand_nodes[0];
    1459           std::vector<Node> stack;
    1460           reached[t] = true;
    1461           stack.push_back(t);
    1462           while (!stack.empty()) {
    1463             Node u, v = stack.back();
    1464             stack.pop_back();
    1465             if (v == s) break;
    1466             for (InArcIt a(_graph, v); a != INVALID; ++a) {
    1467               if (reached[u = _graph.source(a)]) continue;
    1468               int j = _arc_id[a];
    1469               if (_cap[j] >= total) {
    1470                 arc_vector.push_back(j);
    1471                 reached[u] = true;
    1472                 stack.push_back(u);
    1473               }
    1474             }
    1475           }
    1476         } else {
    1477           // Find the min. cost incomming arc for each demand node
    1478           for (int i = 0; i != int(demand_nodes.size()); ++i) {
    1479             Node v = demand_nodes[i];
    1480             Cost c, min_cost = std::numeric_limits<Cost>::max();
    1481             Arc min_arc = INVALID;
    1482             for (InArcIt a(_graph, v); a != INVALID; ++a) {
    1483               c = _cost[_arc_id[a]];
    1484               if (c < min_cost) {
    1485                 min_cost = c;
    1486                 min_arc = a;
    1487               }
    1488             }
    1489             if (min_arc != INVALID) {
    1490               arc_vector.push_back(_arc_id[min_arc]);
    1491             }
    1492           }
    1493         }
    1494       } else {
    1495         // Find the min. cost outgoing arc for each supply node
    1496         for (int i = 0; i != int(supply_nodes.size()); ++i) {
    1497           Node u = supply_nodes[i];
    1498           Cost c, min_cost = std::numeric_limits<Cost>::max();
    1499           Arc min_arc = INVALID;
    1500           for (OutArcIt a(_graph, u); a != INVALID; ++a) {
    1501             c = _cost[_arc_id[a]];
    1502             if (c < min_cost) {
    1503               min_cost = c;
    1504               min_arc = a;
    1505             }
    1506           }
    1507           if (min_arc != INVALID) {
    1508             arc_vector.push_back(_arc_id[min_arc]);
    1509           }
    1510         }
    1511       }
    1512 
    1513       // Perform heuristic initial pivots
    1514       for (int i = 0; i != int(arc_vector.size()); ++i) {
    1515         in_arc = arc_vector[i];
    1516         if (_state[in_arc] * (_cost[in_arc] + _pi[_source[in_arc]] -
    1517             _pi[_target[in_arc]]) >= 0) continue;
    1518         findJoinNode();
    1519         bool change = findLeavingArc();
    1520         if (delta >= MAX) return false;
    1521         changeFlow(change);
    1522         if (change) {
    1523           updateTreeStructure();
    1524           updatePotential();
    1525         }
    1526       }
    1527       return true;
    15281433    }
    15291434
     
    15501455      PivotRuleImpl pivot(*this);
    15511456
    1552       // Perform heuristic initial pivots
    1553       if (!initialPivots()) return UNBOUNDED;
    1554 
    15551457      // Execute the Network Simplex algorithm
    15561458      while (pivot.findEnteringArc()) {
Note: See TracChangeset for help on using the changeset viewer.