Sobes.tech
Middle

O que é um algoritmo ganancioso e como ele é aplicado na resolução de problemas?

sobes.tech IA

Resposta da IA

O algoritmo ganancioso é uma abordagem heurística que, em cada passo, toma a decisão localmente ótima na esperança de que isso leve a uma solução globalmente ótima.

Aplicações:

  1. Problema de seleção de atividades:

    • Problema: Escolher o maior número de intervalos não sobrepostos no tempo de um conjunto dado.
    • Solução gananciosa: Ordenar os intervalos por tempo de término crescente. A cada passo, selecionar o intervalo com o menor tempo de término que não se sobrepõe aos já selecionados.
    # Exemplo de seleção de atividades
    # activities = [(start_time, end_time)]
    
    activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 8), (5, 9), (6, 10), (8, 11), (8, 12), (2, 14), (12, 16)]
    activities.sort(key=lambda x: x[1]) # Ordenar por tempo de término
    
    selected_activities = []
    last_finish_time = -1
    
    for activity in activities:
        if activity[0] >= last_finish_time:
            selected_activities.append(activity)
            last_finish_time = activity[1]
    
    print(selected_activities) # [ (1, 4), (5, 7), (8, 11), (12, 16) ]
    
  2. Problema de troco de moedas (Coin Change Problem) para conjuntos canônicos de moedas:

    • Problema: Dar a quantia desejada com o menor número de moedas.
    • Solução gananciosa: Usar a maior quantidade possível das denominações de moedas maiores até que a soma seja entregue. Funciona apenas para certos conjuntos de moedas (por exemplo, 1, 5, 10, 25).
    # Exemplo de troco de moedas (para moedas canônicas)
    coins = [25, 10, 5, 1]
    amount = 67
    result = {}
    
    for coin in coins:
        while amount >= coin:
            result[coin] = result.get(coin, 0) + 1
            amount -= coin
    
    print(result) # {25: 2, 10: 1, 5: 1, 1: 2}
    
  3. Algoritmo de Kruskal para encontrar a árvore geradora mínima:

    • Problema: Encontrar um subconjunto de arestas de um grafo não dirigido ponderado conectado que conecta todos os vértices com o peso total mínimo.
    • Solução gananciosa: Ordenar todas as arestas por peso em ordem crescente. Adicionar as arestas na ordem, se elas não formarem um ciclo com as já selecionadas, até que n-1 arestas tenham sido adicionadas (onde n é o número de vértices).

Algoritmos gananciosos são fáceis de implementar, mas nem sempre encontram a solução globalmente ótima para problemas arbitrários. Para alguns problemas (por exemplo, troco de moedas com conjuntos arbitrários, problema da mochila em geral), a abordagem gananciosa não é ótima. Para garantir a optimalidade ou uma melhor aproximação, podem ser necessários métodos como programação dinâmica ou outros. Antes de aplicar um algoritmo ganancioso, é importante garantir que ele seja adequado para o problema em questão.