Exemplo de aplicação do Algoritmo do Vizinho mais Próximo, na resolução de um problema, utilizando sete cidades. Ajuda

O algoritmo do vizinho mais próximo foi, na ciência da computação, um dos primeiros algoritmos utilizados para determinar uma solução para o problema do problema do caixeiro viajante. Ele gera rapidamente um caminho curto, mas geralmente não o ideal.


Abaixo está a aplicação do algoritmo do vizinho mais próximo ao problema do caixeiro viajante.

Estes são os passos do algoritmo:

  1. escolha um vértice arbitrário como vértice atual.
  2. descubra a aresta de menor peso que seja conectada ao vértice atual e a um vértice não visitado V.
  3. faça o vértice atual ser V.
  4. marque V como visitado.
  5. se todos os vértices no domínio estiverem visitados, encerre o algoritmo.
  6. Se não vá para o passo 2.

A seqüência dos vértices visitados é a saída do algoritmo.

O algoritmo do vizinho mais próximo é fácil de implementar e executar rapidamente, mas às vezes pode perder rotas mais curtas, que são facilmente notadas com a visão humana, devido à sua natureza "gananciosa". Como um guia geral, se os últimos passos do percurso são comparáveis em comprimento aos dos primeiros passos, o percurso é razoável; se eles são muito maiores, então é provável que existam percursos bem melhores.


Exemplo de código fonte

editar

Exemplo simples em Java do algoritmo do vizinho mais próximo para encontrar o caminho mais curto em um grafo completo.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class NearestNeighbour {

    private int[][] graph;
    private int numNodes;
    private List<Integer> path;

    public NearestNeighbour(int[][] graph) {
        this.graph = graph;
        this.numNodes = graph.length;
        this.path = new ArrayList<>();
    }

    public List<Integer> getShortestPath(int startNode) {
        // Adiciona o nó inicial ao caminho
        path.add(startNode);

        // Enquanto não visitou todos os nós
        while (path.size() < numNodes) {
            // Seleciona o vizinho mais próximo
            int currentNode = path.get(path.size() - 1);
            int nextNode = getNearestNeighbour(currentNode);

            // Adiciona o vizinho mais próximo ao caminho
            path.add(nextNode);
        }

        // Adiciona o nó inicial novamente para fechar o caminho
        path.add(startNode);

        return path;
    }

    private int getNearestNeighbour(int node) {
        int nearestNeighbour = -1;
        int shortestDistance = Integer.MAX_VALUE;

        // Procura o vizinho mais próximo não visitado
        for (int i = 0; i < numNodes; i++) {
            if (i != node && !path.contains(i) && graph[node][i] < shortestDistance) {
                nearestNeighbour = i;
                shortestDistance = graph[node][i];
            }
        }

        return nearestNeighbour;
    }

    public static void main(String[] args) {
        // Grafo completo com pesos
        int[][] graph = {
                {0, 2, 9, 10},
                {2, 0, 6, 4},
                {9, 6, 0, 8},
                {10, 4, 8, 0}
        };

        // Cria o objeto do algoritmo
        NearestNeighbour nn = new NearestNeighbour(graph);

        // Encontra o caminho mais curto a partir do nó 0
        List<Integer> shortestPath = nn.getShortestPath(0);

        // Imprime o caminho mais curto
        System.out.println("Caminho mais curto: " + Arrays.toString(shortestPath.toArray()));
    }
}
Ícone de esboço Este artigo sobre programação de computadores é um esboço. Você pode ajudar a Wikipédia expandindo-o.

📚 Artikel Terkait di Wikipedia

Go (linguagem de programação)

hierarquia, e reutilização de código sem herança. type Pessoa struct { Nome string idade int } package main import "fmt" type Animal struct { } func (a Animal)

SHACL

www.w3.org (em inglês). Consultado em 23 de fevereiro de 2019  «Web-based graph technology is on the rise. Here is why.». www.linkedin.com (em inglês).

Rust (linguagem de programação)

trim<T>(input: T) -> String where T: AsRef<str>, // T: Into<String>, { // Retorna uma nova String incondicionalmente input.as_ref().trim().to_string() // input

Adrian Ocneanu

University Press 1988, 119-172 Quantum symmetry, differential geometry of finite graphs and classification of subfactors, University of Tokyo Seminary Notes 45

Categoria de espaços vetoriais de dimensão finita

módulos Citação: Kissinger, Aleks (2012). Pictures of processes: automated graph rewriting for monoidal categories and applications to quantum computing

Siang Wun Song

Parallel Algorithm for Maximal Cliques in Circle Graphs. 2002: Parallel Dynamic Programming For Solving The String Editing Problem On A CGM/BSP. 2003: A Parallel

Google Chrome

SafeSearch Scholar Shopping Tenor Usenet Voos PageRank Análise Trends Knowledge Graph Descontinuados Allo Answers Browser Sync Base Buzz Checkout Chrome Frame

Zvi Galil

and directed graphs». Combinatorica. 6 (2). doi:10.1007/BF02579168  Galil, Z. «Efficient algorithms for finding maximum matching in graphs». ACM Computing