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