diff --git a/aima/agents.py b/aima/agents.py index d159466cc..e1258160a 100644 --- a/aima/agents.py +++ b/aima/agents.py @@ -191,7 +191,7 @@ def rule_match(state, rules): # ______________________________________________________________________________ -loc_A, loc_B = (0, 0), (1, 0) # The two locations for the Vacuum world +loc_A, loc_B, loc_C, loc_D = (0, 0), (1, 0), (0, 1), (1, 1) # The two locations for the Vacuum world def RandomVacuumAgent(): @@ -203,7 +203,7 @@ def RandomVacuumAgent(): >>> environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} True """ - return Agent(RandomAgentProgram(['Right', 'Left', 'Suck', 'NoOp'])) + return Agent(RandomAgentProgram(['Right', 'Left', 'Up', 'Down', 'Suck', 'NoOp'])) def TableDrivenVacuumAgent(): @@ -215,16 +215,84 @@ def TableDrivenVacuumAgent(): >>> environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} True """ - table = {((loc_A, 'Clean'),): 'Right', - ((loc_A, 'Dirty'),): 'Suck', - ((loc_B, 'Clean'),): 'Left', - ((loc_B, 'Dirty'),): 'Suck', - ((loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right', - ((loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', - ((loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck', - ((loc_B, 'Dirty'), (loc_B, 'Clean')): 'Left', - ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', - ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck'} + table = { + ((loc_A, 'Dirty'),): 'Suck', + ((loc_A, 'Clean'),): 'Right', + ((loc_B, 'Dirty'),): 'Suck', + ((loc_B, 'Clean'),): 'Down', + ((loc_D, 'Dirty'),): 'Suck', + ((loc_D, 'Clean'),): 'Left', + ((loc_C, 'Dirty'),): 'Suck', + ((loc_C, 'Clean'),): 'Up', + + ((loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right', + ((loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down', + ((loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left', + ((loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up', + ((loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', + ((loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck', + ((loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck', + ((loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck', + ((loc_A, 'Clean'), (loc_B, 'Clean')): 'Down', + ((loc_B, 'Clean'), (loc_D, 'Clean')): 'Left', + ((loc_D, 'Clean'), (loc_C, 'Clean')): 'Up', + ((loc_C, 'Clean'), (loc_A, 'Clean')): 'Right', + + ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left', + ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck', + ((loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down', + ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down', + ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', + ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up', + ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck', + ((loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left', + ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left', + ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck', + ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down', + ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', + ((loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right', + ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right', + ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck', + ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right', + ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck', + ((loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up', + ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up', + ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck', + + ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up', + ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck', + ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left', + ((loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left', + ((loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck', + ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left', + ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck', + ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down', + ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right', + ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck', + ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up', + ((loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up', + ((loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck', + ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up', + ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck', + ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left', + ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left', + ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck', + ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down', + ((loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down', + ((loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', + ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down', + ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', + ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right', + ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down', + ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck', + ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right', + ((loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right', + ((loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck', + ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right', + ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck', + ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up', + + } return Agent(TableDrivenAgentProgram(table)) @@ -247,7 +315,11 @@ def program(percept): elif location == loc_A: return 'Right' elif location == loc_B: + return 'Down' + elif location == loc_D: return 'Left' + elif location == loc_C: + return 'Up' return Agent(program) @@ -261,20 +333,24 @@ def ModelBasedVacuumAgent(): >>> environment.status == {(1,0):'Clean' , (0,0) : 'Clean'} True """ - model = {loc_A: None, loc_B: None} + model = {loc_A: None, loc_B: None, loc_C: None, loc_D: None} def program(percept): """Same as ReflexVacuumAgent, except if everything is clean, do NoOp.""" location, status = percept model[location] = status # Update the model here - if model[loc_A] == model[loc_B] == 'Clean': + if model[loc_A] == model[loc_B] == model[loc_C] == model[loc_D] == 'Clean': return 'NoOp' elif status == 'Dirty': return 'Suck' elif location == loc_A: return 'Right' elif location == loc_B: + return 'Down' + elif location == loc_D: return 'Left' + elif location == loc_C: + return 'Up' return Agent(program) @@ -807,7 +883,9 @@ class TrivialVacuumEnvironment(Environment): def __init__(self): super().__init__() self.status = {loc_A: random.choice(['Clean', 'Dirty']), - loc_B: random.choice(['Clean', 'Dirty'])} + loc_B: random.choice(['Clean', 'Dirty']), + loc_C: random.choice(['Clean', 'Dirty']), + loc_D: random.choice(['Clean', 'Dirty'])} def thing_classes(self): """Return the Thing/Agent classes that may populate this vacuum world.""" @@ -820,20 +898,44 @@ def percept(self, agent): def execute_action(self, agent, action): """Change agent's location and/or location's status; track performance. Score 10 for each dirt cleaned; -1 for each move.""" - if action == 'Right': + + if action == 'Right' and agent.location == (0,0): agent.location = loc_B agent.performance -= 1 - elif action == 'Left': + elif action == 'Right' and agent.location == (0,1): + agent.location = loc_D + agent.performance -= 1 + elif action == 'Left' and agent.location == (1,0): agent.location = loc_A agent.performance -= 1 + elif action == 'Left' and agent.location == (1,1): + agent.location = loc_C + agent.performance -= 1 + elif action == 'Down' and agent.location == (0,0): + agent.location = loc_C + agent.performance -= 1 + elif action == 'Down' and agent.location == (1,0): + agent.location = loc_D + agent.performance -= 1 + elif action == 'Up' and agent.location == (0,1): + agent.location = loc_A + agent.performance -= 1 + elif action == 'Up' and agent.location == (1,1): + agent.location = loc_B + agent.performance -= 1 + elif action == 'Suck': if self.status[agent.location] == 'Dirty': agent.performance += 10 self.status[agent.location] = 'Clean' +## Should the agent be penalized for doing an invalid action? +## For example if it chooses Left while its already at loc_A, should it still get agent.performance -= 1 +## - Carter + def default_location(self, thing): """Agents start in either location at random.""" - return random.choice([loc_A, loc_B]) + return random.choice([loc_A, loc_B, loc_C, loc_D]) # ______________________________________________________________________________ diff --git a/notebooks/vacuum_world.ipynb b/notebooks/vacuum_world.ipynb index 8fa52dffc..18fa153ee 100644 --- a/notebooks/vacuum_world.ipynb +++ b/notebooks/vacuum_world.ipynb @@ -2,9 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/nbformat/validator.py:434: MissingIDFieldWarning: Cell is missing an id field, this will become a hard error in future nbformat versions. You may want to use `normalize()` on your notebooks before validations (available since nbformat 5.1.4). Previous versions of nbformat are fixing this issue transparently, and will stop doing so in the future.\n", + " _validate(nbdict, ref, version, version_minor, relax_add_props)\n" + ] + } + ], "source": [ "%run bootstrap.ipynb" ] @@ -82,7 +91,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -99,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -107,127 +116,164 @@ "text/html": [ "\n", - "\n", + "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "

