gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Small improvements for NetworkSimplex (#298)
0 1 0
default
1 file changed with 2 insertions and 15 deletions:
↑ Collapse diff ↑
Ignore white space 48 line context
... ...
@@ -140,50 +140,48 @@
140 140

	
141 141
      /// The Block Search pivot rule.
142 142
      /// A specified number of arcs are examined in every iteration
143 143
      /// in a wraparound fashion and the best eligible arc is selected
144 144
      /// from this block.
145 145
      BLOCK_SEARCH,
146 146

	
147 147
      /// The Candidate List pivot rule.
148 148
      /// In a major iteration a candidate list is built from eligible arcs
149 149
      /// in a wraparound fashion and in the following minor iterations
150 150
      /// the best eligible arc is selected from this list.
151 151
      CANDIDATE_LIST,
152 152

	
153 153
      /// The Altering Candidate List pivot rule.
154 154
      /// It is a modified version of the Candidate List method.
155 155
      /// It keeps only the several best eligible arcs from the former
156 156
      /// candidate list and extends this list in every iteration.
157 157
      ALTERING_LIST
158 158
    };
159 159
    
160 160
  private:
161 161

	
162 162
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
163 163

	
164
    typedef std::vector<Arc> ArcVector;
165
    typedef std::vector<Node> NodeVector;
166 164
    typedef std::vector<int> IntVector;
167 165
    typedef std::vector<bool> BoolVector;
168 166
    typedef std::vector<Value> ValueVector;
169 167
    typedef std::vector<Cost> CostVector;
170 168

	
171 169
    // State constants for arcs
172 170
    enum ArcStateEnum {
173 171
      STATE_UPPER = -1,
174 172
      STATE_TREE  =  0,
175 173
      STATE_LOWER =  1
176 174
    };
177 175

	
178 176
  private:
179 177

	
180 178
    // Data related to the underlying digraph
181 179
    const GR &_graph;
182 180
    int _node_num;
183 181
    int _arc_num;
184 182
    int _all_arc_num;
185 183
    int _search_arc_num;
186 184

	
187 185
    // Parameters of the problem
188 186
    bool _have_lower;
189 187
    SupplyType _stype;
... ...
@@ -664,59 +662,50 @@
664 662

	
665 663
      _parent.resize(all_node_num);
666 664
      _pred.resize(all_node_num);
667 665
      _forward.resize(all_node_num);
668 666
      _thread.resize(all_node_num);
669 667
      _rev_thread.resize(all_node_num);
670 668
      _succ_num.resize(all_node_num);
671 669
      _last_succ.resize(all_node_num);
672 670
      _state.resize(max_arc_num);
673 671

	
674 672
      // Copy the graph (store the arcs in a mixed order)
675 673
      int i = 0;
676 674
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
677 675
        _node_id[n] = i;
678 676
      }
679 677
      int k = std::max(int(std::sqrt(double(_arc_num))), 10);
680 678
      i = 0;
681 679
      for (ArcIt a(_graph); a != INVALID; ++a) {
682 680
        _arc_id[a] = i;
683 681
        _source[i] = _node_id[_graph.source(a)];
684 682
        _target[i] = _node_id[_graph.target(a)];
685 683
        if ((i += k) >= _arc_num) i = (i % k) + 1;
686 684
      }
687 685
      
688
      // Initialize maps
689
      for (int i = 0; i != _node_num; ++i) {
690
        _supply[i] = 0;
691
      }
692
      for (int i = 0; i != _arc_num; ++i) {
693
        _lower[i] = 0;
694
        _upper[i] = INF;
695
        _cost[i] = 1;
696
      }
697
      _have_lower = false;
698
      _stype = GEQ;
686
      // Reset parameters
687
      reset();
699 688
    }
700 689

	
701 690
    /// \name Parameters
702 691
    /// The parameters of the algorithm can be specified using these
703 692
    /// functions.
704 693

	
705 694
    /// @{
706 695

	
707 696
    /// \brief Set the lower bounds on the arcs.
708 697
    ///
709 698
    /// This function sets the lower bounds on the arcs.
