729G10 Artificiell intelligens I
Laboration 2: Intelligentare agenter
Sammanfattning
Den här laborationen går ut på att utveckla en intelligent agent som kan suga upp allt åtkomligt damm i en godtyckligt stor rektangulär värld med slumpmässigt utplacerade hinder.
Syfte
Syftet med denna laboration är att förstå vad som krävs för att utveckla en intelligent agent som kan verka i en mer realistisk omgivning än agenten från den första laborationen. Vidare bör en ytterligare förståelse för vad begreppet intelligens innebär inom AI uppnås.
Förberedelser
För att kunna utföra laborationen så snabbt och smärtfritt som möjligt måste ni komma väl förberedda till första laborationstillfället:
- Läs kapitel 2 i kursboken och förstå vad som står i avsnitt 2.3 och 2.4.
- Läs igenom laborationsinstruktionerna noga.
- Fundera på vilken strategi agenten ska ha och hur denna kan formuleras i form av handlingsregler. Skissa er agents strategi med papper och penna innan ni börjar programmera. Försök även att översätta strategin till handlingsregler. Genom att göra detta kan ni upptäcka tankefel på ett tidigt stadium och rätta till dessa.
För er egen skull bör ni redovisa den sista punkten för er laborationsassistent, muntligt eller skriftligt, innan ni börjar med labben. Förhoppningsvis kan denne varna er om det verkar finnas brister i strategin innan ni ödslat för mycket tid.
Laborationssystemet
Laborationssystemet är detsamma som i den första laborationen. Se därför instruktionerna för lab 1 för information.
Som ni snart kommer märka krävs det i denna laboration att ni håller reda på var dammsugaren befinner sig i rummet. I Lab2.py finns det en färdig klass som hjälper er med detta. Som ni kan se i state-klassen initieras där en instans av Position-klassen ( self.position = Position(startCoordinates)). I den klassen finns metoder för att hantera positionsförflyttningar i världen som dammsugaren befinner sig i.
Som instansen initieras nu står positionen i (1,1). Vill ni sedan flytta den positionen
måste ni anropa state.position's metoder. Ett urval av dessa är:
move_forward()flyttar positionen framåtmove_back()flyttar positionen bakåtturn_left()byter riktning ett steg åt vänsterturn_right()byter riktning ett steg åt höger
För att flytta positionen ett steg framåt skriver ni alltså state.position.move_forward(). Klassen i sin helhet med dokumenterade metoder ligger i labbfilen, läs där för att se alla metoder ni kan anropa.
Tänk på att ni inte flyttar agenten i världen genom att anropa dessa metoder, ni flyttar endast positionen där agenten tror att den står. För att flytta er i världen måste ni fortfarande utföra handlingar. Det gäller alltså att se till att koordinaten där agenten tror att den står faktiskt är den samma som där den faktiskt står.
I positionshanteringen finns även stöd för att rita ut fyrkanter i världen för felsökning. Om ni exempelvis vill rita ut en fyrkant på den rutan som är till vänster om er skriver ni state.position.draw_left("färg") där färg är någon av "black","pink","green","white","blue","red". Även här, läs i koden för att se vilka metoder ni kan anropa.
Utförande
- Kopiera filerna i katalogen
~729G10/Kursbibliotek/Lab2/till din egen hemkatalog. - Öppna filen
Lab2.pyi t.ex.idle. Pröva att testköra denna. - Implementera en agent med ett internt tillstånd som klarar av att suga upp allt smuts i en godtyckligt stor rektangulär värld med slumpmässigt utplacerade hinder. Agenten ska, då alla rutor har besökts och all smuts är uppsugen, stänga av sig.
- Bestäm agentens strategi för att städa rent.
- Bestäm vad agentens interna tillstånd ska innehålla för information.
- Färdigställ definitionerna av funktionerna
update-state-with-percept,choose-actionochupdate-state-with-action.
Observera uppdelningen av funktionalitet mellan dessa tre funktioner. Att denna följs är ett baskrav för laborationen.
Vanligt fel!
Det vanligaste felet inför den här laborationen är att man försöker återanvända allt för mycket från den första laborationen. För de allra flesta är det bästa att börja om helt från början. Att försöka utveckla strategin från den förra agenten brukar oftast leda till gigantiska, otympliga program som försöker hantera femtielva olika specialfall (t.ex. om jag bumpat och inte varit i rutan ovanför och står med näsan i väster och gått två steg framåt så ska jag svänga höger om inte rutan under känns mer lockande ;). Så fram med papper och penna och tänk efter före.
Tips
Det kan vara bra att repetera lite listig python.
Redovisning och bedömning
Redovisning enligt nedan skickas till e-post: Labbass.AI@gmail.com, samt lämnas in i labbomslag i Jody Foos fack.
- Skicka in koden för den färdiga, fungerande agenten via e-post, samt lämna in en utskrift av densamma. Ni ska maila in hela Lab2.py, men det räcker att ni skriver ut de delar av koden där ni själva gjort ändringar.
- Skriv en labrapport där ni tar upp följande punkter:
- Ge en övergripande beskrivning av er agents strategi.
- Diskutera på vilket sätt er agent skiljer sig från agenten i laboration 1. Klarar den andra omgivningar än agenten i lab 1 (koppla till boken)? 2. Är den mer intelligent (bortse från titeln på denna laboration)? Motivera era svar.
- Jämför er agent med en sökagent (föreläsning 3). Vad skiljer och vilka är likheterna?
- Enbart för VG: Diskutera om er strategi är optimal för denna typ av värld. Hade ni kunnat lösa uppgiften med färre handlingar, och i så fall hur? Diskutera även agentens tidskomplexitet, det vill säga hur många handlingar måste agenten utföra i förhållande till hur många rutor det finns i världen. (Jämför med agenten från lab 1, som besöker varje ruta en gång, och i varje ruta gör ett konstant antal handlingar (max: suger damm, svänger 3 gånger, går därifrån eller stänger av sig). Om världen är n*m rutor stor, gör alltså en lab 1 agent som värst 5*m*n handlingar, och har därmed tidskomplexiteten O(mn).)
- Lämna in er diskussion av punkterna ovan på papper.
Krav för godkänt
För betyget godkänt krävs att agenten klarar av att suga upp all åtkomlig smuts i en godtyckligt stor rektangulär värld med slumpmässigt utplacerade hinder. Agenten ska då all smuts är uppsugen stänga av sig. Agenten ska alltså ha en systematisk strategi för att besöka alla tillgängliga rutor. Vidare krävs att diskussionen är relevant med tydliga kopplingar mellan teori och praktik.
Krav för väl godkänt
För betyget väl godkänt krävs även att diskussionen visar på en djupare insikt och förs med egna resonemang, samt att den extra diskussionsfrågan redovisats. Vidare krävs att koden är effektiv, bra kommenterad samt välstrukturerad med väl valda funktionsnamn. Koden ska följa den struktur som anges av de givna funktionsnamnen, det vill säga, agentens tillstånd får bara uppdateras i update_state*-funktionerna, inte i choose_action. Agenten ska vara helt eller delvis optimerad för de förutsättningar som är givna (rektangulärt rum utan hinder, startposition, initial rikting, etc). Laborationen ska även vara inlämnad i tid.
Sidansvarig: Arne Jönsson
