Guia de Algoritmos: Estratégias Gulosas

Estratégias Gulosas

Usadas para resolver problemas de otimização, sempre escolhendo a estratégia localmente ótima, frequentemente alcançando soluções globais satisfatórias, mas sem garantir a solução absoluta. Em casos de problemas sem efeito retroativo, a abordagem gulosa garante uma solução global ideal.

Sem efeito retroativo significa que o estado atual é independente dos estados anteriores, dependendo apenas do momento presente.

Para problemas não resolvidos pela estratégia gulosa, consulte a seção sobre programação dinâmica.

A Busca em Largura (Breadth-First Search, BFS) é um algoritmo usado para percorrer ou pesquisar grafos. Embora não seja tradicionalmente considerada uma estratégia gulosa, sua natureza de explorar os nós mais próximos primeiro pode ser interpretada como tal. O BFS visita nós na ordem crescente da distância desde o ponto inicial.

Exemplo Simples de Guloso

Escolha uma estratégia adequaad para maximizar ou minimziar resultados.

Problema de Coelhos e Galinhas Priorize galinhas com menos pés ao calcular o máximo número de animais, e coelhos com mais pés ao calcular o mínimo, ajustando conforme necessário.

def lucro_maximo(preco):
    min_preco = preco[0]
    lucro = 0
    for i in range(1, len(preco)):
        min_preco = min(min_preco, preco[i])
        lucro = max(lucro, preco[i] - min_preco)
    return lucro

Intervalos Gulosos

Selecione o maior número possível de intervalos mutuamente exclusivos.

Problema: Selecionar programas televisivos com término mais cedo.

Código exemplo:

import sys

for entrada in sys.stdin:
    dados = entrada.split()
    capacidade = int(dados[0])
    distancia = float(dados[1])
    consumo = float(dados[2])
    num_postos = int(dados[3])
    postos = []
    posicao_atual = 0
    combustivel_atual = 0
    custo_total = 0
    chegou = False

    for _ in range(num_postos):
        posto = input().split()
        postos.append([float(posto[0]), float(posto[1])])

    postos.sort(key=lambda x: (x[1], x[0]))
    preços_ordenados = sorted(postos, key=lambda x: x[0])

    for j in range(len(postos)):
        if j == len(postos) - 1:
            break

        proximo_mais_barato = postos[j + 1][0] < postos[j][0]

        if posicao_atual == postos[j][1]:
            if proximo_mais_barato:
                necessidade = (postos[j + 1][1] - postos[j][1]) / consumo
                if combustivel_atual >= necessidade:
                    combustivel_atual -= necessidade
                    posicao_atual = postos[j + 1][1]
                else:
                    custo_total += (necessidade - combustivel_atual) * postos[j][0]
                    combustivel_atual = necessidade
                    posicao_atual = postos[j + 1][1]
                    combustivel_atual = 0
            else:
                alcance = posicao_atual + combustivel_atual * consumo
                if alcance >= postos[j + 1][1]:
                    pass
                else:
                    chegou = False
                    break
        else:
            chegou = False
            break

    if posicao_atual == postos[-1][1]:
        necessidade = (distancia - posicao_atual) / consumo
        if combustivel_atual + necessidade > capacidade:
            custo_total += (necessidade - combustivel_atual + capacidade) * postos[-1][0]
            posicao_atual += capacidade * consumo
            combustivel_atual = 0
        else:
            custo_total += necessidade * postos[-1][0]
            posicao_atual = distancia
            combustivel_atual = 0
    else:
        chegou = False

    if posicao_atual >= distancia:
        chegou = True
        print(f"{custo_total:.2f}")
    else:
        print(f"The maximum travel distance = {posicao_atual:.2f}")


Cobertura de Conjuntos

Selecione o menor conjunto de estações de rádio para cobrir todos os estados dos EUA.

estados_necessarios = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
estações = {
    "kone": set(["id", "nv", "ut"]),
    "ktwo": set(["wa", "id", "mt"]),
    "kthree": set(["or", "nv", "ca"]),
    "kfour": set(["nv", "ut"]),
    "kfive": set(["ca", "az"])
}

def cobertura_conjunto(estados, estações):
    estações_selecionadas = set()
    while estados:
        melhor_estação = None
        estados_cobertos = set()
        for estação, cobertura in estações.items():
            interseção = estados & cobertura
            if len(interseção) > len(estados_cobertos) and estação not in estações_selecionadas:
                melhor_estação = estação
                estados_cobertos = interseção
        if melhor_estação is not None:
            estados -= estados_cobertos
            estações_selecionadas.add(melhor_estação)
            estações.pop(melhor_estação)
        else:
            return None
    return estações_selecionadas

print(cobertura_conjunto(estados_necessarios, estações))

Tags: Algoritmos guloso Otimização

Publicado em 8-14 12:55