Representatie & Zoeken College 3: Zoeken met heuristieken Wat zijn heuristieken Zoekalgorithmen die heuristieken gebruiken Eigenschappen van die zoekalgorithmen Leeswijzer: Hoofdstuk 4.0 t/m 4.3 (niet 4.1.2) AI3 1 1 1 1 1 1 1
DUS Vorige keer Bomen doorzoeken breadth first depth first iterative deepening Zonder veel kennis over de aard van de boom Echter: de bomen zijn te groot: Schaken: 4 zetten = 2¼ billioen borden 1000´ sneller = 1 zet dieper 1.000.000´ sneller = 2 zetten dieper DUS Exploiteer domein-kennis voor het doorzoeken van de bomen Eerste bullet: de methoden van vorige week trekken zich weinig aan van de *inhoud* van de boom en de knopen, ze doorzoeken “blind” de boom via een “vaste” methode (depth, breadth), etc. Echter, bomen zijn heel groot, veel te groot om helemaal te doorzoeken, Om een idee te krijgen van hoe groot bomen zijn: bij schaken is de branching factor 35, 4 zetten = 35^8 = 2.25 billioen Bij elke extra zet groeit de boom een factor 35^2 (wit+zwart) = een factor 1000 dus bij twee zetten groeit ie een factor 1000x1000 Onze computers worden wel sneller, mar niet zoveel sneller er moeten dus manieren gevonden worden om gerichter te gaan zoeken. AI3
Heuristieken = vuistregels Complete kennis is vaak: niet beschikbaar te duur om te berekenen Gebruik gedeeltelijke kennis (= schattingen, heuristieken) Heuristieken maken soms fouten Heuristisch zoeken Twee onderdelen: Heuristische functie h geeft de “veelbelovendheid” per knoop Algorithme gebruikt h om door de zoekruimte te lopen definitie van heuristiek. voorbeeld van niet beschikbaar: schaken (niemand kan perfect schaken) voorbeeld van te duur: diagnose van een ingewikkelde fabriek (we hebben de fabriek zelf gebouwd, dus in principe perfecte kennis, maar zou te lang duren om er mee te rekenen, niet op tijd te achterhalen wat er mis is) functie h definieert de “veelbelovendheid” van een knoop als getal (= sterke vereenvoudiging). Denk aan schaken: is een bord 1 beter dan bord 2? Op sommige aspecten wel (bijv. positie), op andere niet (bijv. stukken). Kortom: een 1-dimensionale heuristische functie is nogal simplistisch. AI3
Heuristische functie (Voorbeelden) aantal stenen op een foute plek som van afstanden tot de juiste plekken (Manhattan) 2x aantal directe verwisselingen LET OP: gewenste eindtoestand is 1-8 met de klok mee vanaf linksboven. Def. van 3e heuristiek: hoeveel paren komen op hun plek door een direct verwisseling En natuurlijk kan h(..) niet de optimale waarde leveren (immers, daarvoor zou je de hele zoekruimte moeten kennen, en dan is er verder weinig te zoeken)… Zou willen: h(...) = kortste afstand tot oplossing MAAR JA..... AI3
Algorithme: Hill-climbing = Kies altijd beste richting (lokale beslissing) en vergeet de rest 2 8 3 1 6 4 7 5 leg uit waar de naam hill-climbing vandaan komt: je staat in een berglandschap, het is overal mist (je kunt maar 2m om je heen kijken), je wilt naar de top, het beste wat je kunt doen is steeds lokaal kijken waar de berg het stijlst omhoog gaat, en dan in die richting een stukje lopen, waarna je weer hetzelfde doet. Het is dus zoeken met alleen maar lokale informatie. Alle andere opties gooi je daarna direct weg (vergeet je). Dat is natuurlijk prettig want hoef je niks te onthouden, maar leidt ook tot nadelen (zie volgende slide). Merk ook op hoe snel de boom kleiner wordt. In het voordeel (met branching factor 3) verdwijnt bij elke stap 2/3 van de overgebleven ruimte uit zicht. Na 3 stappen heb je dan nog maar 1/27ste over, etc. AI3
Hill-climbing: nadeel Kan verdwaald raken in oneindige takken 3 2 1 100 ... dit is een boom waar de oplossing rechts zit, en links een slechte tak is. de heuristische functie geeft dit heel goed weer, en maakt maar op 1 plek een vergissing (de 1e tak rechts) Echter, hill-climbing is zo “onveilig” dat die ene vergissing dodelijk is, en hij nooit meer uit de oneindige tak komt. AI3
Hill-climbing: nadeel Kan terecht komen in lokaal minimum 5 4 3 6 1 2 A tweede nadeel van hill climbing is dat ie in lokale minima kan komen (dit is ook goed te illustreren met het berg-verhaal: je komt op een subtop uit naast de echt hoogste top, maar eenmaal op die subtop zijn alle mogelijkheden slechter dan waar je zit) AI3
Algorithme: best-first Kies beste van alle open knopen: Volgorde: ACHOPWX = open knoop X A 5 4 3 6 1 2 B C D E F G H O P W De remedie om hill-climbing robuuster te maken is om niet langer meer de niet-gekozen mogelijkheden gelijk te vergeten, maar om ze te onthouden voor later gebruik. Wat “best-first” doet is niet alleen lokaal de beste mogelijkheid kiezen (en alle 1-na-beste mogelijkheden vergeten), maar best-first onthoud alle suboptimale mogelijkheden van het verleden, en vergelijkt dan de mogelijkheden uit vanuit de huidige plek met alle nog-niet-gekozen mogelijkheden uit het verleden, en kiest daar dan de *globaal* beste mogelijkheid uit. De lijst van “alle nog niet gekozen mogelijkheden uit het verleden + de mogelijkheden vanuit de huidige positie” heet de “open lijst”. Een andere manier om best-first uit te leggen: kies uit de open lijst de best-scorende kandidaat, vervang die kandidaat door al zijn kinderen, dat levert een nieuwe open lijst, herhaal. Het voorbeeld illustreert hoe best-first hersteld van het lokale minimum waar hill-climbing in gevangen bleef. AI3
Best-first: nadeel Kan verdwaald raken in oneindige takken 4 3 1 ... ... Maar ook best-first is niet perfect: het is weliswaar bestand tegen lokale minima, maar niet tegen oneindige takken. Ik noem deze boom altijd de “student met opdracht” boom. De student zegt steeds dat ie het morgen afheeft (afstand =1). Maar morgen zegt ie weer precies hetzelfde. Hill-climbing zou hier natuurlijk in trappen maar ook best-first trapt hier nog in, en raakt verstrikt in de oneindige tak. Merk wel op dat om best-first te foppen de heuristiek heel veel slechter moet zijn dan om hill-climbing te foppen: bij hill-climbing was het genoeg om op 1 plek een verkeerde score te hebben, terwijl hier moet de heuristiek op een oneindig aantal plekken een foute waarde moet geven. AI3
Algorithme: “A” Compenseer voor diep gelegen knopen Heuristische functie: h(n) = schatting voor afstand tot doel Reeds afgelegde afstand: g(n) Totaal: f(n) = g(n) + h(n) Algorithme “A” = best-first search met f(n) Om nu ook nog de problemen met best-first op te lossen gaan we compenseren voor de diepte. (in termen van het “student”-verhaal: elke keer als ie met dezelfde belofte terugkomt gaan we ‘m een klein beetje minder geloven). In termen van de boom: de waarde van elke knoop is (natuurlijk) de heuristische waarde + strafpunten voor hoe diep de knoop zelf al ligt. Nog anders gezegd: bij best-first kiezen we een knoop op de geschatte lengte van knoop tot doel, bij A kiezen we een knoop op de geschatte lengte van het hele pad van start tot doel (waarbij we het stuk van start tot huidig precies weten (dat hebben we nl. al afgelegd), en hoeven we dus niet te schatten, en we voor het stuk van huidige knoop tot doel de h-schatting gebruiken. Feitelijk is A hetzelfde algorithme als best-first (open lijst, gekozen knoop vervangen door zijn opvolgers, herhaal), maar alleen de heuristische functie veranderd. Die is niet langer meer h, maar h+diepte = h+g. AI3
Algorithme “A”: voordeel Kan niet verdwaald raken in oneindige takken 4 3 1 ... +0=4 +1=2 +2=3 +3=4 +4=5 +1=4 Dit illustreert dat inderdaad, de boom waar best-first nog in verstrikt raakte, daar kan A nu tegen, omdat er op een gegeven moment voldoende “compensatie” is voor de alsmaar dieper liggen te optimistische schattingen. Het zal later blijken dat (onder bepaalde voorwaarden) dit *altijd* zo is. AI3
Algorithme “A”: negatief Nog steeds gevoelig voor de kwaliteit van de heuristische kennis 1 ... 1000 +1=2 +2=3 +3=4 +0=1 +1=1001 A vindt weliswaar altijd de oplossing (want kan tegen locale minima en tegen oneindige takken), maar kan het soms nog wel steeds heel inefficient doen. Zoals hier. Deze heuristiek heeft het zo’n beetje maximaal verkeerd: overal waar de oplossing niet ligt zegt ie dat ie vlakbij is, en waar ie wel ligt zegt ie dat ie ver weg is. Het algorithme A zal alle linker-takken tot op diepte 1000 doorzoeken (= 2^1000 knopen! = ongeveer 10^300 !!!), maar uiteindelijk zal ie wel een keer de goede keuze maken. Het is natuurlijk onvermijdelijk dat het algorithme net zo goed (of: slecht) is als de heuristiek die je het geeft. Onvermijdelijk AI3
A* = A + 0 £ h(n) £ h*(n) Algorithme: A* Algorithme A: Stel: h*(n) = echte nog af te leggen afstand A* = A + 0 £ h(n) £ h*(n) Laatse variatie: het algorithme A* is precies hetzelfde als A, maar met de extra eis dat de heuristiek h een *onderschatting* is van de echte nog af te leggen afstand. Let op: natuurlijk weten we h* niet, maar soms kunnen we toch afleiden dat een bepaalde functie h < h*. Zie vb. volgende slide. dwz: h(n) is een onderschatting van de nog af te leggen afstand AI3
A*: Voorbeelden van h(n) 2 8 3 1 6 4 7 5 0 £ h(n) £ h*(n) h(n) = aantal stenen op foute plek h(n) = som van afstanden tot foute plekken h(n) = 2´ aantal directe verwisselingen ook al kennen we h* niet, we kunnen beredeneren dat de eerste h < h* (waarom? ) ook voor de tweede h < h* (waarom?) voor de derde h is het onduidelijk. Voor de eerste en de tweede h mogen we A dus A* noemen AI3
Eigenschappen: Admissible optimale oplossing wordt altijd als eerste gevonden Breadth-first: + Depth-first: - It.-deepening: + Hill-climbing: - Best first - A: - A*: + beam: - Waarom is dat nou belangrijk: A* is admissible (= beste oplossing als eerste gegarandeerd gevonden). Het hele overzicht van alle methoden voor wat betreft admissible staat hier opgesomd. AI3
Eigenschappen: monotoon (1) h(ni) - h(nj) £ cost(ni , nj) (2) h(goal) = 0 Vb: Manhattan Voordeel: monotoon ® admissible M.a.w: I.h.a “A” niet admissible maar als h monotoon dan “A” wel admissible Wat mij betreft mag je deze en de volgende slide overslaan AI3
Waarom heet dat “monotoon”? g(ni) ¯ nj ..... ni g(nj) cost(ni nj) f(nj) = g(nj) + h(nj) = g(ni) + cost(ni , nj) + h(nj) ³ g(ni) + h(ni) - h(nj) + h(nj) = g(ni) + h(ni) = f(ni) AI3
Kwaliteit van heuristieken perfecte heuristiek: h(n) = h*(n) triviale heuristiek: h(n) = 0 (A* + triviale heuristiek = ??) tot slot nog wat theoretische begrippen: een heuristiek is perfect als ie overal hetzelfde zegt als h* (in het algemeen is dat dus niet haalbaar) een heuristiek is triviaal als ie overal hetzelfde zegt (bijv. 0, of een ander getal) A* + triviale heuristiek = breadth first (laat ze daar eerst maar over nadenken) (dat was overigens een tentamen vraag) AI3
Eigenschap van heuristiek: geïnformeerdheid Twee heuristieken, h1(n) en h2(n), met Dan is h2(n) beter geïnformeerdheid Voordeel: h2 bezoekt minder knopen Nadeel: h2 is (vaak) duurder om uit te rekenen nog een begrip: h2 is beter geinformeerd dan h1 als *overal* (= in elke knoop) geldt dat h2 dichter bij h* ligt dan h1. Let op: dat moet dus in *elke* knoop gelden. Vb: de manhattan afstand is beter geinformeerd dan “het aantal blokken op de verkeerde plaats” (waarom?) AI3
Algorithme: beam-search Best-first search was: bd knopen in open-list ..... behoud alleen beste k knopen in open list beam breedte k k knopen in open-list laatste variant: de meest interessante varianten (best-first, A, A*) zijn allemaal gebaseerd op het bijhouden van de lijst van open knopen (= alle nog niet gekozen kinderen tot nu toe). Probleem is dat die lijst open knopen ongeveer zo hard groeit als de breedte van de boom (ongeveer), en daarvan weten we dat ie b^d is. Dat was het nadeel van breadth-first, en eigenlijk heeft best-first dus hetzelfde nadeel (= vraagt onbetaalbaar veel geheugen). Oplossing hiervoor is nog: maak de open lijst een vaste maximale omvang (zeg: k). Dwz: kies beste knoop uit open lijst vervang ‘m door zijn kinderen als de lijst hierdoor >k wordt, gooi dan de slechtse kandidaten uit de open lijst om ‘m weer max lengte k te maken etc. Voordeel: geheugen gebruik is nu niet meer b^d , maar k (vast max) Nadeel: niet meer admissible (want misschien heb je de knoop die je nodig had op weg naar de oplossing wel uit de open lijst gegooid) (laat ze hier maar weer over nadenken…) AI3
Algorithme: beam-search Beam-search met breedte 1 = hill-climbing i.h.a: beam search is niet admissible AI3