COIN-OR::LEMON - Graph Library

Changeset 2448:ab899ae3505f in lemon-0.x for tools/lgf-gen.cc


Ignore:
Timestamp:
06/05/07 16:48:20 (17 years ago)
Author:
Alpar Juttner
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3285
Message:

Bugfix and improvement in -tsp2 algorithm

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/lgf-gen.cc

    r2447 r2448  
    533533}
    534534
    535 Node common(UEdge e, UEdge f)
    536 {
    537   return (g.source(e)==g.source(f)||g.source(e)==g.target(f))?
    538         g.source(e):g.target(e);
    539 }
    540 
    541535void tsp2()
    542536{
     
    553547    for(NodeIt n(g);n!=INVALID;++n)
    554548      if(countIncEdges(g,n)%2==1) leafs.push_back(n);
    555     for(unsigned int i=0;i<leafs.size();i+=2)
    556       g.addEdge(leafs[i],leafs[i+1]);
     549
     550//    for(unsigned int i=0;i<leafs.size();i+=2)
     551//       g.addEdge(leafs[i],leafs[i+1]);
     552
     553    std::vector<Pedge> pedges;
     554    for(unsigned int i=0;i<leafs.size()-1;i++)
     555      for(unsigned int j=i+1;j<leafs.size();j++)
     556        {
     557          Node n=leafs[i];
     558          Node m=leafs[j];
     559          Pedge p;
     560          p.a=n;
     561          p.b=m;
     562          p.len=(coords[m]-coords[n]).normSquare();
     563          pedges.push_back(p);
     564        }
     565    std::sort(pedges.begin(),pedges.end(),pedgeLess);
     566    for(unsigned int i=0;i<pedges.size();i++)
     567      if(countIncEdges(g,pedges[i].a)%2 &&
     568         countIncEdges(g,pedges[i].b)%2)
     569        g.addEdge(pedges[i].a,pedges[i].b);
    557570  }
    558571
    559572  for(NodeIt n(g);n!=INVALID;++n)
    560     if(countIncEdges(g,n)%2)
     573    if(countIncEdges(g,n)%2 || countIncEdges(g,n)==0 )
    561574      std::cout << "GEBASZ!!!" << std::endl;
    562575 
     576  for(UEdgeIt e(g);e!=INVALID;++e)
     577    if(g.source(e)==g.target(e))
     578      std::cout << "LOOP GEBASZ!!!" << std::endl;
     579 
    563580  std::cout << "Number of edges : " << countUEdges(g) << std::endl;
    564 
    565 //   for(NodeIt n(g);n!=INVALID;++n)
    566 //     if(countIncEdges(g,n)>2)
    567 //       std::cout << "+";
    568 //   std::cout << std::endl;
    569581 
    570582  std::cout << "Total edge length (euler) : " << totalLen() << std::endl;
    571583
    572   ListUGraph::UEdgeMap<UEdge> enext(g);
     584  ListUGraph::UEdgeMap<Edge> enext(g);
    573585  {
    574586    UEulerIt<ListUGraph> e(g);
    575     UEdge eo=e;
    576     UEdge ef=e;
     587    Edge eo=e;
     588    Edge ef=e;
    577589//     std::cout << "Tour edge: " << g.id(UEdge(e)) << std::endl;     
    578590    for(++e;e!=INVALID;++e)
     
    584596    enext[eo]=ef;
    585597  }
    586  
     598   
    587599  std::cout << "Creating a tour from that..." << std::endl;
    588600 
     
    590602  int ednum = countUEdges(g);
    591603 
    592   for(UEdge p=UEdgeIt(g);ednum>nnum;p=enext[p])
     604  for(Edge p=enext[UEdgeIt(g)];ednum>nnum;p=enext[p])
    593605    {
    594606//       std::cout << "Checking edge " << g.id(p) << std::endl;     
    595       UEdge e=enext[p];
    596       UEdge f=enext[e];
    597       Node n2=common(e,f);
     607      Edge e=enext[p];
     608      Edge f=enext[e];
     609      Node n2=g.source(f);
    598610      Node n1=g.oppositeNode(n2,e);
    599611      Node n3=g.oppositeNode(n2,f);
     
    601613        {
    602614//        std::cout << "Remove an Edge" << std::endl;
    603           UEdge ff=enext[f];
     615          Edge ff=enext[f];
    604616          g.erase(e);
    605617          g.erase(f);
    606           UEdge ne=g.addEdge(n1,n3);
    607           enext[p]=ne;
    608           enext[ne]=ff;
    609           ednum--;
     618          if(n1!=n3)
     619            {
     620              Edge ne=g.direct(g.addEdge(n1,n3),n1);
     621              enext[p]=ne;
     622              enext[ne]=ff;
     623              ednum--;
     624            }
     625          else {
     626            enext[p]=ff;
     627            ednum-=2;
     628          }
    610629        }
    611630    }
     
    613632  std::cout << "Total edge length (tour) : " << totalLen() << std::endl;
    614633
     634  std::cout << "2-opt the tour..." << std::endl;
     635 
    615636  tsp_improve();
    616637 
     
    762783    tlen+=sqrt((coords[g.source(e)]-coords[g.target(e)]).normSquare());
    763784  std::cout << "Total edge length  : " << tlen << std::endl;
     785
    764786  if(ap["eps"])
    765787    graphToEps(g,prefix+".eps").
    766788      scale(600).nodeScale(.2).edgeWidthScale(.001).preScale(false).
    767789      coords(coords).run();
    768 
     790 
    769791  if(ap["dir"])
    770792    GraphWriter<ListUGraph>(prefix+".lgf",g).
Note: See TracChangeset for help on using the changeset viewer.