56 /// |
61 /// |
57 /// \warning Both value types must be signed and all input data must |
62 /// \warning Both value types must be signed and all input data must |
58 /// be integer. |
63 /// be integer. |
59 /// |
64 /// |
60 /// \note %NetworkSimplex provides five different pivot rule |
65 /// \note %NetworkSimplex provides five different pivot rule |
61 /// implementations. For more information see \ref PivotRule. |
66 /// implementations, from which the most efficient one is used |
|
67 /// by default. For more information see \ref PivotRule. |
62 template <typename GR, typename F = int, typename C = F> |
68 template <typename GR, typename F = int, typename C = F> |
63 class NetworkSimplex |
69 class NetworkSimplex |
64 { |
70 { |
65 public: |
71 public: |
66 |
72 |
67 /// The flow type of the algorithm |
73 /// The flow type of the algorithm |
68 typedef F Flow; |
74 typedef F Flow; |
69 /// The cost type of the algorithm |
75 /// The cost type of the algorithm |
70 typedef C Cost; |
76 typedef C Cost; |
|
77 #ifdef DOXYGEN |
|
78 /// The type of the flow map |
|
79 typedef GR::ArcMap<Flow> FlowMap; |
|
80 /// The type of the potential map |
|
81 typedef GR::NodeMap<Cost> PotentialMap; |
|
82 #else |
71 /// The type of the flow map |
83 /// The type of the flow map |
72 typedef typename GR::template ArcMap<Flow> FlowMap; |
84 typedef typename GR::template ArcMap<Flow> FlowMap; |
73 /// The type of the potential map |
85 /// The type of the potential map |
74 typedef typename GR::template NodeMap<Cost> PotentialMap; |
86 typedef typename GR::template NodeMap<Cost> PotentialMap; |
|
87 #endif |
75 |
88 |
76 public: |
89 public: |
77 |
90 |
78 /// \brief Enum type for selecting the pivot rule. |
91 /// \brief Enum type for selecting the pivot rule. |
79 /// |
92 /// |
115 /// It is a modified version of the Candidate List method. |
128 /// It is a modified version of the Candidate List method. |
116 /// It keeps only the several best eligible arcs from the former |
129 /// It keeps only the several best eligible arcs from the former |
117 /// candidate list and extends this list in every iteration. |
130 /// candidate list and extends this list in every iteration. |
118 ALTERING_LIST |
131 ALTERING_LIST |
119 }; |
132 }; |
|
133 |
|
134 /// \brief Enum type for selecting the problem type. |
|
135 /// |
|
136 /// Enum type for selecting the problem type, i.e. the direction of |
|
137 /// the inequalities in the supply/demand constraints of the |
|
138 /// \ref min_cost_flow "minimum cost flow problem". |
|
139 /// |
|
140 /// The default problem type is \c GEQ, since this form is supported |
|
141 /// by other minimum cost flow algorithms and the \ref Circulation |
|
142 /// algorithm as well. |
|
143 /// The \c LEQ problem type can be selected using the \ref problemType() |
|
144 /// function. |
|
145 /// |
|
146 /// Note that the equality form is a special case of both problem type. |
|
147 enum ProblemType { |
|
148 |
|
149 /// This option means that there are "<em>greater or equal</em>" |
|
150 /// constraints in the defintion, i.e. the exact formulation of the |
|
151 /// problem is the following. |
|
152 /** |
|
153 \f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f] |
|
154 \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \geq |
|
155 sup(u) \quad \forall u\in V \f] |
|
156 \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f] |
|
157 */ |
|
158 /// It means that the total demand must be greater or equal to the |
|
159 /// total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or |
|
160 /// negative) and all the supplies have to be carried out from |
|
161 /// the supply nodes, but there could be demands that are not |
|
162 /// satisfied. |
|
163 GEQ, |
|
164 /// It is just an alias for the \c GEQ option. |
|
165 CARRY_SUPPLIES = GEQ, |
|
166 |
|
167 /// This option means that there are "<em>less or equal</em>" |
|
168 /// constraints in the defintion, i.e. the exact formulation of the |
|
169 /// problem is the following. |
|
170 /** |
|
171 \f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f] |
|
172 \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq |
|
173 sup(u) \quad \forall u\in V \f] |
|
174 \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f] |
|
175 */ |
|
176 /// It means that the total demand must be less or equal to the |
|
177 /// total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or |
|
178 /// positive) and all the demands have to be satisfied, but there |
|
179 /// could be supplies that are not carried out from the supply |
|
180 /// nodes. |
|
181 LEQ, |
|
182 /// It is just an alias for the \c LEQ option. |
|
183 SATISFY_DEMANDS = LEQ |
|
184 }; |
120 |
185 |
121 private: |
186 private: |
122 |
187 |
123 TEMPLATE_DIGRAPH_TYPEDEFS(GR); |
188 TEMPLATE_DIGRAPH_TYPEDEFS(GR); |
124 |
189 |
793 _local_potential = false; |
879 _local_potential = false; |
794 } |
880 } |
795 _potential_map = ↦ |
881 _potential_map = ↦ |
796 return *this; |
882 return *this; |
797 } |
883 } |
|
884 |
|
885 /// @} |
798 |
886 |
799 /// \name Execution Control |
887 /// \name Execution Control |
800 /// The algorithm can be executed using \ref run(). |
888 /// The algorithm can be executed using \ref run(). |
801 |
889 |
802 /// @{ |
890 /// @{ |
803 |
891 |
804 /// \brief Run the algorithm. |
892 /// \brief Run the algorithm. |
805 /// |
893 /// |
806 /// This function runs the algorithm. |
894 /// This function runs the algorithm. |
807 /// The paramters can be specified using \ref lowerMap(), |
895 /// The paramters can be specified using functions \ref lowerMap(), |
808 /// \ref upperMap(), \ref capacityMap(), \ref boundMaps(), |
896 /// \ref upperMap(), \ref capacityMap(), \ref boundMaps(), |
809 /// \ref costMap(), \ref supplyMap() and \ref stSupply() |
897 /// \ref costMap(), \ref supplyMap(), \ref stSupply(), |
810 /// functions. For example, |
898 /// \ref problemType(), \ref flowMap() and \ref potentialMap(). |
|
899 /// For example, |
811 /// \code |
900 /// \code |
812 /// NetworkSimplex<ListDigraph> ns(graph); |
901 /// NetworkSimplex<ListDigraph> ns(graph); |
813 /// ns.boundMaps(lower, upper).costMap(cost) |
902 /// ns.boundMaps(lower, upper).costMap(cost) |
814 /// .supplyMap(sup).run(); |
903 /// .supplyMap(sup).run(); |
815 /// \endcode |
904 /// \endcode |
998 _last_succ.resize(all_node_num); |
1096 _last_succ.resize(all_node_num); |
999 _state.resize(all_arc_num); |
1097 _state.resize(all_arc_num); |
1000 |
1098 |
1001 // Initialize node related data |
1099 // Initialize node related data |
1002 bool valid_supply = true; |
1100 bool valid_supply = true; |
|
1101 Flow sum_supply = 0; |
1003 if (!_pstsup && !_psupply) { |
1102 if (!_pstsup && !_psupply) { |
1004 _pstsup = true; |
1103 _pstsup = true; |
1005 _psource = _ptarget = NodeIt(_graph); |
1104 _psource = _ptarget = NodeIt(_graph); |
1006 _pstflow = 0; |
1105 _pstflow = 0; |
1007 } |
1106 } |
1008 if (_psupply) { |
1107 if (_psupply) { |
1009 Flow sum = 0; |
|
1010 int i = 0; |
1108 int i = 0; |
1011 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { |
1109 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { |
1012 _node_id[n] = i; |
1110 _node_id[n] = i; |
1013 _supply[i] = (*_psupply)[n]; |
1111 _supply[i] = (*_psupply)[n]; |
1014 sum += _supply[i]; |
1112 sum_supply += _supply[i]; |
1015 } |
1113 } |
1016 valid_supply = (sum == 0); |
1114 valid_supply = (_ptype == GEQ && sum_supply <= 0) || |
|
1115 (_ptype == LEQ && sum_supply >= 0); |
1017 } else { |
1116 } else { |
1018 int i = 0; |
1117 int i = 0; |
1019 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { |
1118 for (NodeIt n(_graph); n != INVALID; ++n, ++i) { |
1020 _node_id[n] = i; |
1119 _node_id[n] = i; |
1021 _supply[i] = 0; |
1120 _supply[i] = 0; |
1022 } |
1121 } |
1023 _supply[_node_id[_psource]] = _pstflow; |
1122 _supply[_node_id[_psource]] = _pstflow; |
1024 _supply[_node_id[_ptarget]] = -_pstflow; |
1123 _supply[_node_id[_ptarget]] = -_pstflow; |
1025 } |
1124 } |
1026 if (!valid_supply) return false; |
1125 if (!valid_supply) return false; |
|
1126 |
|
1127 // Infinite capacity value |
|
1128 Flow inf_cap = |
|
1129 std::numeric_limits<Flow>::has_infinity ? |
|
1130 std::numeric_limits<Flow>::infinity() : |
|
1131 std::numeric_limits<Flow>::max(); |
|
1132 |
|
1133 // Initialize artifical cost |
|
1134 Cost art_cost; |
|
1135 if (std::numeric_limits<Cost>::is_exact) { |
|
1136 art_cost = std::numeric_limits<Cost>::max() / 4 + 1; |
|
1137 } else { |
|
1138 art_cost = std::numeric_limits<Cost>::min(); |
|
1139 for (int i = 0; i != _arc_num; ++i) { |
|
1140 if (_cost[i] > art_cost) art_cost = _cost[i]; |
|
1141 } |
|
1142 art_cost = (art_cost + 1) * _node_num; |
|
1143 } |
|
1144 |
|
1145 // Run Circulation to check if a feasible solution exists |
|
1146 typedef ConstMap<Arc, Flow> ConstArcMap; |
|
1147 FlowNodeMap *csup = NULL; |
|
1148 bool local_csup = false; |
|
1149 if (_psupply) { |
|
1150 csup = _psupply; |
|
1151 } else { |
|
1152 csup = new FlowNodeMap(_graph, 0); |
|
1153 (*csup)[_psource] = _pstflow; |
|
1154 (*csup)[_ptarget] = -_pstflow; |
|
1155 local_csup = true; |
|
1156 } |
|
1157 bool circ_result = false; |
|
1158 if (_ptype == GEQ || (_ptype == LEQ && sum_supply == 0)) { |
|
1159 // GEQ problem type |
|
1160 if (_plower) { |
|
1161 if (_pupper) { |
|
1162 Circulation<GR, FlowArcMap, FlowArcMap, FlowNodeMap> |
|
1163 circ(_graph, *_plower, *_pupper, *csup); |
|
1164 circ_result = circ.run(); |
|
1165 } else { |
|
1166 Circulation<GR, FlowArcMap, ConstArcMap, FlowNodeMap> |
|
1167 circ(_graph, *_plower, ConstArcMap(inf_cap), *csup); |
|
1168 circ_result = circ.run(); |
|
1169 } |
|
1170 } else { |
|
1171 if (_pupper) { |
|
1172 Circulation<GR, ConstArcMap, FlowArcMap, FlowNodeMap> |
|
1173 circ(_graph, ConstArcMap(0), *_pupper, *csup); |
|
1174 circ_result = circ.run(); |
|
1175 } else { |
|
1176 Circulation<GR, ConstArcMap, ConstArcMap, FlowNodeMap> |
|
1177 circ(_graph, ConstArcMap(0), ConstArcMap(inf_cap), *csup); |
|
1178 circ_result = circ.run(); |
|
1179 } |
|
1180 } |
|
1181 } else { |
|
1182 // LEQ problem type |
|
1183 typedef ReverseDigraph<const GR> RevGraph; |
|
1184 typedef NegMap<FlowNodeMap> NegNodeMap; |
|
1185 RevGraph rgraph(_graph); |
|
1186 NegNodeMap neg_csup(*csup); |
|
1187 if (_plower) { |
|
1188 if (_pupper) { |
|
1189 Circulation<RevGraph, FlowArcMap, FlowArcMap, NegNodeMap> |
|
1190 circ(rgraph, *_plower, *_pupper, neg_csup); |
|
1191 circ_result = circ.run(); |
|
1192 } else { |
|
1193 Circulation<RevGraph, FlowArcMap, ConstArcMap, NegNodeMap> |
|
1194 circ(rgraph, *_plower, ConstArcMap(inf_cap), neg_csup); |
|
1195 circ_result = circ.run(); |
|
1196 } |
|
1197 } else { |
|
1198 if (_pupper) { |
|
1199 Circulation<RevGraph, ConstArcMap, FlowArcMap, NegNodeMap> |
|
1200 circ(rgraph, ConstArcMap(0), *_pupper, neg_csup); |
|
1201 circ_result = circ.run(); |
|
1202 } else { |
|
1203 Circulation<RevGraph, ConstArcMap, ConstArcMap, NegNodeMap> |
|
1204 circ(rgraph, ConstArcMap(0), ConstArcMap(inf_cap), neg_csup); |
|
1205 circ_result = circ.run(); |
|
1206 } |
|
1207 } |
|
1208 } |
|
1209 if (local_csup) delete csup; |
|
1210 if (!circ_result) return false; |
1027 |
1211 |
1028 // Set data for the artificial root node |
1212 // Set data for the artificial root node |
1029 _root = _node_num; |
1213 _root = _node_num; |
1030 _parent[_root] = -1; |
1214 _parent[_root] = -1; |
1031 _pred[_root] = -1; |
1215 _pred[_root] = -1; |
1032 _thread[_root] = 0; |
1216 _thread[_root] = 0; |
1033 _rev_thread[0] = _root; |
1217 _rev_thread[0] = _root; |
1034 _succ_num[_root] = all_node_num; |
1218 _succ_num[_root] = all_node_num; |
1035 _last_succ[_root] = _root - 1; |
1219 _last_succ[_root] = _root - 1; |
1036 _supply[_root] = 0; |
1220 _supply[_root] = -sum_supply; |
1037 _pi[_root] = 0; |
1221 if (sum_supply < 0) { |
|
1222 _pi[_root] = -art_cost; |
|
1223 } else { |
|
1224 _pi[_root] = art_cost; |
|
1225 } |
1038 |
1226 |
1039 // Store the arcs in a mixed order |
1227 // Store the arcs in a mixed order |
1040 int k = std::max(int(sqrt(_arc_num)), 10); |
1228 int k = std::max(int(sqrt(_arc_num)), 10); |
1041 int i = 0; |
1229 int i = 0; |
1042 for (ArcIt e(_graph); e != INVALID; ++e) { |
1230 for (ArcIt e(_graph); e != INVALID; ++e) { |
1043 _arc_ref[i] = e; |
1231 _arc_ref[i] = e; |
1044 if ((i += k) >= _arc_num) i = (i % k) + 1; |
1232 if ((i += k) >= _arc_num) i = (i % k) + 1; |
1045 } |
1233 } |
1046 |
1234 |
1047 // Initialize arc maps |
1235 // Initialize arc maps |
1048 Flow inf_cap = |
|
1049 std::numeric_limits<Flow>::has_infinity ? |
|
1050 std::numeric_limits<Flow>::infinity() : |
|
1051 std::numeric_limits<Flow>::max(); |
|
1052 if (_pupper && _pcost) { |
1236 if (_pupper && _pcost) { |
1053 for (int i = 0; i != _arc_num; ++i) { |
1237 for (int i = 0; i != _arc_num; ++i) { |
1054 Arc e = _arc_ref[i]; |
1238 Arc e = _arc_ref[i]; |
1055 _source[i] = _node_id[_graph.source(e)]; |
1239 _source[i] = _node_id[_graph.source(e)]; |
1056 _target[i] = _node_id[_graph.target(e)]; |
1240 _target[i] = _node_id[_graph.target(e)]; |