TSP programmi Java lähtekood

Allikas: Lambda
// Travelling Salesman Problem
// Depth first search
// Fourth attempt: improved algorithm
//  we will not continue searching paths
//  which are ALREADY worse than the best one
//  found so far

public class Tsp4 {
                
  static int cities=10; // nr of cities
  static int nodeslooked=0; // count nodes in search
  static int leaveslooked=0; // count leaves in search
  static int best=9999999;  // global variable recording best distance  
  // Matrix of distances (cost to travel) between cities 
  static int dist[][] =
          {{0,5,4,3,7,1,3,6,9,2},
           {5,0,2,9,4,1,7,2,3,4},
           {4,2,0,6,7,2,4,6,8,9},
           {3,9,6,0,6,2,5,6,9,9},
           {4,2,2,6,0,2,4,5,8,9},
           {3,9,6,6,6,0,5,6,9,4},
           {1,9,3,2,6,2,0,6,1,5},
           {3,2,0,6,2,2,4,0,2,3},
           {7,9,6,7,6,1,5,6,0,2},
           {1,8,2,7,6,1,3,6,2,0}};
           
  static int passedcities[]; // passed cities on a path
  static int bestpath[]; // best path so far        
           
  public static void main(String[] args) {               
     // create helper arrays
     passedcities = new int[cities];
     bestpath = new int[cities];
     // search from city 0, with 0 passed and 0 cost of travel so far      
     search(0,0,0);                     
     // print out result
     System.out.println("examined nodes during search: "+nodeslooked);
     System.out.println("examined leaves during search: "+leaveslooked);
     System.out.println("best cost: "+best); 
     System.out.println("best path: ");
     for (int i=0; i<cities; i++) System.out.print(bestpath[i] + " ");
       
  }
     
  // The recursive search function
  //
  // city: nr of city just arrived into
  // passed: number of cities passed so far
  // passedlen: length (cost) travelled so far
  
  static void search(int city, int passed, int passedlen) {
      //System.out.println("city: "+city+" passed: "+passed+
      //                   " passedlen: "+passedlen); 
      nodeslooked++; 
      // store the new passed city in the passed array
      passedcities[passed]=city;
      // maybe we have travelled through all cities - 1?
      if (passed==(cities-1)) {
          leaveslooked++;        
          // compute the final length (trip to home is left!)
          int length=passedlen+dist[0][city];
          // save the length and path if we are back home 
          // and the length found is best so far
          if (length<best) {
              best=length; 
              for (int i=0; i<cities; i++) bestpath[i]=passedcities[i]; 
          }              
      // if not all cities have been passed, try all cities
      // not yet passed          
      } else  {
           // loop over all cities
           for(int next=0; next<cities; next++) {
             // if the distance will be less
             // than the best distance so far, ONLY THEN GO!
             if (passedlen+dist[city][next] < best) {
               // check if next is OK (not passed yet)
               boolean okcity=true;
               for (int i=0; i<passed+1 && okcity; i++) 
                  if (passedcities[i]==next) okcity=false;                                    
               if (okcity) {   // if ok, continue search
                search(next,
                       passed+1,
                       passedlen+dist[city][next]); 
               }
             }  
           }    
       }    
               
  }
  
}   // end of class