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();
    }
}
