GeeksforGeeks

Předpoklady :

  • Rekurze
  • Analýza Složitosti

Backtracking je algoritmické techniky pro řešení problémů rekurzivně tím, že se snaží vybudovat řešení, postupně, jeden kus v době, odstranění těchto řešení, která nesplňují omezení problému v každém okamžiku (podle času, tady, je podle doby, která uplynula až po dosažení nějaké úrovně vyhledávací strom).

Podle definice wiki,

Backtracking lze definovat jako obecné algoritmické techniky, která se domnívá, hledá všechny možné kombinace za účelem vyřešení výpočetní problém.

Existují tři typy problémů v ustupování–

  1. Rozhodovací Problém – V tomto, budeme hledat vhodné řešení.
  2. optimalizační problém-v tomto hledáme nejlepší řešení.
  3. výčtový problém-v tom najdeme všechna proveditelná řešení.

jak zjistit, zda lze problém vyřešit pomocí zpětného sledování?

Obecně platí, že každý problém splňování podmínek, které má jasné a dobře definované omezení na jakékoli objektivní řešení, které postupně staví kandidáta do roztoku a opustí kandidáta („ustoupí“), jakmile zjistí, že kandidát nemůže být dokončena na platné řešení, může být vyřešen pomocí Ustupování. Nicméně, většina z problémů, které jsou diskutovány, může být vyřešen pomocí jiných známých algoritmů, jako je Dynamické Programování nebo Greedy Algoritmy v logaritmické, lineární, lineárně-logaritmické časové složitosti v pořadí velikosti vstupu, a proto, zastínit backtracking algoritmus v každém ohledu (od ustupování algoritmy jsou obecně exponenciální v čase i prostoru). Několik problémů však stále přetrvává, které mají až dosud algoritmy zpětného sledování.

zvažte situaci, že máte před sebou tři krabice a pouze jedna z nich má zlatou minci, ale nevíte, která z nich. Takže, abyste získali minci, budete muset otevřít VŠECHnY krabice jeden po druhém. Budete první, podívejte se na první políčko, pokud neobsahuje mince, budete muset zavřít a zkontrolovat, druhé pole a tak dále, dokud nenajdete minci. To je to, co je backtracking, to je řešení všech dílčích problémů jeden po druhém, aby bylo dosaženo nejlepšího možného řešení.

Zvažte následující příklad pochopit Backtracking přístup více formálně,

Vzhledem k instanci nějaké výpočetní problém, P data D odpovídající instance, všechny omezení, které musí být splněny, aby k vyřešení problému jsou zastoupeny C . Backtracking algoritmus pak bude pracovat následovně:

Algoritmus začíná budovat řešení, počínaje s prázdnou množinu řešení S . V = {}

  1. přidat do  s první tah, který ještě zbývá (všechny možné pohyby jsou přidány do  s jeden po druhém). Tím se nyní vytvoří nový podstrom s ve vyhledávacím stromu algoritmu.
  2. zkontrolujte, zda  S + s splňuje všechna omezení v  C .
    • pokud ano, pak je podstrom  s „způsobilý“ pro přidání dalších „dětí“.
    • jinak je celý podstrom s zbytečný, takže se vrací zpět ke kroku 1 pomocí argumentu  s .
  3. v případě „způsobilosti“ nově vytvořeného podstromu  s se vrací zpět ke kroku 1 pomocí argumentu  s+s .
  4. pokud kontrola S+s vrátí, že se jedná o řešení pro celá data  D . Výstup a ukončení programu.
    pokud ne, pak vraťte, že s proudem s není možné žádné řešení, a proto jej zlikvidujte.

Rozdíl mezi Rekurze a Backtracking:

rekurze, funkce volá sama sebe, dokud nedosáhne základní případ. Při zpětném sledování používáme rekurzi k prozkoumání všech možností, dokud nedosáhneme nejlepšího výsledku problému.

Pseudo kód pro zpětné sledování :

1. Rekurzivní řešení zpětného sledování.

void findSolutions(n, other params) : if (found a solution) : solutionsFound = solutionsFound + 1; displaySolution(); if (solutionsFound >= solutionTarget) : System.exit(0); return for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); findSolutions(n+1, other params); removeValue(val, n);

2. Zjištění, zda řešení existuje, nebo ne

boolean findSolutions(n, other params) : if (found a solution) : displaySolution(); return true; for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); if (findSolutions(n+1, other params)) return true; removeValue(val, n); return false;

Pojďme zkusit vyřešit standardní Ustupování problém, N-Queen Problem.
N královna je problém umístění N šachových královen na šachovnici N×n tak, aby žádné dvě královny na sebe neútočily. Například, následující je řešení pro 4 královna problém.

očekávaný výstup je binární matice, která má 1s pro bloky, kde jsou umístěny královny. Následuje například výstupní matice pro výše uvedené řešení 4 queen.

{ 0, 1, 0, 0}{ 0, 0, 0, 1}{ 1, 0, 0, 0}{ 0, 0, 1, 0}

Backtracking Algoritmus: nápad je místo královny, jeden po druhém v různých sloupců, počínaje nejlevějším sloupci. Když umístíme královnu do sloupce, zkontrolujeme střety s již umístěnými královnami. V aktuálním sloupci, pokud najdeme řádek, pro který neexistuje střet, můžeme označit tento řádek a sloupec jako součást řešení. Pokud nenajdeme takovou řadu kvůli střetům, pak ustoupíme a vrátíme se nepravdivě.

1) Start in the leftmost column2) If all queens are placed return true3) Try all rows in the current column. Do following for every tried row. a) If the queen can be placed safely in this row then mark this as part of the solution and recursively check if placing queen here leads to a solution. b) If placing the queen in leads to a solution then return true. c) If placing queen doesn't lead to a solution then unmark this (Backtrack) and go to step (a) to try other rows.3) If all rows have been tried and nothing worked, return false to trigger backtracking.

můžete odkazovat na článek o Backtracking | Set 3 (N Queen Problem) pro úplnou implementaci výše uvedeného přístupu.
Více Backtracking Problémy:

  • Backtracking | Set 1 (Knight ‚ s tour problém)
  • Backtracking | Set 2 (myš v Bludišti)
  • Backtracking | Set 4 (Dílčí Součet)
  • Backtracking | Set 5 (m Barvení Problém)
  • –> Klikněte Zde pro Více
Tagy Článku :
Praxe Tagy :

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.