\n", "\n", - "
class TrivialVacuumEnvironment(Environment):\n",
-       "\n",
-       "    """This environment has two locations, A and B. Each can be Dirty\n",
+       "
class TrivialVacuumEnvironment(Environment):\n",
+       "    """This environment has two locations, A and B. Each can be Dirty\n",
        "    or Clean. The agent perceives its location and the location's\n",
        "    status. This serves as an example of how to implement a simple\n",
        "    Environment."""\n",
        "\n",
-       "    def __init__(self):\n",
+       "    def __init__(self):\n",
        "        super().__init__()\n",
        "        self.status = {loc_A: random.choice(['Clean', 'Dirty']),\n",
-       "                       loc_B: random.choice(['Clean', 'Dirty'])}\n",
+       "                       loc_B: random.choice(['Clean', 'Dirty']),\n",
+       "                       loc_C: random.choice(['Clean', 'Dirty']),\n",
+       "                       loc_D: random.choice(['Clean', 'Dirty'])}\n",
        "\n",
-       "    def thing_classes(self):\n",
-       "        return [Wall, Dirt, ReflexVacuumAgent, RandomVacuumAgent,\n",
-       "                TableDrivenVacuumAgent, ModelBasedVacuumAgent]\n",
+       "    def thing_classes(self):\n",
+       "        """Return the Thing/Agent classes that may populate this vacuum world."""\n",
+       "        return [Wall, Dirt, ReflexVacuumAgent, RandomVacuumAgent, TableDrivenVacuumAgent, ModelBasedVacuumAgent]\n",
        "\n",
-       "    def percept(self, agent):\n",
-       "        """Returns the agent's location, and the location status (Dirty/Clean)."""\n",
-       "        return (agent.location, self.status[agent.location])\n",
+       "    def percept(self, agent):\n",
+       "        """Returns the agent's location, and the location status (Dirty/Clean)."""\n",
+       "        return agent.location, self.status[agent.location]\n",
        "\n",
-       "    def execute_action(self, agent, action):\n",
-       "        """Change agent's location and/or location's status; track performance.\n",
+       "    def execute_action(self, agent, action):\n",
+       "        """Change agent's location and/or location's status; track performance.\n",
        "        Score 10 for each dirt cleaned; -1 for each move."""\n",
-       "        if action == 'Right':\n",
+       "        \n",
+       "        if action == 'Right' and agent.location == (0,0):\n",
        "            agent.location = loc_B\n",
        "            agent.performance -= 1\n",
