Problema del viajante bitónico

Dada una array 2D , arr[][] que denota una lista de coordenadas de N vértices en un espacio 2D que ya está ordenado por coordenadas x e y, la tarea es encontrar la distancia mínima de un recorrido que comienza desde el extremo izquierdo vértice, y va estrictamente a la derecha, y luego, al llegar al vértice más a la derecha, el recorrido va estrictamente de derecha a izquierda hasta el vértice inicial. 

Ejemplos:

Entrada: N = 7, arr[][] = {{0, 6}, {1 0}, {2 3}, {5 4}, {6 1}, {7 5}, {8 2}}
Salida : 25.582
Explicación: 

El recorrido TSP : 0-3-5-6-4-1-2-0 no es un recorrido TSP bitónico porque aunque el recorrido inicialmente va de izquierda a derecha (0-3-5-6) y luego vuelve de derecha a la izquierda (6-4-1), luego da otro paso de izquierda a derecha (1-2) y luego de derecha a izquierda (2-0). 
El recorrido: 0-2-3-5-6-4-1-0 es un recorrido TSP Bitonic válido porque se puede descomponer en dos recorridos: 0-2-3-5-6 que va de izquierda a derecha y 6 -4-1-0 que retrocede de derecha a izquierda.

Entrada: N = 3, arr[][] = {{1, 1}, {2, 3}, {3, 1}}
Salida: 6,47

Enfoque: El problema anterior se puede resolver usando Programación Dinámica . En aras de la comprensión, el problema se puede convertir en dos personas. Ambos deben comenzar desde el punto más a la izquierda al mismo tiempo. Camine por dos caminos diferentes y finalmente llegue al punto más a la derecha, excepto el punto de partida y el punto final.

  • Cada punto pasa a ser pasado por una persona. Aquí, dp[i][j] representa la distancia que camina la primera persona hacia i y la segunda hacia j .
  • En la solución, dp[i][j] significa que se ha caminado de 1 a max(i, j) , y las posiciones actuales de las dos personas son i y j respectivamente, y la distancia que deben recorrer.
  • También se puede inferir que dp[i][j] es igual a dp[j][i] , por lo que de ahora en adelante se estipula que i siempre es mayor que j es decir i>j en el estado.
  • De esta manera, no importa esa persona, el siguiente paso solo puede ir a i+1, i+2,… estos puntos.
  • Entonces, el estado dp[i][j] solo se puede transferir a dp[i+1][j] o dp[i][i+1].

Siga los pasos a continuación para resolver el problema:

  • Cree una array 2D , dp[][] de tamaño N*N . 
  • Iterar la última fila de la tabla, dp , y actualizar dp[N-1][i] a la suma de distancia(N-1, N) y distancia(i, N) , donde distancia(x, y) representa la Distancia euclidiana entre los puntos x e y de arr .
  • Cree una función recursiva findTour (i, j) para llenar todas las demás celdas
    • Actualice dp[i][j] al mínimo de findTour(i+1, j)+distance(i, i+1) y findTour(i+1, i)+distance(j, i+1) .

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Size of the array a[]
const int mxN = 1005;
 
// Structure to store the x and
// y coordinates of a point
struct Coordinates {
    double x, y;
} a[mxN];
 
// Declare a 2-D dp array
float dp[mxN][mxN];
 
// Function to calculate the
// distance between two points
// in a Euclidian plane
float distance(int i, int j)
{
    // Return the distance
    return sqrt(
      (a[i].x - a[j].x) * (a[i].x - a[j].x)
    + (a[i].y - a[j].y) * (a[i].y - a[j].y));
}
 
// Utility recursive function to find
// the bitonic tour distance
float findTourDistance(int i, int j)
{
    // Memoization
    if (dp[i][j] > 0)
        return dp[i][j];
 
    // Update dp[i][j]
    dp[i][j] = min(
    findTourDistance(i + 1, j) + distance(i, i + 1),
    findTourDistance(i + 1, i) + distance(j, i + 1));
 
    return dp[i][j];
}
 
// Function to find the
// bitonic tour distance
void bitonicTSP(int N)
{
    // Initialize the dp array
    memset(dp, 0, sizeof(dp));
 
    // Base Case
    for (int j = 1; j < N - 1; j++)
        dp[N - 1][j] = distance(N - 1, N)
              + distance(j, N);
 
    // Print the answer
    printf("%.2f\n", findTourDistance(1, 1));
}
 
// Driver Code
int main()
{
    // Given Input
    int N = 3;
    a[1].x = 1, a[1].y = 1;
    a[2].x = 2, a[2].y = 3;
    a[3].x = 3, a[3].y = 1;
 
    // Function Call
    bitonicTSP(N);
}
Producción

6.47

Tiempo Complejidad: O(N 2 )
Espacio Auxiliar: O(N 2 )

Publicación traducida automáticamente

Artículo escrito por azmuth13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *