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");
}
}
}
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With