-       "        elif action == 'Left':\n",
+       "        elif action == 'Right' and agent.location == (0,1):\n",
+       "            agent.location = loc_D\n",
+       "            agent.performance -= 1\n",
+       "        elif action == 'Left' and agent.location == (1,0):\n",
+       "            agent.location = loc_A\n",
+       "            agent.performance -= 1\n",
+       "        elif action == 'Left' and agent.location == (1,1):\n",
+       "            agent.location = loc_C\n",
+       "            agent.performance -= 1\n",
+       "        elif action == 'Down' and agent.location == (0,0):\n",
+       "            agent.location = loc_C\n",
+       "            agent.performance -= 1\n",
+       "        elif action == 'Down' and agent.location == (1,0):\n",
+       "            agent.location = loc_D\n",
+       "            agent.performance -= 1\n",
+       "        elif action == 'Up' and agent.location == (0,1):\n",
        "            agent.location = loc_A\n",
        "            agent.performance -= 1\n",
+       "        elif action == 'Up' and agent.location == (1,1):\n",
+       "            agent.location = loc_B\n",
+       "            agent.performance -= 1\n",
+       "        \n",
        "        elif action == 'Suck':\n",
        "            if self.status[agent.location] == 'Dirty':\n",
        "                agent.performance += 10\n",
        "            self.status[agent.location] = 'Clean'\n",
        "\n",
