Problemlösning Problemlösning Vad är problemlösning Hur ser ett problem ut? Programmering = Problemlösning Omformulering av ett problem kan i slutändan omsättas i ett program. Ett program består av en, eller flera, algoritm/er. Algoritmen är lösningen på ett problem. Planering av program Ett recept är ett bra exempel på en plan. - Ingredienser och mängder bestäms av vad du vill göra. - Ingredienserna är indata - Sättet att kombinera dem är processbearbetningen - Det tillagade är utdatat Programmeringsmetaforer Instruktion Konstruktion Problemlösning Adaptation Demonstration Konstruktion Legoteknik Språket består av byggblock Naturligt med tankar om underhåll och renovering Re-use Kanske inte hollistisk (helhetssyn) 1
Problemlösning Strukturerad programmering Program är en lösning på ett problem, och lösningen skulle idealiskt växa fram genom stegvis detaljering (stepwise refinement) utan att man någonsin skulle behöva backa och göra om. Problemlösning Strukturerad programmering Hierarki Modularitet Fördelar i att lokalisera och korrigera fel. Strukturerad programmering TOP-DOWN Steg för steg bryter ned problemet till delproblem Tillämpas rekursivt Lösningen till huvudproblemet med det (hypotetiska) antagandet att man redan har en lösning till de olika delproblemen. Strukturerad programmering När ett delproblem når en detaljnivå som är elementär där standardlösningar finns för detta. Ex. datatypen FIFO (First-In-First-Out) om jag vill göra en printerkö, eller Stack Den hierarkiska strukturen som helhet motsvarar ett fungerande program Stack (ADT) Tallrikstrave i matsal Operationer: Titta på översta elementet Lägga på ett element Ta bort ett element Kolla om stacken är tom Strukturerad programmering Tanken var att nedbrytningsprocessen skulle vägledas av den verkliga strukturen i det givna problemet, genom tillämpningsområdets egna naturliga morfologi Programmets komponenter och strukturen skall svara mot verkliga objekt, relationer och egenskaper i världen. Stöds av de tankar Taylor hade i början av 1900 angående tillverkningsindustrin. 2
Modularitet Problemlösningsmetaforen Komponenter Löst kopplade Högt oberoende Väl definierade gränsytor (Interface) mellan komponenter Höga precisionskrav (beroende på ovan) Uppmärksamheten flyttas från datorn (instruktionsmetaforen) och program (konstruktionsmetaforen) till abstrakt beteende. Knyter an mot dagens tankar runt OOP där strukturerad programmering med TOP- DOWN ofta kombineras med konstruktionsmetaforens BOTTOM-UP. Nivå Val av metafor beror delvis på nivån och delvis på uppgift/problem Låg nära maskinen passar instruktionsmetaforen Mellan passar oftast problemlösningsmetaforen Hög passar oftast adaptionsmetaforen Problemlösning Definition av problem 1) ett väl definierat mål, väl definierade kriterier på ett sökt tillstånd 2) en väl definierad utgångspunkt, ett starttillstånd 3) en välavgränsad repertoar av väldefinierade operationer för att transformera tillstånd Lösning En struktur av operationer som förbinder utgångspunkt och mål Ibland duger vilken lösning som helst, men ibland vill man ha en lösning som är optimerad (ur något perspektiv) Behållarna Givet att vi har två behållare, en som rymmer 7 dl och en som rymmer 3 dl Ingen av dem har någon gradering I startläget är den större full med vatten och mindre tom Målet är att den mindre skall innehålla 1 dl 3
Operationer Träd 1) Töm den större 2) Häll till den mindre från den större 3) Häll till den större från den mindre 4) Töm den mindre 5) Fyll den större från en kran 6) Fyll den mindre från en kran Lösningen av problemet med behållarna kan beskrivas av en hierarki kallat träd Ett träd har en Rot en/flera Noder ett/flera Löv ett/flera Barn en/flera Föräldrar Behållarna 2 Om målet är att ha 2 dl i den mindre, hur gör vi då? Sökning i träd Om vi vill göra uttömmande sökningar i träd för att finna en lösning till ett problem så kan vi göra på på två sätt Bredden först Djupet först Ohanterligt vid till exempel schack Heuristik Metod för att finna lösning snabbare (än uttömmande sökning) Grekiska för att finna Metod för att upptäcka eller bilda ny relevant kunskap Läran om sådana metoder Tumregler Heuristisk sökning Positiv rekommendera vissa noder som är mer intressanta Negativ t.ex. inte fortsätta under ett visst djup Sökalgoritmer med heuristik oftast väsentligt snabbare än uttömande sökning Schackdatorer 4
Riktning Framåt från utgångspunkt Bakåt från mål Metoder för PL i DV Två nivåer 1) Programmeringsmetodik. Metoder och trick för att lösa programmeringsuppgift, dvs det är programmeraren som skall lösa problemet, och det är programmet som är lösningen. Ex. Iteration (adaptation), Rekursion (uppdelning) 2) Program som skall lösa problem. Uppgift för AI. Problemlösning och programbyggnadskonst Ex. Brokonstruktion Problemet Vilka punkter A och B Vilken sorts trafik Trafikvolym Väderpåverkan (miljö) Framtida krav Materialkunskap, tekniker (standarder), verktygslåda (hjälpmedel) Problemet kräver: A) Förståelse för hur den färdiga konstruktionen skall utnyttjas, vilken uppgift den fyller, driftsförhållanden, framtida behov etc. B) Materialkännedom, teknikkunskaper, kunskaper i bakomliggande teorier C) Kunskap och färdighet i att använda olika hjälpmedel och verktyg D) Metodkunskap, förmåga att utvärdera konstruktionsförslag, kvalitetskriterier, kretivitet Relaterar mot (i DV) 1) Uppgiftsformulering, problemspecifikation 2) algoritmkonstruktion (problemlösning) 3) verifikation (att algoritmen uppfyller specifikationen) 4) kodning (programskrivning) 5) testning och avlusning 6) validering (att programmet löser uppgiften) 7) dokumentering (löper parallellt med de andra momenten) 8) underhåll (sträcker sig över programmets hela livslängd) Programutveckling Analys: Identifiera och definiera problemet Design: Planera lösningen på problemet Designa ett gränssnitt (interface): Väljvilka objekt som ska ingå (textrutor, knappar, etc.) Kodning: Översätt algoritmen till ett programmeringsspråk Testning och debugging: Kontrollera att programmet gör rätt, hitta och korrigera eventuella fel Dokumentera: Sammanställ material som beskriver programmet (ska ske kontinuerligt) 5
Verktyg Vad är en algoritm Olika verktyg för utveckling av program. Flödesdiagram: Visar grafiskt hur flödet i ett program går, hur olika delar är knutna logiskt Pseudokod: Problemet omsatt i språk som ligger mitt emellan naturligt språk och programspråk. Hierarkidiagram: Visar hur olika delar av ett program hänger ihop Strikt ska algoritmen: Vara ändlig Uppfylla bestämdhet 0 eller fler indata 1 eller fler utdata Uppfölja effektivitet Algoritmiska exempel Recept Algebra Hämta posten Flödesdiagram Grafiskt sätt att visa hur flödet i ett program går Ikoner med kopplingar Symboler för flödesdiagram forts 6
Exempel på flödesdiagram Pseudokod Psedokod är ett mellanting mellan naturligt språk (t.ex. svenska) och programmeringsspråk (t.ex. vb). Syftet är att underlätta implementation, d.v.s. Översättning till programmeringsspråk. Naturligt språk Problemställning: Jag ska parkera på stan och räknar med att stanna en och en halv timme. Det kostar 10kr per 6min. Hur mycket pengar måste jag lägga i? Pseudokod Parkeringstid är 90 min Kostnad per 6 minuter är 1kr. Kostnad är 90/6 * 1 Om ilagda pengar < 15kr lägg i en krona Tryck på biljettknappen Hierarkidiagram 7