Greedy Algorithm with examples: Greedy Method & Přístup

Obsah:

Anonim

Co je chamtivý algoritmus?

V Greedy Algorithm je sada zdrojů rekurzivně rozdělena na základě maximální okamžité dostupnosti daného zdroje v dané fázi provádění.

K vyřešení problému založeného na chamtivém přístupu existují dvě fáze

  1. Skenování seznamu položek
  2. Optimalizace

Tyto fáze jsou popsány paralelně v tomto výukovém algoritmu Greedy, o průběhu dělení pole.

Abyste pochopili chamtivý přístup, budete muset mít pracovní znalosti o rekurzi a přepínání kontextu. To vám pomůže pochopit, jak vysledovat kód. Chamtivé paradigma můžete definovat z hlediska vlastních nezbytných a dostatečných výroků.

Chamtivé paradigma definují dvě podmínky.

  • Každé postupné řešení musí strukturovat problém směrem k jeho nejlépe přijatému řešení.
  • Stačí, když se strukturování problému může zastavit v konečném počtu chamtivých kroků.

S pokračujícím teoretizováním popíšeme historii spojenou s přístupem hledání chamtivců.

V tomto výukovém algoritmu Greedy se naučíte:

  • Historie chamtivých algoritmů
  • Chamtivé strategie a rozhodnutí
  • Charakteristika chamtivého přístupu
  • Proč používat chamtivý přístup?
  • Jak vyřešit problém s výběrem aktivity
  • Architektura chamtivého přístupu
  • Nevýhody chamtivých algoritmů

Historie chamtivých algoritmů

Zde je důležitý mezník chamtivých algoritmů:

  • Chamtivé algoritmy byly v 50. letech konceptualizovány pro mnoho algoritmů procházení grafů.
  • Esdger Djikstra konceptualizoval algoritmus tak, aby generoval minimální kostry. Jeho cílem bylo zkrátit rozpětí tras v nizozemském hlavním městě Amsterdamu.
  • Ve stejném desetiletí dosáhli Prim a Kruskal optimalizačních strategií, které byly založeny na minimalizaci nákladů na trasu podél zvážených tras.
  • V 70. letech navrhli američtí vědci Cormen, Rivest a Stein ve svém klasickém úvodu do knihy algoritmů rekurzivní substrukturu chamtivých řešení.
  • Paradigma Greedy search bylo zaregistrováno jako jiný typ optimalizační strategie v záznamech NIST v roce 2005.
  • Protokoly, které běží na webu, jako je například open-shortest-path-first (OSPF) a mnoho dalších protokolů pro přepínání síťových paketů, používají doposud chamtivou strategii k minimalizaci času stráveného v síti.

Chamtivé strategie a rozhodnutí

Logika ve své nejjednodušší formě byla scvrknuta na „chamtivý“ nebo „ne chamtivý“. Tyto výroky byly definovány přístupem přijatým k pokroku v každé fázi algoritmu.

Například Djikstrův algoritmus využíval postupnou chamtivou strategii k identifikaci hostitelů na internetu výpočtem nákladové funkce. Hodnota vrácená nákladovou funkcí určovala, zda je další cesta „chamtivý“ nebo „nenásytný“.

Stručně řečeno, algoritmus přestává být chamtivý, pokud v jakékoli fázi provede krok, který není místně chamtivý. Chamtivé problémy se zastaví bez dalšího rozsahu chamtivosti.

Charakteristika chamtivého přístupu

Důležité vlastnosti algoritmu metody Greedy jsou:

  • K dispozici je seřazený seznam zdrojů s přiřazením nákladů nebo hodnoty. Ty kvantifikují omezení v systému.
  • Vezmete maximální množství zdrojů v době, kdy platí omezení.
  • Například v problému s plánováním aktivit jsou náklady na prostředky v hodinách a činnosti je třeba provádět v sériovém pořadí.

Proč používat chamtivý přístup?

Zde jsou důvody pro použití chamtivého přístupu:

  • Chamtivý přístup má několik kompromisů, díky nimž je vhodný pro optimalizaci.
  • Jedním z hlavních důvodů je okamžité dosažení nejpravděpodobnějšího řešení. Pokud lze v problému s výběrem aktivity (vysvětleno níže) provést více aktivit před dokončením aktuální aktivity, lze tyto aktivity provést ve stejnou dobu.
  • Dalším důvodem je rekurzivní rozdělení problému na základě podmínky bez nutnosti kombinovat všechna řešení.
  • V problému s výběrem aktivity je krok „rekurzivního dělení“ dosažen skenováním seznamu položek pouze jednou a zvážením určitých aktivit.

