In This Post we are Solve Travelling Sales Person problem using Dynamic programming.
9] Solve Travelling Sales Person problem using Dynamic programming.
PROGRAM :-
import java.util.Scanner;
class TSPExp {
int weight[][], n, tour[], finalCost;
final int INF = 1000;
TSPExp()
{
Scanner s = new Scanner(System.in);
System.out.println("Enter no. of nodes :=>");
n = s.nextInt();
weight = new int[n][n];
tour = new int[n - 1];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i != j)
{
System.out.print("Enter weight of " + (i + 1) + " to " + (j + 1) + ":=> ");
weight[i][j] = s.nextInt();
}
}
}
System.out.println();
System.out.println("Starting node assumed to be node 1.");
eval();
}
public int COST(int currentNode, int inputSet[], int setSize)
{
if (setSize == 0)
return weight[currentNode][0];
int min = INF;
int setToBePassedOnToNextCallOfCOST[] = new int[n - 1];
for (int i = 0; i < setSize; i++)
{
int k = 0;// initialise new set
for (int j = 0; j < setSize; j++)
{
if (inputSet[i] != inputSet[j])
setToBePassedOnToNextCallOfCOST[k++] = inputSet[j];
}
int temp = COST(inputSet[i], setToBePassedOnToNextCallOfCOST, setSize - 1);
if ((weight[currentNode][inputSet[i]] + temp) < min)
{
min = weight[currentNode][inputSet[i]] + temp;
}
}
return min;
}
public int MIN(int currentNode, int inputSet[], int setSize)
{
if (setSize == 0)
return weight[currentNode][0];
int min = INF, minindex = 0;
int setToBePassedOnToNextCallOfCOST[] = new int[n - 1];
for (int i = 0; i < setSize; i++)// considers each node of inputSet
{
int k = 0;
for (int j = 0; j < setSize; j++)
{
if (inputSet[i] != inputSet[j])
setToBePassedOnToNextCallOfCOST[k++] = inputSet[j];
}
int
temp = COST(inputSet[i], setToBePassedOnToNextCallOfCOST, setSize - 1);
if ((weight[currentNode][inputSet[i]] + temp) < min)
{
min = weight[currentNode][inputSet[i]] + temp;
minindex = inputSet[i];
}
}
return minindex;
}
public void eval()
{
int dummySet[] = new int[n - 1];
for (int i = 1; i < n; i++)
dummySet[i - 1] = i;
finalCost = COST(0, dummySet, n - 1);
constructTour();
}
public void constructTour()
{
int previousSet[] = new int[n - 1];
int nextSet[] = new int[n - 2];
for (int i = 1; i < n; i++)
previousSet[i - 1] = i;
int setSize = n - 1;
tour[0] = MIN(0, previousSet, setSize);
for (int i = 1; i < n - 1; i++)
{
int k = 0;
for (int j = 0; j < setSize; j++)
{
if (tour[i - 1] != previousSet[j])
nextSet[k++] = previousSet[j];
}
--setSize;
tour[i] = MIN(tour[i - 1], nextSet, setSize);
for (int j = 0; j < setSize; j++)
previousSet[j] = nextSet[j];
}
display();
}
public void display()
{
System.out.println();
System.out.print("The tour is 1-");
for (int i = 0; i < n - 1; i++)
System.out.print((tour[i] + 1) + "-");
System.out.print("1");
System.out.println();
System.out.println("The final cost is " + finalCost);
}
}
class TspDp{
public static void main(String args[])
{
TSPExp obj = new TSPExp();
}
}
