PROBLEMLÖSNING! Problem & lösning! Sökträd, sökgraf! Automatisk problemlösning! Heuristik! Heuristisk sökning! GPS! Mål medel analys! Problemlösning i programmering 1 Problem (snäv mening)! Ett problem är en situation där det finns " ett väldefinierat mål, väldefinierade kriterier på ett sökt tillstånd " en väldefinierad utgångspunkt, ett starttillstånd " en välavgränsad repertoar av väldefinierade operationer för att transformera tillstånd! En lösning är " en kombination av operationer som transformerar starttillståndet till ett måltillstånd! I vissa fall duger en lösning vilken som helst, i andra fall söks en optimal lösning! Notera: dessa definitioner av problem och lösning svarar inte alltid så bra mot praktisk problemlösning där man inte alltid har så fullständig information att utgå från 2
Sökrum, sökträd! Exempel på ett problem av typen mät upp önskad volym med hjälp av ograderade kärl med känd volym! Sökträd " noder representerar tillstånd " bågar representerar hur olika operationer leder till nya tillstånd! Lite svårare uppgift av samma typ: mät upp precis 2 dl 3 Träd och grafer 4! Träd " Terminologi: A är roten i trädet. E och F är barn(noder) till B. B är förälder till E och F. E och F är syskon. E, F, G och H är på samma nivå. I, F, C, J, N, L och M är löv (eller terminalnoder). " Inga cykler får förekomma! När man representerar sökrummet som ett träd kommer samma tillstånd att representeras i flera olika noder i sökträdet! Alternativt kan man representera sökrummet med en graf i stället! (Riktad) Graf " Bågar kan gå från en nod till vilken annan nod som helst " Cykler är alltså tillåtna! Med en sökgraf kan man ha precis en nod för varje tillstånd! Notera: i båda fallen expanderar man trädet/grafen vartefter sökningen fortskrider
Automatisk problemlösning! En möjlig generell ansats: " uttömmande genomsökning exhaustive search av hela sökrummet " kan göras med en traverseringsalgoritm som kallas bredden-först: sök igenom trädet från roten och nedåt, nivå för nivå! Terminologi: traversering av ett dataobjekt innebär en systematisk genomgång av alla dess element! Men sökrummet kan vara så stort att uttömmande sökning blir en ohanterlig uppgift " om man kan göra M olika operationer i varje tillstånd så får varje ny nivå i sökträdet M gånger fler noder, dvs. antalet noder växer exponentiellt med djupet! antal noder på nivå n (om vi startar med n = 0 för roten) blir M n! Ex: för schack innehåller sökrummet approximativt 35 100 ( 10 154 ) noder jfr. med antalet protoner i universum som enligt en uppskattning är omkring 10 80! I det läget blir det intressant att hitta smarta strategier för att välja vilka delar av sökrummet man ska koncentrera sig på! En sådan strategi kallas (sök)heuristik 5 Heuristik heuristik, (av grek. heurískein finna ) 1. metod för att upptäcka eller bilda ny relevant kunskap 2. läran om sådana metoder. En heuristik används för att göra plausibla antaganden, för att välja eller generera hypoteser, men innebär i sig inte ett rättfärdigande eller en förklaring av dessa hypoteser. Ett exempel: Om man ute på havet ser fåglar, kan man anta att land är i närheten. Denna heuristik föreslår en hypotes vars giltighet sedan kan prövas, t.ex. genom att avsöka horisonten med kikare, eller genom en kalkyl med hjälp av sjökort och navigeringsutrustning. I allmänhet är en heuristik oprecis (hur nära och i vilken riktning ligger land?), osäker (fåglar befinner sig inte alltid i närheten av land), och icke-deduktiv, d.v.s. heuristiken utgör inte en logisk argumentation för sambandet mellan fåglar och land. Heuristiken bör ge relevanta hypoteser. Inom ett formellt kunskapsområde, som t.ex. plangeometri, kan man härleda hur många sanna satser som helst genom en mekanisk applikation av axiomen. Men av geometrins oändligt många sanna satser är ytterst få matematiskt intressanta. Att sålla ut dem kräver mer arbete än att med heuristik aktivt bilda intressanta hypoteser. Heuristik behövs också i själva beviskonstruktionen för att föreslå plausibla bevisvägar vars framkomlighet sedan kan prövas i faktiska bevisförsök. Heuristik är en viktig komponent i många datorprogram som utvecklats eller inspirerats av forskningen inom artificiell intelligens. I ett schackspelande program, t.ex., används heuristik för att peka ut de drag som mest plausibelt kan antas leda till vinst; i ett program som löser matematiska integraler, används heuristik för att välja lovande integrationsmetoder. 6
Heuristisk sökning! I mäta-volym-problemet skulle man kunna tänka sig flera enkla heuristiker " prioritera expansion av noder där summan av volymerna är lika med målvolymen " strunta i att expandera noder där båda kärlen är tomma "?! Ett generellt sätt att förbättra bredden-först sökning med heuristik är att försöka finna en lätt beräknad (heuristisk) funktion h(n) som uppskattar hur långt från målet man är i en given nod n (dvs. givet information om tillståndet som n representerar) " ju bättre uppskattning, desto effektivare heuristik " den kan användas så att man hela tiden väljer att expandera den nod i sökfronten som har lägst h-värde 7 General Problem Solver (GPS)! Newell, Shaw & Simon, slutet av 1950-talet! Avsikten är just att GPS ska vara en generell problemlösare " för att lösa problem inom ett speciellt område behöver man bara förse den med de allmänna regler och samband som gäller för området, de specifika operationer som får användas, starttillstånd och målvillkor! Ex: om det gäller schack, får man ge GPS reglerna som gäller för schack! Ex: om det gäller satslogik, får man ge GPS axiom och inferensregler för satslogik! Den heuristik som används i GPS är mål-medel analys - means-ends analysis: " analysera vad skillnaden är mellan aktuellt tillstånd och måltillstånd " relatera dessa skillnader till de möjliga operationer som står till buds " välj operationer som har förutsättningar att kunna reducera just dessa skillnader! Allmänt används återspårning backtracking när man misslyckas, gå tillbaka till närmast tidigare val av operation där man ännu inte försökt alla möjligheter och pröva med nästa alternativ 8
GPS tillämpad på satslogik som exempel! Exempel på problem givet L1: R ( P Q) härled L0 : (Q P) R! Härledningsregler (urval) R1 a b b a --- R5 a b ( a b) R6 a b a b --- R8 a b a ---! Den sökta lösningen är en specifik sekvens av härledningsregler som steg för steg omvandlar det satslogiska uttrycket R ( P Q) till uttrycket (Q P) R 9 Satslogik Satslogik är en logik med vilken man beskriver och analyserar logiska relationer och härledningar i termer av satskonnektiven (betecknas även med & eller, utläses och), (utläses eller), (även eller ~, utläses icke), och (även, utläses om så eller implicerar). Variabler såsom p, q, r, står för påståendesatser, exempelvis Pelle kom med tåget, Det kommer att regna i morgon, Osten är god, Ett plus ett är tre. Konnektivens betydelse kan definieras så här: p q är sant precis då både p och q är sanna p q är sant precis då minst en av p och q är sanna p är sant precis då p är falskt p q är sant utom i det fall då p är sant medan q är falskt Ett enkelt exempel på en giltig slutledning i satslogik är följande resonemang (kallas Modus Ponens): p q p Alltså q Det vill säga, givet de två premisserna om p så q, och p, drar vi slutsatsen att q. Detta är en giltig slutledning: om premisserna är sanna så är slutsatsen sann, alldeles oavsett vad p och q står för. Om till exempel p = Svalorna flyger lågt, och q = Det regnar i morgon så ger det följande instans av den generella slutledningen: Om svalorna flyger lågt så regnar det i morgon Svalorna flyger lågt Alltså kommer det att regna i morgon 10
GPS huvudloop GPS måltyper Mål medel analys i logikexemplet Några av de skillnader som beräknas N en variabel förekommer olika många gånger i de två uttrycken, t.ex. P Q skiljer sig med +N från P Q Q, eftersom det första uttrycket behöver ett Q till C det finns en skillnad i förekomsten av något binärt konnektiv, t.ex. P Q jämfört med P Q P det finns en skillnad i placering mellan uttryckens delar, exempelvis P (Q R) jämfört med (Q R) P R1 R5 R6 R8 R1 R5 R6 R8 ²N ²C x x ²P x differens-operator-tabell (partiell) a b b a a b ( a b) a b a b a b a 11 GPS huvudloop, måltyper 12
GPS måltyper 13 GPS i arbete R1 R5 R6 R8 givet L1: R ( P Q) härled L0: (Q P) R ²N mål 1: transformera L1 till L0 matchning ger positionsdifferens (² P) ²C x x mål 2: reducera ² P mellan L1 och L0 ²P x först funna operator är R1 mål 3: applicera R1 på L1 mål 4: transformera L1 till C(R1) matchning lyckas med a = R och b = P Q producera nytt objekt: L2: ( P Q) R mål 5: transformera L2 till L0 matchning ger konnektivdifferens (²C ) i vänster deluttryck mål 6: reducera ²C mellan vänster del av L2 och vänster del av L0 först funna operator är R5 mål 7: applicera R5 på vänster del av L2 mål 8: transformera vänster del av L2 till C(R5) matchning ger konnektivdifferens (² C) i vänster deluttryck mål 9: reducera ²C mellan vänster del av L2 och C(R5) mål förkastat: differensen inte lättare än differensen i mål 6 andra funna operator är R6 mål 10: applicera R6 på vänster del av L2 mål 11: transformera vänster del av L2 till C(R6) matchning lyckas med a = P och b = Q producera nytt objekt: L3: (P Q) R mål 12: transformera L3 till L0 matchning ger positionsdifferens (² P) i vänster deluttryck mål 13: reducera ² P mellan vänster del av L3 och vänster del av L0 först funna operator är R1 mål 14: applicera R1 på vänster del av L3 mål 15: transformera vänster del av L3 till C(R1) matchning lyckas med a = P och b = Q producera nytt objekt: L4: (Q P) R mål 16: transformera L4 till L0 matchning ger att L4 är identisk med L0. QED Problemlösning i programmering! Om programmering är problemlösning är förstås problemlösning det viktigaste vid programmering! Det finns mycket riktigt också en ganska stor repertoar av problemlösningstrick som tillämpas av programmerare! En del av de mest grundläggande metoderna återspeglas direkt i algoritmer och programspråk! Några exempel:! Iteration " upprepa en operation om och om igen till dess att problemet är löst! Ex: spika in en spik, gå till affären! Rekursion " försök formulera en lösning av problemet i termer av mindre stora problem av samma typ, dvs. som om man redan hade löst problemet för mindre stora uppgifter än det aktuella problemet! Ex: samsortering - merge sort! Dynamisk programmering " lös systematiskt problem av växande storlek ända upp till det aktuella problemets! Ex: Pascals triangel 14