Backjumping - Backjumping
v ustoupit algoritmy, zpětný skok je technika, která snižuje hledat prostor, proto zvyšuje účinnost. Zatímco backtracking vždy jde nahoru o jednu úroveň v vyhledávací strom když byly testovány všechny hodnoty proměnné, může zpětný skok stoupat o další úrovně. V tomto článku pevné pořadí vyhodnocení proměnných je použito, ale stejné úvahy platí pro dynamické pořadí vyhodnocení.
Vyhledávací strom navštívený pravidelným zpětným sledováním
Zpětný skok: šedý uzel není navštíven
Definice
Kdykoli backtracking vyzkoušel všechny hodnoty pro proměnnou, aniž by našel řešení, přehodnotí poslední z dříve přiřazených proměnných, změní její hodnotu nebo další zpětné sledování, pokud nebudou vyzkoušeny žádné jiné hodnoty. Li je aktuální dílčí přiřazení a všechny hodnoty pro byly vyzkoušeny bez nalezení řešení, backtracking k závěru, že žádné řešení se nerozšiřuje existuje. Algoritmus poté „jde nahoru“ do , měnící se Pokud je to možné, hodnota se vrací zpět, jinak.
Částečné přiřazení není vždy nutné v plném rozsahu k prokázání, že žádná hodnota vést k řešení. Zejména předpona částečného přiřazení může mít stejnou vlastnost, to znamená, že existuje index takhle nelze rozšířit a vytvořit řešení s jakoukoli hodnotou pro . Pokud algoritmus dokáže tuto skutečnost, může přímo uvažovat o jiné hodnotě pro místo toho, aby přehodnotila jak by to za normálních okolností bylo.
Příklad, ve kterém je aktuální přiřazení byl neúspěšně vyzkoušen se všemi možnými hodnotami . Zpětná stopa se vrací zpět k , snaží se mu přiřadit novou hodnotu. | Místo zpětného sledování algoritmus provede nějaké další zpracování, které dokazuje, že vyhodnocení , , a nejsou součástí žádného řešení. | Výsledkem je současné hodnocení není součástí žádného řešení a algoritmus může přímo přejít zpět na zkouší novou hodnotu. |
Účinnost algoritmu zpětného skákání závisí na tom, jak vysoko je schopen zpětného skoku. V ideálním případě by algoritmus mohl skákat na libovolnou proměnnou je takový, že aktuální přiřazení k nelze rozšířit na řešení s jakoukoli hodnotou . Pokud tomu tak je, se nazývá a bezpečný skok.
Zjištění, zda je skok bezpečný, není vždy možné, protože bezpečné skoky jsou definovány z hlediska sady řešení, což se algoritmus snaží najít. V praxi používají algoritmy zpětného skákání nejnižší index, který se může účinně ukázat jako bezpečný skok. Různé algoritmy používají různé metody k určení, zda je skok bezpečný. Tyto metody mají různé náklady, ale vyšší náklady na nalezení bezpečnějšího skoku mohou být obchodovány se sníženým množstvím vyhledávání v důsledku přeskočení částí vyhledávacího stromu.
Zpětný skok v listových uzlech
Nejjednodušší podmínkou, ve které je zpětný skok možný, je situace, kdy byly všechny hodnoty proměnné bez dalšího větvení prokázány jako nekonzistentní. v omezení spokojenosti, dílčí hodnocení je konzistentní právě tehdy, pokud splňuje všechna omezení týkající se přiřazených proměnných, a nekonzistentní v opačném případě. Může se stát, že konzistentní částečné řešení nelze rozšířit na konzistentní úplné řešení, protože některé nepřiřazené proměnné nemusí být přiřazeny bez porušení dalších omezení.
Podmínka, ve které jsou všechny hodnoty dané proměnné jsou v rozporu s aktuálním dílčím řešením se nazývá a list slepá ulička. To se stane přesně, když proměnná je list vyhledávacího stromu (který odpovídá uzlům, které mají na obrázcích tohoto článku pouze listy jako podřízené).
Algoritmus zpětného skákání od Gaschniga provádí zpětný skok pouze v slepých uličkách listů. Jinými slovy to funguje odlišně od zpětného sledování pouze tehdy, když jsou všechny možné hodnoty byl testován a vyústil nekonzistentně bez nutnosti větvení přes jinou proměnnou.
Bezpečný skok lze najít jednoduchým vyhodnocením pro každou hodnotu , nejkratší předpona v rozporu s . Jinými slovy, pokud je možná hodnota pro , algoritmus kontroluje konzistenci následujících hodnocení:
... | ||||
... | ||||
... | ||||
Nejmenší index (nejnižší seznam), pro který jsou hodnocení nekonzistentní, by byl bezpečný skok, pokud byly jedinou možnou hodnotou pro . Protože každá proměnná může obvykle nabývat více než jedné hodnoty, je maximální index, který vychází z kontroly každé hodnoty, bezpečným skokem a je bodem, kde skáče Gaschnigův algoritmus.
V praxi může algoritmus kontrolovat výše uvedená hodnocení a současně kontrolovat konzistenci .
Zpětný skok na vnitřních uzlech
Předchozí algoritmus zpětně poskočí, pouze když hodnoty proměnné mohou být zobrazeny v rozporu s aktuálním částečným řešením bez dalšího větvení. Jinými slovy umožňuje zpětný skok pouze v uzlech listů ve stromu vyhledávání.
Interní uzel vyhledávacího stromu představuje přiřazení proměnné, která je v souladu s předchozími. Pokud toto řešení nerozšíří žádné řešení, předchozí algoritmus vždy ustoupí: v tomto případě se neprovede zpětný skok.
Backjumping na vnitřních uzlech nelze provést jako u listových uzlů. Opravdu, pokud nějaká hodnocení požadované větvení, je to proto, že jsou v souladu s aktuálním přiřazením. Výsledkem je neúspěšné hledání předpony, která není v souladu s těmito hodnotami poslední proměnné.
V takových případech, co se ukázalo jako hodnocení nebýt součástí řešení se současným dílčím hodnocením je rekurzivní Vyhledávání. Zejména algoritmus „ví“, že od tohoto okamžiku neexistuje žádné řešení, protože se vrací zpět do tohoto uzlu, místo aby se zastavil po nalezení řešení.
Tento návrat je způsoben řadou slepé uličky, body, kde se algoritmus ukázal jako dílčí řešení nekonzistentní. Pro další zpětný skok musí algoritmus vzít v úvahu, že nemožnost hledání řešení je způsobena těmito slepými uličkami. Bezpečné skoky jsou zejména indexy předpon, díky nimž jsou tyto slepé uličky nekonzistentními dílčími řešeními.
V tomto příkladu se algoritmus vrátil , poté, co vyzkoušel všechny své možné hodnoty, kvůli třem kříženým bodům nekonzistence. | Druhý bod zůstává nekonzistentní, i když hodnoty a jsou odstraněny z jeho dílčího vyhodnocení (všimněte si, že hodnoty proměnné jsou v jejích podřízených) | Ostatní nekonzistentní hodnocení zůstávají tak i bez , , a | Algoritmus může zpětně skočit protože toto je nejnižší proměnná, která udržuje všechny nekonzistence. Nová hodnota pro bude souzen. |
Jinými slovy, když jsou všechny hodnoty byly vyzkoušeny, může algoritmus zpětně přejít na předchozí proměnnou za předpokladu, že současné hodnocení pravdy je v rozporu se všemi hodnoceními pravdy v listových uzlech, které jsou potomky uzlu .
Zjednodušení
Kvůli potenciálně vysokému počtu uzlů, které jsou v podstromu , informace, které jsou nezbytné pro bezpečný návrat zpět se shromažďuje během návštěvy jejího podstromu. Hledání bezpečného skoku lze zjednodušit dvěma hledisky. První je, že algoritmus potřebuje bezpečný skok, ale stále pracuje s skokem, který není nejvyšším možným bezpečným skokem.
Druhým zjednodušením je, že uzly v podstromu které byly přeskočeny zpětným skokem, lze ignorovat při hledání zpětného skoku pro . Přesněji řečeno, všechny uzly přeskočeny zpětným skokem z uzlu až do uzlu jsou pro podstrom zakořeněný v irelevantní , a také irelevantní jsou jejich další podstromy.
Ve skutečnosti, pokud algoritmus sestoupil z uzlu na cestou, ale zpětné skoky v cestě zpět, pak to mohlo jít přímo z na namísto. Zpětný skok ve skutečnosti naznačuje, že uzly mezi a jsou pro podstrom zakořeněný v irelevantní . Jinými slovy, zpětný skok naznačuje, že návštěva oblasti vyhledávacího stromu byla chybou. Tuto část vyhledávacího stromu lze proto při zvažování možného zpětného skoku z ignorovat nebo od jednoho z jeho předků.
Tuto skutečnost lze využít shromážděním v každém uzlu sadu dříve přiřazených proměnných, jejichž vyhodnocení stačí k prokázání, že v podstromu zakořeněném v uzlu neexistuje žádné řešení. Tato sada je vytvořena během provádění algoritmu. Při zatahování z uzlu je tato sada odebrána proměnná uzlu a shromážděna v sadě cíle zpětného sledování nebo zpětného skákání. Vzhledem k tomu, že uzly, které jsou přeskočeny ze zpětného skákání, se nikdy nezatahují, jejich sady jsou automaticky ignorovány.
Grafický zpětný skok
Důvodem zpětného skákání založeného na grafech je, že bezpečný skok lze najít kontrolou, která z proměnných jsou v omezení s proměnnými které jsou vytvořeny v listových uzlech. Pro každý listový uzel a každou proměnnou indexu to je zde vytvořeno, indexy menší nebo rovny jehož proměnná je v omezení s lze použít k vyhledání bezpečných skoků. Zejména když jsou všechny hodnoty pro byly vyzkoušeny, tato sada obsahuje indexy proměnných, jejichž vyhodnocení umožňují prokázat, že nelze najít žádné řešení návštěvou podstromu zakořeněného na . Výsledkem je, že algoritmus může zpětně přejít na nejvyšší index v této sadě.
Skutečnost, že uzly přeskočené zpětným skokem, lze ignorovat při zvažování dalšího zpětného skoku, lze využít následujícím algoritmem. Při zasouvání z listového uzlu se vytvoří sada proměnných, které jsou s ním v omezení, a „pošlou se zpět“ jeho rodiči nebo předkovi v případě zpětného skoku. V každém interním uzlu je udržována sada proměnných. Pokaždé, když je sada proměnných přijata od jednoho z jejích podřízených nebo potomků, jsou jejich proměnné přidány do udržované sady. Při dalším zpětném sledování nebo zpětném skoku z uzlu je proměnná uzlu odstraněna z této sady a sada je odeslána do uzlu, který je cílem zpětného sledování nebo zpětného skákání. Tento algoritmus funguje, protože sada udržovaná v uzlu shromažďuje všechny proměnné, které jsou relevantní k prokázání neuspokojivosti listů, které jsou potomky tohoto uzlu. Vzhledem k tomu, že sady proměnných se odesílají pouze při zpětném sledování z uzlů, sady shromážděné v uzlech přeskočených zpětným skokem jsou automaticky ignorovány.
Konfliktní zpětný skok (aka zpětný skok zaměřený na konflikty (cbj))
Ještě rafinovanější algoritmus zpětného skákání, někdy schopný dosáhnout větších zpětných skoků, je založen na kontrole nejen běžné přítomnosti dvou proměnných ve stejném omezení, ale také na tom, zda omezení ve skutečnosti způsobilo nekonzistenci. Tento algoritmus zejména shromažďuje jedno z porušených omezení v každém listu. V každém uzlu je nejvyšším indexem proměnné, která je v jedné z omezení shromážděných na listech, bezpečný skok.
Zatímco narušené omezení zvolené v každém listu nemá vliv na bezpečnost výsledného skoku, výběr omezení s nejvyššími možnými indexy zvýší výšku skoku. Z tohoto důvodu jsou na základě proměnných s nižšími indexy upřednostňována omezení zpětného seskoku na základě objednávek takovým způsobem, že jsou upřednostňována omezení nad proměnnými s nižšími indexy.
Formálně omezení je upřednostňován před jiným pokud je nejvyšší index proměnné v ale ne v je nižší než nejvyšší index proměnné v ale ne v . Jinými slovy, s výjimkou běžných proměnných, je upřednostňováno omezení, které má všechny nižší indexy.
V listovém uzlu zvolí algoritmus nejnižší index takhle je nekonzistentní s poslední proměnnou vyhodnocenou v listu. Z omezení, která jsou při tomto hodnocení porušena, vybere nejpreferovanější a shromažďuje všechny své indexy méně než . Tímto způsobem, když se algoritmus vrátí zpět k proměnné , nejnižší shromážděný index označuje bezpečný skok.
V praxi se tento algoritmus zjednodušuje shromažďováním všech indexů v jedné sadě namísto vytváření sady pro každou hodnotu . Zejména algoritmus shromažďuje v každém uzlu všechny sady pocházející od jeho potomků, které nebyly přeskočeny zpětným skokem. Při zatahování z tohoto uzlu je tato sada odebrána proměnná uzlu a shromážděna do cíle zpětného sledování nebo zpětného skákání.
Bylo navrženo zpětné seskoky zaměřené na konflikty Problémy s omezením spokojenosti podle Patrick Prosser ve své klíčové práci z roku 1993.
Viz také
Reference
- Dechter, Rina (2003). Zpracování omezení. Morgan Kaufmann. ISBN 1-55860-890-7.
- Prosser, Patrick (1993). „Hybridní algoritmy pro problém spokojenosti s omezeními“ (PDF). Computational Intelligence 9 (3). Citovat deník vyžaduje
| deník =
(Pomoc)