GeeksforGeeks

előfeltételek :

  • rekurzió
  • Komplexitáselemzés

a visszalépés egy algoritmikus technika a problémák rekurzív megoldására azáltal, hogy megpróbál megoldást építeni fokozatosan, egy darabból egy időben, eltávolítva azokat a megoldásokat, amelyek nem felelnek meg a probléma korlátainak bármely időpontban (az idő, itt, a keresési fa bármely szintjének eléréséig eltelt időre utal).

a wiki definíciója szerint,

a visszalépés általános algoritmikus technikaként definiálható, amely figyelembe veszi az összes lehetséges kombináció keresését egy számítási probléma megoldása érdekében.

háromféle probléma van a visszalépésben–

  1. döntési probléma – ebben keresünk egy megvalósítható megoldást.
  2. optimalizálási probléma – ebben keressük a legjobb megoldást.
  3. felsorolási probléma – ebben találunk minden megvalósítható megoldást.

Hogyan állapítható meg, hogy a probléma megoldható-e a visszalépéssel?

általában minden olyan kényszer-elégedettségi probléma, amelynek világos és jól meghatározott korlátai vannak bármely objektív megoldásra, amely fokozatosan építi fel a jelöltet a megoldásra, és elhagyja a jelöltet (“visszalépések”), amint megállapítja, hogy a jelöltet nem lehet érvényes megoldásra teljesíteni, visszalépéssel megoldható. A tárgyalt problémák többsége azonban megoldható más ismert algoritmusokkal, például dinamikus programozással vagy kapzsi algoritmusokkal logaritmikus, lineáris, lineáris-logaritmikus idő komplexitás a bemenet méretének sorrendjében, és ezért minden tekintetben felülmúlja a visszalépési algoritmust (mivel a visszalépési algoritmusok általában exponenciálisak mind időben, mind térben). Azonban néhány probléma továbbra is fennáll, hogy csak backtracking algoritmusok megoldani őket eddig.

Vegyünk egy olyan helyzetet, hogy három doboz van előtted, és csak az egyikben van arany érme, de nem tudod, melyik. Tehát, annak érdekében, hogy az érme, akkor meg kell nyitni az összes doboz egyesével. Először jelölje be az első négyzetet, ha nem tartalmazza az érmét, akkor be kell zárnia, és be kell jelölnie a második négyzetet, és így tovább, amíg meg nem találja az érmét. Ez a visszalépés, vagyis az összes részprobléma megoldása egyenként a lehető legjobb megoldás elérése érdekében.

fontolja meg az alábbi példát, hogy formálisabban megértse a visszalépési megközelítést,

bármilyen számítási probléma esetén P és az adat D megfelel a példánynak, a probléma megoldásához teljesítendő összes korlátozást C képviseli. A visszalépési algoritmus ezután a következőképpen fog működni:

az algoritmus elkezdi felépíteni a megoldást, kezdve egy üres megoldáskészlettel S . Sz = {}

  1. adja hozzá a S – hez az első mozdulatot, amely még megmaradt (az összes lehetséges lépés egyenként hozzáadódik a S – hez). Ez most létrehoz egy új Al-fa s a keresési fa az algoritmus.
  2. ellenőrizze, hogy a S+s megfelel-e a C összes korlátozásának.
    • ha igen, akkor a s alfa “jogosult” további “gyermekek”hozzáadására.
    • különben a teljes s alfa haszontalan, ezért visszatér az 1.lépéshez a S argumentum használatával.
  3. az újonnan kialakított alfa “jogosultsága” esetén s , visszatér az 1.lépéshez, a s+s argumentum használatával.
  4. ha az ellenőrzés S+s visszatér, hogy ez a megoldás a teljes adat D . A program kimenete és befejezése.
    ha nem, akkor adja vissza, hogy az aktuális s esetén nem lehetséges megoldás, ezért dobja el.

különbség a rekurzió és a visszalépés között:

a rekurzióban a függvény addig hívja magát, amíg el nem ér egy alapeset. A visszalépés során rekurziót használunk az összes lehetőség feltárására, amíg a legjobb eredményt nem kapjuk a problémára.

pszeudo kód a visszalépéshez :

1. Rekurzív visszalépési megoldás.

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. Annak megállapítása, hogy létezik-e megoldás

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;

próbáljunk meg megoldani egy szabványos visszalépési problémát, N-királynő probléma.
az N királynő az a probléma, hogy n sakkkirálynőt helyezünk el egy N! N sakktáblán úgy, hogy két királynő ne támadja meg egymást. Például a következő megoldás 4 királynő probléma.

a várható kimenet egy bináris mátrix, amely 1S a blokkokat, ahol királynők kerülnek. Például, a következő a kimeneti mátrix a fenti 4 királynő megoldás.

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

visszalépési algoritmus: az ötlet az, hogy a királynőket egyenként helyezzük el különböző oszlopokban, a bal szélső oszloptól kezdve. Amikor egy királynőt helyezünk egy oszlopba, ellenőrizzük, hogy vannak-e összecsapások a már elhelyezett királynőkkel. Az aktuális oszlopban, ha olyan sort találunk, amelyre nincs ütközés, ezt a sort és oszlopot a megoldás részeként jelöljük meg. Ha nem találunk ilyen sort összecsapások miatt, akkor visszalépünk és hamisan térünk vissza.

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.

a fenti megközelítés teljes megvalósításához hivatkozhat a visszalépésről | 3.készletről (N királynő probléma) szóló cikkre.
további visszalépési problémák:

  • Backtracking / Set 1 (A lovag túra probléma)
  • Backtracking / Set 2 (patkány egy labirintusban)
  • Backtracking | Set 4 (részhalmaz összege)
  • Backtracking | Set 5 (m színező probléma)
  • –> kattintson ide további információkért
cikk-címkék :
gyakorlat címkék:

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.