Visszalépési algoritmus
Mi az a visszakövetési algoritmus?
A visszalépés egy olyan algoritmus, amely lehetséges kombinációkat keres a megoldáshoz számítási problémák. Fokozatosan épít fel jelölteket, és eltávolítja azokat, amelyek nem felelnek meg az adott megszorításoknak. Ez a technika nagyon hasznos olyan helyzetekben, amikor több lehetséges eredmény közül kell választani egy megvalósítható megoldást.
Ez az algoritmus jobbnak és hatékonyabbnak tekinthető, mint a Brute Force megközelítés. Ellentétben a Bruteforce-szal, amely minden lehetséges megoldást kipróbál, a Backtracking arra összpontosít, hogy csak egy végső megoldást találjon a megadottak szerint. korlátok. Időt és memóriát is megtakarít azáltal, hogy visszavonja az utolsó lépést (backtrack), és megpróbál egy másik lehetőséget, miután elérte a zsákutcát. Ezenkívül leáll, amint érvényes megoldást talál.
A visszalépés egy széles körben használt technika, mivel összetett problémákat is megoldhat kimerítő erőforrás-felhasználás nélkül. Különösen hasznos olyan problémák esetén, ahol számos megkötést kell teljesíteni, mint például a Sudoku, az n királynő probléma és az ütemezés. A lehetséges megoldások között intelligens navigációval a visszalépés minden feltételnek megfelelő választ találhat. Ez felbecsülhetetlen értékűvé teszi a pontosságot és a hatékonyságot egyaránt igénylő feladatoknál.
Hogyan működik a visszakövetési algoritmus?
A visszakereső algoritmusok olyan problémamegoldó technikák, amelyek lépésről lépésre érvényes megoldásokat keresnek. Ha egy lépés megszorításai nem tesznek eleget bizonyos feltételeknek, az algoritmus visszatér az előző lépéshez.
Ezután más lehetséges kombinációkkal folytatódik, amelyek kielégítik az adott megszorításokat. Mivel számos lehetséges kombináció létezik, kiválasztja az egyik legkielégítőbb lehetőséget, és egymás után megoldja a problémát. Ez az algoritmikus technika akkor hasznos, ha egy vagy több lehetséges opciót kell megoldania. A visszavonás azt jelenti, hogy visszavonja a választását, amikor olyan helyzet adódik, amely nem hoz érvényes megoldást.
A visszakövető algoritmus általában a következő lépéseket tartalmazza a probléma megoldásához:
1. lépés) Inicializálás: Kezdje a kezdeti üres/részleges megoldással.
2. lépés) Kiválasztás: Adott feltételek és megszorítások alapján válasszon egy lehetőséget a jelenlegi megoldás kiterjesztéséhez.
3. lépés) Feltárás: Rekurzív megoldás a kiválasztott jelölt mérlegelésével és a problémamegoldó folyamat előrehaladásával.
4. lépés) Korlátozás ellenőrzése: Minden lépésben ellenőrizze, hogy az aktuális részmegoldás megsérti-e a korlátozásokat. Ha igen, térjen vissza az előző lépéshez, és próbáljon ki egy másik jelöltet.
5. lépés) Felmondás: A visszalépési folyamat leáll, ha érvényes megoldást találunk, vagy az összes kombinációt kimerítettük.
6. lépés) Visszalépés: Ha az aktuális opció nem oldja meg az adott problémát, akkor visszaáll az előző állapotba. Ezután mérlegeli az új lehetőséget az adott probléma megoldására.
7. lépés) Ismételje meg: Folytassa ezekkel a lépésekkel, amíg a probléma meg nem oldódik, vagy az összes lehetőséget ki nem vizsgálta.
A visszakövetési algoritmus rekurzív jellege
A visszakövető algoritmusok rekurzív jellegűek. Ez azt jelenti, hogy az algoritmus különböző paraméterekkel hívja magát mindaddig, amíg nem talál megoldást, vagy nem teszteli az összes lehetőséget:
def find_solutions(n, other_params): if found_a_solution(): increment_solutions_found() display_solution() if solutions_found >= solution_target: exit_program() return for val in range(first, last+1): if is_valid(val, n): apply_value(val, n) find_solutions(n + 1, other_params) remove_value(val, n)
A visszalépési problémákkal kapcsolatos általános kifejezések
Íme néhány alapvető kifejezés a Backtracking technikával kapcsolatban:
- Megoldás vektor: A megoldásokat n-es sorokban ábrázolja, például (X1, X2, …, Xn).
- megszorítások: X értékeket korlátozó szabályok, implicit és explicit.
- Megoldástér: Minden érvényes X érték, amely megfelel az explicit megszorításoknak.
- Állami űrfa: A megoldásteret faként ábrázolja.
- Állami tér: Leírja az útvonalakat egy állapottérfában.
- Probléma állapot: részmegoldásokat képviselő csomópontok a keresési fában.
- Megoldás államok: S-ben érvényes megoldási sorokat képező állapotok.
- Válasz Államok: Teljesítse az implicit megszorításokat, és hozza létre a kívánt megoldásokat.
- Ígéretes Node: A kívánt megoldásokhoz vezet, és továbbra is megvalósítható.
- Nem ígéretes csomópont: Megvalósíthatatlan állapotokhoz vezet, nem vizsgálják tovább.
- Élő csomópont: Feltáratlan gyerekekkel generált.
- E-Node: Élő csomópont folyamatos gyermekgenerációval.
- Halott csomópont: Nincs további bővítés az összes létrehozott gyermeknél.
- Depth-First Node Generation: A legújabb élő csomópontot használja következő E-csomópontként.
- Határozó funkció: Maximalizálja vagy minimalizálja B(x1, x2, …, Xa) optimalizálást.
- Statikus fák: A problémapéldánytól független fa megfogalmazása.
- Dinamikus fák: A fa összetétele a problémapéldánytól függően változik.
Mikor érdemes visszamenő algoritmust használni?
A Backtracking technikát egy összetett probléma megoldására választhatjuk, ha:
- Sok választási lehetőség létezik: A visszalépés akkor megfelelő, ha a problémamegoldó folyamat minden lépésében sok lehetőség létezik. Ezek a lehetőségek vonatkozhatnak az elemek kiválasztására és a lépésekre.
- Nincs egyértelmű legjobb választás: Ha nincs elegendő információ a rendelkezésre álló lehetőségek közül a legjobb választás meghatározásához, egy Backtracking algoritmus használható.
- A döntés több választási lehetőséget eredményez: Kiválaszthatja a visszalépési technika a választások szisztematikus felülvizsgálatához.
- Meg kell vizsgálni az összes lehetséges megoldást: A Backtracking szisztematikusan feltárja az összes megoldást, egymásra épülő döntések sorozatával.
A visszalépési problémák típusai
Háromféle probléma létezik a visszakövető algoritmusokban: döntési problémák, optimalizálási problémák és felsorolási problémák. Tanuljunk meg róluk az alábbiakban.
- Döntési probléma: Az ilyen típusú problémáknál a cél annak meghatározása, hogy létezik-e megvalósítható megoldás. Ellenőrizzük az „igen” és „nem” válaszokat. Például az n-királynők probléma. Ez egy döntési probléma, amely azt vizsgálja, hogy mekkora valószínűséggel kerül n dáma egy n × n sakktáblára anélkül, hogy megtámadnák egymást.
- Optimalizálási probléma: Optimalizálási feladatoknál a cél a lehető legjobb megoldás megtalálása a sok lehetőség közül. Ez magában foglalhatja egy bizonyos függvény vagy változó maximális és minimális értékének meghatározását. Vegyük például a hátizsák problémát, ahol a cél az, hogy maximalizáljuk a táskában lévő tárgyak összértékét, miközben betartjuk a súlyhatárt.
- Felsorolási probléma: Célja az összes lehetséges megoldás megtalálása egy adott problémára. Minden érvényes opciót kihagyás nélkül felsorolunk. Példa erre az összes lehetséges betűkombináció generálása egy adott karakterkészletből.
A visszalépés alkalmazásai és példák
A Backtrackingnek számos alkalmazása létezik. Némelyikük pszeudokódjával az alábbiakban olvasható.
- Sudoku Solver: Ez a probléma egy 3×3-as részrácsot tartalmaz duplikált számokkal. A visszakövetési technika azt mutatja, hogy a megoldás hamis értéket ad vissza, jelezve, hogy más számelhelyezésre van szükség.
- N-Queen probléma: A backtracking megközelítés határozza meg, hogyan kell bemutatni a királynőket egy N × N sakktáblán úgy, hogy egyikük se fenyegesse egymást.
- Részhalmazösszeg probléma: Egy adott halmaz számainak azon részhalmazának megkeresésére szolgál, amely összead egy adott célösszeget.
- Hamiltoni ciklus probléma: A visszalépés alkalmazható egy zárt körutat keresni egy gráfban, amely minden csúcsot pontosan egyszer látogat meg.
- Patkány labirintusban probléma: A backtracking technikát arra használják, hogy megtalálják a patkány útját a labirintus kiindulópontjától a kijáratig.
function solveSudoku(board): if no empty cells: return true # Sudoku is solved for each empty cell (row, col): for num from 1 to 9: if num is valid in (row, col): place num in (row, col) if solveSudoku(board): return true remove num from (row, col) return false # No valid solution
function solveNQueens(board, col): if col >= N: return true # All queens are placed for each row in the column col: if isSafe(board, row, col): place queen at (row, col) if solveNQueens(board, col + 1): return true remove queen from (row, col) return false # No valid solution in this branch
function subsetSum(nums, target, index, currentSubset): if target == 0: print(currentSubset) # Subset with the target sum found return if index >= len(nums) or target < 0: return currentSubset.add(nums[index]) subsetSum(nums, target - nums[index], index + 1, currentSubset) currentSubset.remove(nums[index]) subsetSum(nums, target, index + 1, currentSubset)
A visszalépési algoritmus előnyei és hátrányai
A visszalépési algoritmus előnyei
A visszalépési technikákat összetett problémák megoldására használják. Számos előnye van, mint például:
- A visszalépési technika hatékony a kényszerek kezelésére.
- Ez a módszer alkalmas optimalizálási problémák megoldására.
- A technika különféle típusú problémákra működik.
- Ez az eljárás segíthet az összes lehetséges megoldás áttekintésében.
- Mivel visszalép, több memóriát takarít meg, mint a Bruteforce technika.
A visszalépési algoritmus hátrányai
A visszalépési technikáknak is vannak korlátai, például az időbonyolítás. Ennek a technikának a következő hátrányai vannak:
- Garantált megoldás nincs.
- A sok kombináció miatt lassabb.
- A sok lehetőség miatt rendkívül összetett az idő.
- Nem alkalmas valós idejű korlátozásokra, mivel a legjobb megoldás megtalálása sokáig tarthat.
- A hatékonyság a probléma összetettségétől függ.
Különbség a visszalépés és a rekurzió között
Rekurzió | visszalépés |
---|---|
Az alapeset eléréséig hívja magát. | Rekurziót használ az összes lehetőség áttekintésére, amíg meg nem találja a legjobb megvalósítható eredményt. |
Alulról felfelé irányuló megközelítés. | Felülről lefelé irányuló megközelítés. |
Egyetlen érték sem kerül elvetésre. | Az életképtelen megoldásokat elutasítják. |
Következtetés
A visszalépés egy hasznos algoritmikus stratégia összetett problémák megoldására a megvalósítható megoldások szisztematikus feltárásával és szükség esetén a visszalépéssel. Arra számíthatunk, hogy a visszakövetési technikák a számítási teljesítmény és az algoritmikus hatékonyság javulásával javulnak. Ezek a fejlesztések lehetővé teszik számukra a nagyobb és összetettebb problémák hatékony kezelését.
Ezenkívül a gépi tanulási modellek a korábban tanult mintákon alapuló visszalépési döntésekhez vezethetnek.
Mindezek a technológiai újítások forradalmasítani fogják a visszalépési algoritmusokat, és hatékony és sokoldalú eszközzé teszik őket a különféle területek bonyolult problémáinak megoldására.