Jak vyřešit problém s výběrem aktivity

V příkladu plánování aktivity je pro každou aktivitu čas „zahájení“ a „dokončení“. Každá aktivita je indexována číslem pro referenci. Existují dvě kategorie aktivit.

  1. považovaná aktivita : je aktivita, což je reference, ze které se analyzuje schopnost provádět více než jednu zbývající aktivitu.
  2. zbývající aktivity: aktivity v jednom nebo více indexech před uvažovanou aktivitou.

Celková doba trvání udává náklady na provedení činnosti. To je (dokončení - začátek) nám dává durational jako náklady na činnost.

Dozvíte se, že chamtivý rozsah je počet zbývajících aktivit, které můžete provést v době uvažované aktivity.

Architektura chamtivého přístupu

KROK 1)

Naskenujte seznam nákladů na aktivitu, počínaje indexem 0 jako uvažovaným indexem.

KROK 2)

Když je možné v daném čase dokončit více aktivit, uvažovaná aktivita skončí, začněte hledat jednu nebo více zbývajících aktivit.

KROK 3)

Pokud již žádné další aktivity neexistují, aktuální zbývající aktivita se stane další zvažovanou aktivitou. Opakujte kroky 1 a 2 s nově uvažovanou aktivitou. Pokud nezbývají žádné zbývající aktivity, přejděte ke kroku 4.

KROK 4)

Vraťte sjednocení uvažovaných indexů. Jedná se o indexy aktivity, které se použijí k maximalizaci propustnosti.

Architektura chamtivého přístupu

Vysvětlení kódu

#include#include#include#define MAX_ACTIVITIES 12

Vysvětlení kódu:

  1. Zahrnuté hlavičkové soubory / třídy
  2. Maximální počet aktivit poskytovaných uživatelem.
using namespace std;class TIME{public:int hours;public: TIME(){hours = 0;}};

Vysvětlení kódu:

  1. Obor názvů pro operace streamování.
  2. Definice třídy pro TIME
  3. Hodinové časové razítko.
  4. Výchozí konstruktor TIME
  5. Proměnná hodiny.
class Activity{public:int index;TIME start;TIME finish;public: Activity(){start = finish = TIME();}};

Vysvětlení kódu:

  1. Definice třídy z aktivity
  2. Časová razítka definující dobu trvání
  3. Všechna časová razítka jsou inicializována na 0 ve výchozím konstruktoru
class Scheduler{public:int considered_index,init_index;Activity *current_activities = new Activity[MAX_ACTIVITIES];Activity *scheduled;

Vysvětlení kódu:

  1. Část 1 definice třídy plánovače.
  2. Zvažovaný index je výchozím bodem pro skenování pole.
  3. Inicializační index se používá k přiřazení náhodných časových značek.
  4. Pole aktivních objektů je dynamicky alokováno pomocí nového operátoru.
  5. Naplánovaný ukazatel definuje aktuální základní umístění pro chamtivost.
Scheduler(){considered_index = 0;scheduled = NULL;… … 

Vysvětlení kódu:

  1. Konstruktor plánovače - část 2 definice třídy plánovače.
  2. Uvažovaný index definuje aktuální začátek aktuálního skenování.
  3. Aktuální chamtivý rozsah není na začátku definován.
for(init_index = 0; init_index < MAX_ACTIVITIES; init_index++){current_activities[init_index].start.hours =rand() % 12;current_activities[init_index].finish.hours =current_activities[init_index].start.hours +(rand() % 2);printf("\nSTART:%d END %d\n",current_activities[init_index].start.hours,current_activities[init_index].finish.hours);}… … 

Vysvětlení kódu:

  1. Smyčka pro inicializaci počátečních a koncových hodin každé z aktuálně naplánovaných aktivit.
  2. Inicializace času zahájení.
  3. Inicializace času ukončení vždy po nebo přesně v počáteční hodinu.
  4. Příkaz ladění k vytištění přidělené doby trvání.
public:Activity * activity_select(int);};

Vysvětlení kódu:

  1. Část 4 - poslední část definice třídy plánovače.
  2. Funkce pro výběr aktivity vezme jako výchozí bod výchozí bod a rozdělí chamtivý úkol na chamtivé dílčí problémy.
Activity * Scheduler :: activity_select(int considered_index){this->considered_index = considered_index;int greedy_extent = this->considered_index + 1;… … 

  1. Pomocí operátoru rozlišení oboru (: :) je poskytnuta definice funkce.
  2. Uvažovaný index je index nazývaný podle hodnoty. Greedy_extent je inicializovaný pouze index za uvažovaným indexem.
Activity * Scheduler :: activity_select(int considered_index){while( (greedy_extent < MAX_ACTIVITIES ) &&((this->current_activities[greedy_extent]).start.hours <(this->current_activities[considered_index]).finish.hours )){printf("\nSchedule start:%d \nfinish%d\n activity:%d\n",(this->current_activities[greedy_extent]).start.hours,(this->current_activities[greedy_extent]).finish.hours,greedy_extent + 1);greedy_extent++;}… … 

Vysvětlení kódu:

  1. Základní logika - chamtivý rozsah je omezen na počet aktivit.
  2. Počáteční hodiny aktuální aktivity jsou zkontrolovány jako naplánovatelné před dokončením uvažované aktivity (dané uvažovaným indexem).
  3. Dokud je to možné, vytiskne se volitelný příkaz ladění.
  4. Přejít na další index v poli aktivit
… if ( greedy_extent <= MAX_ACTIVITIES ){return activity_select(greedy_extent);}else{return NULL;}}

Vysvětlení kódu:

  1. Podmíněné zkontroluje, zda byly pokryty všechny činnosti.
  2. Pokud ne, můžete svou chamtivost restartovat s uvažovaným Indexem jako aktuálním bodem. Toto je rekurzivní krok, který chamtivě rozděluje problémové prohlášení.
  3. Pokud ano, vrátí se volajícímu bez možnosti rozšíření chamtivosti.
int main(){Scheduler *activity_sched = new Scheduler();activity_sched->scheduled = activity_sched->activity_select(activity_sched->considered_index);return 0;}

Vysvětlení kódu:

  1. Hlavní funkce použitá k vyvolání plánovače.
  2. Je vytvořen nový plánovač.
  3. Funkce výběru aktivity, která vrací ukazatel aktivity typu, se po ukončení chamtivého úkolu vrátí volajícímu.

Výstup:

START:7 END 7START:9 END 10START:5 END 6START:10 END 10START:9 END 10Schedule start:5finish6activity:3Schedule start:9finish10activity:5

Nevýhody chamtivých algoritmů

Není vhodný pro chamtivé problémy, kde je vyžadováno řešení pro každý dílčí problém, jako je třídění.

V takových problémech s praktikováním chamtivého algoritmu může být chamtivá metoda špatná; v nejhorším případě dokonce vést k neoptimálnímu řešení.

Nevýhodou chamtivých algoritmů je tedy používání nevědění, co leží před současným chamtivým stavem.

Níže je uvedena nevýhoda metody Greedy:

V chamtivém skenování, které se zde zobrazuje jako strom (vyšší hodnota, vyšší chamtivost), bude stav algoritmu na hodnotě: 40 pravděpodobně jako další hodnota brát 29. Jeho úkol dále končí na 12. To činí hodnotu 41.

Pokud však algoritmus zvolil neoptimální cestu nebo přijal strategii dobývání. poté by následovalo 25 a 40 a celkové zlepšení nákladů by bylo 65, což je o 24 bodů vyšší než neoptimální rozhodnutí.

Příklady chamtivých algoritmů

Většina síťových algoritmů používá chamtivý přístup. Zde je seznam několika příkladů algoritmu Greedy:

  • Primův algoritmus minimálního rozpětí stromu
  • Problém obchodního cestujícího
  • Graf - zbarvení mapy
  • Kruskalův algoritmus minimálního rozpětí stromů
  • Dijkstraův algoritmus minimálního rozpětí stromu
  • Graf - vrcholový kryt
  • Problém s batohem
  • Problém s plánováním úloh

Souhrn:

Abychom to shrnuli, článek definoval chamtivé paradigma, ukázal, jak chamtivá optimalizace a rekurze vám mohou pomoci získat nejlepší řešení až do bodu. Algoritmus Greedy je široce přijímán do aplikace pro řešení problémů v mnoha jazycích, jako je Greedy algoritmus Python, C, C #, PHP, Java atd. Výběr aktivity příkladu algoritmu Greedy byl popsán jako strategický problém, který by mohl dosáhnout maximální propustnosti pomocí chamtivosti přístup. Nakonec byly vysvětleny nevýhody používání chamtivého přístupu.