710 699
    /// If it is not used before calling \ref run(), the lower bounds
711 700
    /// will be set to zero on all arcs.
712 701
    ///
713 702
    /// \param map An arc map storing the lower bounds.
714 703
    /// Its \c Value type must be convertible to the \c Value type
715 704
    /// of the algorithm.
716 705
    ///
717 706
    /// \return <tt>(*this)</tt>
718 707
    template <typename LowerMap>
719 708
    NetworkSimplex& lowerMap(const LowerMap& map) {
720 709
      _have_lower = true;
721 710
      for (ArcIt a(_graph); a != INVALID; ++a) {
722 711
        _lower[_arc_id[a]] = map[a];
... ...
@@ -747,70 +736,68 @@
747 736
    /// \brief Set the costs of the arcs.
748 737
    ///
749 738
    /// This function sets the costs of the arcs.
750 739
    /// If it is not used before calling \ref run(), the costs
751 740
    /// will be set to \c 1 on all arcs.
752 741
    ///
753 742
    /// \param map An arc map storing the costs.
754 743
    /// Its \c Value type must be convertible to the \c Cost type
755 744
    /// of the algorithm.
756 745
    ///
757 746
    /// \return <tt>(*this)</tt>
758 747
    template<typename CostMap>
759 748
    NetworkSimplex& costMap(const CostMap& map) {
760 749
      for (ArcIt a(_graph); a != INVALID; ++a) {
761 750
        _cost[_arc_id[a]] = map[a];
762 751
      }
763 752
      return *this;
764 753
    }
765 754

	
766 755
    /// \brief Set the supply values of the nodes.
767 756
    ///
768 757
    /// This function sets the supply values of the nodes.
769 758
    /// If neither this function nor \ref stSupply() is used before
770 759
    /// calling \ref run(), the supply of each node will be set to zero.
771
    /// (It makes sense only if non-zero lower bounds are given.)
772 760
    ///
773 761
    /// \param map A node map storing the supply values.
774 762
    /// Its \c Value type must be convertible to the \c Value type
775 763
    /// of the algorithm.
776 764
    ///
777 765
    /// \return <tt>(*this)</tt>
778 766
    template<typename SupplyMap>
779 767
    NetworkSimplex& supplyMap(const SupplyMap& map) {
780 768
      for (NodeIt n(_graph); n != INVALID; ++n) {
781 769
        _supply[_node_id[n]] = map[n];
782 770
      }
783 771
      return *this;
784 772
    }
785 773

	
786 774
    /// \brief Set single source and target nodes and a supply value.
787 775
    ///
788 776
    /// This function sets a single source node and a single target node
789 777
    /// and the required flow value.
790 778
    /// If neither this function nor \ref supplyMap() is used before
791 779
    /// calling \ref run(), the supply of each node will be set to zero.
792
    /// (It makes sense only if non-zero lower bounds are given.)
793 780
    ///
794 781
    /// Using this function has the same effect as using \ref supplyMap()
795 782
    /// with such a map in which \c k is assigned to \c s, \c -k is
796 783
    /// assigned to \c t and all other nodes have zero supply value.
797 784
    ///
798 785
    /// \param s The source node.
799 786
    /// \param t The target node.
800 787
    /// \param k The required amount of flow from node \c s to node \c t
801 788
    /// (i.e. the supply of \c s and the demand of \c t).
802 789
    ///
803 790
    /// \return <tt>(*this)</tt>
804 791
    NetworkSimplex& stSupply(const Node& s, const Node& t, Value k) {
805 792
      for (int i = 0; i != _node_num; ++i) {
806 793
        _supply[i] = 0;
807 794
      }
808 795
      _supply[_node_id[s]] =  k;
809 796
      _supply[_node_id[t]] = -k;
810 797
      return *this;
811 798
    }
812 799
    
813 800
    /// \brief Set the type of the supply constraints.
814 801
    ///
815 802
    /// This function sets the type of the supply/demand constraints.
816 803
    /// If it is not used before calling \ref run(), the \ref GEQ supply
0 comments (0 inline)