Algoritam pohlepnog pretraživanja (Greedy Search) u C++- Objašnjenje, primjer i kod

Algoritam Greedy Search pristup je rješavanju problema koji uvijek odabire najbolju dostupnu opciju u svakom koraku bez razmatranja dugoročnog utjecaja odluke. Iako ne jamči pronalaženje globalno optimalnog rješenja, ova metoda često djeluje brzo i jednostavna je za implementaciju.

Kako radi

  1. Inicijalizacija: Počnite s praznim ili početnim rješenjem.
  2. Lokalni optimalni izbor: U svakom koraku odaberite lokalno optimalan izbor na temelju funkcije cilja ili definiranih kriterija.
  3. Primijeni izbor: Primijeni optimalni izbor na trenutno rješenje.
  4. Ponavljanje: Ponavljajte korake od 2 do 4 dok se ne može napraviti bolji lokalni izbor.

Primjer: Knapsack Problem

Razmotrimo Knapsack Problem, gdje imamo naprtnjaču s maksimalnom težinom i popis predmeta s težinama i vrijednostima. Cilj je odabrati predmete koji će maksimizirati ukupnu vrijednost u naprtnjači. Pristup Greedy Search za ovaj problem je odabir stavki na temelju najvećeg omjera vrijednosti i težine.

Primjer koda u C++

#include <iostream>  
#include <vector>  
#include <algorithm>  
  
struct Item {  
    int weight;  
    int value;  
};  
  
bool compare(Item a, Item b) {  
    double ratioA =(double)a.value / a.weight;  
    double ratioB =(double)b.value / b.weight;  
    return ratioA > ratioB;  
}  
  
double greedyKnapsack(int maxWeight, std::vector<Item>& items) {  
    double totalValue = 0.0;  
  
    std::sort(items.begin(), items.end(), compare);  
  
    for(const Item& item: items) {  
        if(maxWeight >= item.weight) {  
            totalValue += item.value;  
            maxWeight -= item.weight;  
        } else {  
            totalValue +=(double)maxWeight / item.weight * item.value;  
            break;  
        }  
    }  
  
    return totalValue;  
}  
  
int main() {  
    int maxWeight = 10;  
    std::vector<Item> items = {{2, 6}, {5, 12}, {3, 8}, {7, 14}, {4, 10}};  
    double maxValue = greedyKnapsack(maxWeight, items);  
  
    std::cout << "Max value in knapsack: " << maxValue << std::endl;  
  
    return 0;  
}  

U ovom primjeru koristimo pristup Greedy Search za rješavanje Knapsack Problem. Predmete razvrstavamo na temelju opadajućeg omjera vrijednosti i težine i odabiremo predmete s najvećim omjerom koji još uvijek odgovaraju ograničenju težine naprtnjače.