Algoritmia - Calcular ruta minima

 
Vista:

Calcular ruta minima

Publicado por Fran (1 intervención) el 26/02/2009 17:21:10
Hola os planteo mi duda y a ver si alguien me puede ayudar.

Supongamos que tengo 4 puntos geograficos y un punto de partida inicial. Tengo en una BD todas las distancias entre todos, es decir si fuera un grafo seria completo.
Necesito un algoritmo que como punto inicial y final sea el mismo punto de partida, y pasando por los otros 4 puntos me diga en que orden los tengo que recorrer para que la distancia sea la mínima.
He mirado el algoritmo Dijkstra que a priori pintaba bien pero creo que no se ajusta a l que quiero.

Alguien podria decirme como hacerlo o en que basarme o alguna idea. Voy a impementarlo en Java por si sirve de algo y teniendo las distancias en una base de datos MySQL.

Gracias de antemano a quien aporte algo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Resolución del problema del viajante de comercio en Java utilizando MySQL

Publicado por Alejandro (307 intervenciones) el 13/03/2024 22:42:12
Lo que estás buscando es conocido como el problema del viajante de comercio (TSP por sus siglas en inglés), que consiste en encontrar el recorrido más corto que visita cada punto exactamente una vez y regresa al punto de partida.

Dado que tienes todas las distancias entre los puntos en una base de datos, puedes utilizar un enfoque de fuerza bruta o un algoritmo heurístico para resolver este problema.

1. Fuerza bruta:
- Genera todas las posibles permutaciones de los puntos.
- Calcula la longitud del recorrido para cada permutación.
- Encuentra la permutación que tiene la distancia mínima.

2. Algoritmos heurísticos:
- Algoritmo del vecino más cercano: Empieza en un punto y en cada paso elige el punto más cercano que no ha sido visitado.
- Algoritmo del mínimo costo: Construye un árbol de expansión mínimo (MST) y luego realiza un recorrido en preorden del árbol.

En tu caso, podrías implementar el algoritmo del vecino más cercano, ya que es relativamente fácil de implementar y suele dar buenos resultados en situaciones donde el número de puntos es pequeño.

Aquí tienes un ejemplo de cómo podrías implementar el algoritmo del vecino más cercano en Java utilizando una base de datos MySQL para obtener las distancias entre los puntos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Aquí importarías las clases necesarias para trabajar con JDBC y MySQL
 
public class TSP {
 
    public static List<Integer> encontrarRecorridoMinimo(int puntoInicial, int numPuntos, Connection conexion) throws SQLException {
        List<Integer> recorrido = new ArrayList<>();
        Set<Integer> visitados = new HashSet<>();
 
        recorrido.add(puntoInicial);
        visitados.add(puntoInicial);
 
        while (recorrido.size() < numPuntos) {
            int ultimoPunto = recorrido.get(recorrido.size() - 1);
            int puntoMasCercano = encontrarVecinoMasCercano(ultimoPunto, visitados, conexion);
            recorrido.add(puntoMasCercano);
            visitados.add(puntoMasCercano);
        }
 
        // Añadir el punto inicial al final para completar el ciclo
        recorrido.add(puntoInicial);
 
        return recorrido;
    }
 
    private static int encontrarVecinoMasCercano(int punto, Set<Integer> visitados, Connection conexion) throws SQLException {
        int puntoMasCercano = -1;
        double distanciaMinima = Double.MAX_VALUE;
 
        // Consulta SQL para obtener la distancia mínima desde el punto actual a cualquier otro punto no visitado
        String consulta = "SELECT destino, distancia FROM distancias WHERE origen = ? AND destino NOT IN (" + String.join(",", Collections.nCopies(visitados.size(), "?")) + ")";
 
        try (PreparedStatement ps = conexion.prepareStatement(consulta)) {
            ps.setInt(1, punto);
            int i = 2;
            for (int v : visitados) {
                ps.setInt(i++, v);
            }
 
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    int destino = rs.getInt("destino");
                    double distancia = rs.getDouble("distancia");
                    if (distancia < distanciaMinima) {
                        distanciaMinima = distancia;
                        puntoMasCercano = destino;
                    }
                }
            }
        }
 
        return puntoMasCercano;
    }
 
    // Aquí iría tu método main para conectarte a la base de datos y llamar a encontrarRecorridoMinimo()
}

Este es solo un ejemplo básico para darte una idea de cómo podrías implementar el algoritmo del vecino más cercano en Java utilizando una base de datos MySQL para obtener las distancias entre los puntos. Asegúrate de adaptarlo a tus necesidades específicas y manejar correctamente la conexión a la base de datos y los errores.

Recuerda que el algoritmo del vecino más cercano no garantiza siempre la solución óptima, pero puede ser útil para resolver instancias pequeñas del problema del viajante de comercio. ¡Buena suerte, Fran!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar