Para el cálculo de distancias entre coordenadas cartesianas en un plano(2D) se utiliza el teorema de Pitágoras:
Código (Ruta.java):
package Tsp;
public class Ruta {
public static void main(String[] args) {
Principal p = new Principal();
p.principal();
}
}
Código (Principal.java):
package Tsp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Principal {
String[] nombre_nodos = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"};
Double[] coordenadasX = {20.0, 18.0, 22.0, 13.0, 3.0, 18.0, 30.0, 5.0, 14.0, 26.0, 23.0};
Double[] coordenadasY = {3.0, 26.0, 27.0, 31.0, 32.0, 37.0, 35.0, 42.0, 52.0, 45.0, 12.0};
List<String> lista_nombre_nodos = new ArrayList<>();
List<Double> lista_coordenadasX = new ArrayList<>();
List<Double> lista_coordenadasY = new ArrayList<>();
String[] v_nodos = new String[lista_nombre_nodos.size()];
double[][] coordenadas_XY;
double[] ruta;
public void principal() {
Pasar_Arrays_a_Listas();
Pasar_Listas_a_Arrays();
// Cálculos distancias entre nodos.
double n2 = Math.pow(coordenadas_XY.length, 2);
double[] distancias = new double[(int) n2];
distancias = getDistancia(coordenadas_XY);
// Mostrar datos
Mostrar_Listas();
Mostrar_Tabla(distancias, "\nTabla distancias:");
}
private void Pasar_Arrays_a_Listas() {
lista_nombre_nodos.addAll(Arrays.asList(nombre_nodos));
lista_coordenadasX.addAll(Arrays.asList(coordenadasX));
lista_coordenadasY.addAll(Arrays.asList(coordenadasY));
}
private void Pasar_Listas_a_Arrays() {
v_nodos = lista_nombre_nodos.toArray(v_nodos);
coordenadas_XY = new double[lista_coordenadasX.size()][lista_coordenadasY.size()];
for (int i = 0; i < coordenadas_XY.length; i++) {
coordenadas_XY[0][i] = lista_coordenadasX.get(i);
coordenadas_XY[1][i] = lista_coordenadasY.get(i);
}
}
private void Mostrar_Listas() {
System.out.println("\nNodos:\n" + lista_nombre_nodos);
System.out.println("\nCoordenadas:");
System.out.println("X: " + lista_coordenadasX);
System.out.println("Y: " + lista_coordenadasY);
}
public void Mostrar_Tabla(double[] v1, String msg) {
System.out.println(msg);
int n = (int) Math.sqrt(v1.length);
double t1[][] = new double[n][n];
int cont = 0;
String aux = "";
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
t1[j][i] = v1[cont];
aux += ((int) (t1[j][i] * 10000)) + "\t";
cont++;
}
System.out.println(aux);
aux = "";
}
}
public double[] getDistancia(double[][] xy) {
int cont = 0;
double[] v1 = new double[xy[0].length * xy[0].length];
for (int i = 0; i < xy[0].length; i++) {
for (int j = 0; j < xy[0].length; j++) {
v1[cont] = Math.sqrt(Math.pow((xy[0][i] - xy[0][j]), 2) + Math.pow((xy[1][i] - xy[1][j]), 2));
cont++;
}
}
return v1;
}
}
Resultado:
run:
Nodos:
[A, B, C, D, E, F, G, H, I, J, K]
Coordenadas:
X: [20.0, 18.0, 22.0, 13.0, 3.0, 18.0, 30.0, 5.0, 14.0, 26.0, 23.0]
Y: [3.0, 26.0, 27.0, 31.0, 32.0, 37.0, 35.0, 42.0, 52.0, 45.0, 12.0]
Tabla distancias:
0 2308679 2408318 2886173 3361547 3405877 3352610 4178516 4936598 4242640 948683
2308679 0 412310 707106 1615549 1100000 1500000 2061552 2630589 2061552 1486606
2408318 412310 0 984885 1964688 1077032 1131370 2267156 2624880 1843908 1503329
2886173 707106 984885 0 1004987 781024 1746424 1360147 2102379 1910497 2147091
3361547 1615549 1964688 1004987 0 1581138 2716615 1019803 2282542 2641968 2828427
3405877 1100000 1077032 781024 1581138 0 1216552 1392838 1552417 1131370 2549509
3352610 1500000 1131370 1746424 2716615 1216552 0 2596150 2334523 1077032 2404163
4178516 2061552 2267156 1360147 1019803 1392838 2596150 0 1345362 2121320 3498571
4936598 2630589 2624880 2102379 2282542 1552417 2334523 1345362 0 1389244 4100000
4242640 2061552 1843908 1910497 2641968 1131370 1077032 2121320 1389244 0 3313608
948683 1486606 1503329 2147091 2828427 2549509 2404163 3498571 4100000 3313608 0
BUILD SUCCESSFUL (total time: 0 seconds)