Problema del vendedor ambulante | Enfoque codicioso

Dada una array 2D tsp[][] , donde cada fila tiene la array de distancias desde esa ciudad indexada a todas las demás ciudades y -1 indica que no existe un camino entre esas dos ciudades indexadas. La tarea es imprimir el costo mínimo en el ciclo TSP.
Ejemplos: 

Entrada: 
cucharadita[][] = {{-1, 10, 15, 20}, 
{10, -1, 35, 25}, 
{15, 35, -1, 30}, 
{20, 25, 30, – 1}}; 
A continuación se muestra el gráfico dado: 
 

Salida: 80 
Explicación: 
Estamos tratando de encontrar el camino/ruta con el costo mínimo tal que se logre nuestro objetivo de visitar todas las ciudades una vez y regresar a la ciudad de origen. El camino a través del cual podemos lograr eso, se puede representar como 1 -> 2 -> 4 -> 3 -> 1. Aquí, comenzamos desde la ciudad 1 y terminamos en la misma visitando todas las demás ciudades una vez en nuestro camino. El costo de nuestro camino/ruta se calcula de la siguiente manera: 
1 -> 2 = 10 
2 -> 4 = 25 
4 -> 3 = 30 
3 -> 1 = 15 
(Todos los costos se toman de la array 2D dada) 
Por lo tanto, costo total = 10 + 25 + 30 + 15 = 80
Entrada: 
cucharadita[][] = {{-1, 30, 25, 10}, 
{15, -1, 20, 40}, 
{10, 20, -1 , 25}, 
{30, 10, 20, -1}}; 
Salida: 50 

Presentamos el problema del vendedor ambulante y discutimos las soluciones de programación ingenua y dinámica para el problema en la publicación anterior . Ambas soluciones son inviables. De hecho, no existe una solución de tiempo polinomial disponible para este problema, ya que se trata de un problema NP-Hard conocido. Sin embargo, existen algoritmos aproximados para resolver el problema. 
Este problema se puede relacionar con el problema del ciclo hamiltoniano , de manera que aquí sabemos que existe un ciclo hamiltoniano en el gráfico, pero nuestro trabajo es encontrar el ciclo con el costo mínimo. Además, en un gráfico TSP particular, puede haber muchos ciclos hamiltonianos, pero solo necesitamos generar uno que satisfaga nuestro objetivo requerido del problema.
Enfoque: Este problema se puede resolver usandoTécnica codiciosa . A continuación se muestran los pasos: 

  1. Cree dos titulares de datos primarios: 
    • Una lista que contiene los índices de las ciudades en términos de la array de entrada de distancias entre ciudades.
    • Array de resultados que tendrá todas las ciudades que se pueden mostrar en la consola de cualquier manera.
  2. Realice un recorrido en la array de adyacencia dada tsp[][] para toda la ciudad y si el costo de llegar a cualquier ciudad desde la ciudad actual es menor que el costo actual, actualice el costo.
  3. Genere el ciclo de ruta mínimo utilizando el paso anterior y devuelva allí el costo mínimo.

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;
 
// Function to find the minimum
// cost path for all the paths
void findMinRoute(vector<vector<int> > tsp)
{
    int sum = 0;
    int counter = 0;
    int j = 0, i = 0;
    int min = INT_MAX;
    map<int, int> visitedRouteList;
 
    // Starting from the 0th indexed
    // city i.e., the first city
    visitedRouteList[0] = 1;
    int route[tsp.size()];
 
    // Traverse the adjacency
    // matrix tsp[][]
    while (i < tsp.size() && j < tsp[i].size())
    {
 
        // Corner of the Matrix
        if (counter >= tsp[i].size() - 1)
        {
            break;
        }
 
        // If this path is unvisited then
        // and if the cost is less then
        // update the cost
        if (j != i && (visitedRouteList[j] == 0))
        {
            if (tsp[i][j] < min)
            {
                min = tsp[i][j];
                route[counter] = j + 1;
            }
        }
        j++;
 
        // Check all paths from the
        // ith indexed city
        if (j == tsp[i].size())
        {
            sum += min;
            min = INT_MAX;
            visitedRouteList[route[counter] - 1] = 1;
            j = 0;
            i = route[counter] - 1;
            counter++;
        }
    }
 
    // Update the ending city in array
    // from city which was last visited
    i = route[counter - 1] - 1;
 
    for (j = 0; j < tsp.size(); j++)
    {
 
        if ((i != j) && tsp[i][j] < min)
        {
            min = tsp[i][j];
            route[counter] = j + 1;
        }
    }
    sum += min;
 
    // Started from the node where
    // we finished as well.
    cout << ("Minimum Cost is : ");
    cout << (sum);
}
 
// Driver Code
int main()
{
   
    // Input Matrix
    vector<vector<int> > tsp = { { -1, 10, 15, 20 },
                                 { 10, -1, 35, 25 },
                                 { 15, 35, -1, 30 },
                                 { 20, 25, 30, -1 } };
 
    // Function Call
    findMinRoute(tsp);
}
 
// This code is contributed by grand_master.

Java

// Java program for the above approach
import java.util.*;
 
public class TSPGreedy {
 
