Ifi6057lab1

Allikas: Lambda

Tähtaeg: 23. september. Hilinenult on tööd võimalik kaitsta kuni 7. oktoobrini (kaasa arvatud).

Sissejuhatus

Ifi6057lab1-1.png

Agent (robot-tolmuimeja) tegutseb Tolmuimejamaailmas, mis koosneb kahest ruumist A ja B (vt. joonis). Ruum võib olla kas puhas või on seal prügi, agendi eesmärgiks on ruumid puhtana hoida. Maailmas kehtib diskreetne aeg: igal sammul loeb agent korra oma sensoreid ja teeb ühe tegevuse.

  • Sensorid: agent näeb ruumi tähist (A ja B) ning ruumi olekut (puhas või must)
  • Tegevused: agendi tegevused on: Left ja Right liiguvad ruumide vahel, Suck üritab ruumi puhtaks teha. NoOp ei tee midagi.

Maailmast välja liikuda ei ole võimalik, tegevuse Left ruumis A tagajärg on see, et agent on endiselt ruumis A.

Ülesanne

  1. Programmeerida Pythonis Tolmuimejamaailma simulaator, mis võimaldab:
    • erineva loogikaga agente mingi n sammu jooksul maailmas käitada;
    • igal sammul annab simulaator töötavale agendile ette selle, mida agendi sensorid tajuvad ning viib täide tegevused, mida agent selle peale teeb (näiteks kui agent teeb Suck siis tuleks ruumist prügi ära võtta);
    • mõõta nende efektiivsust. Efektiivsuse skoor on puhaste ruumide arv igal sammul (näiteks kui ruumid on kogu aeg puhtad ja simulaator töötab 10 sammu, siis skoor on 20).
    • maailma esialgne olek ja agendi esialgne asukoht peaks olema muudetav (võib olla ka juhuslik)
    • näidata maailma olekut igal sammul (saaks ka ilma, aga nii on huvitavam).
  2. Programmeerida lihtne "Reflex" agent mis:
    • igal sammul loeb oma sensoreid ja tegutseb selle alusel.
  3. Lisada simulaatorisse efektiivsuse mõõt, mis annab miinuspunkte edasi-tagasi sõitmise eest. Iga kord kui agent käivitab mootorid käsuga Left või Right või Suck võetakse skoorist üks punkt maha.
  4. Programmeerida olekuga "Model-based reflex" agent, mis:
    • lisaks eelnevale säilitab sisemist olekut (mingisugune mälu, millest saab järeldada asju maailma seisundi kohta).
    • kasutab oma sisemist olekut parema efektiivsuse saavutamiseks
  5. Katsetada mõlemat agenti mõlema efektiivsuse mõõdu juures 10 sammu jooksul. Kui algolek on juhuslik, tuleks piisavalt palju katseid teha. Selgitada tulemusi lühiraportis (0,5 lk; .pdf või .txt)
  6. Mõtelda, mis juhtub mittedeterminismi korral: tegevused võivad ebaõnnestuda või maailm ei ole staatiline. Programmis või raportis seda teemat pole vaja käsitleda (kuigi keelatud ka ei ole).

Toorik

Harjutustunnis näitena tehtud asi, mille peale võib ülesande lahenduse ehitada. Pange tähele, et see kood ei täida veel enamusi ülesande kirjelduses toodud tingimustest.

Agent, mis praegusel kujul veel liikuda ei oska:

class Agent:
    def get_action(self, sensordata):
        if sensordata["state"] == "DIRT":
            return "Suck"
        return "NoOp"

Simulaator, mis esialgu agendi tegevusi veel ignoreerib:

# alternatiivne viis esitada ruumi olekut ("" ja "DIRT" asemel)
CLEAN=1
DIRTY=2

class VacuWorld:
    def __init__(self, agent=None):
        self.rooms = ["", ""]
#        self.rooms = [CLEAN, CLEAN]
        self.add_agent(agent)
        self.inistate()

    def inistate(self):
        self.rooms[1] = "DIRT"

    def add_agent(self, agent):
        self.agent = agent
        self.agentpos = "B"

    def run(self, steps=10):
        for i in range(steps):
            # zip() teeb siin listi [("A", ""), ("B", "DIRT")]
            # kust on hea v6tta ruumi olekut koos ruumi nimega.
            for label, room in zip(["A","B"], (self.rooms)):
                if self.agentpos==label:
                    agentstr = "&"
                    roomstate = room
                else:
                    agentstr = " "
                print (label, "[ "+room+ " "+ agentstr +" ]", end="")
            print ()
            action = self.agent.get_action({"state" : roomstate})
            print (action)

Nii tekitatakse simulaatori objekt ning antakse talle ette agent, mida simulatsioonis käivitada. Simulatsiooni sammude arv antakse ka ette:

if __name__ == "__main__":
    w = VacuWorld()  # see kutsub VacuWorld.__init__() v2lja
    a = Agent()
    w.add_agent(a)
    w.run(5)  # steps=5

Koodinäiteid, ilmselt paremaid ja läbimõeldumaid, leiab ka siit: https://code.google.com/p/aima-python/. Nende kasutamisega ei maksa üle pingutada. Koodi kirjutamise eesmärk siin ülesandes on eelkõige ülesandest süviti arusaamiseks.

Esitamine

Töö eest saab punktid kätte, kui see on harjutustunnis kaitstud (õppejõud vaatab tööd ja esitab küsimusi).

Selleks, et tuvastada, et töö on ikka tähtajaks tehtud, saatke see õppejõule priit at whitedb org.

Töö peaks olema sellisel viisil laekunud 23. septembri kella 23.59-ks.

Sõltumatult sellest, kas töö on emailiga saadetud või mitte, korraldage asi nii, et teil omal see kaitsmise ajal käepärast oleks (oma läptop, mälupulk, grupiketas arvutiklassis).