# HG changeset patch # User alpar # Date 1181054900 0 # Node ID ab899ae3505f6c3db9d491e6badc63dcd3228ca4 # Parent 260ce674cc65787aaeb3c4374587c9f2b9fec557 Bugfix and improvement in -tsp2 algorithm diff -r 260ce674cc65 -r ab899ae3505f tools/lgf-gen.cc --- a/tools/lgf-gen.cc Tue Jun 05 11:49:19 2007 +0000 +++ b/tools/lgf-gen.cc Tue Jun 05 14:48:20 2007 +0000 @@ -532,12 +532,6 @@ std::cout << T.realTime() << "s: Done\n"; } -Node common(UEdge e, UEdge f) -{ - return (g.source(e)==g.source(f)||g.source(e)==g.target(f))? - g.source(e):g.target(e); -} - void tsp2() { std::cout << "Find a tree..." << std::endl; @@ -552,28 +546,46 @@ std::vector leafs; for(NodeIt n(g);n!=INVALID;++n) if(countIncEdges(g,n)%2==1) leafs.push_back(n); - for(unsigned int i=0;i pedges; + for(unsigned int i=0;i2) -// std::cout << "+"; -// std::cout << std::endl; std::cout << "Total edge length (euler) : " << totalLen() << std::endl; - ListUGraph::UEdgeMap enext(g); + ListUGraph::UEdgeMap enext(g); { UEulerIt e(g); - UEdge eo=e; - UEdge ef=e; + Edge eo=e; + Edge ef=e; // std::cout << "Tour edge: " << g.id(UEdge(e)) << std::endl; for(++e;e!=INVALID;++e) { @@ -583,35 +595,44 @@ } enext[eo]=ef; } - + std::cout << "Creating a tour from that..." << std::endl; int nnum = countNodes(g); int ednum = countUEdges(g); - for(UEdge p=UEdgeIt(g);ednum>nnum;p=enext[p]) + for(Edge p=enext[UEdgeIt(g)];ednum>nnum;p=enext[p]) { // std::cout << "Checking edge " << g.id(p) << std::endl; - UEdge e=enext[p]; - UEdge f=enext[e]; - Node n2=common(e,f); + Edge e=enext[p]; + Edge f=enext[e]; + Node n2=g.source(f); Node n1=g.oppositeNode(n2,e); Node n3=g.oppositeNode(n2,f); if(countIncEdges(g,n2)>2) { // std::cout << "Remove an Edge" << std::endl; - UEdge ff=enext[f]; + Edge ff=enext[f]; g.erase(e); g.erase(f); - UEdge ne=g.addEdge(n1,n3); - enext[p]=ne; - enext[ne]=ff; - ednum--; + if(n1!=n3) + { + Edge ne=g.direct(g.addEdge(n1,n3),n1); + enext[p]=ne; + enext[ne]=ff; + ednum--; + } + else { + enext[p]=ff; + ednum-=2; + } } } std::cout << "Total edge length (tour) : " << totalLen() << std::endl; + std::cout << "2-opt the tour..." << std::endl; + tsp_improve(); std::cout << "Total edge length (2-opt tour) : " << totalLen() << std::endl; @@ -761,11 +782,12 @@ for(UEdgeIt e(g);e!=INVALID;++e) tlen+=sqrt((coords[g.source(e)]-coords[g.target(e)]).normSquare()); std::cout << "Total edge length : " << tlen << std::endl; + if(ap["eps"]) graphToEps(g,prefix+".eps"). scale(600).nodeScale(.2).edgeWidthScale(.001).preScale(false). coords(coords).run(); - + if(ap["dir"]) GraphWriter(prefix+".lgf",g). writeNodeMap("coordinates_x",scaleMap(xMap(coords),600)).