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", "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,