Institutionen för Datavetenskap presenterar: Den intelligenta dammsugaren En laboration i fyra delar Laborationen utvecklad av KogVet- studenter Reviderad 2007: Jenny Dalenius 1
Hej och välkommen! Bilden nedan borde du nu ha framför dig. Annars, säg till din labbassistent. Labbfönstret du kommer jobba i under laborationen. Introduktion Laborationens uppbyggnad Du har blivit anställd som AI- programmerare på företaget Vacuumheads. De tillverkar dammsugare av alla de sorter. Just nu håller de på med en dammsugare som på egen hand ska kunna dammsuga i ett rum och som skräddarsys efter kundens behov. Det är här du kommer in i bilden. Du har till uppgift att programmera dammsugaren så att den klarar av kundens krav. Till din hjälp har du ett grafiskt utvecklingsverktyg (det du just nu har framför dig på datorn). 2
Testmiljö Dammsugaren du programmerar testkörs i en låtsasvärld som ser ut enligt bilden nedan. Testvärlden, det är här du kommer att provköra din dammsugare. Testvärlden är som synes indelad i rutor. Den gula gubben är din dammsugare som rör sig genom testvärlden. De rutor dammsugaren inte har varit på är gråa. Om dammsugaren rör sig över en ruta blir den svart. Rutor som är väggar eller hinder är färgade blå. Rutor där det finns damm innehåller en vit prick. Hur programmeras dammsugaren? Dammsugaren programmeras genom att man bestämmer vad den ska göra i olika situationer. Om dammsugaren exempelvis står på en ruta med damm så ska den suga upp dammet, om dammsugaren har krockat med väggen ska den vända om etc. Vi har alltså en tankegång enligt följande: Om en situation inträffar - > gör någonting. Detta kallas i labben en sats (eng. statement). Det som står efter pilen utförs alltså om det som står före pilen gäller (är sant). Det som står före pilen kallas i laborationen en förutsättning (eng. precondition) och det som står efter en handling (eng. action). När du programmerar dammsugaren ska du välja ut lämpliga förutsättningar och koppla ihop dem med handlingar. 3
Hur fungerar dammsugaren? Dammsugaren jobbar så att den går igenom förutsättningarna en i taget, uppifrån och ned. Hittar den en förutsättning som stämmer utför den handlingen som står efter. Efter utförd handling börjar den om och går igenom förutsättningarna från början igen. Varje gång dammsugaren utför en handling ändras situationen. Dammsugaren kan ju t.ex. ha stått på en ruta utan damm och flyttat sig till en ruta med damm. Så nästa gång dammsugaren går igenom villkoren så kanske en annan förutsättning är uppfylld. Ett exempel Som exempel ska vi konstruera en dammsugare som rör sig från det sydvästra hörnet till det sydöstra hörnet och suger upp allt damm där emellan. När dammsugaren sedan når sydöstra hörnet ska den stänga av sig (dammsugaren börjar alltid i det sydvästra hörnet vänd österut). Det vi först vill kolla varje gång vi kommer till en ny ruta är om det finns smuts där. Finns det smuts vill vi suga upp det. Det skulle alltså se ut enligt följande: 1. Om det finns smuts - > sug upp smuts Det är viktigt att denna sats kommer först. Om vi skulle ha en annan sats ovanför skulle vi kunna lämna en ruta med smuts utan att suga upp det. Ordningen på satserna är, som du säkert kommer att märka, väldigt avgörande för dammsugarens funktion. Om det inte finns smuts där vill vi kolla om vi varit på rutan framför. Har vi inte varit där vill vi röra oss framåt. 2. Om inte varit på rutan framför - > gå framåt Slutligen om vi går in i väggen så ska vi stänga av dammsugaren för då är vi i det sydöstra hörnet. Att gå in i en vägg är samma sak som att ha varit på rutan framför oss. Vi får alltså: 3. Om varit på rutan framför - > stäng av Introduktionsuppgift Vi ska nu prova att programmera dammsugaren enligt ovan. Under rubriken Om det här är uppfyllt väljs förutsättningar (preconditions) och under Utför den här åtgärden väljs handlingar (actions). Vi ska nu börja med att programmera sats 1: Om det finns damm - > sug upp damm För att göra detta väljer vi helt enkelt alternativet Smuts i rutan i den översta menyn för förutsättningar och Sug upp smuts i den översta menyn för handlingar. För det andra villkoret lyder förutsättningen: Om inte varit på rutan framför. Eftersom vi vill att det ska hända något om förutsättningen inte gäller måste vi kryssa i rutan Inte på den raden. Programmera nu sats 2 och 3 på egen hand. Nu har du nästan programmerat klart din första dammsugare. Det som behövs nu och som alltid är god programmeringssed är att ha en förutsättning som berättar vad som ska hända om ingen annan förutsättning är uppfylld. Till detta används förutsättningen Alla övriga fall. Vad vi ska göra i det här fallet har inte så stor betydelse eftersom vi vet att något annat villkor alltid är uppfyllt. Men så fort uppgiften blir lite större kan det vara svårt att överblicka alla möjliga situationer som kan uppstå. Därför är det bra att vänja sig vid att alltid ha med ett sådant villkor. I det här fallet kan vi t 4
ex välja handlingen Gå framåt. Tänk på att Alla övriga fall är ett villkor som alltid är sant. Om du lägger till satser efter en sådan sats kommer de aldrig någonsin att köras, eftersom dammsugaren alltid börjar om från början med villkoren när den har utfört en handling. Du kan nu provköra dammsugaren och se om den beter sig som väntat. Detta gör du genom att trycka på Starta utan hinder. Gjorde dammsugaren som väntat? Vill du se hur dammsugaren uppförde sig en gång till är det bara att trycka på startknappen igen. Några tips innan du börjar med uppdragen - På sidorna 7-8 i denna labbhandledning har du en förteckning över alla förutsättningar och handlingar som finns samt en förklaring över hur de fungerar. Dessutom så finns en förteckning över alla felmeddelanden och vanliga meddelanden som kan dyka upp under labbens gång. - Lek ett tag med dammsugaren innan du börjar med uppdragen, gör egna villkor och försök förutsäga dammsugarens beteende. Om ditt program inte fungerar som du hade tänkt och dammsugaren inte stänger av sig själv går det alltid att avbryta den med stopp- knappen. Nu kan du börja med uppdragen, vänd sida för att sätta igång! 5
Uppdrag 1 Uppdrag Tant Grönlund har en salong där hon brukar ha sina tebjudningar varannan torsdag. Eftersom tant Grönlund har nått den beaktansvärda åldern av 83 är ryggen inte riktigt vad den har varit. Hon har därför svårt att böja sig ned och komma åt i hörnen när hon dammsuger. Hon har därför beställt en dammsugare från Vacuumheads som ska göra det jobbet åt henne. Din uppgift är att konstruera en dammsugare som går ett varv längs med väggen i ett kvadratiskt rum utan hinder (den ska alltså aldrig röra sig in mot mitten utan hålla sig längs med väggen). När den kommer tillbaka till startrutan ska den stänga av sig själv. På vägen ska den naturligtvis suga upp allt damm den stöter på. Testkör utan hinder. Uppdrag 2 Torsten Svensson har ett garage han städar pedantiskt varje dag. Men nu ska Torsten på semester till Vadstena i fyra veckor och behöver därför någon som kan dammsuga golvet när han är borta. Uppdraget går till Vacuumheads. Torsten vill att dammsugaren ska suga bort allt damm som finns i garaget. När dammsugaren är klar ska den stänga av sig oavsett var den befinner sig. Eftersom Torsten är väldigt noggrann av sig finns det naturligtvis inga hinder i vägen på hans garagegolv. Testkör utan hinder. Uppdrag 3 När Torsten kommer tillbaka från semestern och ska titta till sitt garage snubblar han över dammsugaren som står mitt på golvet. Det slutar inte bättre än att Torsten bryter foten. Arg och städoduglig bestämmer sig Torsten för att stämma Vacuumheads. Lyckligtvis lyckas din chef få till stånd en kompromiss. Dammsugaren ska programmeras om så att den när den har dammsugit klart istället åker tillbaka till hörnet där den började och stänger av sig. Uppdraget att programmera om dammsugaren går till dig (vem annars). Testkör utan hinder. Uppdrag 4 Eulalia Söderström är trött på att hennes upproriska tonåring aldrig städar rummet. Som den kloka mor hon är beställer hon en dammsugare från Vacuumheads. Dammsugaren ska kunna ta sig igenom rummet, dammsuga bort allt damm och ta sig tillbaka till starten och där stänga av sig. Inte nog med det, den rebelliska tonåringen har högar med smutstvätt, böcker och CD- skivor slumpvis utspridda på golvet i vägen för din dammsugare (om det finns damm som inte går att komma åt ska det ignoreras). Testkör med hinder. 6
Förutsättningar Förklaringar till alla förutsättningar och handlingar Står i startrutan Är sant om dammsugaren står i startrutan (sydvästra hörnet). Smuts i rutan Är sant om det finns damm i rutan dammsugaren står i. Har varit i rutan framför Är sant om dammsugaren varit på rutan framför. Har varit i rutan bakom Är sant om dammsugaren varit på rutan bakåt. Har varit i rutan till vänster Är sant om dammsugaren varit på rutan till vänster. Vänster är alltså sett ur dammsugarens synvinkel. Om dammsugaren är vänd nedåt är vänster för dammsugaren höger på skärmen o.s.v. Samma sak gäller också för vänster, framåt och bakåt. Har varit i rutan till höger Är sant om dammsugaren varit på rutan till höger. Har varit i alla omgivande rutor Är sant om dammsugaren har varit i rutan framför, rutan bakom, rutan till vänster och rutan till höger. Har varit i alla omgivande rutor och är i startrutan Är sant om dammsugaren har varit i rutan framför, rutan bakom, rutan till vänster och rutan till höger och dessutom står i startrutan (längst ner till vänster). Startrutan är ett steg framåt Är sant om positionen framför dammsugaren är startrutan. Alla övriga fall Är alltid sant. Denna förutsättning ska alltid finnas med längst ned bland dina villkor så att dammsugaren alltid gör något även om ingen annan förutsättning är uppfylld. 7
Handlingar Sug upp smuts Dammsugaren suger upp allt damm i den ruta där den står. Gå framåt Dammsugaren flyttar ett steg framåt i den riktning den är vänd. Sväng höger Dammsugaren vrider sig till höger. Sväng vänster Dammsugaren vrider sig till vänster. Sväng helt om Dammsugaren vänder 180 grader. Gå till föregående ruta Dammsugaren går tillbaka till den ruta där den var förut. (Om denna handling görs flera gånger i rad kommer dammsugaren inte att hoppa fram och tillbaka mellan två rutor, utan gå tillbaka längs den väg den kom från början. Tänk på hur bakåt- knappen fungerar i en webbläsare!) Om dammsugaren kommer till en ruta den besökt flera gånger går den tillbaka längs med den väg den kom första gången den besökte rutan. Stäng av Dammsugaren stänger av sig. Testkörningen avslutas. 8