Algorytmy zachłanne (greedy algorithms) to grupa algorytmów, w których rozwiązujemy problem krok po kroku, zawsze wybierając w danym momencie to, co wydaje się najlepsze „tu i teraz”. Nie analizujemy wszystkich możliwych kombinacji – ufamy, że lokalnie najlepsza decyzja doprowadzi nas do dobrego (czasem optymalnego) rozwiązania globalnego.
Zaletą takiego podejścia jest prostota i szybkość działania. Wadą – to, że nie zawsze gwarantuje rozwiązanie optymalne, zależy to od konkretnego problemu.
Rozważmy mapę Polski podzieloną na województwa. Chcemy ją pokolorować tak, aby dwa sąsiadujące województwa miały różne kolory, używając możliwie małej liczby kolorów.
Okazuje się, że każdą taką mapę można pokolorować maksymalnie 4 kolorami. Pokazany algorytm jest zachłanny: dla każdego województwa wybieramy natychmiast pierwszy możliwy (najmniejszy) kolor.
Kolejny klasyczny przykład to problem wydawania reszty: jak wydać daną kwotę za pomocą monet tak, aby liczba monet była jak najmniejsza?
Dostępne nominały monet: 5 zł, 2 zł, 1 zł, 50 gr, 20 gr, 10 gr, 5 gr, 2 gr, 1 gr.
Mamy wydać 4,78 zł.
Otrzymaliśmy rozwiązanie z minimalną liczbą monet – w typowym systemie monetarnym (takim jak polski) algorytm zachłanny daje wynik optymalny.
Jeśli nominały są „dziwne”, algorytm zachłanny może się mylić. Przykład: nominały 25, 10, 1, a reszta 30.
Wniosek: przy problemie wydawania reszty skuteczność metody zachłannej zależy od tego, jak wygląda zbiór nominałów.
Wyjaśnienie działania programuWyobraźmy sobie, że pewien miłośnik filmów uczestniczy w jednodniowym festiwalu filmowym. Ma listę seansów z podanymi godzinami:
Cel: obejrzeć możliwie jak najwięcej filmów, pamiętając, że:
Możemy rozważyć różne kryteria wyboru kolejnego filmu:
Okazuje się, że tylko kryterium 3 (najwcześniej kończący się film) gwarantuje rozwiązanie optymalne.
koniec_poprzedniego.koniec_poprzedniego,
dodaj film do harmonogramu i zaktualizuj koniec_poprzedniego,Taki algorytm jest zachłanny: w każdej chwili wybieramy ten film, który kończy się najwcześniej z dostępnych. Można matematycznie wykazać, że dla tego problemu daje on zawsze rozwiązanie optymalne.
Sortuj
Do uporządkowania filmów według czasu zakończenia użyto
sortowania przez wstawianie. Funkcja przyjmuje trzy listy:
koniec, poczatek oraz iden.
Podczas przesuwania elementów w liście koniec odpowiednio
przesuwane są elementy w listach poczatek i iden.
Dzięki temu wszystkie trzy listy nadal opisują te same filmy.
Takie listy nazywamy listami równoległymi.
Wypisz
Funkcja Wypisz wypisuje informacje o jednym filmie:
jego identyfikator, godzinę rozpoczęcia i zakończenia.
Wybierz
Funkcja Wybierz realizuje zachłanny wybór filmów:
Główna część programu:
Wybierz, aby pokazać listę filmów wybranych przez kinomana.Podstawowa zasada, którą warto zapamiętać:
Algorytm zachłanny w każdej chwili wybiera lokalnie najlepszą opcję, licząc na to, że doprowadzi ona do dobrego (czasem optymalnego) rozwiązania całego problemu.