Algoritmos gulosos


Um algoritmo guloso é uma estratégia de construção de algoritmos que toma decisões baseadas na melhor escolha disponível no momento, sem considerar as possíveis consequências futuras. A ideia é que, ao fazer uma série de escolhas localmente ótimas, o algoritmo chegue a uma solução globalmente ótima.

Abaixo um exemplo simples de um algoritmo guloso em C que resolve o problema da mochila fracionária (Fractional Knapsack Problem). Nesse problema, você tem uma mochila com uma capacidade limitada e um conjunto de itens, cada um com um peso e um valor. O objetivo é maximizar o valor total dos itens que podem ser colocados na mochila. Diferente do problema da mochila inteira, aqui você pode fracionar os itens.

#include <stdio.h>
 
// Estrutura para representar um item com peso e valor
typedef struct {
    int peso;
    int valor;
} Item;
 
// Função para comparar a razão valor/peso de dois itens
int comparar(const void *a, const void *b) {
    double r1 = (double)((Item *)a)->valor / ((Item *)a)->peso;
    double r2 = (double)((Item *)b)->valor / ((Item *)b)->peso;
    return r2 - r1 > 0 ? 1 : -1;
}
 
// Função para resolver o problema da mochila fracionária
double mochilaFracionaria(Item itens[], int n, int capacidade) {
    // Ordena os itens com base na razão valor/peso
    qsort(itens, n, sizeof(Item), comparar);
 
    double valorTotal = 0.0;
    int pesoAtual = 0;
 
    for (int i = 0; i < n; i++) {
        if (pesoAtual + itens[i].peso <= capacidade) {
            // Se o item cabe inteiro na mochila, adiciona-o
            pesoAtual += itens[i].peso;
            valorTotal += itens[i].valor;
        } else {
            // Se o item não cabe inteiro, adiciona a fração que cabe
            int pesoRestante = capacidade - pesoAtual;
            valorTotal += itens[i].valor * ((double)pesoRestante / itens[i].peso);
            break;  // A mochila está cheia
        }
    }
 
    return valorTotal;
}
 
int main() {
    int capacidade = 50;  // Capacidade da mochila
 
    // Array de itens {peso, valor}
    Item itens[] = {{10, 60}, {20, 100}, {30, 120}};
    int n = sizeof(itens) / sizeof(itens[0]);
 
    double maxValor = mochilaFracionaria(itens, n, capacidade);
    printf("Valor máximo que pode ser obtido = %.2f\n", maxValor);
 
    return 0;
}

Note

Neste exemplo, a estratégia gulosa é a escolha do item com a maior razão valor/peso em cada etapa. Essa abordagem pode não funcionar para todos os problemas de otimização, mas no caso da mochila fracionária, ela sempre resulta em uma solução ótima.

Referências


https://drive.google.com/file/d/1vGZYPPw7PZuMMqXpjjUkF_kMGTmVv1-r/view?usp=drive_link