-       "    def default_location(self, thing):\n",
-       "        """Agents start in either location at random."""\n",
-       "        return random.choice([loc_A, loc_B])\n",
+       "## Should the agent be penalized for doing an invalid action? \n",
+       "## For example if it chooses Left while its already at loc_A, should it still get agent.performance -= 1\n",
+       "## - Carter\n",
+       "\n",
+       "    def default_location(self, thing):\n",
+       "        """Agents start in either location at random."""\n",
+       "        return random.choice([loc_A, loc_B, loc_C, loc_D])\n",
        "
\n", "\n", "\n" @@ -246,20 +292,20 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Dirty'}.\n" + "State of the Environment: {(0, 0): 'Dirty', (1, 0): 'Dirty', (0, 1): 'Clean', (1, 1): 'Dirty'}.\n" ] } ], "source": [ "# These are the two locations for the two-state environment\n", - "loc_A, loc_B = (0, 0), (1, 0)\n", + "loc_A, loc_B, loc_C, loc_D = (0, 0), (1, 0), (0,1), (1,1)\n", "\n", "# Initialize the two-state environment\n", "trivial_vacuum_env = TrivialVacuumEnvironment()\n", @@ -277,12 +323,12 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Create the random agent\n", - "random_agent = Agent(program=RandomAgentProgram(['Right', 'Left', 'Suck', 'NoOp']))" + "random_agent = Agent(program=RandomAgentProgram(['Right', 'Left', 'Up', 'Down', 'Suck', 'NoOp']))" ] }, { @@ -294,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -321,21 +367,24 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Dirty'}.\n", - "RandomVacuumAgent is located at (1, 0).\n" + "None\n", + "State of the Environment: {(0, 0): 'Dirty', (1, 0): 'Dirty', (0, 1): 'Clean', (1, 1): 'Dirty'}.\n", + "RandomVacuumAgent is located at (1, 1).\n" ] } ], "source": [ "# Running the environment\n", - "trivial_vacuum_env.step()\n", + "print(trivial_vacuum_env.step())\n", + "\n", + "\n", "\n", "# Check the current state of the environment\n", "print(\"State of the Environment: {}.\".format(trivial_vacuum_env.status))\n", @@ -343,6 +392,39 @@ "print(\"RandomVacuumAgent is located at {}.\".format(random_agent.location))" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " perceives ((0, 1), 'Clean') and does Left\n", + " perceives ((0, 1), 'Clean') and does NoOp\n", + " perceives ((0, 1), 'Clean') and does Left\n", + " perceives ((0, 1), 'Clean') and does Right\n", + " perceives ((1, 1), 'Dirty') and does Up\n", + " perceives ((1, 0), 'Dirty') and does Up\n", + " perceives ((1, 0), 'Dirty') and does NoOp\n", + " perceives ((1, 0), 'Dirty') and does Down\n", + " perceives ((1, 1), 'Dirty') and does Right\n", + " perceives ((1, 1), 'Dirty') and does Down\n" + ] + } + ], + "source": [ + "env = TrivialVacuumEnvironment()\n", + "\n", + "agent = RandomVacuumAgent()\n", + "agent = TraceAgent(agent)\n", + "\n", + "env.add_thing(agent)\n", + "\n", + "env.run(10)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -355,20 +437,87 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "table = {((loc_A, 'Clean'),): 'Right',\n", - " ((loc_A, 'Dirty'),): 'Suck',\n", - " ((loc_B, 'Clean'),): 'Left',\n", - " ((loc_B, 'Dirty'),): 'Suck',\n", - " ((loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right',\n", - " ((loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", - " ((loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", - " ((loc_B, 'Dirty'), (loc_B, 'Clean')): 'Left',\n", - " ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", - " ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_A, 'Dirty')): 'Suck'\n", + "table = {\n", + " ((loc_A, 'Dirty'),): 'Suck',\n", + " ((loc_A, 'Clean'),): 'Right', \n", + " ((loc_B, 'Dirty'),): 'Suck',\n", + " ((loc_B, 'Clean'),): 'Down', \n", + " ((loc_D, 'Dirty'),): 'Suck',\n", + " ((loc_D, 'Clean'),): 'Left', \n", + " ((loc_C, 'Dirty'),): 'Suck',\n", + " ((loc_C, 'Clean'),): 'Up', \n", + "\n", + " ((loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", + " ((loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck',\n", + " ((loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck',\n", + " ((loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", + " ((loc_A, 'Clean'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_B, 'Clean'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_D, 'Clean'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_C, 'Clean'), (loc_A, 'Clean')): 'Right',\n", + "\n", + " ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck',\n", + " ((loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", + " ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck',\n", + " ((loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck',\n", + " ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", + " ((loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", + " ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", + " ((loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck',\n", + "\n", + " ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck',\n", + " ((loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck',\n", + " ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck',\n", + " ((loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", + " ((loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck',\n", + " ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Clean')): 'Up',\n", + " ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Clean'), (loc_C, 'Dirty')): 'Suck',\n", + " ((loc_B, 'Dirty'), (loc_B, 'Clean'), (loc_D, 'Dirty'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Clean')): 'Left',\n", + " ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean'), (loc_D, 'Dirty')): 'Suck',\n", + " ((loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", + " ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", + " ((loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Clean')): 'Down',\n", + " ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean'), (loc_B, 'Dirty')): 'Suck',\n", + " ((loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", + " ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Clean')): 'Right',\n", + " ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Clean'), (loc_A, 'Dirty')): 'Suck',\n", + " ((loc_D, 'Dirty'), (loc_D, 'Clean'), (loc_C, 'Dirty'), (loc_C, 'Clean')): 'Up',\n", + "\n", " }" ] }, @@ -381,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -398,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -407,14 +556,14 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "TableDrivenVacuumAgent is located at (0, 0).\n" + "TableDrivenVacuumAgent is located at (0, 1).\n" ] } ], @@ -427,15 +576,15 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Dirty'}.\n", - "TableDrivenVacuumAgent is located at (1, 0).\n" + "State of the Environment: {(0, 0): 'Dirty', (1, 0): 'Dirty', (0, 1): 'Clean', (1, 1): 'Dirty'}.\n", + "TableDrivenVacuumAgent is located at (0, 0).\n" ] } ], @@ -471,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -488,7 +637,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -502,9 +651,18 @@ " \n", " def program(percept):\n", " loc, status = percept\n", - " return ('Suck' if status == 'Dirty' \n", - " else'Right' if loc == loc_A \n", - " else'Left')\n", + "\n", + " if status == 'Dirty':\n", + " return 'Suck'\n", + " elif loc == loc_A:\n", + " return 'Right'\n", + " elif loc == loc_B:\n", + " return 'Down'\n", + " elif loc == loc_D:\n", + " return 'Left'\n", + " elif loc == loc_C:\n", + " return 'Up'\n", + " \n", " return program\n", "\n", " \n", @@ -522,14 +680,14 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "SimpleReflexVacuumAgent is located at (1, 0).\n" + "SimpleReflexVacuumAgent is located at (1, 1).\n" ] } ], @@ -541,15 +699,15 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Clean'}.\n", - "SimpleReflexVacuumAgent is located at (1, 0).\n" + "State of the Environment: {(0, 0): 'Dirty', (1, 0): 'Dirty', (0, 1): 'Clean', (1, 1): 'Clean'}.\n", + "SimpleReflexVacuumAgent is located at (1, 1).\n" ] } ], @@ -584,7 +742,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -601,14 +759,14 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "ModelBasedVacuumAgent is located at (0, 0).\n" + "ModelBasedVacuumAgent is located at (1, 0).\n" ] } ], @@ -628,14 +786,14 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "State of the Environment: {(0, 0): 'Clean', (1, 0): 'Clean'}.\n", + "State of the Environment: {(0, 0): 'Dirty', (1, 0): 'Clean', (0, 1): 'Clean', (1, 1): 'Clean'}.\n", "ModelBasedVacuumAgent is located at (1, 0).\n" ] } @@ -702,7 +860,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.11.5" } }, "nbformat": 4,