Sobes.tech
Junior

O que é um algoritmo guloso e em que casos é aplicado?

sobes.tech IA

Resposta da IA

O algoritmo guloso é uma abordagem para resolver problemas de otimização que, a cada passo, escolhe a melhor solução local (a opção mais vantajosa do ponto de vista do momento atual) na esperança de que essa sequência de soluções locais ótimas conduza a uma solução globalmente ótima. Ele não considera as possíveis consequências da escolha atual nos passos futuros.

Características:

  • Simplicidade: Geralmente mais fácil de implementar do que programação dinâmica ou outros métodos de otimização.
  • Velocidade: Frequentemente tem menor complexidade computacional.
  • Garantia de otimalidade: Nem sempre garante encontrar a solução globalmente ótima. A garantia aplica-se apenas a certos tipos de problemas.

Aplica-se em problemas onde foi demonstrado que a escolha localmente ótima em cada passo leva a uma solução globalmente ótima. Exemplos:

  • Problema de seleção de atividades: Escolher o maior número de atividades não sobrepostas no tempo.
  • Problema da mochila (com fracionamento de objetos): Quando os objetos podem ser divididos. Caso contrário, é um problema de programação dinâmica.
  • Algoritmo de Prim e Kruskal: Para encontrar a árvore geradora mínima em um grafo.
  • Algoritmo de Dijkstra: Para encontrar o caminho mais curto em um grafo com pesos de aresta não negativos.
  • Codificação de Huffman: Para construir um código prefixo ótimo.

Exemplo de pseudocódigo para o algoritmo de seleção de atividades:

Função SelecionarAtividades(atividades):
  Ordenar atividades por tempo de término
  atividades_selecionadas = lista vazia
  último_tempo_de_fim = 0

  Para cada atividade em atividades:
    Se atividade.início >= último_tempo_de_fim:
      Adicionar atividade a atividades_selecionadas
      último_tempo_de_fim = atividade.fim

  Retornar atividades_selecionadas

É importante verificar se o algoritmo guloso é aplicável a um problema específico, pois caso contrário, pode fornecer uma solução subótima.

# Exemplo simples onde o algoritmo guloso não é ótimo
# Problema de troco: dar a menor quantidade de moedas
# Moedas disponíveis: [1, 5, 10, 25] USD
# Por exemplo, para 30 centavos

# Algoritmo guloso:
# Pegamos a maior moeda <= 30 (25) -> resto 5
# Pegamos a maior moeda <= 5 (5) -> resto 0
# Resultado: 2 moedas (25 + 5). Aqui, é ótimo.

# Moedas disponíveis: [1, 6, 10]
# Para 12 centavos

# Algoritmo guloso:
# Pegamos a maior moeda <= 12 (10) -> resto 2
# Pegamos a maior moeda <= 2 (1) -> resto 1
# Pegamos a maior moeda <= 1 (1) -> resto 0
# Resultado: 3 moedas (10 + 1 + 1).
# A solução ótima seria 2 moedas (6 + 6).

# Este exemplo mostra que o algoritmo guloso nem sempre leva à solução globalmente ótima,
# se as propriedades do problema não forem compatíveis com sua aplicação (por exemplo,
# denominações de moeda padrão geralmente permitem o uso do guloso,
# mas denominações arbitrárias não).