Göm menyn

729G10 Artificiell intelligens I

Laboration 1: Intelligenta agenter

Sammanfattning

I den här laborationen ska ni skapa en intelligent agent med ett internt tillstånd som klarar av att städa rent i ett omöblerat rum.

Syfte

Syftet med den här laborationen är att konkret få känna på vad som menas med begreppet agent och vad intelligens egentligen kan vara i ett AI-perspektiv. Vidare ska ni lära er använda den begreppsapparat som finns i kursboken genom att diskutera och reflektera över vad ni gjort.

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:

  1. Läs kapitel 2 i kursboken och försäkra er om att ni har en klar förståelse av begreppen agent och omgivning.
  2. Läs igenom laborationsinstruktionerna noga. Ni bör ha klart för er hur agenten interagerar med omgivningssimulatorn.
  3. Fundera på vilken strategi agenten ska ha och hur denna kan formuleras i form av handlingsregler. Skissa gärna på er agent med papper och penna innan ni börjar programmera. 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

I den här laborationen kommer ni att använda en befintlig omgivningssimulator och generella definitioner av olika typer av agenter. Alla filer till första labben kan hämtas från Kursbibliotek/Lab1 genom att antingen via webben (föregående länk), eller genom att kopiera dem från ~729G10/Kursbibliotek/Lab1.

Omgivningssimulatorn

Omgivningssimulatorn representerar den värld i vilken agenterna vistas. I denna laboration är omgivningen en tvådimensionell, rektangulär värld bestående av olika rutor, väggar och damm. Det är omgivningssimulatorn som ser till att agenten varseblir (dvs. ger agenten olika percept) och uppdaterar omgivningen baserat på de handlingar som agenten väljer att utföra. Det som händer när man kör en omgivningssimulator med en agent är alltså följande:

  1. Agenten varseblir (dvs. omgivningssimulatorn förser agenten med ett percept.
  2. Agenten beslutar sig för hur den vill handla (dvs. skickar ut en handling till omgivningssimulatorn).
  3. Omgivningssimulatorn ser till att handlingen utförs och uppdaterar omgivningen.
  4. Agenten uppdaterar sitt interna tillstånd, med resultaten av den valda handlingen.
  5. Upprepa från steg 1.

Omgivningssimulatorns kod finns i filen~729G10/Kursbibliotek/Lab1/Environment.py. Ni behöver inte förstå denna kod och ska absolut inte ändra i denna.

När man startar igång omgivningssimulatorn med en agent börjar agenten alltid i rutan längst ner till vänster i världen. Agentens riktning är också alltid öster när den börjar.

För att göra omgivningen och agentens beteende lite tydligare har vi valt att lägga på ett eget grafiskt gränssnitt på systemet. Hur detta kan se ut ser ni i figur 2.

Figur 2: Grafisk representation av dammsugarvärlden.

Agenter

Er uppgift i den här laborationen är alltså att skapa en agent med tillräcklig intelligens för att suga upp allt damm i en värld utan hinder. Det finns redan två mindre intelligenta agenter som man kan kika på och testköra innan man ger sig i kast med sin egen. Den slumpmässiga agenten, som namnet antyder, väljer handlingar helt slumpmässigt och struntar helt i vad den varseblir. Sålunda kan den gå ifrån en ruta med damm utan att suga upp det. Den reaktiva agenten är lite klipskare och tar till viss del hänsyn till vad den varseblir när den väljer en handling. Den är dock ändå inte särdeles intelligent.

Koden för dessa finns i ~729G10/Kursbibliotek/Lab1/Agent.py och ~729G10/Kursbibliotek/Lab1/Lab1.py, Agent.py innehåller de generella klasserna för de olika typerna av agenter och dessa ska ni inte ändra, medan Lab1.py innehåller de specifika definitionerna för dammsugardomänen.

Agentprogrammet
En agents beteende styrs helt av dess agentprogram. Agentprogrammet får som indata ett percept och ska returnera en (och endast en) handling. Omgivningssimulatorn utför handlingen och ger agenten ett nytt percept. Perceptet är en tupel bestående av två element: (Status, Bump):
  1. Status: Dirty om det finns smuts i rutan som agenten befinner sig i, Clean annars.

  2. Bump: Bump om agenten har stötit emot något hinder då den utförde föregående handling, None annars.

Perceptet kan t.ex. vara (Dirty, None) om agenten inte har krockat och det finns smuts i rutan den står. Utdata från agentens program är en symbol, eller en liten lista, som representerar handlingen (endast en åt gången). Dessa är:

  • Forward som betyder att agenten rör sig framåt till nästa ruta.
  • Suck som innebär att agenten städar bort smutsen på rutan.
  • TurnRight och TurnLeft som innebär att agenten vrider sig ett kvarts varv åt höger respektive vänster.
  • ShutDown som innebär att agenten stänger av sig.

Glöm inte att när ni returnerar en handling till omgivningssimulatorn att "fnutta" handlingen. Dvs. vill ni returnera Forward så måste ni skriva 'Forward' .

Agentens prestation
För varje handling agenten utförs får den -1 i prestation. För varje dammtuss den suger upp får den +100 i prestation. Ju högre prestationspoäng desto bättre (smartare) agent.

Att köra och jämföra agenter

I filen ~729G10/Kursbibliotek/Lab1/Lab1.py finns det två funktioner som kan användas för att testa agenter.

run-random-vacuum_environment tar som argument typen av agent som ska köras. Det kan vara RandomVacuumAgent, SimpleReflexiveAgent, VacuumAgentWithState. Dessutom kan man som argument ge världens bredd, höjd, sannolikhet för smuts (ett tal mellan 0 och 1), samt True eller False för om GUI ska vara på eller av.

compare_vacuum_agents tar som argument en lista med typer av agenter. Dessa körs i 1000 världar och snitt prestationen returneras för varje agenttyp.

Utförande

  1. Lägg till Python och Pygame. Gå in i ett terminalfönster och skriv: module initadd prog/python och module add prog/python
  2. Kopiera filerna i katalogen ~729G10/Kursbibliotek/Lab1/ till din egen hemkatalog.
  3. Öppna filen Lab1.py Pröva att testköra denna.
  4. Implementera en agent med ett internt tillstånd som klarar av att suga upp allt smuts i en godtyckligt stor rektangulär värld. 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-action och update-state-with-action.
      Observera uppdelningen av funktionalitet mellan dessa tre funktioner. Att denna följs är ett baskrav för laborationen.

Redovisning och bedömning

Den här laborationen redovisas till Christian Smith och skickas till e-post Labbass.AI@gmail.com genom att lämna in följande:

  • 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 Lab1.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:
    • Diskutera på vilket sätt er agent skiljer sig från de fördefinierade agenterna.
    • Diskutera vilka typer av omgivningar som er agent är mest lämpad för, utifrån bokens beskrivning av omgivningar. Gör kopplingar till teorin.
  • Lämna in en utskrift av er diskussion av punkterna ovan.

Krav för godkänt

För betyget godkänt krävs att agenten klarar av att suga upp allt smuts i en godtyckligt stor rektangulär värld. Agenten ska, då all smuts är uppsugen stänga av sig. Agenten ska alltså ha en systematisk strategi för att besöka alla rutorna. 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. 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 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