Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/graphAlgorithms/maxFlo/perf/eval1.cpp
00001 #include "stdinc.h"
00002 #include "Flograph.h"
00003 #include "ppFifo.h"
00004 #include "ppHiLab.h"
00005 #include "shortPath.h"
00006 #include "dinic.h"
00007 #include "dinicDtrees.h"
00008 #include "Util.h"
00009 
00010 void eval(Flograph &fg) {
00011         int n = fg.n(); int m = fg.m();
00012         int t1, t2, floVal;
00013 
00014         string stats;
00015         t1 = Util::getTime();
00016         dinic(fg,floVal,stats);
00017         t2 = Util::getTime();
00018         cout << n << " " << m << " " << stats;
00019         cout << "  " << floVal << " " << t2-t1 << " dinic" << endl;
00020         fg.clear();
00021 
00022         t1 = Util::getTime();
00023         dinicDtrees(fg,floVal,stats);
00024         t2 = Util::getTime();
00025         cout << n << " " << m << " " << stats;
00026         cout << "  " << floVal << " " << t2-t1 << " dinicDtrees" << endl;
00027         fg.clear();
00028 }
00029 
00030 void badcase(int k1, int k2, Flograph& fg) {
00031         int i,j, n, m, c1, c2, c3, c4, bl, br;
00032         edge e;
00033 
00034         // determine first vertex in each group
00035         c1 = 2;                 // start of short chain from source
00036         c2 = c1 + 4*(k1-1)+1;   // start of long chain from source
00037         bl = c2 + 4*(k1-1)+3;   // start of 1st vertex group in bipartite graph
00038         br = bl + k2;           // start of 2nd vertex group in bipartite graph
00039         c3 = br + k2;           // start of long chain to sink
00040         c4 = c3 + 4*(k1-1)+3;   // start of short chain to sink
00041 
00042         n = c4 + 4*(k1-1)+1;
00043         m = 16*(k1-1) + k2*k2 + 8*k1 + 4;       
00044         fg.resize(n,m);
00045         fg.setSrcSnk(1,n);
00046 
00047         // build short chain from source
00048         for (i = 0; c1+i < c2; i++) {
00049                 if ((i%4) == 0) { 
00050                         e = fg.join(fg.src(),c1+i); 
00051                         if (i == 0) fg.setCapacity(e,k2*k2*k2);
00052                         else fg.setCapacity(e,k2*k2);
00053                 }
00054                 if (c1+i < c2-1) { 
00055                         e = fg.join(c1+i,c1+i+1); fg.setCapacity(e,2*k2*k2*k2);
00056                 }
00057         }
00058         // build long chain from source
00059         for (i = 0; c2+i < bl; i++) {
00060                 if ((i%4) == 0) { 
00061                         e = fg.join(fg.src(),c2+i);
00062                         if (i == 0) fg.setCapacity(e,k2*k2*k2);
00063                         else fg.setCapacity(e,k2*k2);
00064                 }
00065                 if (c2+i < bl-1) { 
00066                         e = fg.join(c2+i,c2+i+1); fg.setCapacity(e,2*k2*k2*k2);
00067                 }
00068         }
00069         // connect source chains to bipartite graph
00070         for (i = 0; i < k2; i++) {
00071                 e = fg.join(c2-1,bl+i); fg.setCapacity(e,2*k2*k2); 
00072                 e = fg.join(bl-1,br+i); fg.setCapacity(e,2*k2*k2);
00073         }
00074         // build central bipartite graph
00075         for (i = 0; i < k2; i++) {
00076                 for (j = 0; j < k2; j++) {
00077                         e = fg.join(bl+i, br+j); fg.setCapacity(e,1);
00078                 }
00079         }
00080         // connect bipartite graph to sink chains
00081         for (i = 0; i < k2; i++) {
00082                 e = fg.join(bl+i,c3); fg.setCapacity(e,2*k2*k2); 
00083                 e = fg.join(br+i,c4); fg.setCapacity(e,2*k2*k2);
00084         }
00085         // build long chain to sink
00086         for (i = 0; c3+i < c4; i++) {
00087                 if ((i%4) == 2) {
00088                         e = fg.join(c3+i,fg.snk()); fg.setCapacity(e,k2*k2);
00089                 }
00090                 if (c3+i < c4-1) { 
00091                         e = fg.join(c3+i,c3+i+1); fg.setCapacity(e,2*k2*k2*k2);
00092                 }
00093         }
00094         // build short chain to sink
00095         for (i = 0; c4+i < n; i++) {
00096                 if ((i%4) == 0) { 
00097                         e = fg.join(c4+i,fg.snk()); fg.setCapacity(e,k2*k2);
00098                 }
00099                 if (c4+i < n-1) { 
00100                         e = fg.join(c4+i,c4+i+1); fg.setCapacity(e,2*k2*k2*k2);
00101                 }
00102         }
00103 }
00104 
00105 main() {
00106         Flograph fg(10,20);
00107 
00108         cout << "random graphs, increasing n\n";
00109         int n = 1024;
00110         int m;
00111         for (int i = 10; i <= 13; i++) {
00112                 m = i*n;
00113                 fg.rgraph(n,m,50,20);
00114                 fg.randCapacity(100*m/n,80);
00115                 eval(fg);
00116                 cout << endl;
00117                 n += n;
00118         }
00119         cout << "bad cases - high density\n";
00120         for (int k = 10; k <= 40; k += 10) {
00121                 badcase(k,k,fg);
00122                 eval(fg);
00123                 cout << endl;
00124         }
00125 }
 All Classes Files Functions Variables Typedefs Friends