Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Travelling Salesman-based question

Tags:

java

I am writing a program that is based on the Travelling Salesman Problem. There are four cities in which the user determines its x and y coordinates. The salesman always starts at city1 and ends up at city1, so there are 6 possible routes. However, each route has an equivalent route, i.e route1 has the same distance asroute6. I have accounted for this. I've also tried to account for if (route1 or route6) and (route2 or route4) have the same distance. The program tells you that.

However, every time four or even all six routes have the same distance, the program just tells me that two out of the four or six routes have the shortest distance. This is what I need help with.

import java.util.Scanner;
import java.lang.Math;

public class CityDistancesProgram 
{
   public static void main(String[] args)
   {
     Scanner keyboard = new Scanner(System.in);

     //x and y coordinates of each city
     int x1, y1, x2, y2, x3, y3, x4, y4;

     //Variable for the distances of each route
     double route1, route2, route3, route4, route5, route6; 

     //Since the distance from cityA to cityB is the same as the distance from cityB to cityA,
     //these are all the possible combinations of distances between each city
     double city1city2, city2city3, city3city4, city4city1, city2city4, city3city1;
     double city2city1, city3city2, city4city3, city1city4, city4city2, city1city3;

     double shortestRoute;

     System.out.println("Enter the value of each city's x-coordinate and y-coordinate");
     System.out.println(" ");

     //First city
     System.out.println("City 1's x-coordinate:");
     x1 = keyboard.nextInt();
     System.out.println("City 1's y-coordinate:"); 
     y1 = keyboard.nextInt();

     //Second city
     System.out.println("City 2's x-coordinate:");
     x2 = keyboard.nextInt();
     System.out.println("City 2's y-coordinate:"); 
     y2 = keyboard.nextInt();

     //Third city
     System.out.println("City 3's x-coordinate:");
     x3 = keyboard.nextInt();
     System.out.println("City 3's y-coordinate:"); 
     y3 = keyboard.nextInt();

     //Fourth city
     System.out.println("City 4's x-coordinate:");
     x4 = keyboard.nextInt();     
     System.out.println("City 4's y-coordinate:"); 
     y4 = keyboard.nextInt();

     System.out.println("City 1's coordinates are: (" +  x1 + ", "  +  y1 +")");
     System.out.println("City 2's coordinates are: (" +  x2 + ", "  +  y2 +")");
     System.out.println("City 3's coordinates are: (" +  x3 + ", "  +  y3 +")");
     System.out.println("City 4's coordinates are: (" +  x4 + ", "  +  y4 +")");

       //Computing all possible combinations of distance between each city
       city1city2 = Math.sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)); //distance from city1 to city2 
       city3city1 = Math.sqrt((x1 - x3)*(x1 - x3) + (y1 - y3)*(y1 - y3)); //distance from city1 to city3 
       city4city1 = Math.sqrt((x1 - x4)*(x1 - x4) + (y1 - y4)*(y1 - y4)); //distance from city4 to city1
       city2city3 = Math.sqrt((x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3)); //distance from city2 to city3 
       city3city4 = Math.sqrt((x3 - x4)*(x3 - x4) + (y3 - y4)*(y3 - y4)); //distance from city3 to city4 
       city2city4 = Math.sqrt((x2 - x4)*(x2 - x4) + (y2 - y4)*(y2 - y4)); //distance from city2 to city4 

       city2city1 = city1city2; //distance from city2 to city1
       city3city2 = city2city3; //distance from city3 to city2
       city4city3 = city3city4; //distance from city4 to city3
       city1city4 = city4city1; //distance from city1 to city4
       city4city2 = city2city4; //distance from city4 to city2
       city1city3 = city3city1; //distance from city1 to city3

       //Computing the distance of each possible route
       route1 = city1city2 + city2city3 + city3city4 + city4city1;
       route2 = city1city2 + city2city4 + city4city3 + city3city1;
       route3 = city1city3 + city3city2 + city2city4 + city4city1;
       route4 = city1city3 + city3city4 + city4city2 + city2city1;
       route5 = city1city4 + city4city2 + city2city3 + city3city1;
       route6 = city1city4 + city4city3 + city3city2 + city2city1;

       System.out.println(" ");
       System.out.println("The first route has a total distance of " + route1 + " km");
       System.out.println("The second route has a total distance of " + route2 + " km");
       System.out.println("The third route has a total distance of " + route3 + " km");
       System.out.println("The fourth route has a total distance of " + route4 + " km");
       System.out.println("The fifth route has a total distance of " + route5 + " km");
       System.out.println("The sixth route has a total distance of " + route6 + " km");

       shortestRoute = Math.min(Math.min(route1, Math.min(route2,route3)), Math.min(route4,Math.min(route5,route6)));
       System.out.println(" ");

       if(shortestRoute == route1 || shortestRoute == route6)
       {
         System.out.println("route1 and route6 have the shortest distance");
       }
       else if(shortestRoute == route2 || shortestRoute == route4)
       {
         System.out.println("route2 and route4 have the shortest distance");
       }
       else if(shortestRoute == route3 || shortestRoute == route5)
       {
         System.out.println("route3 and route5 have the shortest distance");
       }
       else if((shortestRoute == route1 || shortestRoute == route6) && (shortestRoute == route2 || shortestRoute == route4))
       {
          System.out.println("route1, route6, route2 and route4 have the shortest distance");
       }
       else if((shortestRoute == route1 || shortestRoute == route6) && (shortestRoute == route3 || shortestRoute == route5))
       {
          System.out.println("route1, route6, route3 and route5 have the shortest distance");
       }
       else if((shortestRoute == route3 || shortestRoute == route5) && (shortestRoute == route2 || shortestRoute == route4))
       {
          System.out.println("route3, route5, route2 and route4 have the shortest distance");
       }
       else
       {
            System.out.println("There is no shortest distance, they are all the same");
       }
   }
}
like image 754
Alex Chavez Avatar asked Oct 01 '22 20:10

Alex Chavez


1 Answers

Your collection of if statements at the end is the problem. Its a collection of elseifs, so as soon as you match one expression you're done. You need to be sure your expressions are in most specific to least specific order.

You could simplify to something like this (pseudo code only)

bool r1 = shortestRoute == route1 || shortestRoute == route6;
bool r2 = shortestRoute == route2 || shortestRoute == route4;
bool r3 = shortestRoute == route3 || shortestRoute == route5;

if (r1 && r2 && r2) {
    print "all the same"
}
else if (r1 && r2) {
}
else if (r1 && r3) {
}
else if (r2 && r3) {
}
// Now individual checks for r1 r2 and r3
like image 132
John3136 Avatar answered Oct 05 '22 09:10

John3136