[Lemon-commits] [lemon_svn] marci: r1418 - hugo/trunk/src/work/marci/lp
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:45:16 CET 2006
Author: marci
Date: Thu Dec 2 20:59:30 2004
New Revision: 1418
Modified:
hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h
Log:
:-)
Modified: hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h
==============================================================================
--- hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h (original)
+++ hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h Thu Dec 2 20:59:30 2004
@@ -10,10 +10,11 @@
//#include <lemon/time_measure.h>
//#include <graph_wrapper.h>
#include <lemon/preflow.h>
+#include <lemon/min_cost_flow.h>
//#include <augmenting_flow.h>
//#include <preflow_res.h>
-#include <../merge_node_graph_wrapper.h>
-#include <lemon/../work/marci/lp/lp_solver_wrapper.h>
+#include <work/marci/merge_node_graph_wrapper.h>
+#include <work/marci/lp/lp_solver_wrapper.h>
namespace lemon {
@@ -30,7 +31,7 @@
}
};
- // excess: rho-delta
+ // excess: rho-delta egyelore csak =0-ra.
template <typename Graph, typename Num,
typename Excess=typename Graph::template NodeMap<Num>,
typename LCapMap=typename Graph::template EdgeMap<Num>,
@@ -74,9 +75,12 @@
// std::cout << "making new edges..." << std::endl;
typename GWWW::template EdgeMap<Num> translated_cap(gwww);
- for (typename GW::EdgeIt e(gw); e!=INVALID; ++e)
- translated_cap.set(typename GWWW::Edge(e,INVALID,false),
- capacity[e]-lcapacity[e]);
+ for (typename GW::EdgeIt e(gw); e!=INVALID; ++e) {
+ translated_cap.set(typename GWWW::Edge(e,INVALID,false),
+ capacity[e]-lcapacity[e]);
+ // cout << "t_cap " << gw.id(e) << " "
+ // << translated_cap[typename GWWW::Edge(e,INVALID,false)] << endl;
+ }
Num expected=0;
@@ -92,6 +96,7 @@
gww.addEdge(typename GW::Node(n,INVALID,false), t);
translated_cap.set(typename GWWW::Edge(INVALID, e, true),
excess[n]-a);
+ // std::cout << g.id(n) << "->t " << excess[n]-a << std::endl;
}
if (excess[n]<a) {
typename GWW::Edge e=
@@ -99,6 +104,7 @@
translated_cap.set(typename GWWW::Edge(INVALID, e, true),
a-excess[n]);
expected+=a-excess[n];
+ // std::cout << "s->" << g.id(n) << " "<< a-excess[n] <<std:: endl;
}
}
@@ -117,7 +123,94 @@
}
return (expected>=preflow.flowValue());
}
- void run() {
+ // for nonnegative costs
+ bool run() {
+ // std::cout << "making new vertices..." << std::endl;
+ typedef ListGraph Graph2;
+ Graph2 g2;
+ typedef MergeEdgeGraphWrapper<const Graph, Graph2> GW;
+ // std::cout << "merging..." << std::endl;
+ GW gw(g, g2);
+ typename GW::Node s(INVALID, g2.addNode(), true);
+ typename GW::Node t(INVALID, g2.addNode(), true);
+ typedef SmartGraph Graph3;
+ // std::cout << "making extender graph..." << std::endl;
+ typedef NewEdgeSetGraphWrapper2<GW, Graph3> GWW;
+// {
+// checkConcept<StaticGraph, GWW>();
+// }
+ GWW gww(gw);
+ typedef AugmentingGraphWrapper<GW, GWW> GWWW;
+ GWWW gwww(gw, gww);
+
+ // std::cout << "making new edges..." << std::endl;
+ typename GWWW::template EdgeMap<Num> translated_cap(gwww);
+
+ for (typename Graph::EdgeIt e(g); e!=INVALID; ++e) {
+ typename GW::Edge ew(e, INVALID, false);
+ typename GWWW::Edge ewww(ew, INVALID, false);
+ translated_cap.set(ewww, capacity[e]-lcapacity[e]);
+ // cout << "t_cap " << g.id(e) << " "
+ // << translated_cap[ewww] << endl;
+ }
+
+ Num expected=0;
+
+ // std::cout << "making new edges 2..." << std::endl;
+ for (typename Graph::NodeIt n(g); n!=INVALID; ++n) {
+ // std::cout << "node: " << g.id(n) << std::endl;
+ Num a=0;
+ for (typename Graph::InEdgeIt e(g, n); e!=INVALID; ++e) {
+ a+=lcapacity[e];
+ // std::cout << "bee: " << g.id(e) << " " << lcapacity[e] << std::endl;
+ }
+ for (typename Graph::OutEdgeIt e(g, n); e!=INVALID; ++e) {
+ a-=lcapacity[e];
+ // std::cout << "kie: " << g.id(e) << " " << lcapacity[e] << std::endl;
+ }
+ // std::cout << "excess " << g.id(n) << ": " << a << std::endl;
+ if (0>a) {
+ typename GWW::Edge e=
+ gww.addEdge(typename GW::Node(n,INVALID,false), t);
+ translated_cap.set(typename GWWW::Edge(INVALID, e, true),
+ -a);
+ // std::cout << g.id(n) << "->t " << -a << std::endl;
+ }
+ if (0<a) {
+ typename GWW::Edge e=
+ gww.addEdge(s, typename GW::Node(n,INVALID,false));
+ translated_cap.set(typename GWWW::Edge(INVALID, e, true),
+ a);
+ expected+=a;
+ // std::cout << "s->" << g.id(n) << " "<< a <<std:: endl;
+ }
+ }
+
+ // std::cout << "preflow..." << std::endl;
+ typename GWWW::template EdgeMap<Num> translated_cost(gwww, 0);
+ for (typename Graph::EdgeIt e(g); e!=INVALID; ++e) {
+ translated_cost.set(typename GWWW::Edge(
+ typename GW::Edge(e, INVALID, false), INVALID, false), cost[e]);
+ }
+ // typename GWWW::template EdgeMap<Num> translated_flow(gwww, 0);
+ MinCostFlow<GWWW, typename GWWW::template EdgeMap<Num>,
+ typename GWWW::template EdgeMap<Num> >
+ min_cost_flow(gwww, translated_cost, translated_cap,
+ s, t);
+ while (min_cost_flow.augment()) { }
+ std::cout << "fv: " << min_cost_flow.flowValue() << std::endl;
+ std::cout << "expected: " << expected << std::endl;
+
+ for (typename Graph::EdgeIt e(g); e!=INVALID; ++e) {
+ typename GW::Edge ew(e, INVALID, false);
+ typename GWWW::Edge ewww(ew, INVALID, false);
+ // std::cout << g.id(e) << " " << flow[e] << std::endl;
+ flow.set(e, lcapacity[e]+
+ min_cost_flow.getFlow()[ewww]);
+ }
+ return (expected>=min_cost_flow.flowValue());
+ }
+ void runByLP() {
LPSolverWrapper lp;
lp.setMinimize();
typedef LPSolverWrapper::ColIt ColIt;
More information about the Lemon-commits
mailing list