    // Function to find the minimum
    // cost path for all the paths
    static void findMinRoute(int[][] tsp)
    {
        int sum = 0;
        int counter = 0;
        int j = 0, i = 0;
        int min = Integer.MAX_VALUE;
        List<Integer> visitedRouteList
            = new ArrayList<>();
 
        // Starting from the 0th indexed
        // city i.e., the first city
        visitedRouteList.add(0);
        int[] route = new int[tsp.length];
 
        // Traverse the adjacency
        // matrix tsp[][]
        while (i < tsp.length
               && j < tsp[i].length) {
 
            // Corner of the Matrix
            if (counter >= tsp[i].length - 1) {
                break;
            }
 
            // If this path is unvisited then
            // and if the cost is less then
            // update the cost
            if (j != i
                && !(visitedRouteList.contains(j))) {
                if (tsp[i][j] < min) {
                    min = tsp[i][j];
                    route[counter] = j + 1;
                }
            }
            j++;
 
            // Check all paths from the
            // ith indexed city
            if (j == tsp[i].length) {
                sum += min;
                min = Integer.MAX_VALUE;
                visitedRouteList.add(route[counter] - 1);
                j = 0;
                i = route[counter] - 1;
                counter++;
            }
        }
 
        // Update the ending city in array
        // from city which was last visited
        i = route[counter - 1] - 1;
 
        for (j = 0; j < tsp.length; j++) {
 
            if ((i != j) && tsp[i][j] < min) {
                min = tsp[i][j];
                route[counter] = j + 1;
            }
        }
        sum += min;
 
        // Started from the node where
        // we finished as well.
        System.out.print("Minimum Cost is : ");
        System.out.println(sum);
    }
 
    // Driver Code
    public static void
        main(String[] args)
    {
        // Input Matrix
        int[][] tsp = {
            { -1, 10, 15, 20 },
            { 10, -1, 35, 25 },
            { 15, 35, -1, 30 },
            { 20, 25, 30, -1 }
        };
 
        // Function Call
        findMinRoute(tsp);
    }
}

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class TSPGreedy{
 
// Function to find the minimum
// cost path for all the paths
static void findMinRoute(int[,] tsp)
{
    int sum = 0;
    int counter = 0;
    int j = 0, i = 0;
    int min = int.MaxValue;
     
    List<int> visitedRouteList = new List<int>();
 
    // Starting from the 0th indexed
    // city i.e., the first city
    visitedRouteList.Add(0);
    int[] route = new int[tsp.Length];
 
    // Traverse the adjacency
    // matrix tsp[,]
    while (i < tsp.GetLength(0) &&
           j < tsp.GetLength(1))
    {
 
        // Corner of the Matrix
        if (counter >= tsp.GetLength(0) - 1)
        {
            break;
        }
 
        // If this path is unvisited then
        // and if the cost is less then
        // update the cost
        if (j != i &&
            !(visitedRouteList.Contains(j)))
        {
            if (tsp[i, j] < min)
            {
                min = tsp[i, j];
                route[counter] = j + 1;
            }
        }
        j++;
 
        // Check all paths from the
        // ith indexed city
        if (j == tsp.GetLength(0))
        {
            sum += min;
            min = int.MaxValue;
            visitedRouteList.Add(route[counter] - 1);
             
            j = 0;
            i = route[counter] - 1;
            counter++;
        }
    }
 
    // Update the ending city in array
    // from city which was last visited
    i = route[counter - 1] - 1;
 
    for(j = 0; j < tsp.GetLength(0); j++)
    {
        if ((i != j) && tsp[i, j] < min)
        {
            min = tsp[i, j];
            route[counter] = j + 1;
        }
    }
    sum += min;
 
    // Started from the node where
    // we finished as well.
    Console.Write("Minimum Cost is : ");
    Console.WriteLine(sum);
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Input Matrix
    int[,] tsp = { { -1, 10, 15, 20 },
                   { 10, -1, 35, 25 },
                   { 15, 35, -1, 30 },
                   { 20, 25, 30, -1 } };
 
    // Function call
    findMinRoute(tsp);
}
}
 
// This code is contributed by Amit Katiyar

Python3

#  Python3 program for the above approach
 
from typing import DefaultDict
 
 
INT_MAX = 2147483647
 
# Function to find the minimum
# cost path for all the paths
def findMinRoute(tsp):
    sum = 0
    counter = 0
    j = 0
    i = 0
    min = INT_MAX
    visitedRouteList = DefaultDict(int)
 
    # Starting from the 0th indexed
    # city i.e., the first city
    visitedRouteList[0] = 1
    route = [0] * len(tsp)
 
    # Traverse the adjacency
    # matrix tsp[][]
    while i < len(tsp) and j < len(tsp[i]):
 
        # Corner of the Matrix
        if counter >= len(tsp[i]) - 1:
            break
 
        # If this path is unvisited then
        # and if the cost is less then
        # update the cost
        if j != i and (visitedRouteList[j] == 0):
            if tsp[i][j] < min:
                min = tsp[i][j]
                route[counter] = j + 1
 
        j += 1
 
        # Check all paths from the
        # ith indexed city
        if j == len(tsp[i]):
            sum += min
            min = INT_MAX
            visitedRouteList[route[counter] - 1] = 1
            j = 0
            i = route[counter] - 1
            counter += 1
 
    # Update the ending city in array
    # from city which was last visited
    i = route[counter - 1] - 1
 
    for j in range(len(tsp)):
 
        if (i != j) and tsp[i][j] < min:
            min = tsp[i][j]
            route[counter] = j + 1
 
    sum += min
 
    # Started from the node where
    # we finished as well.
    print("Minimum Cost is :", sum)
 
 
# Driver Code
if __name__ == "__main__":
 
    # Input Matrix
    tsp = [[-1, 10, 15, 20], [10, -1, 35, 25], [15, 35, -1, 30], [20, 25, 30, -1]]
 
    # Function Call
    findMinRoute(tsp)
Producción

Minimum Cost is : 80

Complejidad de tiempo: O(N 2 *log 2 N) 
Espacio auxiliar: O(N)
 

Publicación traducida automáticamente

Artículo escrito por jddeep003 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 *