From 5a7fd29ef3cfd6c71f62b555ca708cfd580dfd9d Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Sun, 14 Sep 2025 14:53:59 +0100 Subject: [PATCH 01/56] Checkpoint --- .gitignore | 4 + COMP9016_Lab1.py | 314 ++++++++++++++++++++++++++++ agents.ipynb | 516 ++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 804 insertions(+), 30 deletions(-) create mode 100644 COMP9016_Lab1.py diff --git a/.gitignore b/.gitignore index 58e83214e..99a4cd479 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,7 @@ target/ # for macOS .DS_Store ._.DS_Store + + + +3.12.11-aima-python-venv/ \ No newline at end of file diff --git a/COMP9016_Lab1.py b/COMP9016_Lab1.py new file mode 100644 index 000000000..895132b49 --- /dev/null +++ b/COMP9016_Lab1.py @@ -0,0 +1,314 @@ +# COMP9016 Lab 1 +# NAME: (John) Paul Nagle +# STUDENT NUMBER: R00065426@mymtu.ie + +# NB: I had a lot of issues with earlier versions of python (i.e. anything below 3.10) on my macbook, so I an using python 3.12 here +# I think this is the only way I could started, and f strings are the only pre-python 3.6 feature that I am using +# I get nearly all of the pytests passing with python 3.12, so I think my env is OK +# i.e. 2 failed, 417 passed + + +# IV. Theoretical exercise + +# 1) Show that the simple vacuum-cleaner agent function +# described in Figure 3 is indeed rational under the +# assumptions listed below. + + # @~ = roomba (i.e. agent) + # ::: = dirt + + # +----------------+----------------+ + # | A | B | + # | @~ | | + # | | | + # | :::: | ::: | + # +----------------+----------------+ + + + # "A rational agent is one that does the right thing." + # "For each possible precept sequence, a rational agent should + # select an action expected to maximize its performance measure, + # given the evidence provided by the percept sequence, + # and whatever built-in knowledge the agent has." + # [Artificial Intelligence, A Modern Approach, Russell and Norvig, 4th Edition] + + # So, in our example, the agent will be able to percive it's location i.e. A, and it will be + # able to percive the dirt state i.e. dirty. + # It will be able to select the correct action, i.e. suck. + # At that stage, it will have incurred a penalty of 1 point, as the tile had dirt. + # The action function will generate a reward of 1 point, so we can say that + # the agent is maximising it's performance measure. + # At this stage the agent will again be able to percive it's location (left), and + # the clean/dirty state of the tile. + # It will be able to generate an action function (i.e. Right) based on it's percept history. + # So, the percept history at this stage will be + + # [A, Dirty] -> Suck + # [A, Clean] -> Right + + # Now, in tile B (which is dirty) it receives a penalty point, as it percieves correctly that the + # tile B is dirty. It generates an action function i.e.Suck. It receives a point. The + # percept history is now + + # [A, Dirty] -> Suck + # [A, Clean] -> Right + # [B, Dirty] -> Suck + # [B, Clean] -> Left + + # From this point on, the agent will move from left to right, perceiving a clean tile each time. and + # being rewarded with one point for each clean tile perception + + # In conclusion, we can say that this agent is rational. + +# 2) Describe a rational agent function for the case in +# which each movement costs one point. Does the +# corresponding agent program require internal state? + + # In the scenario in which each movement costs one point, we cannot say that the previous agent would + # be rational. + # This is beacause the agent will not be maximimising it's performance measure by carrying out the + # agent functions that it has been provided. There would be a conflict between the agents designed + # functions of Left or Right when the agent has percieved that it is on a clean tile, and a rational + # agents goal of maximising its performance measure. To move would cost it one point, and to land on + # a clean tile would award it one point. The agent would behave irrationally by oscillating between + # tiles for no net reward. + + # To make such an agent rational, we could change the performance measure to award say 2 points + # for detecting a clean tile. Or we could change the environment to randonly generate dirt. In that case + # performance measure would be capable increasing over the time steps, so the agent would be behaving + # rationally by oscillitating between tiles. + + # Introducing an internal state to the agent, of say remembering how long it had been since it last saw + # the random dirt generated could be a way to optimise the agent's performance measure. If it somehow + # deduces, based on it's memory of the environment that is stored in the agents internal state, that + # dirt is onb average generated every 10 time steps, then we could introduce logic that tells that + # agent to wait for 10 time steps before it moves. This might, on average, improve the performance + # reward, and might increase the rationality of the agent. + + +# 3) Discuss possible agent designs for the cases in which +# clean squares can become dirty and the geography +# of the environment is unknown. Does it make sense +# for the agent to learn from its experience in these +# cases? If so, what should it learn? If not, why not? + + # Where clean squares can become dirty and where the geography of the env is unknown means that we need to + # introduce an element of environment detection to the agent. This would allow the agent to learn from its + # actions, and to build up an internal map maybe of the environment. Assuming the agent has some more actions + # available to it regarding movements i.e. Left Right, Up, Down + # The agent could build up an internal table of tiles, and the directions of travel available to/from that tile + # + # +----------------+----------------+----------------+----------------+ + # | A | B | C | D | + # | @~ | | | | + # | | | | | + # | :::: | ::: | | | + # +----------------+----------------+----------------+----------------+ + # | E | F | + # | | | + # | | | + # | | | + # +----------------+----------------+ + + # Tile UP DOWN LEFT RIGHT + # A N Y N Y + # B N Y Y Y + # C N N Y Y + # D N N Y N + # E Y N N Y + # F Y N Y N + + # It might get more complicated here, as the agent might also keep track of how many times each tile has been + # visited, and use that information to decide which tiles to visit next. It would need to be able to generate + # directions to the destination tile. Tiles visited along the way would alter count of the tile vists, and + # might change the next optimal tile to visit etc + + # The agent might also keep track of how often and where dirt is appearing, and we miught be able to add logic + # to wait for some time-steps before moving. It might turn out that there is one area where dirt appears more + # often (less randomly), so we might might want to give that tile more weight when deciding what the next tile + # visit is. + + # Depending on how much control the roomba have over it's motors, we might be able to train the roomba to move + # diagonally, and add more actions like UP-LEFT or DOWN-RIGHT thus allowing more tile traversal per time-step + # and optimising the rewards. (This goes against the assumption that we have a set number of actions available to us) + + + +################################################################################ +# My niave code implementation of the agent, and an environment to run it in. +################################################################################ + +from typing import List +import random + + +class Percept: + """ A basic percept class that stores the agent's location, whether the + current tile is dirty, and the action taken by the agent. """ + def __init__(self, location, dirty, action=None): + self.location = location + self.dirty = dirty + self.action = action + + def __str__(self): + return f"Location: {self.location}, Dirty: {self.dirty}" + +class Tile: + """ A basic tile class that stores the tile's name and whether it is dirty. """ + def __init__(self, name, dirt=False): + self.name = name + self.dirt = dirt + + def __str__(self): + return f"Tile {self.name} ({'dirty' if self.dirt else 'clean'})" + +class Agent: + """ An agent class that stores the agent's performance, percept history, and current location. """ + def __init__(self): + self.performance = 0 + self.percept_history: List[Percept] = [] + self.location = None + + def set_performance_award(self, performance): + """ Set the performance award for the agent """ + self.performance += performance + + def action(self, percept): + """ Perform an action based on a perception """ + # FIrst, store the percept in history + self.percept_history.append(percept) + + if percept.dirty: + return "Suck" + if percept.location in ("A", "C"): # Obviously, these hard coded values wont scale + return "Right" + if percept.location in ("B", "D"): # Obviously, these hard coded values wont scale + return "Left" + + return False + +class Environment: + """ An environment to run an agent in """ + def __init__(self, tiles, agent, penalise_movement): + self.tiles = tiles + self.agent = agent + self.penalise_movement = penalise_movement + self.set_random_agent_location() + + def set_random_agent_location(self): + """Set the agent's location to a random tile""" + # Choose a random tile from the available tiles + random_tile = random.choice(self.tiles) + self.agent.location = random_tile.name + + def percept(self, agent): + """ Return what the agent percieves at this stage """ + for tile in self.tiles: + if tile.name == agent.location: + return Percept(location=agent.location, dirty=tile.dirt) + + # If agent's location is not found, return a default percept + return Percept(location=None, dirty=False) + + def execute_action(self, agent, action): + """ The agent executes the action """ + if action == "Suck": + for tile in self.tiles: + if tile.name == agent.location and tile.dirt: + tile.dirt = False + agent.set_performance_award(1) + elif action == "Left": + if agent.location == self.tiles[1].name: # Obviously, these hard coded values wont scale + agent.location = self.tiles[0].name # Obviously, these hard coded values wont scale + if self.penalise_movement: + agent.set_performance_award(-1) + elif action == "Right": + if agent.location == self.tiles[0].name: # Obviously, these hard coded values wont scale + agent.location = self.tiles[1].name # Obviously, these hard coded values wont scale + if self.penalise_movement: + agent.set_performance_award(-1) + + + def step(self): + """ Run a step in the environment """ + actions = [] + + # Get the percept for the agent + percept = self.percept(self.agent) + + # Get the action from the agent + action = self.agent.action(percept) + actions.append((self.agent, action, percept)) + + # Execute all actions + for agent, action, _ in actions: + self.execute_action(agent, action) + + return actions + + def run(self, steps): + """ Run the environment for the specified number of steps """ + for step_num in range(steps): + print("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-") + self.print_state(f"STEP {step_num + 1}") + actions = self.step() + for agent, action, percept in actions: + print(f"Agent perceives [{percept}] and takes action [{action}]") + print(f"Performance score is now {agent.performance}") + + + def print_state(self, message): + """ Print the current state of the environment """ + print(f"==> {message}") + for tile in self.tiles: + agent_here = (self.agent.location == tile.name) + print(f"Tile {tile.name}: {'dirty' if tile.dirt else 'clean'}{' (agent here)' if agent_here else ''}") + + + +def main(): + # Create tiles A and B + tile_a = Tile("A", dirt=True) + tile_b = Tile("B", dirt=True) + + # Create an environment with an agent, tiles A and B, and no penalisation for movmenet + agent_1 = Agent() + env_1 = Environment([tile_a, tile_b], agent_1, penalise_movement=False) + + env_1.print_state("INITIAL STATE ENV_1") + + # Run the environment! + env_1.run(11) + + env_1.print_state("FINAL STATE ENV_1") + + # # Print the agent's percept history + # print("\nAgent's percept history:") + # for i, percept in enumerate(agent.percept_history): + # print(f"{i+1}: {percept}") + + print("\n\n") + print("*****************************************************") + print("\n\n") + + +# 2) Describe a rational agent function for the case in which each movement costs one point. + + # Create new tiles C and D for the new env + tile_c = Tile("C", dirt=True) + tile_d = Tile("D", dirt=True) + + # Create an environment with tiles A and B, and no penalisation for movmenet + agent_2 = Agent() + env_2 = Environment([tile_c, tile_d], agent_2, penalise_movement=True) + + env_2.print_state("INITIAL STATE ENV_2") + + # Run the environment! + env_2.run(1000) + + env_2.print_state("FINAL STATE ENV_2") + + +if __name__ == "__main__": + main() diff --git a/agents.ipynb b/agents.ipynb index 636df75e3..1484a24ba 100644 --- a/agents.ipynb +++ b/agents.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -43,9 +43,152 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "

\n", + "\n", + "
class Agent(Thing):\n",
+       "    """An Agent is a subclass of Thing with one required instance attribute \n",
+       "    (aka slot), .program, which should hold a function that takes one argument,\n",
+       "    the percept, and returns an action. (What counts as a percept or action \n",
+       "    will depend on the specific environment in which the agent exists.)\n",
+       "    Note that 'program' is a slot, not a method. If it were a method, then the\n",
+       "    program could 'cheat' and look at aspects of the agent. It's not supposed\n",
+       "    to do that: the program can only look at the percepts. An agent program\n",
+       "    that needs a model of the world (and of the agent itself) will have to\n",
+       "    build and maintain its own model. There is an optional slot, .performance,\n",
+       "    which is a number giving the performance measure of the agent in its\n",
+       "    environment."""\n",
+       "\n",
+       "    def __init__(self, program=None):\n",
+       "        self.alive = True\n",
+       "        self.bump = False\n",
+       "        self.holding = []\n",
+       "        self.performance = 0\n",
+       "        if program is None or not isinstance(program, collections.abc.Callable):\n",
+       "            print("Can't find a valid program for {}, falling back to default.".format(self.__class__.__name__))\n",
+       "\n",
+       "            def program(percept):\n",
+       "                return eval(input('Percept={}; action? '.format(percept)))\n",
+       "\n",
+       "        self.program = program\n",
+       "\n",
+       "    def can_grab(self, thing):\n",
+       "        """Return True if this agent can grab this thing.\n",
+       "        Override for appropriate subclasses of Agent and Thing."""\n",
+       "        return False\n",
+       "
\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "psource(Agent)" ] @@ -75,9 +218,222 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "

\n", + "\n", + "
class Environment:\n",
+       "    """Abstract class representing an Environment. 'Real' Environment classes\n",
+       "    inherit from this. Your Environment will typically need to implement:\n",
+       "        percept:           Define the percept that an agent sees.\n",
+       "        execute_action:    Define the effects of executing an action.\n",
+       "                           Also update the agent.performance slot.\n",
+       "    The environment keeps a list of .things and .agents (which is a subset\n",
+       "    of .things). Each agent has a .performance slot, initialized to 0.\n",
+       "    Each thing has a .location slot, even though some environments may not\n",
+       "    need this."""\n",
+       "\n",
+       "    def __init__(self):\n",
+       "        self.things = []\n",
+       "        self.agents = []\n",
+       "\n",
+       "    def thing_classes(self):\n",
+       "        return []  # List of classes that can go into environment\n",
+       "\n",
+       "    def percept(self, agent):\n",
+       "        """Return the percept that the agent sees at this point. (Implement this.)"""\n",
+       "        raise NotImplementedError\n",
+       "\n",
+       "    def execute_action(self, agent, action):\n",
+       "        """Change the world to reflect this action. (Implement this.)"""\n",
+       "        raise NotImplementedError\n",
+       "\n",
+       "    def default_location(self, thing):\n",
+       "        """Default location to place a new thing with unspecified location."""\n",
+       "        return None\n",
+       "\n",
+       "    def exogenous_change(self):\n",
+       "        """If there is spontaneous change in the world, override this."""\n",
+       "        pass\n",
+       "\n",
+       "    def is_done(self):\n",
+       "        """By default, we're done when we can't find a live agent."""\n",
+       "        return not any(agent.is_alive() for agent in self.agents)\n",
+       "\n",
+       "    def step(self):\n",
+       "        """Run the environment for one time step. If the\n",
+       "        actions and exogenous changes are independent, this method will\n",
+       "        do. If there are interactions between them, you'll need to\n",
+       "        override this method."""\n",
+       "        if not self.is_done():\n",
+       "            actions = []\n",
+       "            for agent in self.agents:\n",
+       "                if agent.alive:\n",
+       "                    actions.append(agent.program(self.percept(agent)))\n",
+       "                else:\n",
+       "                    actions.append("")\n",
+       "            for (agent, action) in zip(self.agents, actions):\n",
+       "                self.execute_action(agent, action)\n",
+       "            self.exogenous_change()\n",
+       "\n",
+       "    def run(self, steps=1000):\n",
+       "        """Run the Environment for given number of time steps."""\n",
+       "        for step in range(steps):\n",
+       "            if self.is_done():\n",
+       "                return\n",
+       "            self.step()\n",
+       "\n",
+       "    def list_things_at(self, location, tclass=Thing):\n",
+       "        """Return all things exactly at a given location."""\n",
+       "        if isinstance(location, numbers.Number):\n",
+       "            return [thing for thing in self.things\n",
+       "                    if thing.location == location and isinstance(thing, tclass)]\n",
+       "        return [thing for thing in self.things\n",
+       "                if all(x == y for x, y in zip(thing.location, location)) and isinstance(thing, tclass)]\n",
+       "\n",
+       "    def some_things_at(self, location, tclass=Thing):\n",
+       "        """Return true if at least one of the things at location\n",
+       "        is an instance of class tclass (or a subclass)."""\n",
+       "        return self.list_things_at(location, tclass) != []\n",
+       "\n",
+       "    def add_thing(self, thing, location=None):\n",
+       "        """Add a thing to the environment, setting its location. For\n",
+       "        convenience, if thing is an agent program we make a new agent\n",
+       "        for it. (Shouldn't need to override this.)"""\n",
+       "        if not isinstance(thing, Thing):\n",
+       "            thing = Agent(thing)\n",
+       "        if thing in self.things:\n",
+       "            print("Can't add the same thing twice")\n",
+       "        else:\n",
+       "            thing.location = location if location is not None else self.default_location(thing)\n",
+       "            self.things.append(thing)\n",
+       "            if isinstance(thing, Agent):\n",
+       "                thing.performance = 0\n",
+       "                self.agents.append(thing)\n",
+       "\n",
+       "    def delete_thing(self, thing):\n",
+       "        """Remove a thing from the environment."""\n",
+       "        try:\n",
+       "            self.things.remove(thing)\n",
+       "        except ValueError as e:\n",
+       "            print(e)\n",
+       "            print("  in Environment delete_thing")\n",
+       "            print("  Thing to be removed: {} at {}".format(thing, thing.location))\n",
+       "            print("  from list: {}".format([(thing, thing.location) for thing in self.things]))\n",
+       "        if thing in self.agents:\n",
+       "            self.agents.remove(thing)\n",
+       "
\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "psource(Environment)" ] @@ -114,9 +470,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Can't find a valid program for BlindDog, falling back to default.\n" + ] + } + ], "source": [ "class BlindDog(Agent):\n", " def eat(self, thing):\n", @@ -137,9 +501,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], "source": [ "print(dog.alive)" ] @@ -163,7 +535,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -217,7 +589,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -264,7 +636,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -287,9 +659,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BlindDog decided to move down at location: 1\n", + "BlindDog decided to move down at location: 2\n", + "BlindDog decided to move down at location: 3\n", + "BlindDog decided to move down at location: 4\n", + "BlindDog ate Food at location: 5\n" + ] + } + ], "source": [ "park = Park()\n", "dog = BlindDog(program)\n", @@ -313,9 +697,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BlindDog decided to move down at location: 5\n", + "BlindDog decided to move down at location: 6\n", + "BlindDog drank Water at location: 7\n" + ] + } + ], "source": [ "park.run(5)" ] @@ -329,9 +723,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BlindDog decided to move down at location: 7\n", + "BlindDog decided to move down at location: 8\n", + "BlindDog decided to move down at location: 9\n", + "BlindDog decided to move down at location: 10\n", + "BlindDog decided to move down at location: 11\n", + "BlindDog decided to move down at location: 12\n", + "BlindDog decided to move down at location: 13\n", + "BlindDog decided to move down at location: 14\n", + "BlindDog drank Water at location: 15\n" + ] + } + ], "source": [ "park.add_thing(water, 15)\n", "park.run(10)" @@ -357,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -423,9 +833,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "park = Park2D(5,20, color={'BlindDog': (200,0,0), 'Water': (0, 200, 200), 'Food': (230, 115, 40)}) # park width is set to 5, and height to 20\n", "dog = BlindDog(program)\n", @@ -482,7 +905,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -553,7 +976,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -618,9 +1041,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "park = Park2D(5,5, color={'EnergeticBlindDog': (200,0,0), 'Water': (0, 200, 200), 'Food': (230, 115, 40)})\n", "dog = EnergeticBlindDog(program)\n", @@ -654,7 +1090,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -696,9 +1132,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[], [], [], [, ], [, None]]\n" + ] + } + ], "source": [ "step()" ] @@ -713,7 +1169,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "3.12.11-aima-python-venv", "language": "python", "name": "python3" }, @@ -727,7 +1183,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.12.11" } }, "nbformat": 4, From d9f46bff29454382eddca0bfaf0a2637b81d9c4e Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Wed, 17 Sep 2025 15:19:07 +0100 Subject: [PATCH 02/56] Checkpoint --- A1_COMP9016_Nagle_JohnPaul_R00065426.py | 155 ++++++++++++++++++++++++ agents.md | 111 +++++++++++++++++ 2 files changed, 266 insertions(+) create mode 100644 A1_COMP9016_Nagle_JohnPaul_R00065426.py create mode 100644 agents.md diff --git a/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/A1_COMP9016_Nagle_JohnPaul_R00065426.py new file mode 100644 index 000000000..17f9e8231 --- /dev/null +++ b/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -0,0 +1,155 @@ +import sys +import os + +# Get the parent dir of the current directory +parent_dir = os.path.dirname(os.getcwd()) + +# Add the parent directory to sys.path +sys.path.append(parent_dir) + +# Now you can import a module from the parent directory +from agents import * + + +# Define custom destination blocks +class PositiveDestination(Thing): + """A destination that awards 1 point when an agent reaches it""" + pass + +class NegativeDestination(Thing): + """A destination that penalizes 1 point when an agent reaches it""" + pass + + +class GridWorldEnvironment(Environment): + # This environment has a grid of rows and columns with obstacles randomly dispersed + # + + def __init__(self, width=4, height=3): + super().__init__() + self.width = width + self.height = height + + + def get_agent_percepts(self, agent, env): + """ + Returns the available moves for an agent in the given environment. + + Parameters: + - agent: The agent object + - env: The XYEnvironment object + + Returns: + - List of available directions + """ + x, y = agent.location + + # Get positions of all obstacles in the environment + obstacle_positions = [(thing.location[0], thing.location[1]) + for thing in env.things + if isinstance(thing, Obstacle) and hasattr(thing, 'location')] + + return self.get_available_moves(x, y, env.width, env.height, obstacle_positions) + + + + def percept(self, agent): + """Override the percept method to include available moves""" + # Get standard percepts from parent class + standard_percepts = super().percept(agent) + + # Add available moves to percepts + x, y = agent.location + obstacle_positions = [(thing.location[0], thing.location[1]) + for thing in self.things + if isinstance(thing, Obstacle)] + + available_moves = self.get_available_moves(x, y, self.width, self.height, obstacle_positions) + + # Return both standard percepts and available moves + return (standard_percepts, available_moves) + + + def get_available_moves(self, x, y, width, height, obstacles=None): + """ + Returns a list of available directions (north, south, east, west) that an agent can move + based on its current position and grid boundaries. + + Parameters: + - x, y: Current coordinates of the agent + - width, height: Dimensions of the grid + - obstacles: Optional list of (x,y) tuples representing obstacle positions + + Returns: + - List of available directions as strings ('north', 'south', 'east', 'west') + """ + if obstacles is None: + obstacles = [] + + available_moves = [] + + # Check North (up, decreasing y) + if y > 0 and (x, y-1) not in obstacles: + available_moves.append('north') + + # Check South (down, increasing y) + if y < height-1 and (x, y+1) not in obstacles: + available_moves.append('south') + + # Check East (right, increasing x) + if x < width-1 and (x+1, y) not in obstacles: + available_moves.append('east') + + # Check West (left, decreasing x) + if x > 0 and (x-1, y) not in obstacles: + available_moves.append('west') + + return available_moves + + + + def execute_action(self, agent, action): + # First execute the standard action + super().execute_action(agent, action) + + # Check if agent is at a positive destination + positive_destinations = self.list_things_at(agent.location, PositiveDestination) + if positive_destinations: + agent.performance += 1 + print(f"Agent reached positive destination! Score +1. Total: {agent.performance}") + + # Check if agent is at a negative destination + negative_destinations = self.list_things_at(agent.location, NegativeDestination) + if negative_destinations: + agent.performance -= 1 + print(f"Agent reached negative destination! Score -1. Total: {agent.performance}") + + +def simple_agent_program(percept): + """A simple agent program that moves randomly""" + return random.choice(['Forward', 'TurnRight', 'TurnLeft']) + +# Create and set up the environment +def create_custom_environment(): + # Create environment with width 4 and height 3 + env = GridWorldEnvironment(4, 3) + + env.add_thing(Obstacle(), (2, 3)) + env.add_thing(PositiveDestination(), (4, 1)) + env.add_thing(NegativeDestination(), (3, 1)) + + # Create and add an agent with a direction + agent = Agent(simple_agent_program) + agent.direction = Direction("right") # Give the agent a direction + env.add_thing(agent, (0, 0)) + + return env + + +def main(): + + env = create_custom_environment() + env.run(20) + +if __name__ == "__main__": + main() diff --git a/agents.md b/agents.md new file mode 100644 index 000000000..a97264b13 --- /dev/null +++ b/agents.md @@ -0,0 +1,111 @@ +# Explanation of agents.py + +The `agents.py` file implements the agent-environment framework from Chapters 1-2 of the "Artificial Intelligence: A Modern Approach" (AIMA) textbook. This file provides a foundation for creating intelligent agents that interact with various environments. + +## Core Class Hierarchy + +```mermaid +graph TD + Thing --> Agent + Thing --> Dirt + Thing --> Wall + Thing --> Obstacle + Obstacle --> Wall + Environment --> XYEnvironment + XYEnvironment --> VacuumEnvironment + XYEnvironment --> WumpusEnvironment + Environment --> TrivialVacuumEnvironment + Environment --> ContinuousWorld + XYEnvironment --> GraphicEnvironment + Agent --> Wumpus + Agent --> Explorer +``` + +### Key Classes + +1. **Thing** (lines 47-66) + - Base class for all physical objects in environments + - Has methods like `is_alive()`, `show_state()`, and `display()` + +2. **Agent** (lines 69-98) + - Subclass of Thing that can perceive and act in an environment + - Has a `program` attribute that maps percepts to actions + - Tracks performance, alive status, and items being held + +3. **Environment** (lines 285-384) + - Abstract class representing the world where agents operate + - Manages things and agents within the environment + - Provides methods for adding/removing things and running simulations + - Key methods include `percept()`, `execute_action()`, `step()`, and `run()` + +4. **XYEnvironment** (lines 466-600) + - Environment with a 2D grid representation + - Handles agent movement, obstacle detection, and wall creation + - Provides methods for finding things at specific locations + +## Agent Programs + +The file implements several types of agent programs: + +1. **TableDrivenAgentProgram** (lines 118-133) + - Uses a lookup table to map percept sequences to actions + - Practical only for tiny domains due to memory requirements + +2. **RandomAgentProgram** (lines 136-147) + - Chooses actions randomly, ignoring percepts + +3. **SimpleReflexAgentProgram** (lines 153-165) + - Takes action based solely on current percept + - Uses rules to match state to actions + +4. **ModelBasedReflexAgentProgram** (lines 168-181) + - Takes action based on percept and internal state + - Maintains a model of the world + +## Specific Environments + +### Vacuum World + +1. **VacuumEnvironment** (lines 730-764) + - 2D grid where agents clean dirt + - Performance: +100 for each dirt cleaned, -1 for each action + +2. **TrivialVacuumEnvironment** (lines 767-801) + - Simplified environment with only two locations (A and B) + - Performance: +10 for each dirt cleaned, -1 for each move + +### Wumpus World + +1. **WumpusEnvironment** (lines 861-1008) + - Implementation of the classic Wumpus World problem + - Contains pits, a wumpus monster, and gold + - Agent must navigate dangers to find gold and return to start + +## Utility Functions + +1. **TraceAgent** (lines 101-112) + - Wraps an agent's program to print inputs and outputs for debugging + +2. **compare_agents** (lines 1014-1029) + - Evaluates multiple agent types in the same environment type + - Returns performance statistics + +3. **test_agent** (lines 1032-1049) + - Tests a single agent type across multiple environment instances + +## Key Concepts Demonstrated + +1. **Agent-Environment Interaction**: + - Agents perceive through `percept()` method + - Agents act through `execute_action()` method + - Environment simulates through `step()` and `run()` methods + +2. **Agent Types**: + - Simple reflex agents (act based on current percept) + - Model-based reflex agents (maintain internal state) + - Table-driven agents (use lookup tables) + - Random agents (choose actions randomly) + +3. **Performance Measurement**: + - Each agent has a performance score + - Different environments define different scoring systems \ No newline at end of file From 4ecb110573f95a3f1d0910e113280ccbfb64b9d6 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Wed, 17 Sep 2025 17:58:23 +0100 Subject: [PATCH 03/56] checkpoint --- A1_COMP9016_Nagle_JohnPaul_R00065426.py | 102 ++++++++++++++++-------- 1 file changed, 67 insertions(+), 35 deletions(-) diff --git a/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 17f9e8231..c62549d85 100644 --- a/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -22,15 +22,13 @@ class NegativeDestination(Thing): class GridWorldEnvironment(Environment): - # This environment has a grid of rows and columns with obstacles randomly dispersed - # + ''' This environment has a grid of rows and columns with obstacles ''' def __init__(self, width=4, height=3): super().__init__() self.width = width self.height = height - def get_agent_percepts(self, agent, env): """ Returns the available moves for an agent in the given environment. @@ -47,7 +45,7 @@ def get_agent_percepts(self, agent, env): # Get positions of all obstacles in the environment obstacle_positions = [(thing.location[0], thing.location[1]) for thing in env.things - if isinstance(thing, Obstacle) and hasattr(thing, 'location')] + if isinstance(thing, Obstacle)] return self.get_available_moves(x, y, env.width, env.height, obstacle_positions) @@ -55,9 +53,6 @@ def get_agent_percepts(self, agent, env): def percept(self, agent): """Override the percept method to include available moves""" - # Get standard percepts from parent class - standard_percepts = super().percept(agent) - # Add available moves to percepts x, y = agent.location obstacle_positions = [(thing.location[0], thing.location[1]) @@ -67,22 +62,14 @@ def percept(self, agent): available_moves = self.get_available_moves(x, y, self.width, self.height, obstacle_positions) # Return both standard percepts and available moves - return (standard_percepts, available_moves) + return (available_moves) def get_available_moves(self, x, y, width, height, obstacles=None): """ Returns a list of available directions (north, south, east, west) that an agent can move - based on its current position and grid boundaries. - - Parameters: - - x, y: Current coordinates of the agent - - width, height: Dimensions of the grid - - obstacles: Optional list of (x,y) tuples representing obstacle positions - - Returns: - - List of available directions as strings ('north', 'south', 'east', 'west') - """ + based on its current position and grid boundaries. """ + if obstacles is None: obstacles = [] @@ -109,38 +96,81 @@ def get_available_moves(self, x, y, width, height, obstacles=None): def execute_action(self, agent, action): - # First execute the standard action - super().execute_action(agent, action) - + print(f"Executing action {action}") + print(f"Before action Location is {agent.location}") + + # Calculate obstacle positions + obstacle_positions = [(thing.location[0], thing.location[1]) + for thing in self.things + if isinstance(thing, Obstacle)] + if action not in self.get_available_moves(agent.location[0], + agent.location[1], + self.width, + self.height, + obstacle_positions): + print("❌ Cant go that direction!") + return + + if action == 'north': + agent.location = (agent.location[0], agent.location[1] - 1) # Move up (decrease y) + elif action == 'south': + agent.location = (agent.location[0], agent.location[1] + 1) # Move down (increase y) + elif action == 'east': + agent.location = (agent.location[0] + 1, agent.location[1]) # Move right (increase x) + elif action == 'west': + agent.location = (agent.location[0] - 1, agent.location[1]) # Move left (decrease x) + else: + agent.location = (agent.location[0], agent.location[1]) + + print(f"After action Location is {agent.location}") + # Check if agent is at a positive destination positive_destinations = self.list_things_at(agent.location, PositiveDestination) if positive_destinations: agent.performance += 1 - print(f"Agent reached positive destination! Score +1. Total: {agent.performance}") + print(f"🎉 Agent reached positive destination! Score +1. Total: {agent.performance}") # Check if agent is at a negative destination negative_destinations = self.list_things_at(agent.location, NegativeDestination) if negative_destinations: agent.performance -= 1 - print(f"Agent reached negative destination! Score -1. Total: {agent.performance}") + print(f"😭 Agent reached negative destination! Score -1. Total: {agent.performance}") -def simple_agent_program(percept): +def random_agent_program(percept): """A simple agent program that moves randomly""" - return random.choice(['Forward', 'TurnRight', 'TurnLeft']) + return random.choice(['south', 'east', 'north', 'west']) # Create and set up the environment -def create_custom_environment(): - # Create environment with width 4 and height 3 - env = GridWorldEnvironment(4, 3) - - env.add_thing(Obstacle(), (2, 3)) - env.add_thing(PositiveDestination(), (4, 1)) - env.add_thing(NegativeDestination(), (3, 1)) +def create_gridworld_environment(width, height): + env = GridWorldEnvironment(width, height) + + # Generate some random locations for the obstacle, the positive block and the negative block + obstacle_x = random.randint(0, width-1) + obstacle_y = random.randint(0, height-1) + + while True: + pos_x = random.randint(0, width -1) + pos_y = random.randint(0, height - 1) + if (pos_x, pos_y) != (obstacle_x, obstacle_y): + break + + while True: + neg_x = random.randint(0, width -1) + neg_y = random.randint(0, height - 1) + if (neg_x, neg_y) != (obstacle_x, obstacle_y) and (neg_x, neg_y) != (pos_x, pos_y): + break + + print(f"Obstacle location is {obstacle_x}, {obstacle_y}") + print(f"Positive location is {pos_x}, {pos_y}") + print(f"Negative location is {neg_x}, {neg_y}") + + env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) + env.add_thing(PositiveDestination(), (pos_x, pos_y)) + env.add_thing(NegativeDestination(), (neg_x, neg_y)) # Create and add an agent with a direction - agent = Agent(simple_agent_program) - agent.direction = Direction("right") # Give the agent a direction + agent = Agent(random_agent_program) env.add_thing(agent, (0, 0)) return env @@ -148,8 +178,10 @@ def create_custom_environment(): def main(): - env = create_custom_environment() + # Generate + env = create_gridworld_environment(4, 3) env.run(20) + print(f"********** FINAL SCORE {env.agents[0].performance} ********") if __name__ == "__main__": main() From 0681f73aa979b0168d3360100e0f3c0ffe188540 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Sun, 21 Sep 2025 16:15:23 +0100 Subject: [PATCH 04/56] checkpoint --- A1_COMP9016_Nagle_JohnPaul_R00065426.py | 269 +++++++++++++++--------- 1 file changed, 174 insertions(+), 95 deletions(-) diff --git a/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/A1_COMP9016_Nagle_JohnPaul_R00065426.py index c62549d85..0653db7d0 100644 --- a/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -1,5 +1,46 @@ +""" +# A1_COMP9016_Nagle_JohnPaul_R00065426.py +# +# Name: (John) Paul Nagle +# Student ID: R00065426 +# Class: Knowledge Representation +# Assignment: 1 +# +# The 2D world is comprised of a 4 by 3 grid of blocks. +# There is one obstacle block that no agent can move to at (1, 1) +# An agent gets charged some points (sum of x and y co-ordinates) for making a move. +# An agent gets penalised 50 points if it lands on the penalty block (3, 1) +# If the agent reaches the winning block (3, 0) it gets 100 points, wins the game and +# the game ends +# If the agent does not reach the winning block in the set number of moves, the game ends +# and the agent has lost the game. +# +# Here is a map of the 2D world +┌──────────┬──────────┬──────────┬──────────┐ +│(0,0) │(1,0) │(2,0) │(3,0) │ +│ │ │ │ │ +│ │ │ │ WIN GAME │ +┼──────────┼──────────┼──────────┼──────────┤ +│(0,1) │(1,1) │(2,1) │(3,1) │ +│ │ │ │ │ +│ │ OBSTACLE │ │ PENALTY │ +┼──────────┼──────────┼──────────┼──────────┤ +│(0,2) │(1,2) │(2,2) │(3,2) │ +│ │ │ │ │ +│ │ │ │ │ +└──────────┴──────────┴──────────┴──────────┘ + + +# Agents: Random Agent, picks the noxt move randomly +# Reflex agent, always moves to the cheapest adjacent square. +# Goal Based Agent, uses the history of precepts to determine the next move. + + +""" + import sys import os +import random # Get the parent dir of the current directory parent_dir = os.path.dirname(os.getcwd()) @@ -8,23 +49,26 @@ sys.path.append(parent_dir) # Now you can import a module from the parent directory -from agents import * +from agents4e import Thing, XYEnvironment, Agent, Obstacle + +GAME_WON=False # Define custom destination blocks class PositiveDestination(Thing): - """A destination that awards 1 point when an agent reaches it""" + """A destination that awards 100 points and wins the game when an agent reaches it""" pass + class NegativeDestination(Thing): - """A destination that penalizes 1 point when an agent reaches it""" + """A destination that penalises 50 points when an agent reaches it""" pass -class GridWorldEnvironment(Environment): +class GridWorldEnvironment(XYEnvironment): ''' This environment has a grid of rows and columns with obstacles ''' - def __init__(self, width=4, height=3): + def __init__(self, width, height): super().__init__() self.width = width self.height = height @@ -32,156 +76,191 @@ def __init__(self, width=4, height=3): def get_agent_percepts(self, agent, env): """ Returns the available moves for an agent in the given environment. - - Parameters: - - agent: The agent object - - env: The XYEnvironment object - - Returns: - - List of available directions """ x, y = agent.location # Get positions of all obstacles in the environment - obstacle_positions = [(thing.location[0], thing.location[1]) - for thing in env.things + obstacle_positions = [ + (thing.location[0], thing.location[1]) + for thing in env.things if isinstance(thing, Obstacle)] return self.get_available_moves(x, y, env.width, env.height, obstacle_positions) - - def percept(self, agent): - """Override the percept method to include available moves""" - # Add available moves to percepts + """ In this environment, a percept is a list of available movements from the agent's current location, + based on the grid size and location of any obstacles in the environment, and the cost of moving to the + new location. + The movement directions could be 'up', 'down', 'left', or 'right'.""" x, y = agent.location obstacle_positions = [(thing.location[0], thing.location[1]) for thing in self.things if isinstance(thing, Obstacle)] - - available_moves = self.get_available_moves(x, y, self.width, self.height, obstacle_positions) - - # Return both standard percepts and available moves - return (available_moves) + available_moves_with_costs = self.get_available_moves(x, y, self.width, self.height, obstacle_positions) + return available_moves_with_costs def get_available_moves(self, x, y, width, height, obstacles=None): """ - Returns a list of available directions (north, south, east, west) that an agent can move - based on its current position and grid boundaries. """ + Returns a list of available directions (up, down, left, right) that an agent can move + based on its current position, grid boundaries and obstacles """ if obstacles is None: obstacles = [] - + available_moves = [] - - # Check North (up, decreasing y) + + # Check up (up is decreasing y) if y > 0 and (x, y-1) not in obstacles: - available_moves.append('north') - - # Check South (down, increasing y) + available_moves.append(('up', (x + (y-1)))) + + # Check down (down is increasing y) if y < height-1 and (x, y+1) not in obstacles: - available_moves.append('south') - - # Check East (right, increasing x) + available_moves.append(('down', (x + (y+1)))) + + # Check right (right is increasing x) if x < width-1 and (x+1, y) not in obstacles: - available_moves.append('east') - - # Check West (left, decreasing x) - if x > 0 and (x-1, y) not in obstacles: - available_moves.append('west') - - return available_moves + available_moves.append(('right', ((x+1) + y))) + # Check left (left is decreasing x) + if x > 0 and (x-1, y) not in obstacles: + available_moves.append(('left', ((x-1) + y))) + # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") + return available_moves def execute_action(self, agent, action): - print(f"Executing action {action}") - print(f"Before action Location is {agent.location}") + global GAME_WON + initial_location = agent.location - # Calculate obstacle positions + # Calculate obstacle positions obstacle_positions = [(thing.location[0], thing.location[1]) - for thing in self.things - if isinstance(thing, Obstacle)] - if action not in self.get_available_moves(agent.location[0], - agent.location[1], - self.width, - self.height, - obstacle_positions): - print("❌ Cant go that direction!") + for thing in self.things + if isinstance(thing, Obstacle)] + + # Get the list of moves available to the agent, and exit if the current move is invalid + if not any(action in tup for tup in self.get_available_moves(agent.location[0], + agent.location[1], + self.width, + self.height, + obstacle_positions)): + + print(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") return - if action == 'north': + if action == 'up': agent.location = (agent.location[0], agent.location[1] - 1) # Move up (decrease y) - elif action == 'south': + elif action == 'down': agent.location = (agent.location[0], agent.location[1] + 1) # Move down (increase y) - elif action == 'east': - agent.location = (agent.location[0] + 1, agent.location[1]) # Move right (increase x) - elif action == 'west': + elif action == 'left': agent.location = (agent.location[0] - 1, agent.location[1]) # Move left (decrease x) + elif action == 'right': + agent.location = (agent.location[0] + 1, agent.location[1]) # Move right (increase x) else: - agent.location = (agent.location[0], agent.location[1]) + agent.location = (agent.location[0], agent.location[1]) + print(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") - print(f"After action Location is {agent.location}") + # Charge the agent some points to the agent for making a move + agent.performance -= (agent.location[0] + agent.location[1]) - # Check if agent is at a positive destination + # Check if agent is at the winning destination positive_destinations = self.list_things_at(agent.location, PositiveDestination) if positive_destinations: - agent.performance += 1 - print(f"🎉 Agent reached positive destination! Score +1. Total: {agent.performance}") - - # Check if agent is at a negative destination + agent.performance += 100 + print("Agent reached winning destination! Performance increase 100.") + print(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + GAME_WON=True + + # Check if agent is at a penalty destination negative_destinations = self.list_things_at(agent.location, NegativeDestination) if negative_destinations: - agent.performance -= 1 - print(f"😭 Agent reached negative destination! Score -1. Total: {agent.performance}") + agent.performance -= 50 + print(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + + +class ReflexAgent(Agent): + """A reflex agent that always moves to the cheapest adjacent square. + This agent doesnt care about the percept list. """ + + def __init__(self): + super().__init__(self.cheapest_move) + + def cheapest_move(self, percept): + """ + Takes a percept (list of available moves with costs) and returns + the direction with the lowest cost. + + Each move in percept is a tuple of (direction, cost) + """ + if not percept: + return None # No moves available + + # Find the move with the minimum cost + cheapest = min(percept, key=lambda x: x[1]) + + # Return the direction of the cheapest move + return cheapest[0] + + +class RandomAgent(Agent): + """A simple agent program that moves randomly. The agent does receive a percept, but ignores it, as it is a random agent. + The agent returns a random action """ + def __init__(self): + super().__init__(self.random_move) + + def random_move(self, percept): + return random.choice(['down', 'left', 'up', 'right']) -def random_agent_program(percept): - """A simple agent program that moves randomly""" - return random.choice(['south', 'east', 'north', 'west']) # Create and set up the environment -def create_gridworld_environment(width, height): +def create_gridworld_environment(width, height, env_agent): + + # Create the 2D grid world with the set width and height env = GridWorldEnvironment(width, height) - # Generate some random locations for the obstacle, the positive block and the negative block - obstacle_x = random.randint(0, width-1) - obstacle_y = random.randint(0, height-1) + # Set the poitions of the obstacle, the penalty block and the winning block + obstacle_x = 1 + obstacle_y = 1 + pos_x = 3 + pos_y = 0 + neg_x = 3 + neg_y = 1 - while True: - pos_x = random.randint(0, width -1) - pos_y = random.randint(0, height - 1) - if (pos_x, pos_y) != (obstacle_x, obstacle_y): - break + # Add the obstacle, the penalty block and the winning block to the environment + env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) + env.add_thing(PositiveDestination(), (pos_x, pos_y)) + env.add_thing(NegativeDestination(), (neg_x, neg_y)) - while True: - neg_x = random.randint(0, width -1) - neg_y = random.randint(0, height - 1) - if (neg_x, neg_y) != (obstacle_x, obstacle_y) and (neg_x, neg_y) != (pos_x, pos_y): - break + # Create and add the agent to the environment + agent = Agent(env_agent) + random_position = (random.randint(0, width - 1), random.randint(0, height - 1)) + env.add_thing(agent, random_position) print(f"Obstacle location is {obstacle_x}, {obstacle_y}") print(f"Positive location is {pos_x}, {pos_y}") print(f"Negative location is {neg_x}, {neg_y}") + print(f"Starting position is {random_position}") - env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) - env.add_thing(PositiveDestination(), (pos_x, pos_y)) - env.add_thing(NegativeDestination(), (neg_x, neg_y)) - - # Create and add an agent with a direction - agent = Agent(random_agent_program) - env.add_thing(agent, (0, 0)) - return env def main(): + global GAME_WON + + # Generate and run the environment for 20 steps with a list of agents + agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] + for agent in agent_list: + print("********************************************************") + print(f"* Agent: {agent.__name__:45} *") + print("********************************************************") + env = create_gridworld_environment(4, 3, agent) + env.run(20) + if not GAME_WON: + print(f"😔 Winning location not found.. {agent.__name__} lost with a score of {env.agents[0].performance}") + GAME_WON=False + print("\n") - # Generate - env = create_gridworld_environment(4, 3) - env.run(20) - print(f"********** FINAL SCORE {env.agents[0].performance} ********") if __name__ == "__main__": main() From ed78e21dd23ab6bee8e612b6b01512fc2f61403d Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Sat, 27 Sep 2025 15:29:46 +0100 Subject: [PATCH 05/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 266 ++++++++++++++++++ .../A1_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 0 -> 22642 bytes 2 files changed, 266 insertions(+) create mode 100644 assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py create mode 100644 assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py new file mode 100644 index 000000000..f959e4108 --- /dev/null +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -0,0 +1,266 @@ +""" +# A1_COMP9016_Nagle_JohnPaul_R00065426.py +# +# Name: (John) Paul Nagle +# Student ID: R00065426 +# Class: Knowledge Representation +# Assignment: 1 +# +# The 2D world is comprised of a 4 by 3 grid of blocks. +# There is one obstacle block that no agent can move to at (1, 1) +# An agent gets charged some points (sum of x and y co-ordinates) for making a move. +# An agent gets penalised 50 points if it lands on the penalty block (3, 1) +# If the agent reaches the winning block (3, 0) it gets 100 points, wins the game and +# the game ends +# If the agent does not reach the winning block in the set number of moves, the game ends +# and the agent has lost the game. +# +# Here is a map of the 2D world +┌──────────┬──────────┬──────────┬──────────┐ +│(0,0) │(1,0) │(2,0) │(3,0) │ +│ │ │ │ │ +│ │ │ │ WIN GAME │ +┼──────────┼──────────┼──────────┼──────────┤ +│(0,1) │(1,1) │(2,1) │(3,1) │ +│ │ │ │ │ +│ │ OBSTACLE │ │ PENALTY │ +┼──────────┼──────────┼──────────┼──────────┤ +│(0,2) │(1,2) │(2,2) │(3,2) │ +│ │ │ │ │ +│ │ │ │ │ +└──────────┴──────────┴──────────┴──────────┘ + + +# Agents: Random Agent, picks the noxt move randomly +# Reflex agent, always moves to the cheapest adjacent square. +# Goal Based Agent, uses the history of precepts to determine the next move. + + +""" + +import sys +import os +import random + +# Get the parent dir of the current directory +parent_dir = os.path.dirname(os.getcwd()) + +# Add the parent directory to sys.path +sys.path.append(parent_dir) + +# Now you can import a module from the parent directory +from agents4e import Thing, XYEnvironment, Agent, Obstacle + + +GAME_WON=False + +# Define custom destination blocks +class PositiveDestination(Thing): + """A destination that awards 100 points and wins the game when an agent reaches it""" + pass + + +class NegativeDestination(Thing): + """A destination that penalises 50 points when an agent reaches it""" + pass + + +class GridWorldEnvironment(XYEnvironment): + ''' This environment has a grid of rows and columns with obstacles ''' + + def __init__(self, width, height): + super().__init__() + self.width = width + self.height = height + + def get_agent_percepts(self, agent, env): + """ + Returns the available moves for an agent in the given environment. + """ + x, y = agent.location + + # Get positions of all obstacles in the environment + obstacle_positions = [ + (thing.location[0], thing.location[1]) + for thing in env.things + if isinstance(thing, Obstacle)] + + return self.get_available_moves(x, y, env.width, env.height, obstacle_positions) + + def percept(self, agent): + """ In this environment, a percept is a list of available movements from the agent's current location, + based on the grid size and location of any obstacles in the environment, and the cost of moving to the + new location. + The movement directions could be 'up', 'down', 'left', or 'right'.""" + x, y = agent.location + obstacle_positions = [(thing.location[0], thing.location[1]) + for thing in self.things + if isinstance(thing, Obstacle)] + + available_moves_with_costs = self.get_available_moves(x, y, self.width, self.height, obstacle_positions) + return available_moves_with_costs + + def get_available_moves(self, x, y, width, height, obstacles=None): + """ + Returns a list of available directions (up, down, left, right) that an agent can move + based on its current position, grid boundaries and obstacles """ + + if obstacles is None: + obstacles = [] + + available_moves = [] + + # Check up (up is decreasing y) + if y > 0 and (x, y-1) not in obstacles: + available_moves.append(('up', (x + (y-1)))) + + # Check down (down is increasing y) + if y < height-1 and (x, y+1) not in obstacles: + available_moves.append(('down', (x + (y+1)))) + + # Check right (right is increasing x) + if x < width-1 and (x+1, y) not in obstacles: + available_moves.append(('right', ((x+1) + y))) + + # Check left (left is decreasing x) + if x > 0 and (x-1, y) not in obstacles: + available_moves.append(('left', ((x-1) + y))) + + # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") + return available_moves + + def execute_action(self, agent, action): + global GAME_WON + initial_location = agent.location + + # Calculate obstacle positions + obstacle_positions = [(thing.location[0], thing.location[1]) + for thing in self.things + if isinstance(thing, Obstacle)] + + # Get the list of moves available to the agent, and exit if the current move is invalid + if not any(action in tup for tup in self.get_available_moves(agent.location[0], + agent.location[1], + self.width, + self.height, + obstacle_positions)): + + print(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") + return + + if action == 'up': + agent.location = (agent.location[0], agent.location[1] - 1) # Move up (decrease y) + elif action == 'down': + agent.location = (agent.location[0], agent.location[1] + 1) # Move down (increase y) + elif action == 'left': + agent.location = (agent.location[0] - 1, agent.location[1]) # Move left (decrease x) + elif action == 'right': + agent.location = (agent.location[0] + 1, agent.location[1]) # Move right (increase x) + else: + agent.location = (agent.location[0], agent.location[1]) + print(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") + + # Charge the agent some points to the agent for making a move + agent.performance -= (agent.location[0] + agent.location[1]) + + # Check if agent is at the winning destination + positive_destinations = self.list_things_at(agent.location, PositiveDestination) + if positive_destinations: + agent.performance += 100 + print("Agent reached winning destination! Performance increase 100.") + print(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + GAME_WON=True + + # Check if agent is at a penalty destination + negative_destinations = self.list_things_at(agent.location, NegativeDestination) + if negative_destinations: + agent.performance -= 50 + print(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + + +class ReflexAgent(Agent): + """A reflex agent that always moves to the cheapest adjacent square. + This agent doesnt care about the percept list. """ + + def __init__(self): + super().__init__(self.cheapest_move) + + def cheapest_move(self, percept): + """ + Takes a percept (list of available moves with costs) and returns + the direction with the lowest cost. + + Each move in percept is a tuple of (direction, cost) + """ + if not percept: + return None # No moves available + + # Find the move with the minimum cost + cheapest = min(percept, key=lambda x: x[1]) + + # Return the direction of the cheapest move + return cheapest[0] + + +class RandomAgent(Agent): + """A simple agent program that moves randomly. The agent does receive a percept, but ignores it, as it is a random agent. + The agent returns a random action """ + def __init__(self): + super().__init__(self.random_move) + + def random_move(self, percept): + return random.choice(['down', 'left', 'up', 'right']) + + + +# Create and set up the environment +def create_gridworld_environment(width, height, env_agent): + + # Create the 2D grid world with the set width and height + env = GridWorldEnvironment(width, height) + + # Set the poitions of the obstacle, the penalty block and the winning block + obstacle_x = 1 + obstacle_y = 1 + pos_x = 3 + pos_y = 0 + neg_x = 3 + neg_y = 1 + + # Add the obstacle, the penalty block and the winning block to the environment + env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) + env.add_thing(PositiveDestination(), (pos_x, pos_y)) + env.add_thing(NegativeDestination(), (neg_x, neg_y)) + + # Create and add the agent to the environment + agent = Agent(env_agent) + random_position = (random.randint(0, width - 1), random.randint(0, height - 1)) + env.add_thing(agent, random_position) + + print(f"Obstacle location is {obstacle_x}, {obstacle_y}") + print(f"Positive location is {pos_x}, {pos_y}") + print(f"Negative location is {neg_x}, {neg_y}") + print(f"Starting position is {random_position}") + + return env + + +def main(): + global GAME_WON + + # Generate and run the environment for 20 steps with a list of agents + agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] + for agent in agent_list: + print("********************************************************") + print(f"* Agent: {agent.__name__:45} *") + print("********************************************************") + env = create_gridworld_environment(4, 3, agent) + env.run(20) + if not GAME_WON: + print(f"😔 Winning location not found.. {agent.__name__} lost with a score of {env.agents[0].performance}") + GAME_WON=False + print("\n") + + +if __name__ == "__main__": + main() diff --git a/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx new file mode 100644 index 0000000000000000000000000000000000000000..0c1334dd6b89e437790a5e71ca1f1c064fa1f6a3 GIT binary patch literal 22642 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 l(4+U( Date: Sat, 27 Sep 2025 17:15:32 +0100 Subject: [PATCH 06/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 194 +++++++++++++----- .../~$_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 0 -> 162 bytes 2 files changed, 143 insertions(+), 51 deletions(-) create mode 100644 assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index f959e4108..c5e208561 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -6,16 +6,17 @@ # Class: Knowledge Representation # Assignment: 1 # -# The 2D world is comprised of a 4 by 3 grid of blocks. -# There is one obstacle block that no agent can move to at (1, 1) +# The 2D world is comprised of a grid of blocks. +# There is one obstacle block that no agent can move to # An agent gets charged some points (sum of x and y co-ordinates) for making a move. -# An agent gets penalised 50 points if it lands on the penalty block (3, 1) -# If the agent reaches the winning block (3, 0) it gets 100 points, wins the game and +# An agent gets penalised 50 points if it lands on the penalty block +# If the agent reaches the winning block it gets 100 points, wins the game and # the game ends # If the agent does not reach the winning block in the set number of moves, the game ends # and the agent has lost the game. # -# Here is a map of the 2D world +# Here is an example map of the 2D world +# (4 by 3 grid, obstacle at (1, 1), penalty at (3, 1) and winning block at (3, 0)) ┌──────────┬──────────┬──────────┬──────────┐ │(0,0) │(1,0) │(2,0) │(3,0) │ │ │ │ │ │ @@ -31,8 +32,9 @@ └──────────┴──────────┴──────────┴──────────┘ -# Agents: Random Agent, picks the noxt move randomly -# Reflex agent, always moves to the cheapest adjacent square. +# Agents: Random Agent, picks the next move randomly (for comparison only) +# Simple Reflex agent, always moves to the cheapest adjacent square. +# Model based reflex agent, uses a model to predict the future. # Goal Based Agent, uses the history of precepts to determine the next move. @@ -41,9 +43,23 @@ import sys import os import random +import argparse -# Get the parent dir of the current directory -parent_dir = os.path.dirname(os.getcwd()) +# Parse command line arguments +parser = argparse.ArgumentParser(description='Grid World Environment Simulation') +parser.add_argument('-v', '--verbose', action='http://github.com/store_true', + help='Print detailed movement information') +parser.add_argument('-s', '--steps', type=int, required=True, + help='Number of steps to run the simulation (mandatory)') +parser.add_argument('-r', '--runs', type=int, required=True, + help='Number of times to run each agent (mandatory)') +args = parser.parse_args() + +# Get the absolute path of the script's directory +script_dir = os.path.dirname(os.path.abspath(__file__)) + +# Get the parent directory (project root) +parent_dir = os.path.dirname(script_dir) # Add the parent directory to sys.path sys.path.append(parent_dir) @@ -51,9 +67,10 @@ # Now you can import a module from the parent directory from agents4e import Thing, XYEnvironment, Agent, Obstacle - +# A global variable to keep track of whether the game is won or not GAME_WON=False + # Define custom destination blocks class PositiveDestination(Thing): """A destination that awards 100 points and wins the game when an agent reaches it""" @@ -78,13 +95,13 @@ def get_agent_percepts(self, agent, env): Returns the available moves for an agent in the given environment. """ x, y = agent.location - - # Get positions of all obstacles in the environment + + # A list of positions of all obstacles in the environment obstacle_positions = [ (thing.location[0], thing.location[1]) for thing in env.things if isinstance(thing, Obstacle)] - + return self.get_available_moves(x, y, env.width, env.height, obstacle_positions) def percept(self, agent): @@ -144,8 +161,8 @@ def execute_action(self, agent, action): self.width, self.height, obstacle_positions)): - - print(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") + if args.verbose: + print(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") return if action == 'up': @@ -158,7 +175,8 @@ def execute_action(self, agent, action): agent.location = (agent.location[0] + 1, agent.location[1]) # Move right (increase x) else: agent.location = (agent.location[0], agent.location[1]) - print(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") + if args.verbose: + print(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") # Charge the agent some points to the agent for making a move agent.performance -= (agent.location[0] + agent.location[1]) @@ -167,15 +185,23 @@ def execute_action(self, agent, action): positive_destinations = self.list_things_at(agent.location, PositiveDestination) if positive_destinations: agent.performance += 100 - print("Agent reached winning destination! Performance increase 100.") - print(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + if args.verbose: + print("Agent reached winning destination! Performance increase 100.") + print(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + print("👏 Well done! You've successfully completed the game!") GAME_WON=True # Check if agent is at a penalty destination negative_destinations = self.list_things_at(agent.location, NegativeDestination) if negative_destinations: agent.performance -= 50 - print(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + if args.verbose: + print(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + + def is_done(self): + """The environment is done if the agent has won the game or if no agents are alive.""" + global GAME_WON + return GAME_WON or super().is_done() class ReflexAgent(Agent): @@ -207,60 +233,126 @@ class RandomAgent(Agent): The agent returns a random action """ def __init__(self): super().__init__(self.random_move) - + def random_move(self, percept): return random.choice(['down', 'left', 'up', 'right']) - # Create and set up the environment -def create_gridworld_environment(width, height, env_agent): +def create_gridworld_environment(width, height): # Create the 2D grid world with the set width and height env = GridWorldEnvironment(width, height) - # Set the poitions of the obstacle, the penalty block and the winning block - obstacle_x = 1 - obstacle_y = 1 - pos_x = 3 - pos_y = 0 - neg_x = 3 - neg_y = 1 + # Set random positions for the obstacle, the penalty block and the winning block + # Create a list to track occupied positions + occupied_positions = [] + + # Generate random position for obstacle + obstacle_x = random.randint(0, width - 1) + obstacle_y = random.randint(0, height - 1) + occupied_positions.append((obstacle_x, obstacle_y)) + + # Generate random position for positive destination (winning block) + while True: + pos_x = random.randint(0, width - 1) + pos_y = random.randint(0, height - 1) + if (pos_x, pos_y) not in occupied_positions: + occupied_positions.append((pos_x, pos_y)) + break + + # Generate random position for negative destination (penalty block) + while True: + neg_x = random.randint(0, width - 1) + neg_y = random.randint(0, height - 1) + if (neg_x, neg_y) not in occupied_positions: + occupied_positions.append((neg_x, neg_y)) + break # Add the obstacle, the penalty block and the winning block to the environment env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) env.add_thing(PositiveDestination(), (pos_x, pos_y)) env.add_thing(NegativeDestination(), (neg_x, neg_y)) - # Create and add the agent to the environment - agent = Agent(env_agent) - random_position = (random.randint(0, width - 1), random.randint(0, height - 1)) - env.add_thing(agent, random_position) + if args.verbose: + print(f"Obstacle location is {obstacle_x}, {obstacle_y}") + print(f"Positive location is {pos_x}, {pos_y}") + print(f"Negative location is {neg_x}, {neg_y}") - print(f"Obstacle location is {obstacle_x}, {obstacle_y}") - print(f"Positive location is {pos_x}, {pos_y}") - print(f"Negative location is {neg_x}, {neg_y}") - print(f"Starting position is {random_position}") + return env, occupied_positions - return env - -def main(): +def building_your_world(steps, runs): global GAME_WON - # Generate and run the environment for 20 steps with a list of agents - agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] - for agent in agent_list: + # Generate and run the environment for {steps} steps with a list of agents + agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] + + for agent_program in agent_list: + print("") print("********************************************************") - print(f"* Agent: {agent.__name__:45} *") + print(f"* Agent: {agent_program.__name__:45} *") print("********************************************************") - env = create_gridworld_environment(4, 3, agent) - env.run(20) - if not GAME_WON: - print(f"😔 Winning location not found.. {agent.__name__} lost with a score of {env.agents[0].performance}") - GAME_WON=False - print("\n") + + # Statistics for this agent across all runs + total_performance = 0 + wins = 0 + + # Run the agent the specified number of times + for run in range(1, runs + 1): + # Create a new environment for each run + width, height = 10, 10 + env, occupied_positions = create_gridworld_environment(width, height) + + if args.verbose: + print(f"\nRun {run} of {runs}") + + # Create a new agent + agent = Agent(agent_program) + + # Generate random position for agent that doesn't overlap with other objects + while True: + random_position = (random.randint(0, width - 1), random.randint(0, height - 1)) + if random_position not in occupied_positions: + break + + # Add the agent to the environment + env.add_thing(agent, random_position) + if args.verbose: + print(f"Starting position is {random_position}") + + # Run the simulation + env.run(steps) + + # Update statistics + total_performance += env.agents[0].performance + if GAME_WON: + wins += 1 + + # Print results for this run + print(f"AGENT: {agent_program.__name__:20} RUN:{run}/{runs} STEPS:{steps} RESULT:{'WIN' if GAME_WON else 'LOST'} PERFORMANCE:{env.agents[0].performance}") + + # Remove the agent from the environment + env.delete_thing(agent) + + # Reset the global variable GAME_WON for the next run + GAME_WON = False + + # Print summary statistics for this agent + avg_performance = total_performance / runs + win_rate = (wins / runs) * 100 + print(f"\nSummary for {agent_program.__name__}:") + print(f"Average Performance: {avg_performance:.2f}") + print(f"Win Rate: {win_rate:.2f}% ({wins}/{runs})") + + +def searching_your_world(): + pass if __name__ == "__main__": - main() + # If not in verbose mode, print a message about the -v option + if not args.verbose: + print("Run with -v or --verbose to see detailed movement information") + building_your_world(args.steps, args.runs) + searching_your_world() diff --git a/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx new file mode 100644 index 0000000000000000000000000000000000000000..1215360c558324f168a348f977b46d5a160ee437 GIT binary patch literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Q#Z!U2P@qgIPz9v`0A Date: Sat, 27 Sep 2025 17:17:00 +0100 Subject: [PATCH 07/56] KnowledgeRep Assignment 1 checkpoint --- .../~$_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 162 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx diff --git a/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx deleted file mode 100644 index 1215360c558324f168a348f977b46d5a160ee437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Q#Z!U2P@qgIPz9v`0A Date: Sat, 27 Sep 2025 17:18:16 +0100 Subject: [PATCH 08/56] KnowledgeRep Assignment 1 checkpoint --- A1_COMP9016_Nagle_JohnPaul_R00065426.py | 266 ------------------------ 1 file changed, 266 deletions(-) delete mode 100644 A1_COMP9016_Nagle_JohnPaul_R00065426.py diff --git a/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/A1_COMP9016_Nagle_JohnPaul_R00065426.py deleted file mode 100644 index 0653db7d0..000000000 --- a/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ /dev/null @@ -1,266 +0,0 @@ -""" -# A1_COMP9016_Nagle_JohnPaul_R00065426.py -# -# Name: (John) Paul Nagle -# Student ID: R00065426 -# Class: Knowledge Representation -# Assignment: 1 -# -# The 2D world is comprised of a 4 by 3 grid of blocks. -# There is one obstacle block that no agent can move to at (1, 1) -# An agent gets charged some points (sum of x and y co-ordinates) for making a move. -# An agent gets penalised 50 points if it lands on the penalty block (3, 1) -# If the agent reaches the winning block (3, 0) it gets 100 points, wins the game and -# the game ends -# If the agent does not reach the winning block in the set number of moves, the game ends -# and the agent has lost the game. -# -# Here is a map of the 2D world -┌──────────┬──────────┬──────────┬──────────┐ -│(0,0) │(1,0) │(2,0) │(3,0) │ -│ │ │ │ │ -│ │ │ │ WIN GAME │ -┼──────────┼──────────┼──────────┼──────────┤ -│(0,1) │(1,1) │(2,1) │(3,1) │ -│ │ │ │ │ -│ │ OBSTACLE │ │ PENALTY │ -┼──────────┼──────────┼──────────┼──────────┤ -│(0,2) │(1,2) │(2,2) │(3,2) │ -│ │ │ │ │ -│ │ │ │ │ -└──────────┴──────────┴──────────┴──────────┘ - - -# Agents: Random Agent, picks the noxt move randomly -# Reflex agent, always moves to the cheapest adjacent square. -# Goal Based Agent, uses the history of precepts to determine the next move. - - -""" - -import sys -import os -import random - -# Get the parent dir of the current directory -parent_dir = os.path.dirname(os.getcwd()) - -# Add the parent directory to sys.path -sys.path.append(parent_dir) - -# Now you can import a module from the parent directory -from agents4e import Thing, XYEnvironment, Agent, Obstacle - - -GAME_WON=False - -# Define custom destination blocks -class PositiveDestination(Thing): - """A destination that awards 100 points and wins the game when an agent reaches it""" - pass - - -class NegativeDestination(Thing): - """A destination that penalises 50 points when an agent reaches it""" - pass - - -class GridWorldEnvironment(XYEnvironment): - ''' This environment has a grid of rows and columns with obstacles ''' - - def __init__(self, width, height): - super().__init__() - self.width = width - self.height = height - - def get_agent_percepts(self, agent, env): - """ - Returns the available moves for an agent in the given environment. - """ - x, y = agent.location - - # Get positions of all obstacles in the environment - obstacle_positions = [ - (thing.location[0], thing.location[1]) - for thing in env.things - if isinstance(thing, Obstacle)] - - return self.get_available_moves(x, y, env.width, env.height, obstacle_positions) - - def percept(self, agent): - """ In this environment, a percept is a list of available movements from the agent's current location, - based on the grid size and location of any obstacles in the environment, and the cost of moving to the - new location. - The movement directions could be 'up', 'down', 'left', or 'right'.""" - x, y = agent.location - obstacle_positions = [(thing.location[0], thing.location[1]) - for thing in self.things - if isinstance(thing, Obstacle)] - - available_moves_with_costs = self.get_available_moves(x, y, self.width, self.height, obstacle_positions) - return available_moves_with_costs - - def get_available_moves(self, x, y, width, height, obstacles=None): - """ - Returns a list of available directions (up, down, left, right) that an agent can move - based on its current position, grid boundaries and obstacles """ - - if obstacles is None: - obstacles = [] - - available_moves = [] - - # Check up (up is decreasing y) - if y > 0 and (x, y-1) not in obstacles: - available_moves.append(('up', (x + (y-1)))) - - # Check down (down is increasing y) - if y < height-1 and (x, y+1) not in obstacles: - available_moves.append(('down', (x + (y+1)))) - - # Check right (right is increasing x) - if x < width-1 and (x+1, y) not in obstacles: - available_moves.append(('right', ((x+1) + y))) - - # Check left (left is decreasing x) - if x > 0 and (x-1, y) not in obstacles: - available_moves.append(('left', ((x-1) + y))) - - # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") - return available_moves - - def execute_action(self, agent, action): - global GAME_WON - initial_location = agent.location - - # Calculate obstacle positions - obstacle_positions = [(thing.location[0], thing.location[1]) - for thing in self.things - if isinstance(thing, Obstacle)] - - # Get the list of moves available to the agent, and exit if the current move is invalid - if not any(action in tup for tup in self.get_available_moves(agent.location[0], - agent.location[1], - self.width, - self.height, - obstacle_positions)): - - print(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") - return - - if action == 'up': - agent.location = (agent.location[0], agent.location[1] - 1) # Move up (decrease y) - elif action == 'down': - agent.location = (agent.location[0], agent.location[1] + 1) # Move down (increase y) - elif action == 'left': - agent.location = (agent.location[0] - 1, agent.location[1]) # Move left (decrease x) - elif action == 'right': - agent.location = (agent.location[0] + 1, agent.location[1]) # Move right (increase x) - else: - agent.location = (agent.location[0], agent.location[1]) - print(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") - - # Charge the agent some points to the agent for making a move - agent.performance -= (agent.location[0] + agent.location[1]) - - # Check if agent is at the winning destination - positive_destinations = self.list_things_at(agent.location, PositiveDestination) - if positive_destinations: - agent.performance += 100 - print("Agent reached winning destination! Performance increase 100.") - print(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") - GAME_WON=True - - # Check if agent is at a penalty destination - negative_destinations = self.list_things_at(agent.location, NegativeDestination) - if negative_destinations: - agent.performance -= 50 - print(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") - - -class ReflexAgent(Agent): - """A reflex agent that always moves to the cheapest adjacent square. - This agent doesnt care about the percept list. """ - - def __init__(self): - super().__init__(self.cheapest_move) - - def cheapest_move(self, percept): - """ - Takes a percept (list of available moves with costs) and returns - the direction with the lowest cost. - - Each move in percept is a tuple of (direction, cost) - """ - if not percept: - return None # No moves available - - # Find the move with the minimum cost - cheapest = min(percept, key=lambda x: x[1]) - - # Return the direction of the cheapest move - return cheapest[0] - - -class RandomAgent(Agent): - """A simple agent program that moves randomly. The agent does receive a percept, but ignores it, as it is a random agent. - The agent returns a random action """ - def __init__(self): - super().__init__(self.random_move) - - def random_move(self, percept): - return random.choice(['down', 'left', 'up', 'right']) - - - -# Create and set up the environment -def create_gridworld_environment(width, height, env_agent): - - # Create the 2D grid world with the set width and height - env = GridWorldEnvironment(width, height) - - # Set the poitions of the obstacle, the penalty block and the winning block - obstacle_x = 1 - obstacle_y = 1 - pos_x = 3 - pos_y = 0 - neg_x = 3 - neg_y = 1 - - # Add the obstacle, the penalty block and the winning block to the environment - env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) - env.add_thing(PositiveDestination(), (pos_x, pos_y)) - env.add_thing(NegativeDestination(), (neg_x, neg_y)) - - # Create and add the agent to the environment - agent = Agent(env_agent) - random_position = (random.randint(0, width - 1), random.randint(0, height - 1)) - env.add_thing(agent, random_position) - - print(f"Obstacle location is {obstacle_x}, {obstacle_y}") - print(f"Positive location is {pos_x}, {pos_y}") - print(f"Negative location is {neg_x}, {neg_y}") - print(f"Starting position is {random_position}") - - return env - - -def main(): - global GAME_WON - - # Generate and run the environment for 20 steps with a list of agents - agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] - for agent in agent_list: - print("********************************************************") - print(f"* Agent: {agent.__name__:45} *") - print("********************************************************") - env = create_gridworld_environment(4, 3, agent) - env.run(20) - if not GAME_WON: - print(f"😔 Winning location not found.. {agent.__name__} lost with a score of {env.agents[0].performance}") - GAME_WON=False - print("\n") - - -if __name__ == "__main__": - main() From 86bd1ec8ba521bc945f0d054392cd92aeced6895 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Sat, 27 Sep 2025 17:23:53 +0100 Subject: [PATCH 09/56] KnowledgeRep Assignment 1 checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index c5e208561..73cb217b4 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -44,6 +44,7 @@ import os import random import argparse +import time # Parse command line arguments parser = argparse.ArgumentParser(description='Grid World Environment Simulation') @@ -321,8 +322,11 @@ def building_your_world(steps, runs): if args.verbose: print(f"Starting position is {random_position}") - # Run the simulation + # Run the simulation and measure time + start_time = time.time() env.run(steps) + end_time = time.time() + elapsed_time = end_time - start_time # Update statistics total_performance += env.agents[0].performance @@ -330,7 +334,7 @@ def building_your_world(steps, runs): wins += 1 # Print results for this run - print(f"AGENT: {agent_program.__name__:20} RUN:{run}/{runs} STEPS:{steps} RESULT:{'WIN' if GAME_WON else 'LOST'} PERFORMANCE:{env.agents[0].performance}") + print(f"AGENT:{agent_program.__name__}\tRUN:{run}/{runs}\tSTEPS:{steps}\tRESULT:{'WIN' if GAME_WON else 'LOST'}\tPERFORMANCE:{env.agents[0].performance:5}\t\tTIME:{elapsed_time:.4f}s") # Remove the agent from the environment env.delete_thing(agent) From f7258828a584d8955bc5e8a7ce598183daeab4f3 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Sun, 28 Sep 2025 08:14:50 +0100 Subject: [PATCH 10/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 70 +++++++++---------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 73cb217b4..b785e58c7 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -74,27 +74,24 @@ # Define custom destination blocks class PositiveDestination(Thing): - """A destination that awards 100 points and wins the game when an agent reaches it""" + """ A destination that awards 100 points and wins the game when an agent reaches it """ pass class NegativeDestination(Thing): - """A destination that penalises 50 points when an agent reaches it""" + """ A destination that penalises 50 points when an agent reaches it """ pass class GridWorldEnvironment(XYEnvironment): - ''' This environment has a grid of rows and columns with obstacles ''' - + """ This environment has a grid of rows and columns with obstacles """ def __init__(self, width, height): super().__init__() self.width = width self.height = height def get_agent_percepts(self, agent, env): - """ - Returns the available moves for an agent in the given environment. - """ + """ Returns the available moves for an agent in the given environment. """ x, y = agent.location # A list of positions of all obstacles in the environment @@ -109,7 +106,7 @@ def percept(self, agent): """ In this environment, a percept is a list of available movements from the agent's current location, based on the grid size and location of any obstacles in the environment, and the cost of moving to the new location. - The movement directions could be 'up', 'down', 'left', or 'right'.""" + The movement directions could be 'up', 'down', 'left', or 'right'. """ x, y = agent.location obstacle_positions = [(thing.location[0], thing.location[1]) for thing in self.things @@ -119,9 +116,8 @@ def percept(self, agent): return available_moves_with_costs def get_available_moves(self, x, y, width, height, obstacles=None): - """ - Returns a list of available directions (up, down, left, right) that an agent can move - based on its current position, grid boundaries and obstacles """ + """ Returns a list of available directions (up, down, left, right) that an agent can move + based on its current position, grid boundaries and obstacles """ if obstacles is None: obstacles = [] @@ -200,25 +196,22 @@ def execute_action(self, agent, action): print(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") def is_done(self): - """The environment is done if the agent has won the game or if no agents are alive.""" + """ The environment is done if the agent has won the game or if no agents are alive. """ global GAME_WON return GAME_WON or super().is_done() class ReflexAgent(Agent): - """A reflex agent that always moves to the cheapest adjacent square. - This agent doesnt care about the percept list. """ + """ A reflex agent that always moves to the cheapest adjacent square. + This agent doesnt care about the percept list. """ def __init__(self): super().__init__(self.cheapest_move) def cheapest_move(self, percept): - """ - Takes a percept (list of available moves with costs) and returns - the direction with the lowest cost. - - Each move in percept is a tuple of (direction, cost) - """ + """ Takes a percept (list of available moves with costs) and returns + the direction with the lowest cost. Each move in percept is a tuple + of (direction, cost) """ if not percept: return None # No moves available @@ -230,18 +223,21 @@ def cheapest_move(self, percept): class RandomAgent(Agent): - """A simple agent program that moves randomly. The agent does receive a percept, but ignores it, as it is a random agent. - The agent returns a random action """ - def __init__(self): + """ A simple agent program that moves randomly. The agent does receive a percept, + but ignores it, as it is a random agent. The agent returns a random action """ + def __init__(self): super().__init__(self.random_move) def random_move(self, percept): + """ This function takes a percept and returns a random move """ return random.choice(['down', 'left', 'up', 'right']) # Create and set up the environment def create_gridworld_environment(width, height): - + """ Create a 2D grid world environment with the specified width and height. + The environment is represented as a 2D list of cells, where each cell can be either + a wall, a negative destination (penalty block), or a positive destination (winning block).""" # Create the 2D grid world with the set width and height env = GridWorldEnvironment(width, height) @@ -288,60 +284,60 @@ def building_your_world(steps, runs): # Generate and run the environment for {steps} steps with a list of agents agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] - + for agent_program in agent_list: print("") print("********************************************************") print(f"* Agent: {agent_program.__name__:45} *") print("********************************************************") - + # Statistics for this agent across all runs total_performance = 0 wins = 0 - + # Run the agent the specified number of times for run in range(1, runs + 1): # Create a new environment for each run width, height = 10, 10 env, occupied_positions = create_gridworld_environment(width, height) - + if args.verbose: print(f"\nRun {run} of {runs}") - + # Create a new agent agent = Agent(agent_program) - + # Generate random position for agent that doesn't overlap with other objects while True: random_position = (random.randint(0, width - 1), random.randint(0, height - 1)) if random_position not in occupied_positions: break - + # Add the agent to the environment env.add_thing(agent, random_position) if args.verbose: print(f"Starting position is {random_position}") - + # Run the simulation and measure time start_time = time.time() env.run(steps) end_time = time.time() elapsed_time = end_time - start_time - + # Update statistics total_performance += env.agents[0].performance if GAME_WON: wins += 1 - + # Print results for this run print(f"AGENT:{agent_program.__name__}\tRUN:{run}/{runs}\tSTEPS:{steps}\tRESULT:{'WIN' if GAME_WON else 'LOST'}\tPERFORMANCE:{env.agents[0].performance:5}\t\tTIME:{elapsed_time:.4f}s") - + # Remove the agent from the environment env.delete_thing(agent) - + # Reset the global variable GAME_WON for the next run GAME_WON = False - + # Print summary statistics for this agent avg_performance = total_performance / runs win_rate = (wins / runs) * 100 From ddc6769629367c576777b646e1fec67f6ccf481d Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Sun, 28 Sep 2025 10:23:44 +0100 Subject: [PATCH 11/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 174 ++++++++++-------- .../~$_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 0 -> 162 bytes 2 files changed, 97 insertions(+), 77 deletions(-) create mode 100644 assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index b785e58c7..b213f3d7a 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -15,8 +15,8 @@ # If the agent does not reach the winning block in the set number of moves, the game ends # and the agent has lost the game. # -# Here is an example map of the 2D world -# (4 by 3 grid, obstacle at (1, 1), penalty at (3, 1) and winning block at (3, 0)) +# Here is an example map of the 2D world +# (width 4 by depth 3 grid, obstacle at (1, 1), penalty at (3, 1) and winning block at (3, 0)) ┌──────────┬──────────┬──────────┬──────────┐ │(0,0) │(1,0) │(2,0) │(3,0) │ │ │ │ │ │ @@ -47,15 +47,26 @@ import time # Parse command line arguments -parser = argparse.ArgumentParser(description='Grid World Environment Simulation') +parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') parser.add_argument('-v', '--verbose', action='http://github.com/store_true', - help='Print detailed movement information') + help='Print detailed movement and agent information') parser.add_argument('-s', '--steps', type=int, required=True, - help='Number of steps to run the simulation (mandatory)') + help='Number of steps per run to attempt to win the game (mandatory)') parser.add_argument('-r', '--runs', type=int, required=True, help='Number of times to run each agent (mandatory)') +parser.add_argument('-w', '--width', type=int, required=True, + help='Width of the grid world (mandatory)') +parser.add_argument('-d', '--depth', type=int, required=True, + help='depth of the grid world (mandatory)') args = parser.parse_args() + +def log_message(message): + """Log a message if verbose mode is enabled.""" + if args.verbose: + print(message) + + # Get the absolute path of the script's directory script_dir = os.path.dirname(os.path.abspath(__file__)) @@ -85,10 +96,10 @@ class NegativeDestination(Thing): class GridWorldEnvironment(XYEnvironment): """ This environment has a grid of rows and columns with obstacles """ - def __init__(self, width, height): + def __init__(self, width, depth): super().__init__() self.width = width - self.height = height + self.depth = depth def get_agent_percepts(self, agent, env): """ Returns the available moves for an agent in the given environment. """ @@ -100,7 +111,7 @@ def get_agent_percepts(self, agent, env): for thing in env.things if isinstance(thing, Obstacle)] - return self.get_available_moves(x, y, env.width, env.height, obstacle_positions) + return self.get_available_moves(x, y, env.width, env.depth, obstacle_positions) def percept(self, agent): """ In this environment, a percept is a list of available movements from the agent's current location, @@ -108,14 +119,15 @@ def percept(self, agent): new location. The movement directions could be 'up', 'down', 'left', or 'right'. """ x, y = agent.location - obstacle_positions = [(thing.location[0], thing.location[1]) - for thing in self.things - if isinstance(thing, Obstacle)] + obstacle_positions = [ + (thing.location[0], thing.location[1]) + for thing in self.things + if isinstance(thing, Obstacle)] - available_moves_with_costs = self.get_available_moves(x, y, self.width, self.height, obstacle_positions) + available_moves_with_costs = self.get_available_moves(x, y, self.width, self.depth, obstacle_positions) return available_moves_with_costs - def get_available_moves(self, x, y, width, height, obstacles=None): + def get_available_moves(self, x, y, width, depth, obstacles=None): """ Returns a list of available directions (up, down, left, right) that an agent can move based on its current position, grid boundaries and obstacles """ @@ -129,7 +141,7 @@ def get_available_moves(self, x, y, width, height, obstacles=None): available_moves.append(('up', (x + (y-1)))) # Check down (down is increasing y) - if y < height-1 and (x, y+1) not in obstacles: + if y < depth-1 and (x, y+1) not in obstacles: available_moves.append(('down', (x + (y+1)))) # Check right (right is increasing x) @@ -148,52 +160,65 @@ def execute_action(self, agent, action): initial_location = agent.location # Calculate obstacle positions - obstacle_positions = [(thing.location[0], thing.location[1]) - for thing in self.things - if isinstance(thing, Obstacle)] - - # Get the list of moves available to the agent, and exit if the current move is invalid - if not any(action in tup for tup in self.get_available_moves(agent.location[0], - agent.location[1], - self.width, - self.height, - obstacle_positions)): - if args.verbose: - print(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") + obstacle_positions = [ + (thing.location[0], thing.location[1]) + for thing in self.things + if isinstance(thing, Obstacle)] + + # Check if move is valid + if not self._is_valid_move(agent, action, obstacle_positions): + log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") return - if action == 'up': - agent.location = (agent.location[0], agent.location[1] - 1) # Move up (decrease y) - elif action == 'down': - agent.location = (agent.location[0], agent.location[1] + 1) # Move down (increase y) - elif action == 'left': - agent.location = (agent.location[0] - 1, agent.location[1]) # Move left (decrease x) - elif action == 'right': - agent.location = (agent.location[0] + 1, agent.location[1]) # Move right (increase x) - else: - agent.location = (agent.location[0], agent.location[1]) - if args.verbose: - print(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") - - # Charge the agent some points to the agent for making a move + # Update agent location based on action + location_updates = { + 'up': (0, -1), + 'down': (0, 1), + 'left': (-1, 0), + 'right': (1, 0) + } + + if action in location_updates: + dx, dy = location_updates[action] + agent.location = (agent.location[0] + dx, agent.location[1] + dy) + + log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") + + # Charge the agent for making a move (the cost is the sum of the x and y co-ordinates) agent.performance -= (agent.location[0] + agent.location[1]) - # Check if agent is at the winning destination + # Check destinations and apply effects + self._check_destinations(agent) + + def _is_valid_move(self, agent, action, obstacle_positions): + """Check if the action is valid for the agent's current position.""" + available_moves = self.get_available_moves( + agent.location[0], + agent.location[1], + self.width, + self.depth, + obstacle_positions + ) + return any(action in tup for tup in available_moves) + + def _check_destinations(self, agent): + """Check if agent is at special destinations and apply effects.""" + global GAME_WON + + # Check for positive destination (winning) positive_destinations = self.list_things_at(agent.location, PositiveDestination) if positive_destinations: agent.performance += 100 - if args.verbose: - print("Agent reached winning destination! Performance increase 100.") - print(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") - print("👏 Well done! You've successfully completed the game!") - GAME_WON=True + log_message("Agent reached winning destination! Performance increase 100.") + log_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + log_message("👏 Well done! You've successfully completed the game!") + GAME_WON = True - # Check if agent is at a penalty destination + # Check for negative destination (penalty) negative_destinations = self.list_things_at(agent.location, NegativeDestination) if negative_destinations: agent.performance -= 50 - if args.verbose: - print(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + log_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") def is_done(self): """ The environment is done if the agent has won the game or if no agents are alive. """ @@ -234,12 +259,12 @@ def random_move(self, percept): # Create and set up the environment -def create_gridworld_environment(width, height): - """ Create a 2D grid world environment with the specified width and height. +def create_gridworld_environment(width, depth): + """ Create a 2D grid world environment with the specified width and depth. The environment is represented as a 2D list of cells, where each cell can be either a wall, a negative destination (penalty block), or a positive destination (winning block).""" - # Create the 2D grid world with the set width and height - env = GridWorldEnvironment(width, height) + # Create the 2D grid world with the set width and depth + env = GridWorldEnvironment(width, depth) # Set random positions for the obstacle, the penalty block and the winning block # Create a list to track occupied positions @@ -247,13 +272,13 @@ def create_gridworld_environment(width, height): # Generate random position for obstacle obstacle_x = random.randint(0, width - 1) - obstacle_y = random.randint(0, height - 1) + obstacle_y = random.randint(0, depth - 1) occupied_positions.append((obstacle_x, obstacle_y)) # Generate random position for positive destination (winning block) while True: pos_x = random.randint(0, width - 1) - pos_y = random.randint(0, height - 1) + pos_y = random.randint(0, depth - 1) if (pos_x, pos_y) not in occupied_positions: occupied_positions.append((pos_x, pos_y)) break @@ -261,7 +286,7 @@ def create_gridworld_environment(width, height): # Generate random position for negative destination (penalty block) while True: neg_x = random.randint(0, width - 1) - neg_y = random.randint(0, height - 1) + neg_y = random.randint(0, depth - 1) if (neg_x, neg_y) not in occupied_positions: occupied_positions.append((neg_x, neg_y)) break @@ -271,10 +296,9 @@ def create_gridworld_environment(width, height): env.add_thing(PositiveDestination(), (pos_x, pos_y)) env.add_thing(NegativeDestination(), (neg_x, neg_y)) - if args.verbose: - print(f"Obstacle location is {obstacle_x}, {obstacle_y}") - print(f"Positive location is {pos_x}, {pos_y}") - print(f"Negative location is {neg_x}, {neg_y}") + log_message(f"Obstacle location is {obstacle_x}, {obstacle_y}") + log_message(f"Positive location is {pos_x}, {pos_y}") + log_message(f"Negative location is {neg_x}, {neg_y}") return env, occupied_positions @@ -286,37 +310,35 @@ def building_your_world(steps, runs): agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] for agent_program in agent_list: - print("") - print("********************************************************") - print(f"* Agent: {agent_program.__name__:45} *") - print("********************************************************") + log_message("") + log_message("********************************************************") + log_message(f"* Agent: {agent_program.__name__:45} *") + log_message("********************************************************") # Statistics for this agent across all runs total_performance = 0 wins = 0 + # Create a new environment for the set of runs per agent type + width, depth = args.width, args.depth + env, occupied_positions = create_gridworld_environment(width, depth) + # Run the agent the specified number of times for run in range(1, runs + 1): - # Create a new environment for each run - width, height = 10, 10 - env, occupied_positions = create_gridworld_environment(width, height) - - if args.verbose: - print(f"\nRun {run} of {runs}") + log_message(f"\nRun {run} of {runs}") # Create a new agent agent = Agent(agent_program) # Generate random position for agent that doesn't overlap with other objects while True: - random_position = (random.randint(0, width - 1), random.randint(0, height - 1)) + random_position = (random.randint(0, width - 1), random.randint(0, depth - 1)) if random_position not in occupied_positions: break # Add the agent to the environment env.add_thing(agent, random_position) - if args.verbose: - print(f"Starting position is {random_position}") + log_message(f"Starting position is {random_position}") # Run the simulation and measure time start_time = time.time() @@ -330,7 +352,7 @@ def building_your_world(steps, runs): wins += 1 # Print results for this run - print(f"AGENT:{agent_program.__name__}\tRUN:{run}/{runs}\tSTEPS:{steps}\tRESULT:{'WIN' if GAME_WON else 'LOST'}\tPERFORMANCE:{env.agents[0].performance:5}\t\tTIME:{elapsed_time:.4f}s") + log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{runs}\tSTEPS:{steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{env.agents[0].performance:5}\t\tTIME:{elapsed_time:.4f}s") # Remove the agent from the environment env.delete_thing(agent) @@ -351,8 +373,6 @@ def searching_your_world(): if __name__ == "__main__": - # If not in verbose mode, print a message about the -v option - if not args.verbose: - print("Run with -v or --verbose to see detailed movement information") + print("Use -h or --help to see all available command line options") building_your_world(args.steps, args.runs) searching_your_world() diff --git a/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx new file mode 100644 index 0000000000000000000000000000000000000000..1215360c558324f168a348f977b46d5a160ee437 GIT binary patch literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Q#Z!U2P@qgIPz9v`0A Date: Sun, 28 Sep 2025 13:35:36 +0100 Subject: [PATCH 12/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 382 +++++++++++++++--- .../A1_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 22642 -> 38717 bytes assignment1/Doc2.docx | Bin 0 -> 29326 bytes assignment1/part1.2.docx | Bin 0 -> 18005 bytes .../~$_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 162 -> 0 bytes 5 files changed, 319 insertions(+), 63 deletions(-) create mode 100644 assignment1/Doc2.docx create mode 100644 assignment1/part1.2.docx delete mode 100644 assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index b213f3d7a..5924ab988 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -32,11 +32,9 @@ └──────────┴──────────┴──────────┴──────────┘ -# Agents: Random Agent, picks the next move randomly (for comparison only) +# Agents: Random Agent, picks the next move randomly # Simple Reflex agent, always moves to the cheapest adjacent square. -# Model based reflex agent, uses a model to predict the future. -# Goal Based Agent, uses the history of precepts to determine the next move. - +# Model based reflex agent, uses an internal model to predict the what the best move will be. """ @@ -46,27 +44,6 @@ import argparse import time -# Parse command line arguments -parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') -parser.add_argument('-v', '--verbose', action='http://github.com/store_true', - help='Print detailed movement and agent information') -parser.add_argument('-s', '--steps', type=int, required=True, - help='Number of steps per run to attempt to win the game (mandatory)') -parser.add_argument('-r', '--runs', type=int, required=True, - help='Number of times to run each agent (mandatory)') -parser.add_argument('-w', '--width', type=int, required=True, - help='Width of the grid world (mandatory)') -parser.add_argument('-d', '--depth', type=int, required=True, - help='depth of the grid world (mandatory)') -args = parser.parse_args() - - -def log_message(message): - """Log a message if verbose mode is enabled.""" - if args.verbose: - print(message) - - # Get the absolute path of the script's directory script_dir = os.path.dirname(os.path.abspath(__file__)) @@ -79,6 +56,24 @@ def log_message(message): # Now you can import a module from the parent directory from agents4e import Thing, XYEnvironment, Agent, Obstacle + + + +# Define a dictionary mapping directions to coordinate changes +direction_to_coords = { + 'up': (0, -1), + 'down': (0, 1), + 'left': (-1, 0), + 'right': (1, 0) +} + + +def log_message(message): + """Log a message if verbose mode is enabled.""" + if args.verbose: + print(message) + + # A global variable to keep track of whether the game is won or not GAME_WON=False @@ -106,10 +101,12 @@ def get_agent_percepts(self, agent, env): x, y = agent.location # A list of positions of all obstacles in the environment - obstacle_positions = [ - (thing.location[0], thing.location[1]) - for thing in env.things - if isinstance(thing, Obstacle)] + obstacle_positions = [] + for thing in env.things: + if isinstance(thing, Obstacle): + # Safely get location if it exists + if hasattr(thing, 'location') and thing.location is not None: + obstacle_positions.append(thing.location) return self.get_available_moves(x, y, env.width, env.depth, obstacle_positions) @@ -119,10 +116,12 @@ def percept(self, agent): new location. The movement directions could be 'up', 'down', 'left', or 'right'. """ x, y = agent.location - obstacle_positions = [ - (thing.location[0], thing.location[1]) - for thing in self.things - if isinstance(thing, Obstacle)] + obstacle_positions = [] + for thing in self.things: + if isinstance(thing, Obstacle): + # Safely get location if it exists + if hasattr(thing, 'location') and thing.location is not None: + obstacle_positions.append(thing.location) available_moves_with_costs = self.get_available_moves(x, y, self.width, self.depth, obstacle_positions) return available_moves_with_costs @@ -160,26 +159,21 @@ def execute_action(self, agent, action): initial_location = agent.location # Calculate obstacle positions - obstacle_positions = [ - (thing.location[0], thing.location[1]) - for thing in self.things - if isinstance(thing, Obstacle)] + obstacle_positions = [] + for thing in self.things: + if isinstance(thing, Obstacle): + # Safely get location if it exists + if hasattr(thing, 'location') and thing.location is not None: + obstacle_positions.append(thing.location) # Check if move is valid if not self._is_valid_move(agent, action, obstacle_positions): log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") return - # Update agent location based on action - location_updates = { - 'up': (0, -1), - 'down': (0, 1), - 'left': (-1, 0), - 'right': (1, 0) - } - - if action in location_updates: - dx, dy = location_updates[action] + # Update agent location based on action using the direction_to_coords dictionary + if action in direction_to_coords: + dx, dy = direction_to_coords[action] agent.location = (agent.location[0] + dx, agent.location[1] + dy) log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") @@ -258,6 +252,255 @@ def random_move(self, percept): return random.choice(['down', 'left', 'up', 'right']) +class ModelBasedReflexAgent(Agent): + """A model-based reflex agent that uses an internal model of the environment to make decisions. + The internal model is built up as the agent moves around the environment""" + + def __init__(self): + # Initialize the agent with the model-based reflex program + super().__init__(self.model_based_reflex_agent) + + # Initialize the model + self.model = { + 'width': None, # Will be inferred from percepts + 'depth': None, # Will be inferred from percepts + 'obstacles': set(), # Known obstacle positions + 'positive_dest': None, # Winning block position (if known) + 'negative_dest': None, # Penalty block position (if known) + 'visited': set(), # Positions the agent has visited + 'last_performance': 0, # Last known performance value + 'last_position': None, # Last position of the agent + 'move_history': [], # History of moves to avoid loops + 'exploration_mode': True, # Start in exploration mode + } + + # Initialize state and action + self.state = None + self.action = None + + def model_based_reflex_agent(self, percept): + """The model-based reflex agent program.""" + # Initialize state if first call + if self.state is None: + # Make sure we have a location before initializing state + if hasattr(self, 'location') and self.location is not None: + self.state = {'location': self.location, 'performance': 0} + # Add initial location to visited positions + self.model['visited'].add(self.location) + self.model['last_position'] = self.location + self.model['last_performance'] = 0 + + # Update the state based on percept and model + if self.state is not None: + self.state = self.update_state(self.state, self.action, percept) + + # Apply rules to determine the action + self.action = self.apply_rules(percept) + + # Record this move in history to detect loops + if self.action is not None: + self.model['move_history'].append(self.action) + # Keep only the last 10 moves in history + if len(self.model['move_history']) > 10: + self.model['move_history'] = self.model['move_history'][-10:] + + return self.action + + # If state is not initialized yet, default to a random move + if percept: + return random.choice([move[0] for move in percept]) + return None + + def update_state(self, state, action, percept): + """Update the state based on percept and model.""" + # Update the model with the current location + if action is not None: + # Save the last position and performance + self.model['last_position'] = state['location'] + self.model['last_performance'] = state['performance'] + + # Update current location based on the action taken using direction_to_coords + x, y = state['location'] + if action in direction_to_coords: + dx, dy = direction_to_coords[action] + state['location'] = (x + dx, y + dy) + + # Update performance in state + state['performance'] = self.performance + + # Check for significant performance changes + perf_change = state['performance'] - self.model['last_performance'] + + # If performance decreased by more than the move cost, might be a penalty block + expected_cost = state['location'][0] + state['location'][1] + if perf_change < -expected_cost - 10: # Significant penalty (more than just move cost) + self.model['negative_dest'] = state['location'] + # If we found a penalty block, switch to exploration mode + self.model['exploration_mode'] = True + + # If performance increased significantly, might be a winning block + if perf_change > 50: # Significant reward + self.model['positive_dest'] = state['location'] + # If we found a winning block, switch to exploitation mode + self.model['exploration_mode'] = False + + # Add current location to visited positions + self.model['visited'].add(state['location']) + + # Try to infer grid dimensions and obstacles from percepts + if percept: + # Infer possible moves from current position + possible_directions = [move[0] for move in percept] + x, y = state['location'] + + # If we can't move up, we might be at the top edge or there's an obstacle + if 'up' not in possible_directions and y > 0: + self.model['obstacles'].add((x, y-1)) + + # If we can't move down, we might be at the bottom edge or there's an obstacle + if 'down' not in possible_directions: + # Infer depth if we can't move down + if self.model['depth'] is None or y + 1 > self.model['depth']: + self.model['depth'] = y + 1 + else: + self.model['obstacles'].add((x, y+1)) + + # If we can't move left, we might be at the left edge or there's an obstacle + if 'left' not in possible_directions and x > 0: + self.model['obstacles'].add((x-1, y)) + + # If we can't move right, we might be at the right edge or there's an obstacle + if 'right' not in possible_directions: + # Infer width if we can't move right + if self.model['width'] is None or x + 1 > self.model['width']: + self.model['width'] = x + 1 + else: + self.model['obstacles'].add((x+1, y)) + + return state + + def apply_rules(self, percept): + """Apply rules to determine the action.""" + if not percept: + return None + + # Rule 1: If we know where the winning block is, move towards it + if self.model['positive_dest'] is not None and self.state is not None: + # Calculate direction to move towards the winning block + x, y = self.state['location'] + win_pos = self.model['positive_dest'] + + # Make sure win_pos is a valid tuple + if isinstance(win_pos, tuple) and len(win_pos) == 2: + win_x, win_y = win_pos + + # Determine best direction to move + directions = [] + + # Prioritize horizontal movement first if further away + if abs(x - win_x) > abs(y - win_y): + if x < win_x: + directions.append('right') + elif x > win_x: + directions.append('left') + + if y < win_y: + directions.append('down') + elif y > win_y: + directions.append('up') + else: + # Prioritize vertical movement first if further away + if y < win_y: + directions.append('down') + elif y > win_y: + directions.append('up') + + if x < win_x: + directions.append('right') + elif x > win_x: + directions.append('left') + + # Filter available moves that match our desired directions + possible_moves = [move for move in percept if move[0] in directions] + if possible_moves: + # Choose the first direction in our priority list + for direction in directions: + for move in possible_moves: + if move[0] == direction: + return direction + + # Rule 2: If we know where the penalty block is, avoid it + if self.model['negative_dest'] is not None and self.state is not None: + # Filter out moves that would lead to the penalty block + neg_pos = self.model['negative_dest'] + + # Make sure neg_pos is a valid tuple + if isinstance(neg_pos, tuple) and len(neg_pos) == 2: + neg_x, neg_y = neg_pos + x, y = self.state['location'] + + safe_moves = [] + for move in percept: + direction = move[0] + # Calculate new position using direction_to_coords + if direction in direction_to_coords: + dx, dy = direction_to_coords[direction] + new_pos = (x + dx, y + dy) + + if new_pos != (neg_x, neg_y): + safe_moves.append(move) + + if safe_moves: + # Continue with the remaining rules using only safe moves + percept = safe_moves + + # Rule 3: Avoid getting stuck in loops + if len(self.model['move_history']) >= 4: + # Check for simple loops like up-down-up-down or left-right-left-right + last_moves = self.model['move_history'][-4:] + if (last_moves[0] == last_moves[2] and last_moves[1] == last_moves[3] and + self.opposite_direction(last_moves[0]) == last_moves[1]): + # We're in a loop, try to break out by choosing a different move + loop_moves = {last_moves[0], last_moves[1]} + non_loop_moves = [move for move in percept if move[0] not in loop_moves] + if non_loop_moves: + # Choose the cheapest non-loop move + return min(non_loop_moves, key=lambda x: x[1])[0] + + # Rule 4: Prefer moves to unvisited positions + if self.state is not None: + unvisited_moves = [] + for move in percept: + direction = move[0] + x, y = self.state['location'] + + # Calculate new position using direction_to_coords + if direction in direction_to_coords: + dx, dy = direction_to_coords[direction] + new_pos = (x + dx, y + dy) + + # Check if the new position is unvisited + if new_pos not in self.model['visited']: + unvisited_moves.append(move) + + if unvisited_moves: + # Choose the cheapest unvisited move + return min(unvisited_moves, key=lambda x: x[1])[0] + + # Rule 5: Choose the move with the lowest cost + return min(percept, key=lambda x: x[1])[0] + + def opposite_direction(self, direction): + """Return the opposite direction.""" + opposites = { + 'up': 'down', + 'down': 'up', + 'left': 'right', + 'right': 'left' + } + return opposites.get(direction) + + # Create and set up the environment def create_gridworld_environment(width, depth): """ Create a 2D grid world environment with the specified width and depth. @@ -303,11 +546,11 @@ def create_gridworld_environment(width, depth): return env, occupied_positions -def building_your_world(steps, runs): +def building_your_world(): global GAME_WON # Generate and run the environment for {steps} steps with a list of agents - agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move] + agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, ModelBasedReflexAgent().model_based_reflex_agent] for agent_program in agent_list: log_message("") @@ -324,8 +567,8 @@ def building_your_world(steps, runs): env, occupied_positions = create_gridworld_environment(width, depth) # Run the agent the specified number of times - for run in range(1, runs + 1): - log_message(f"\nRun {run} of {runs}") + for run in range(1, args.runs + 1): + log_message(f"\nRun {run} of {args.runs}") # Create a new agent agent = Agent(agent_program) @@ -342,30 +585,29 @@ def building_your_world(steps, runs): # Run the simulation and measure time start_time = time.time() - env.run(steps) + env.run(args.steps) end_time = time.time() elapsed_time = end_time - start_time # Update statistics - total_performance += env.agents[0].performance + total_performance += agent.performance # Store performance before deletion if GAME_WON: wins += 1 # Print results for this run - log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{runs}\tSTEPS:{steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{env.agents[0].performance:5}\t\tTIME:{elapsed_time:.4f}s") + log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") - # Remove the agent from the environment - env.delete_thing(agent) + # Remove the agent from the environment if it's still in the environment + if agent in env.things: + env.delete_thing(agent) # Reset the global variable GAME_WON for the next run GAME_WON = False # Print summary statistics for this agent - avg_performance = total_performance / runs - win_rate = (wins / runs) * 100 - print(f"\nSummary for {agent_program.__name__}:") - print(f"Average Performance: {avg_performance:.2f}") - print(f"Win Rate: {win_rate:.2f}% ({wins}/{runs})") + avg_performance = total_performance / args.runs + win_rate = (wins / args.runs) * 100 + print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({wins}/{args.runs})") def searching_your_world(): @@ -373,6 +615,20 @@ def searching_your_world(): if __name__ == "__main__": - print("Use -h or --help to see all available command line options") - building_your_world(args.steps, args.runs) + + # Parse command line arguments + parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') + parser.add_argument('-v', '--verbose', action='http://github.com/store_true', + help='Print detailed movement and agent information') + parser.add_argument('-s', '--steps', type=int, required=True, + help='Number of steps per run to attempt to win the game (mandatory)') + parser.add_argument('-r', '--runs', type=int, required=True, + help='Number of times to run each agent (mandatory)') + parser.add_argument('-w', '--width', type=int, required=True, + help='Width of the grid world (mandatory)') + parser.add_argument('-d', '--depth', type=int, required=True, + help='depth of the grid world (mandatory)') + args = parser.parse_args() + + building_your_world() searching_your_world() diff --git a/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx index 0c1334dd6b89e437790a5e71ca1f1c064fa1f6a3..75fef570b9f54ef33a1fc64dac12bd4ef997c5d2 100644 GIT binary patch delta 27620 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 Tq$X%ll$LnVdW0`Fs); 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 delta 13871 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 b_}|B11!>SP@d5yV`Fa6 Date: Sun, 28 Sep 2025 16:32:31 +0100 Subject: [PATCH 13/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 101 ++++-------------- .../A1_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 38717 -> 40666 bytes 2 files changed, 23 insertions(+), 78 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 5924ab988..9ab3ca3ac 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -57,9 +57,7 @@ from agents4e import Thing, XYEnvironment, Agent, Obstacle - - -# Define a dictionary mapping directions to coordinate changes +# Define a global utility dictionary mapping directions to coordinate changes direction_to_coords = { 'up': (0, -1), 'down': (0, 1), @@ -68,17 +66,17 @@ } +# A global variable to keep track of whether the game is won or not +GAME_WON=False + + +# A global function to display a message based on the verbose command line parameter being True def log_message(message): """Log a message if verbose mode is enabled.""" if args.verbose: print(message) -# A global variable to keep track of whether the game is won or not -GAME_WON=False - - -# Define custom destination blocks class PositiveDestination(Thing): """ A destination that awards 100 points and wins the game when an agent reaches it """ pass @@ -220,6 +218,17 @@ def is_done(self): return GAME_WON or super().is_done() +class RandomAgent(Agent): + """ A simple agent program that moves randomly. The agent does receive a percept, + but ignores it, as it is a random agent. The agent returns a random action """ + def __init__(self): + super().__init__(self.random_move) + + def random_move(self, percept): + """ This function takes a percept and returns a random move """ + return random.choice(['down', 'left', 'up', 'right']) + + class ReflexAgent(Agent): """ A reflex agent that always moves to the cheapest adjacent square. This agent doesnt care about the percept list. """ @@ -241,17 +250,6 @@ def cheapest_move(self, percept): return cheapest[0] -class RandomAgent(Agent): - """ A simple agent program that moves randomly. The agent does receive a percept, - but ignores it, as it is a random agent. The agent returns a random action """ - def __init__(self): - super().__init__(self.random_move) - - def random_move(self, percept): - """ This function takes a percept and returns a random move """ - return random.choice(['down', 'left', 'up', 'right']) - - class ModelBasedReflexAgent(Agent): """A model-based reflex agent that uses an internal model of the environment to make decisions. The internal model is built up as the agent moves around the environment""" @@ -265,7 +263,6 @@ def __init__(self): 'width': None, # Will be inferred from percepts 'depth': None, # Will be inferred from percepts 'obstacles': set(), # Known obstacle positions - 'positive_dest': None, # Winning block position (if known) 'negative_dest': None, # Penalty block position (if known) 'visited': set(), # Positions the agent has visited 'last_performance': 0, # Last known performance value @@ -338,12 +335,6 @@ def update_state(self, state, action, percept): # If we found a penalty block, switch to exploration mode self.model['exploration_mode'] = True - # If performance increased significantly, might be a winning block - if perf_change > 50: # Significant reward - self.model['positive_dest'] = state['location'] - # If we found a winning block, switch to exploitation mode - self.model['exploration_mode'] = False - # Add current location to visited positions self.model['visited'].add(state['location']) @@ -384,52 +375,7 @@ def apply_rules(self, percept): if not percept: return None - # Rule 1: If we know where the winning block is, move towards it - if self.model['positive_dest'] is not None and self.state is not None: - # Calculate direction to move towards the winning block - x, y = self.state['location'] - win_pos = self.model['positive_dest'] - - # Make sure win_pos is a valid tuple - if isinstance(win_pos, tuple) and len(win_pos) == 2: - win_x, win_y = win_pos - - # Determine best direction to move - directions = [] - - # Prioritize horizontal movement first if further away - if abs(x - win_x) > abs(y - win_y): - if x < win_x: - directions.append('right') - elif x > win_x: - directions.append('left') - - if y < win_y: - directions.append('down') - elif y > win_y: - directions.append('up') - else: - # Prioritize vertical movement first if further away - if y < win_y: - directions.append('down') - elif y > win_y: - directions.append('up') - - if x < win_x: - directions.append('right') - elif x > win_x: - directions.append('left') - - # Filter available moves that match our desired directions - possible_moves = [move for move in percept if move[0] in directions] - if possible_moves: - # Choose the first direction in our priority list - for direction in directions: - for move in possible_moves: - if move[0] == direction: - return direction - - # Rule 2: If we know where the penalty block is, avoid it + # Rule 1: If we know where the penalty block is, avoid it if self.model['negative_dest'] is not None and self.state is not None: # Filter out moves that would lead to the penalty block neg_pos = self.model['negative_dest'] @@ -454,7 +400,7 @@ def apply_rules(self, percept): # Continue with the remaining rules using only safe moves percept = safe_moves - # Rule 3: Avoid getting stuck in loops + # Rule 2: Avoid getting stuck in loops if len(self.model['move_history']) >= 4: # Check for simple loops like up-down-up-down or left-right-left-right last_moves = self.model['move_history'][-4:] @@ -467,7 +413,7 @@ def apply_rules(self, percept): # Choose the cheapest non-loop move return min(non_loop_moves, key=lambda x: x[1])[0] - # Rule 4: Prefer moves to unvisited positions + # Rule 3 Prefer moves to unvisited positions if self.state is not None: unvisited_moves = [] for move in percept: @@ -487,7 +433,7 @@ def apply_rules(self, percept): # Choose the cheapest unvisited move return min(unvisited_moves, key=lambda x: x[1])[0] - # Rule 5: Choose the move with the lowest cost + # Rule 4: Choose the move with the lowest cost return min(percept, key=lambda x: x[1])[0] def opposite_direction(self, direction): @@ -563,8 +509,7 @@ def building_your_world(): wins = 0 # Create a new environment for the set of runs per agent type - width, depth = args.width, args.depth - env, occupied_positions = create_gridworld_environment(width, depth) + env, occupied_positions = create_gridworld_environment(args.width, args.depth) # Run the agent the specified number of times for run in range(1, args.runs + 1): @@ -575,7 +520,7 @@ def building_your_world(): # Generate random position for agent that doesn't overlap with other objects while True: - random_position = (random.randint(0, width - 1), random.randint(0, depth - 1)) + random_position = (random.randint(0, args.width - 1), random.randint(0, args.depth - 1)) if random_position not in occupied_positions: break diff --git a/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx index 75fef570b9f54ef33a1fc64dac12bd4ef997c5d2..1160aab28ae5b374b5e50edf99ab6bbf1cf65866 100644 GIT binary patch delta 13787 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 Date: Mon, 29 Sep 2025 11:09:08 +0100 Subject: [PATCH 14/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 9ab3ca3ac..ab9923527 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -94,20 +94,6 @@ def __init__(self, width, depth): self.width = width self.depth = depth - def get_agent_percepts(self, agent, env): - """ Returns the available moves for an agent in the given environment. """ - x, y = agent.location - - # A list of positions of all obstacles in the environment - obstacle_positions = [] - for thing in env.things: - if isinstance(thing, Obstacle): - # Safely get location if it exists - if hasattr(thing, 'location') and thing.location is not None: - obstacle_positions.append(thing.location) - - return self.get_available_moves(x, y, env.width, env.depth, obstacle_positions) - def percept(self, agent): """ In this environment, a percept is a list of available movements from the agent's current location, based on the grid size and location of any obstacles in the environment, and the cost of moving to the @@ -121,10 +107,10 @@ def percept(self, agent): if hasattr(thing, 'location') and thing.location is not None: obstacle_positions.append(thing.location) - available_moves_with_costs = self.get_available_moves(x, y, self.width, self.depth, obstacle_positions) + available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.depth, obstacle_positions) return available_moves_with_costs - def get_available_moves(self, x, y, width, depth, obstacles=None): + def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): """ Returns a list of available directions (up, down, left, right) that an agent can move based on its current position, grid boundaries and obstacles """ @@ -184,7 +170,7 @@ def execute_action(self, agent, action): def _is_valid_move(self, agent, action, obstacle_positions): """Check if the action is valid for the agent's current position.""" - available_moves = self.get_available_moves( + available_moves = self.get_available_moves_with_costs( agent.location[0], agent.location[1], self.width, @@ -268,7 +254,6 @@ def __init__(self): 'last_performance': 0, # Last known performance value 'last_position': None, # Last position of the agent 'move_history': [], # History of moves to avoid loops - 'exploration_mode': True, # Start in exploration mode } # Initialize state and action @@ -321,10 +306,10 @@ def update_state(self, state, action, percept): if action in direction_to_coords: dx, dy = direction_to_coords[action] state['location'] = (x + dx, y + dy) - + # Update performance in state state['performance'] = self.performance - + # Check for significant performance changes perf_change = state['performance'] - self.model['last_performance'] @@ -332,8 +317,6 @@ def update_state(self, state, action, percept): expected_cost = state['location'][0] + state['location'][1] if perf_change < -expected_cost - 10: # Significant penalty (more than just move cost) self.model['negative_dest'] = state['location'] - # If we found a penalty block, switch to exploration mode - self.model['exploration_mode'] = True # Add current location to visited positions self.model['visited'].add(state['location']) From 56f9b898fca0229e6e94b22bc16f02432a36e242 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Mon, 29 Sep 2025 11:16:40 +0100 Subject: [PATCH 15/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index ab9923527..5c4609efd 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -375,7 +375,7 @@ def apply_rules(self, percept): if direction in direction_to_coords: dx, dy = direction_to_coords[direction] new_pos = (x + dx, y + dy) - + if new_pos != (neg_x, neg_y): safe_moves.append(move) @@ -387,8 +387,7 @@ def apply_rules(self, percept): if len(self.model['move_history']) >= 4: # Check for simple loops like up-down-up-down or left-right-left-right last_moves = self.model['move_history'][-4:] - if (last_moves[0] == last_moves[2] and last_moves[1] == last_moves[3] and - self.opposite_direction(last_moves[0]) == last_moves[1]): + if (last_moves[0] == last_moves[2] and last_moves[1] == last_moves[3] and self.opposite_direction(last_moves[0]) == last_moves[1]): # We're in a loop, try to break out by choosing a different move loop_moves = {last_moves[0], last_moves[1]} non_loop_moves = [move for move in percept if move[0] not in loop_moves] @@ -407,7 +406,7 @@ def apply_rules(self, percept): if direction in direction_to_coords: dx, dy = direction_to_coords[direction] new_pos = (x + dx, y + dy) - + # Check if the new position is unvisited if new_pos not in self.model['visited']: unvisited_moves.append(move) @@ -476,6 +475,7 @@ def create_gridworld_environment(width, depth): def building_your_world(): + """ This function is used to build the world for the agent to explore.""" global GAME_WON # Generate and run the environment for {steps} steps with a list of agents @@ -488,8 +488,10 @@ def building_your_world(): log_message("********************************************************") # Statistics for this agent across all runs - total_performance = 0 - wins = 0 + agent_stats = { + 'total_performance': 0, + 'wins': 0 + } # Create a new environment for the set of runs per agent type env, occupied_positions = create_gridworld_environment(args.width, args.depth) @@ -517,10 +519,10 @@ def building_your_world(): end_time = time.time() elapsed_time = end_time - start_time - # Update statistics - total_performance += agent.performance # Store performance before deletion + # Update statistics using the dictionary + agent_stats['total_performance'] += agent.performance # Store performance before deletion if GAME_WON: - wins += 1 + agent_stats['wins'] += 1 # Print results for this run log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") @@ -533,9 +535,9 @@ def building_your_world(): GAME_WON = False # Print summary statistics for this agent - avg_performance = total_performance / args.runs - win_rate = (wins / args.runs) * 100 - print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({wins}/{args.runs})") + avg_performance = agent_stats['total_performance'] / args.runs + win_rate = (agent_stats['wins'] / args.runs) * 100 + print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") def searching_your_world(): From d255aa692d9eee69ed2b7edb25f28788e4f0fa12 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Mon, 29 Sep 2025 12:55:46 +0100 Subject: [PATCH 16/56] KnowledgeRep Assignment 1 checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 5c4609efd..54bd48989 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -111,8 +111,9 @@ def percept(self, agent): return available_moves_with_costs def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): - """ Returns a list of available directions (up, down, left, right) that an agent can move - based on its current position, grid boundaries and obstacles """ + """ Returns a list of tuples containing available directions (up, down, left, right) that an + agent can move based on its current position, grid boundaries and obstacles, and the associated + cost of that movement """ if obstacles is None: obstacles = [] @@ -259,7 +260,7 @@ def __init__(self): # Initialize state and action self.state = None self.action = None - + def model_based_reflex_agent(self, percept): """The model-based reflex agent program.""" # Initialize state if first call From 6d2d0d707f7eb550cc8af07b99f7cce2abf41df5 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Mon, 29 Sep 2025 16:40:50 +0100 Subject: [PATCH 17/56] KnowledgeRep Assignment 1 checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 287 +++++++++++++++--- .../~$_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 0 -> 162 bytes assignment1/~$art1.2.docx | Bin 0 -> 162 bytes 3 files changed, 242 insertions(+), 45 deletions(-) create mode 100644 assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx create mode 100644 assignment1/~$art1.2.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 54bd48989..4ac6da372 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -16,20 +16,23 @@ # and the agent has lost the game. # # Here is an example map of the 2D world -# (width 4 by depth 3 grid, obstacle at (1, 1), penalty at (3, 1) and winning block at (3, 0)) -┌──────────┬──────────┬──────────┬──────────┐ -│(0,0) │(1,0) │(2,0) │(3,0) │ -│ │ │ │ │ -│ │ │ │ WIN GAME │ -┼──────────┼──────────┼──────────┼──────────┤ -│(0,1) │(1,1) │(2,1) │(3,1) │ -│ │ │ │ │ -│ │ OBSTACLE │ │ PENALTY │ -┼──────────┼──────────┼──────────┼──────────┤ -│(0,2) │(1,2) │(2,2) │(3,2) │ -│ │ │ │ │ -│ │ │ │ │ -└──────────┴──────────┴──────────┴──────────┘ +Obstacle location is (1, 1) +Positive location is (4, 3) +Negative location is (0, 4) +Agent location is (6, 2) + + 0 1 2 3 4 5 6 7 + +-----------------+ +0 | . . . . . . . . | +1 | . O . . . . . . | +2 | . . . . . . A . | +3 | . . . . P . . . | +4 | N . . . . . . . | +5 | . . . . . . . . | +6 | . . . . . . . . | +7 | . . . . . . . . | + +-----------------+ + # Agents: Random Agent, picks the next move randomly @@ -38,11 +41,13 @@ """ +import signal import sys import os import random import argparse import time +import concurrent.futures # Get the absolute path of the script's directory script_dir = os.path.dirname(os.path.abspath(__file__)) @@ -55,7 +60,8 @@ # Now you can import a module from the parent directory from agents4e import Thing, XYEnvironment, Agent, Obstacle - +from search import Problem, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search +from search import greedy_best_first_graph_search, astar_search, recursive_best_first_search # Define a global utility dictionary mapping directions to coordinate changes direction_to_coords = { @@ -430,15 +436,8 @@ def opposite_direction(self, direction): return opposites.get(direction) -# Create and set up the environment -def create_gridworld_environment(width, depth): - """ Create a 2D grid world environment with the specified width and depth. - The environment is represented as a 2D list of cells, where each cell can be either - a wall, a negative destination (penalty block), or a positive destination (winning block).""" - # Create the 2D grid world with the set width and depth - env = GridWorldEnvironment(width, depth) - - # Set random positions for the obstacle, the penalty block and the winning block +def generate_random_positions(width, depth): + """Generate random positions for obstacle, positive destination, negative destination, and agent.""" # Create a list to track occupied positions occupied_positions = [] @@ -463,19 +462,93 @@ def create_gridworld_environment(width, depth): occupied_positions.append((neg_x, neg_y)) break + # Generate random position for agent + agent_position = None + while True: + agent_x = random.randint(0, width - 1) + agent_y = random.randint(0, depth - 1) + if (agent_x, agent_y) not in occupied_positions: + occupied_positions.append((agent_x, agent_y)) + break + + log_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") + log_message(f"Positive location is ({pos_x}, {pos_y})") + log_message(f"Negative location is ({neg_x}, {neg_y})") + log_message(f"Agent location is ({agent_x}, {agent_y})") + log_message(f"Occupied positions are [{occupied_positions}]") + + return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions + + +# Create and set up the environment +def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negative_pos): + """ Create a 2D grid world environment with the specified width and depth. + The environment is represented as a 2D list of cells, where each cell can be either + a wall, a negative destination (penalty block), or a positive destination (winning block).""" + # Create the 2D grid world with the set width and depth + env = GridWorldEnvironment(width, depth) + + # Unpack positions + obstacle_x, obstacle_y = obstacle_pos + pos_x, pos_y = positive_pos + neg_x, neg_y = negative_pos + + # Create a list of occupied positions + occupied_positions = [obstacle_pos, positive_pos, negative_pos] + # Add the obstacle, the penalty block and the winning block to the environment env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) env.add_thing(PositiveDestination(), (pos_x, pos_y)) env.add_thing(NegativeDestination(), (neg_x, neg_y)) - log_message(f"Obstacle location is {obstacle_x}, {obstacle_y}") - log_message(f"Positive location is {pos_x}, {pos_y}") - log_message(f"Negative location is {neg_x}, {neg_y}") - return env, occupied_positions -def building_your_world(): +# Search +class GridSearchProblem(Problem): + def __init__(self, initial, goal, width, depth, obstacles): + super().__init__(initial, goal) + self.width = width + self.depth = depth + self.obstacles = set(obstacles) + + def actions(self, state): + """Return valid directions from the current state.""" + x, y = state + directions = [] + if y > 0 and (x, y - 1) not in self.obstacles: + directions.append('up') + if y < self.depth - 1 and (x, y + 1) not in self.obstacles: + directions.append('down') + if x > 0 and (x - 1, y) not in self.obstacles: + directions.append('left') + if x < self.width - 1 and (x + 1, y) not in self.obstacles: + directions.append('right') + return directions + + def result(self, state, action): + """Return the new state after applying the action.""" + x, y = state + if action == 'up': + return (x, y - 1) + elif action == 'down': + return (x, y + 1) + elif action == 'left': + return (x - 1, y) + elif action == 'right': + return (x + 1, y) + else: + raise ValueError(f"Unknown action: {action}") + + def goal_test(self, state): + """Check if the current state is the goal.""" + return state == self.goal + + def path_cost(self, c, state1, action, state2): + """Cost is the sum of x and y coordinates of the destination.""" + return c + state2[0] + state2[1] + +def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): """ This function is used to build the world for the agent to explore.""" global GAME_WON @@ -495,24 +568,16 @@ def building_your_world(): } # Create a new environment for the set of runs per agent type - env, occupied_positions = create_gridworld_environment(args.width, args.depth) + env, occupied_positions = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) # Run the agent the specified number of times for run in range(1, args.runs + 1): log_message(f"\nRun {run} of {args.runs}") - # Create a new agent + # Add an agent to the environment agent = Agent(agent_program) - - # Generate random position for agent that doesn't overlap with other objects - while True: - random_position = (random.randint(0, args.width - 1), random.randint(0, args.depth - 1)) - if random_position not in occupied_positions: - break - - # Add the agent to the environment - env.add_thing(agent, random_position) - log_message(f"Starting position is {random_position}") + env.add_thing(agent, agent_pos) + log_message(f"Starting position is {agent_pos}") # Run the simulation and measure time start_time = time.time() @@ -541,8 +606,134 @@ def building_your_world(): print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") -def searching_your_world(): - pass +class GridSearchProblemWithHeuristic(GridSearchProblem): + def h(self, node): + """Manhattan distance heuristic from current node to goal.""" + x1, y1 = node.state + x2, y2 = self.goal + return abs(x2 - x1) + abs(y2 - y1) + + +def timeout_handler(signum, frame): + raise TimeoutError("Search timed out") + + +def greedy_search_with_timeout(problem, h, timeout_seconds=5): + # Set the timeout + signal.signal(signal.SIGALRM, timeout_handler) + signal.alarm(timeout_seconds) + + try: + # Run the search + result = greedy_best_first_graph_search(problem, f=h) + # Cancel the timeout if search completes + signal.alarm(0) + return result + except TimeoutError: + print(f"Greedy search timed out after {timeout_seconds} seconds") + return None + +def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions): + problem = GridSearchProblem( + initial=agent_pos, + goal=positive_pos, + width=args.width, + depth=args.depth, + obstacles=[obstacle_pos, negative_pos] + ) + + solution_bfs = breadth_first_graph_search(problem) + solution_dfs = depth_first_graph_search(problem) + solution_ucs = uniform_cost_search(problem) + + print("UNINFORMED SEARCH RESULTS") + print(f"BFS: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") + print(f"DFS: Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") + print(f"UCS: Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") + print("") + + problemInformed = GridSearchProblemWithHeuristic( + initial=agent_pos, + goal=positive_pos, + width=args.width, + depth=args.depth, + obstacles=[obstacle_pos, negative_pos] + ) + + print("INFORMED SEARCH RESULTS") + # wrapper function with timeout for greedy search + def run_greedy_search(problem): + return greedy_best_first_graph_search(problem, f=problem.h) + + # Run with timeout + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(run_greedy_search, problemInformed) + try: + solution_greedy = future.result(timeout=5) # Timeout after 5 seconds + except concurrent.futures.TimeoutError: + print("Greedy Search timed out!") + + # solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) + solution_astar = astar_search(problemInformed, h=problemInformed.h) + solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) + + + if solution_greedy: + print(f"Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") + else: + print("Greedy: No solution found") + + if solution_astar: + print(f"A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") + else: + print("A*: No solution found") + + if solution_rbfs: + print(f"RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") + else: + print("RBFS: No solution found") + print("") + + +def draw_grid(agent, obstacle, positive, negative): + """ Draw the grid and the agent and obstacles + Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position + """ + rows = args.width + cols = args.depth + content = [["."]*cols for _ in range(rows)] + + grid = [ + (obstacle[0], obstacle[1], "O"), + (agent[0], agent[1], "A"), + (positive[0], positive[1], "P"), + (negative[0], negative[1], "N")] + for (x, y, c) in grid: content[y][x] = c + + # build frame + width = len(str(max(rows, cols)-1)) + contentLine = "# | values |" + + dashes = "-".join("-"*width for _ in range(cols)) + frameLine = contentLine.replace("values", dashes) + frameLine = frameLine.replace("#", " "*width) + frameLine = frameLine.replace("| ", "+-").replace(" |", "-+") + + # x-axis numbers (at the top) + numLine = contentLine.replace("|", " ") + numLine = numLine.replace("#", " "*width) + colNums = " ".join(f"{i:<{width}d}" for i in range(cols)) + numLine = numLine.replace("values", colNums) + print(numLine) + + # print grid + print(frameLine) + for i, row in enumerate(content): + values = " ".join(f"{v:{width}s}" for v in row) + line = contentLine.replace("values", values) + line = line.replace("#", f"{i:{width}d}") + print(line) + print(frameLine) if __name__ == "__main__": @@ -561,5 +752,11 @@ def searching_your_world(): help='depth of the grid world (mandatory)') args = parser.parse_args() - building_your_world() - searching_your_world() + # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent + obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions = generate_random_positions(args.width, args.depth) + + if args.verbose: + draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) + + # building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions) diff --git a/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx new file mode 100644 index 0000000000000000000000000000000000000000..8d582a58df2a8b1d7f96904b0c63fed6fc725b6f GIT binary patch literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Z#Z!U2P@qgIPz5fqLU9%gBQ8lKaR8jB5mf*H literal 0 HcmV?d00001 diff --git a/assignment1/~$art1.2.docx b/assignment1/~$art1.2.docx new file mode 100644 index 0000000000000000000000000000000000000000..8d582a58df2a8b1d7f96904b0c63fed6fc725b6f GIT binary patch literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Z#Z!U2P@qgIPz5fqLU9%gBQ8lKaR8jB5mf*H literal 0 HcmV?d00001 From 49c439ee90bdf0946692ac026fc72081c293f369 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 30 Sep 2025 15:51:16 +0100 Subject: [PATCH 18/56] checkpoint --- A1_COMP9016_Nagle_JohnPaul_R00065426.py | 523 ++++++++++++ .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 762 ------------------ 2 files changed, 523 insertions(+), 762 deletions(-) create mode 100644 A1_COMP9016_Nagle_JohnPaul_R00065426.py delete mode 100644 assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py diff --git a/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/A1_COMP9016_Nagle_JohnPaul_R00065426.py new file mode 100644 index 000000000..01b62fdaa --- /dev/null +++ b/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -0,0 +1,523 @@ +""" +A1_COMP9016_Nagle_JohnPaul_R00065426.py + +Name: (John) Paul Nagle +Student ID: R00065426 +Class: Knowledge Representation +Assignment: 1 + +The 2D world is comprised of a grid of blocks. +There is one obstacle block that no agent can move to. +An agent gets penalised points (sum of x and y co-ordinates) for making each move. +An agent gets penalised 50 points if it lands on the penalty block +If the agent reaches the winning block it gets 100 points, wins the game and the game ends. +If the agent does not reach the winning block in the set number of moves, the game ends and the agent has lost the game. + +Here is an example map of the 2D world +Obstacle location is (1, 1) +Positive location is (4, 3) +Negative location is (0, 4) +Agent location is (6, 2) + + 0 1 2 3 4 5 6 7 + +-----------------+ +0 | . . . . . . . . | +1 | . O . . . . . . | +2 | . . . . . . A . | +3 | . . . . P . . . | +4 | N . . . . . . . | +5 | . . . . . . . . | +6 | . . . . . . . . | +7 | . . . . . . . . | + +-----------------+ + +AGENTS: + - Random Agent, picks the next move randomly + - Simple Reflex agent, always moves to the cheapest adjacent square. + - Table based agent, uses a table to decide the next move + +UNINFORMED SEARCHES: + - Breadth First Search + - Depth First Search + - Uniform Cost Search + +INFORMED SEARCHES: +- Greedy Best First Search +- A* Search i.e. Best First Graph Search +- Recursive Best First Search + +""" + +import sys +import os +import random +import argparse +import time +from zoneinfo import available_timezones + + + +# Get the parent directory of the current directory +parent_dir = os.path.dirname(os.getcwd()) + +# Add the parent directory to sys.path +sys.path.append(parent_dir) + +# Now you can import a module from the parent directory +from agents4e import Thing, XYEnvironment, Agent, Obstacle +from search import Node, Problem, best_first_graph_search, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search +from utils4e import PriorityQueue, memoize + +GAME_WON=False + +direction_to_coords = { + 'up': (0, -1), + 'down': (0, 1), + 'left': (-1, 0), + 'right': (1, 0) +} + +def log_message(message): + """Log a message if verbose mode is enabled.""" + if args.verbose: + print(message) + + +# Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position +def draw_grid(agent, obstacle, positive, negative): + # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked + print("\nA = Agent, P = Winning Square, N = Penalty Square, O = Obstacle\n") + rows = args.width + cols = args.depth + content = [["."]*cols for _ in range(rows)] + + grid = [ + (obstacle[0], obstacle[1], "O"), + (agent[0], agent[1], "A"), + (positive[0], positive[1], "P"), + (negative[0], negative[1], "N")] + for (x, y, c) in grid: content[y][x] = c + + # build frame + width = len(str(max(rows, cols)-1)) + contentLine = "# | values |" + + dashes = "-".join("-"*width for _ in range(cols)) + frameLine = contentLine.replace("values", dashes) + frameLine = frameLine.replace("#", " "*width) + frameLine = frameLine.replace("| ", "+-").replace(" |", "-+") + + # x-axis numbers (at the top) + numLine = contentLine.replace("|", " ") + numLine = numLine.replace("#", " "*width) + colNums = " ".join(f"{i:<{width}d}" for i in range(cols)) + numLine = numLine.replace("values", colNums) + print(numLine) + + # print grid + print(frameLine) + for i, row in enumerate(content): + values = " ".join(f"{v:{width}s}" for v in row) + line = contentLine.replace("values", values) + line = line.replace("#", f"{i:{width}d}") + print(line) + print(frameLine) + + +class PositiveDestination(Thing): + """ A destination that awards 100 points and wins the game when an agent reaches it """ + pass + + +class NegativeDestination(Thing): + """ A destination that penalises 50 points when an agent reaches it """ + pass + + +class GridWorldEnvironment(XYEnvironment): + """ This environment has a grid of rows and columns with obstacles """ + def __init__(self, width, depth): + super().__init__() + self.width = width + self.depth = depth + + def percept(self, agent): + # A list of available movements from the agent's current location and the associated cost + x, y = agent.location + obstacle_positions = [] + for thing in self.things: + if isinstance(thing, Obstacle): + if hasattr(thing, 'location') and thing.location is not None: + obstacle_positions.append(thing.location) + + available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.depth, obstacle_positions) + return available_moves_with_costs + + def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): + # Returns a list of tuples containing all possible moves and their associated costs + if obstacles is None: + obstacles = [] + + available_moves = [] + + if y > 0 and (x, y-1) not in obstacles: # UP is ok + available_moves.append(('up', (x + (y-1)))) + + if y < depth-1 and (x, y+1) not in obstacles: # DOWN is ok + available_moves.append(('down', (x + (y+1)))) + + if x < width-1 and (x+1, y) not in obstacles: # RIGHT is ok + available_moves.append(('right', ((x+1) + y))) + + if x > 0 and (x-1, y) not in obstacles: # LEFT is ok + available_moves.append(('left', ((x-1) + y))) + + # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") + return available_moves + + def execute_action(self, agent, action): + global GAME_WON + initial_location = agent.location + + # Calculate obstacle positions + obstacle_positions = [] + for thing in self.things: + if isinstance(thing, Obstacle): + # Safely get location if it exists + if hasattr(thing, 'location') and thing.location is not None: + obstacle_positions.append(thing.location) + + # Check if move is valid + if not self._is_valid_move(agent, action, obstacle_positions): + log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") + return + + # Update agent location based on action using the direction_to_coords dictionary + if action in direction_to_coords: + dx, dy = direction_to_coords[action] + agent.location = (agent.location[0] + dx, agent.location[1] + dy) + + log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") + + # Charge the agent for making a move (the cost is the sum of the x and y co-ordinates) + agent.performance -= (agent.location[0] + agent.location[1]) + + # Check destinations and apply effects + self._check_destinations(agent) + + def _is_valid_move(self, agent, action, obstacle_positions): + available_moves = self.get_available_moves_with_costs( + agent.location[0], + agent.location[1], + self.width, + self.depth, + obstacle_positions + ) + return any(action in tup for tup in available_moves) + + def _check_destinations(self, agent): + # Check if agent has landed on the winning or penalyty squares + global GAME_WON + + # Check for positive destination (winning) + positive_destinations = self.list_things_at(agent.location, PositiveDestination) + if positive_destinations: + agent.performance += 100 + log_message("Agent reached winning destination! Performance increase 100.") + log_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + log_message("👏 Well done! You've successfully completed the game!") + GAME_WON = True + + # Check for negative destination (penalty) + negative_destinations = self.list_things_at(agent.location, NegativeDestination) + if negative_destinations: + agent.performance -= 50 + log_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + + def is_done(self): + """ The environment is done if the agent has won the game or if no agents are alive. """ + global GAME_WON + return GAME_WON or super().is_done() + + +class RandomAgent(Agent): + # A simple agent program that moves randomly. + def __init__(self): + super().__init__(self.random_move) + + def random_move(self, percept): + return random.choice(['down', 'left', 'up', 'right']) + + +class ReflexAgent(Agent): + # """ A reflex agent that always moves to the cheapest adjacent square + def __init__(self): + super().__init__(self.cheapest_move) + + def cheapest_move(self, percept): + # returns the move with the lowest cost + cheapest = min(percept, key=lambda x: x[1]) + return cheapest[0] + + +class TableDrivenAgent(Agent): + # """ A table driven agent that uses a pre-calculated table to determine the best action to take. + def __init__(self): + super().__init__(self.table_action) + + def _get_preferred_move(self, table, available_moves): + for (_, move_list), direction in table.items(): + if set(move_list) == set(available_moves): + return direction + + def table_action(self, percept): + available_moves_list = [] + for allowed_movement in percept: + available_moves_list.append(allowed_movement[0]) + + available_moves = tuple(available_moves_list) + + agent_table = { + (available_moves, ('up',)): 'up', + (available_moves, ('down',)): 'down', + (available_moves, ('right',)): 'right', + (available_moves, ('left',)): 'left', + (available_moves, ('up', 'down')): 'up', + (available_moves, ('up', 'left')): 'up', + (available_moves, ('up', 'right')): 'right', + (available_moves, ('down', 'left')): 'down', + (available_moves, ('down', 'right')): 'right', + (available_moves, ('left', 'right')): 'left', + (available_moves, ('up', 'down', 'left')): 'up', + (available_moves, ('up', 'down', 'right')): 'up', + (available_moves, ('up', 'left', 'right')): 'right', + (available_moves, ('down', 'left', 'right')): 'left', + (available_moves, ('up', 'down', 'left', 'right')): 'up', + } + + return self._get_preferred_move(agent_table, available_moves) + + +def generate_random_starting_positions(width, depth): + # Generate random positions for obstacle, positive destination, negative destination, and the agent. + occupied_positions = [] + + obstacle_x = random.randint(0, width - 1) + obstacle_y = random.randint(0, depth - 1) + occupied_positions.append((obstacle_x, obstacle_y)) + + while True: + pos_x = random.randint(0, width - 1) + pos_y = random.randint(0, depth - 1) + if (pos_x, pos_y) not in occupied_positions: + occupied_positions.append((pos_x, pos_y)) + break + + while True: + neg_x = random.randint(0, width - 1) + neg_y = random.randint(0, depth - 1) + if (neg_x, neg_y) not in occupied_positions: + occupied_positions.append((neg_x, neg_y)) + break + + agent_position = None + while True: + agent_x = random.randint(0, width - 1) + agent_y = random.randint(0, depth - 1) + if (agent_x, agent_y) not in occupied_positions: + occupied_positions.append((agent_x, agent_y)) + break + + log_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") + log_message(f"Positive location is ({pos_x}, {pos_y})") + log_message(f"Negative location is ({neg_x}, {neg_y})") + log_message(f"Agent location is ({agent_x}, {agent_y})") + log_message(f"Occupied positions are [{occupied_positions}]") + + return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions + + +# Create and set up the environment +def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negative_pos): + # Create the 2D grid world with the set width and depth, and Things located at the specified positions + env = GridWorldEnvironment(width, depth) + env.add_thing(Obstacle(), obstacle_pos) + env.add_thing(PositiveDestination(), positive_pos) + env.add_thing(NegativeDestination(), negative_pos) + + return env + + +# Search +class GridSearchProblem(Problem): + def __init__(self, initial, goal, width, depth, obstacles): + super().__init__(initial, goal) + self.width = width + self.depth = depth + self.obstacles = set(obstacles) + + def actions(self, state): + """Return valid directions from the current state.""" + x, y = state + directions = [] + if y > 0 and (x, y - 1) not in self.obstacles: + directions.append('up') + if y < self.depth - 1 and (x, y + 1) not in self.obstacles: + directions.append('down') + if x > 0 and (x - 1, y) not in self.obstacles: + directions.append('left') + if x < self.width - 1 and (x + 1, y) not in self.obstacles: + directions.append('right') + return directions + + def result(self, state, action): + """Return the new state after applying the action.""" + x, y = state + if action == 'up': + return (x, y - 1) + elif action == 'down': + return (x, y + 1) + elif action == 'left': + return (x - 1, y) + elif action == 'right': + return (x + 1, y) + else: + raise ValueError(f"Unknown action: {action}") + + def goal_test(self, state): + """Check if the current state is the goal.""" + return state == self.goal + + def path_cost(self, c, state1, action, state2): + """Cost is the sum of x and y coordinates of the destination.""" + return c + state2[0] + state2[1] + + +class GridSearchProblemWithHeuristic(GridSearchProblem): + def h(self, node): + """Manhattan distance heuristic from current node to goal.""" + x1, y1 = node.state + x2, y2 = self.goal + return abs(x2 - x1) + abs(y2 - y1) + + +def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): + """ This function is used to build the world for the agent to explore.""" + global GAME_WON + + # Generate and run the environment for {steps} steps with a list of agents + # agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action] + + agent_list = [TableDrivenAgent().table_action] + print("\nAGENT RESULTS") + for agent_program in agent_list: + log_message("") + log_message("********************************************************") + log_message(f"* Agent: {agent_program.__name__:45} *") + log_message("********************************************************") + + # Statistics for this agent across all runs + agent_stats = { + 'total_performance': 0, + 'wins': 0 + } + + # Create a new environment for the set of runs per agent type + env = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) + + # Run the agent the specified number of times + for run in range(1, args.runs + 1): + log_message(f"\nRun {run} of {args.runs}") + + # Add an agent to the environment + agent = Agent(agent_program) + env.add_thing(agent, agent_pos) + log_message(f"Starting position is {agent_pos}") + + # Run the simulation and measure time + start_time = time.time() + env.run(args.steps) + end_time = time.time() + elapsed_time = end_time - start_time + + # Update statistics using the dictionary + agent_stats['total_performance'] += agent.performance # Store performance before deletion + if GAME_WON: + agent_stats['wins'] += 1 + + # Print results for this run + log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") + + # Remove the agent from the environment if it's still in the environment + if agent in env.things: + env.delete_thing(agent) + + # Reset the global variable GAME_WON for the next run + GAME_WON = False + + # Print summary statistics for this agent + avg_performance = agent_stats['total_performance'] / args.runs + win_rate = (agent_stats['wins'] / args.runs) * 100 + print(f"{agent_program.__name__:20}: Cost: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") + # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") + + +def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): + problem = GridSearchProblem( + initial=agent_pos, + goal=positive_pos, + width=args.width, + depth=args.depth, + obstacles=[obstacle_pos, negative_pos] + ) + + solution_bfs = breadth_first_graph_search(problem) + solution_dfs = depth_first_graph_search(problem) + solution_ucs = uniform_cost_search(problem) + + print("\nUNINFORMED SEARCH RESULTS") + print(f"Breadth First Search: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") + print(f"Depth First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") + print(f"Uniform Cost Search : Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") + + problemInformed = GridSearchProblemWithHeuristic( + initial=agent_pos, + goal=positive_pos, + width=args.width, + depth=args.depth, + obstacles=[obstacle_pos, negative_pos] + ) + + print("\nINFORMED SEARCH RESULTS") + + solution_astar = astar_search(problemInformed, h=problemInformed.h) + print(f"A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") + + solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) + print(f"RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") + + solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) + if solution_greedy: + print(f"Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") + else: + print("Greedy: No solution found") + + +if __name__ == "__main__": + + # command line arguments + parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') + parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') + parser.add_argument('-s', '--steps', type=int, required=True, help='Number of steps per run to attempt to win the game (mandatory)') + parser.add_argument('-r', '--runs', type=int, required=True, help='Number of times to run each agent (mandatory)') + parser.add_argument('-w', '--width', type=int, required=True, help='Width of the grid world (mandatory)') + parser.add_argument('-d', '--depth', type=int, required=True, help='depth of the grid world (mandatory)') + args = parser.parse_args() + + # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent + obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions = generate_random_starting_positions(args.width, args.depth) + + draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) + + building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + # searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py deleted file mode 100644 index 4ac6da372..000000000 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ /dev/null @@ -1,762 +0,0 @@ -""" -# A1_COMP9016_Nagle_JohnPaul_R00065426.py -# -# Name: (John) Paul Nagle -# Student ID: R00065426 -# Class: Knowledge Representation -# Assignment: 1 -# -# The 2D world is comprised of a grid of blocks. -# There is one obstacle block that no agent can move to -# An agent gets charged some points (sum of x and y co-ordinates) for making a move. -# An agent gets penalised 50 points if it lands on the penalty block -# If the agent reaches the winning block it gets 100 points, wins the game and -# the game ends -# If the agent does not reach the winning block in the set number of moves, the game ends -# and the agent has lost the game. -# -# Here is an example map of the 2D world -Obstacle location is (1, 1) -Positive location is (4, 3) -Negative location is (0, 4) -Agent location is (6, 2) - - 0 1 2 3 4 5 6 7 - +-----------------+ -0 | . . . . . . . . | -1 | . O . . . . . . | -2 | . . . . . . A . | -3 | . . . . P . . . | -4 | N . . . . . . . | -5 | . . . . . . . . | -6 | . . . . . . . . | -7 | . . . . . . . . | - +-----------------+ - - - -# Agents: Random Agent, picks the next move randomly -# Simple Reflex agent, always moves to the cheapest adjacent square. -# Model based reflex agent, uses an internal model to predict the what the best move will be. - -""" - -import signal -import sys -import os -import random -import argparse -import time -import concurrent.futures - -# Get the absolute path of the script's directory -script_dir = os.path.dirname(os.path.abspath(__file__)) - -# Get the parent directory (project root) -parent_dir = os.path.dirname(script_dir) - -# Add the parent directory to sys.path -sys.path.append(parent_dir) - -# Now you can import a module from the parent directory -from agents4e import Thing, XYEnvironment, Agent, Obstacle -from search import Problem, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search -from search import greedy_best_first_graph_search, astar_search, recursive_best_first_search - -# Define a global utility dictionary mapping directions to coordinate changes -direction_to_coords = { - 'up': (0, -1), - 'down': (0, 1), - 'left': (-1, 0), - 'right': (1, 0) -} - - -# A global variable to keep track of whether the game is won or not -GAME_WON=False - - -# A global function to display a message based on the verbose command line parameter being True -def log_message(message): - """Log a message if verbose mode is enabled.""" - if args.verbose: - print(message) - - -class PositiveDestination(Thing): - """ A destination that awards 100 points and wins the game when an agent reaches it """ - pass - - -class NegativeDestination(Thing): - """ A destination that penalises 50 points when an agent reaches it """ - pass - - -class GridWorldEnvironment(XYEnvironment): - """ This environment has a grid of rows and columns with obstacles """ - def __init__(self, width, depth): - super().__init__() - self.width = width - self.depth = depth - - def percept(self, agent): - """ In this environment, a percept is a list of available movements from the agent's current location, - based on the grid size and location of any obstacles in the environment, and the cost of moving to the - new location. - The movement directions could be 'up', 'down', 'left', or 'right'. """ - x, y = agent.location - obstacle_positions = [] - for thing in self.things: - if isinstance(thing, Obstacle): - # Safely get location if it exists - if hasattr(thing, 'location') and thing.location is not None: - obstacle_positions.append(thing.location) - - available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.depth, obstacle_positions) - return available_moves_with_costs - - def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): - """ Returns a list of tuples containing available directions (up, down, left, right) that an - agent can move based on its current position, grid boundaries and obstacles, and the associated - cost of that movement """ - - if obstacles is None: - obstacles = [] - - available_moves = [] - - # Check up (up is decreasing y) - if y > 0 and (x, y-1) not in obstacles: - available_moves.append(('up', (x + (y-1)))) - - # Check down (down is increasing y) - if y < depth-1 and (x, y+1) not in obstacles: - available_moves.append(('down', (x + (y+1)))) - - # Check right (right is increasing x) - if x < width-1 and (x+1, y) not in obstacles: - available_moves.append(('right', ((x+1) + y))) - - # Check left (left is decreasing x) - if x > 0 and (x-1, y) not in obstacles: - available_moves.append(('left', ((x-1) + y))) - - # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") - return available_moves - - def execute_action(self, agent, action): - global GAME_WON - initial_location = agent.location - - # Calculate obstacle positions - obstacle_positions = [] - for thing in self.things: - if isinstance(thing, Obstacle): - # Safely get location if it exists - if hasattr(thing, 'location') and thing.location is not None: - obstacle_positions.append(thing.location) - - # Check if move is valid - if not self._is_valid_move(agent, action, obstacle_positions): - log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") - return - - # Update agent location based on action using the direction_to_coords dictionary - if action in direction_to_coords: - dx, dy = direction_to_coords[action] - agent.location = (agent.location[0] + dx, agent.location[1] + dy) - - log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") - - # Charge the agent for making a move (the cost is the sum of the x and y co-ordinates) - agent.performance -= (agent.location[0] + agent.location[1]) - - # Check destinations and apply effects - self._check_destinations(agent) - - def _is_valid_move(self, agent, action, obstacle_positions): - """Check if the action is valid for the agent's current position.""" - available_moves = self.get_available_moves_with_costs( - agent.location[0], - agent.location[1], - self.width, - self.depth, - obstacle_positions - ) - return any(action in tup for tup in available_moves) - - def _check_destinations(self, agent): - """Check if agent is at special destinations and apply effects.""" - global GAME_WON - - # Check for positive destination (winning) - positive_destinations = self.list_things_at(agent.location, PositiveDestination) - if positive_destinations: - agent.performance += 100 - log_message("Agent reached winning destination! Performance increase 100.") - log_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") - log_message("👏 Well done! You've successfully completed the game!") - GAME_WON = True - - # Check for negative destination (penalty) - negative_destinations = self.list_things_at(agent.location, NegativeDestination) - if negative_destinations: - agent.performance -= 50 - log_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") - - def is_done(self): - """ The environment is done if the agent has won the game or if no agents are alive. """ - global GAME_WON - return GAME_WON or super().is_done() - - -class RandomAgent(Agent): - """ A simple agent program that moves randomly. The agent does receive a percept, - but ignores it, as it is a random agent. The agent returns a random action """ - def __init__(self): - super().__init__(self.random_move) - - def random_move(self, percept): - """ This function takes a percept and returns a random move """ - return random.choice(['down', 'left', 'up', 'right']) - - -class ReflexAgent(Agent): - """ A reflex agent that always moves to the cheapest adjacent square. - This agent doesnt care about the percept list. """ - - def __init__(self): - super().__init__(self.cheapest_move) - - def cheapest_move(self, percept): - """ Takes a percept (list of available moves with costs) and returns - the direction with the lowest cost. Each move in percept is a tuple - of (direction, cost) """ - if not percept: - return None # No moves available - - # Find the move with the minimum cost - cheapest = min(percept, key=lambda x: x[1]) - - # Return the direction of the cheapest move - return cheapest[0] - - -class ModelBasedReflexAgent(Agent): - """A model-based reflex agent that uses an internal model of the environment to make decisions. - The internal model is built up as the agent moves around the environment""" - - def __init__(self): - # Initialize the agent with the model-based reflex program - super().__init__(self.model_based_reflex_agent) - - # Initialize the model - self.model = { - 'width': None, # Will be inferred from percepts - 'depth': None, # Will be inferred from percepts - 'obstacles': set(), # Known obstacle positions - 'negative_dest': None, # Penalty block position (if known) - 'visited': set(), # Positions the agent has visited - 'last_performance': 0, # Last known performance value - 'last_position': None, # Last position of the agent - 'move_history': [], # History of moves to avoid loops - } - - # Initialize state and action - self.state = None - self.action = None - - def model_based_reflex_agent(self, percept): - """The model-based reflex agent program.""" - # Initialize state if first call - if self.state is None: - # Make sure we have a location before initializing state - if hasattr(self, 'location') and self.location is not None: - self.state = {'location': self.location, 'performance': 0} - # Add initial location to visited positions - self.model['visited'].add(self.location) - self.model['last_position'] = self.location - self.model['last_performance'] = 0 - - # Update the state based on percept and model - if self.state is not None: - self.state = self.update_state(self.state, self.action, percept) - - # Apply rules to determine the action - self.action = self.apply_rules(percept) - - # Record this move in history to detect loops - if self.action is not None: - self.model['move_history'].append(self.action) - # Keep only the last 10 moves in history - if len(self.model['move_history']) > 10: - self.model['move_history'] = self.model['move_history'][-10:] - - return self.action - - # If state is not initialized yet, default to a random move - if percept: - return random.choice([move[0] for move in percept]) - return None - - def update_state(self, state, action, percept): - """Update the state based on percept and model.""" - # Update the model with the current location - if action is not None: - # Save the last position and performance - self.model['last_position'] = state['location'] - self.model['last_performance'] = state['performance'] - - # Update current location based on the action taken using direction_to_coords - x, y = state['location'] - if action in direction_to_coords: - dx, dy = direction_to_coords[action] - state['location'] = (x + dx, y + dy) - - # Update performance in state - state['performance'] = self.performance - - # Check for significant performance changes - perf_change = state['performance'] - self.model['last_performance'] - - # If performance decreased by more than the move cost, might be a penalty block - expected_cost = state['location'][0] + state['location'][1] - if perf_change < -expected_cost - 10: # Significant penalty (more than just move cost) - self.model['negative_dest'] = state['location'] - - # Add current location to visited positions - self.model['visited'].add(state['location']) - - # Try to infer grid dimensions and obstacles from percepts - if percept: - # Infer possible moves from current position - possible_directions = [move[0] for move in percept] - x, y = state['location'] - - # If we can't move up, we might be at the top edge or there's an obstacle - if 'up' not in possible_directions and y > 0: - self.model['obstacles'].add((x, y-1)) - - # If we can't move down, we might be at the bottom edge or there's an obstacle - if 'down' not in possible_directions: - # Infer depth if we can't move down - if self.model['depth'] is None or y + 1 > self.model['depth']: - self.model['depth'] = y + 1 - else: - self.model['obstacles'].add((x, y+1)) - - # If we can't move left, we might be at the left edge or there's an obstacle - if 'left' not in possible_directions and x > 0: - self.model['obstacles'].add((x-1, y)) - - # If we can't move right, we might be at the right edge or there's an obstacle - if 'right' not in possible_directions: - # Infer width if we can't move right - if self.model['width'] is None or x + 1 > self.model['width']: - self.model['width'] = x + 1 - else: - self.model['obstacles'].add((x+1, y)) - - return state - - def apply_rules(self, percept): - """Apply rules to determine the action.""" - if not percept: - return None - - # Rule 1: If we know where the penalty block is, avoid it - if self.model['negative_dest'] is not None and self.state is not None: - # Filter out moves that would lead to the penalty block - neg_pos = self.model['negative_dest'] - - # Make sure neg_pos is a valid tuple - if isinstance(neg_pos, tuple) and len(neg_pos) == 2: - neg_x, neg_y = neg_pos - x, y = self.state['location'] - - safe_moves = [] - for move in percept: - direction = move[0] - # Calculate new position using direction_to_coords - if direction in direction_to_coords: - dx, dy = direction_to_coords[direction] - new_pos = (x + dx, y + dy) - - if new_pos != (neg_x, neg_y): - safe_moves.append(move) - - if safe_moves: - # Continue with the remaining rules using only safe moves - percept = safe_moves - - # Rule 2: Avoid getting stuck in loops - if len(self.model['move_history']) >= 4: - # Check for simple loops like up-down-up-down or left-right-left-right - last_moves = self.model['move_history'][-4:] - if (last_moves[0] == last_moves[2] and last_moves[1] == last_moves[3] and self.opposite_direction(last_moves[0]) == last_moves[1]): - # We're in a loop, try to break out by choosing a different move - loop_moves = {last_moves[0], last_moves[1]} - non_loop_moves = [move for move in percept if move[0] not in loop_moves] - if non_loop_moves: - # Choose the cheapest non-loop move - return min(non_loop_moves, key=lambda x: x[1])[0] - - # Rule 3 Prefer moves to unvisited positions - if self.state is not None: - unvisited_moves = [] - for move in percept: - direction = move[0] - x, y = self.state['location'] - - # Calculate new position using direction_to_coords - if direction in direction_to_coords: - dx, dy = direction_to_coords[direction] - new_pos = (x + dx, y + dy) - - # Check if the new position is unvisited - if new_pos not in self.model['visited']: - unvisited_moves.append(move) - - if unvisited_moves: - # Choose the cheapest unvisited move - return min(unvisited_moves, key=lambda x: x[1])[0] - - # Rule 4: Choose the move with the lowest cost - return min(percept, key=lambda x: x[1])[0] - - def opposite_direction(self, direction): - """Return the opposite direction.""" - opposites = { - 'up': 'down', - 'down': 'up', - 'left': 'right', - 'right': 'left' - } - return opposites.get(direction) - - -def generate_random_positions(width, depth): - """Generate random positions for obstacle, positive destination, negative destination, and agent.""" - # Create a list to track occupied positions - occupied_positions = [] - - # Generate random position for obstacle - obstacle_x = random.randint(0, width - 1) - obstacle_y = random.randint(0, depth - 1) - occupied_positions.append((obstacle_x, obstacle_y)) - - # Generate random position for positive destination (winning block) - while True: - pos_x = random.randint(0, width - 1) - pos_y = random.randint(0, depth - 1) - if (pos_x, pos_y) not in occupied_positions: - occupied_positions.append((pos_x, pos_y)) - break - - # Generate random position for negative destination (penalty block) - while True: - neg_x = random.randint(0, width - 1) - neg_y = random.randint(0, depth - 1) - if (neg_x, neg_y) not in occupied_positions: - occupied_positions.append((neg_x, neg_y)) - break - - # Generate random position for agent - agent_position = None - while True: - agent_x = random.randint(0, width - 1) - agent_y = random.randint(0, depth - 1) - if (agent_x, agent_y) not in occupied_positions: - occupied_positions.append((agent_x, agent_y)) - break - - log_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") - log_message(f"Positive location is ({pos_x}, {pos_y})") - log_message(f"Negative location is ({neg_x}, {neg_y})") - log_message(f"Agent location is ({agent_x}, {agent_y})") - log_message(f"Occupied positions are [{occupied_positions}]") - - return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions - - -# Create and set up the environment -def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negative_pos): - """ Create a 2D grid world environment with the specified width and depth. - The environment is represented as a 2D list of cells, where each cell can be either - a wall, a negative destination (penalty block), or a positive destination (winning block).""" - # Create the 2D grid world with the set width and depth - env = GridWorldEnvironment(width, depth) - - # Unpack positions - obstacle_x, obstacle_y = obstacle_pos - pos_x, pos_y = positive_pos - neg_x, neg_y = negative_pos - - # Create a list of occupied positions - occupied_positions = [obstacle_pos, positive_pos, negative_pos] - - # Add the obstacle, the penalty block and the winning block to the environment - env.add_thing(Obstacle(), (obstacle_x, obstacle_y)) - env.add_thing(PositiveDestination(), (pos_x, pos_y)) - env.add_thing(NegativeDestination(), (neg_x, neg_y)) - - return env, occupied_positions - - -# Search -class GridSearchProblem(Problem): - def __init__(self, initial, goal, width, depth, obstacles): - super().__init__(initial, goal) - self.width = width - self.depth = depth - self.obstacles = set(obstacles) - - def actions(self, state): - """Return valid directions from the current state.""" - x, y = state - directions = [] - if y > 0 and (x, y - 1) not in self.obstacles: - directions.append('up') - if y < self.depth - 1 and (x, y + 1) not in self.obstacles: - directions.append('down') - if x > 0 and (x - 1, y) not in self.obstacles: - directions.append('left') - if x < self.width - 1 and (x + 1, y) not in self.obstacles: - directions.append('right') - return directions - - def result(self, state, action): - """Return the new state after applying the action.""" - x, y = state - if action == 'up': - return (x, y - 1) - elif action == 'down': - return (x, y + 1) - elif action == 'left': - return (x - 1, y) - elif action == 'right': - return (x + 1, y) - else: - raise ValueError(f"Unknown action: {action}") - - def goal_test(self, state): - """Check if the current state is the goal.""" - return state == self.goal - - def path_cost(self, c, state1, action, state2): - """Cost is the sum of x and y coordinates of the destination.""" - return c + state2[0] + state2[1] - -def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): - """ This function is used to build the world for the agent to explore.""" - global GAME_WON - - # Generate and run the environment for {steps} steps with a list of agents - agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, ModelBasedReflexAgent().model_based_reflex_agent] - - for agent_program in agent_list: - log_message("") - log_message("********************************************************") - log_message(f"* Agent: {agent_program.__name__:45} *") - log_message("********************************************************") - - # Statistics for this agent across all runs - agent_stats = { - 'total_performance': 0, - 'wins': 0 - } - - # Create a new environment for the set of runs per agent type - env, occupied_positions = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) - - # Run the agent the specified number of times - for run in range(1, args.runs + 1): - log_message(f"\nRun {run} of {args.runs}") - - # Add an agent to the environment - agent = Agent(agent_program) - env.add_thing(agent, agent_pos) - log_message(f"Starting position is {agent_pos}") - - # Run the simulation and measure time - start_time = time.time() - env.run(args.steps) - end_time = time.time() - elapsed_time = end_time - start_time - - # Update statistics using the dictionary - agent_stats['total_performance'] += agent.performance # Store performance before deletion - if GAME_WON: - agent_stats['wins'] += 1 - - # Print results for this run - log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") - - # Remove the agent from the environment if it's still in the environment - if agent in env.things: - env.delete_thing(agent) - - # Reset the global variable GAME_WON for the next run - GAME_WON = False - - # Print summary statistics for this agent - avg_performance = agent_stats['total_performance'] / args.runs - win_rate = (agent_stats['wins'] / args.runs) * 100 - print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") - - -class GridSearchProblemWithHeuristic(GridSearchProblem): - def h(self, node): - """Manhattan distance heuristic from current node to goal.""" - x1, y1 = node.state - x2, y2 = self.goal - return abs(x2 - x1) + abs(y2 - y1) - - -def timeout_handler(signum, frame): - raise TimeoutError("Search timed out") - - -def greedy_search_with_timeout(problem, h, timeout_seconds=5): - # Set the timeout - signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(timeout_seconds) - - try: - # Run the search - result = greedy_best_first_graph_search(problem, f=h) - # Cancel the timeout if search completes - signal.alarm(0) - return result - except TimeoutError: - print(f"Greedy search timed out after {timeout_seconds} seconds") - return None - -def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions): - problem = GridSearchProblem( - initial=agent_pos, - goal=positive_pos, - width=args.width, - depth=args.depth, - obstacles=[obstacle_pos, negative_pos] - ) - - solution_bfs = breadth_first_graph_search(problem) - solution_dfs = depth_first_graph_search(problem) - solution_ucs = uniform_cost_search(problem) - - print("UNINFORMED SEARCH RESULTS") - print(f"BFS: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") - print(f"DFS: Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") - print(f"UCS: Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") - print("") - - problemInformed = GridSearchProblemWithHeuristic( - initial=agent_pos, - goal=positive_pos, - width=args.width, - depth=args.depth, - obstacles=[obstacle_pos, negative_pos] - ) - - print("INFORMED SEARCH RESULTS") - # wrapper function with timeout for greedy search - def run_greedy_search(problem): - return greedy_best_first_graph_search(problem, f=problem.h) - - # Run with timeout - with concurrent.futures.ThreadPoolExecutor() as executor: - future = executor.submit(run_greedy_search, problemInformed) - try: - solution_greedy = future.result(timeout=5) # Timeout after 5 seconds - except concurrent.futures.TimeoutError: - print("Greedy Search timed out!") - - # solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) - solution_astar = astar_search(problemInformed, h=problemInformed.h) - solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) - - - if solution_greedy: - print(f"Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") - else: - print("Greedy: No solution found") - - if solution_astar: - print(f"A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") - else: - print("A*: No solution found") - - if solution_rbfs: - print(f"RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") - else: - print("RBFS: No solution found") - print("") - - -def draw_grid(agent, obstacle, positive, negative): - """ Draw the grid and the agent and obstacles - Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position - """ - rows = args.width - cols = args.depth - content = [["."]*cols for _ in range(rows)] - - grid = [ - (obstacle[0], obstacle[1], "O"), - (agent[0], agent[1], "A"), - (positive[0], positive[1], "P"), - (negative[0], negative[1], "N")] - for (x, y, c) in grid: content[y][x] = c - - # build frame - width = len(str(max(rows, cols)-1)) - contentLine = "# | values |" - - dashes = "-".join("-"*width for _ in range(cols)) - frameLine = contentLine.replace("values", dashes) - frameLine = frameLine.replace("#", " "*width) - frameLine = frameLine.replace("| ", "+-").replace(" |", "-+") - - # x-axis numbers (at the top) - numLine = contentLine.replace("|", " ") - numLine = numLine.replace("#", " "*width) - colNums = " ".join(f"{i:<{width}d}" for i in range(cols)) - numLine = numLine.replace("values", colNums) - print(numLine) - - # print grid - print(frameLine) - for i, row in enumerate(content): - values = " ".join(f"{v:{width}s}" for v in row) - line = contentLine.replace("values", values) - line = line.replace("#", f"{i:{width}d}") - print(line) - print(frameLine) - - -if __name__ == "__main__": - - # Parse command line arguments - parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') - parser.add_argument('-v', '--verbose', action='http://github.com/store_true', - help='Print detailed movement and agent information') - parser.add_argument('-s', '--steps', type=int, required=True, - help='Number of steps per run to attempt to win the game (mandatory)') - parser.add_argument('-r', '--runs', type=int, required=True, - help='Number of times to run each agent (mandatory)') - parser.add_argument('-w', '--width', type=int, required=True, - help='Width of the grid world (mandatory)') - parser.add_argument('-d', '--depth', type=int, required=True, - help='depth of the grid world (mandatory)') - args = parser.parse_args() - - # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent - obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions = generate_random_positions(args.width, args.depth) - - if args.verbose: - draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) - - # building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) - searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions) From 5282f65ada2fa9dcb1e17e44c5ed2a491a408d8f Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 30 Sep 2025 16:08:37 +0100 Subject: [PATCH 19/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 522 ++++++++++++++++++ 1 file changed, 522 insertions(+) create mode 100644 assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py new file mode 100644 index 000000000..9b58c9a2e --- /dev/null +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -0,0 +1,522 @@ +""" +A1_COMP9016_Nagle_JohnPaul_R00065426.py + +Name: (John) Paul Nagle +Student ID: R00065426 +Class: Knowledge Representation +Assignment: 1 + +The 2D world is comprised of a grid of blocks. +There is one obstacle block that no agent can move to. +An agent gets penalised points (sum of x and y co-ordinates) for making each move. +An agent gets penalised 50 points if it lands on the penalty block +If the agent reaches the winning block it gets 100 points, wins the game and the game ends. +If the agent does not reach the winning block in the set number of moves, the game ends and the agent has lost the game. + +Here is an example map of the 2D world +Obstacle location is (1, 1) +Positive location is (4, 3) +Negative location is (0, 4) +Agent location is (6, 2) + + 0 1 2 3 4 5 6 7 + +-----------------+ +0 | . . . . . . . . | +1 | . O . . . . . . | +2 | . . . . . . A . | +3 | . . . . P . . . | +4 | N . . . . . . . | +5 | . . . . . . . . | +6 | . . . . . . . . | +7 | . . . . . . . . | + +-----------------+ + +AGENTS: + - Random Agent, picks the next move randomly + - Simple Reflex agent, always moves to the cheapest adjacent square. + - Table based agent, uses a table to decide the next move + +UNINFORMED SEARCHES: + - Breadth First Search + - Depth First Search + - Uniform Cost Search + +INFORMED SEARCHES: +- Greedy Best First Search +- A* Search i.e. Best First Graph Search +- Recursive Best First Search + +""" + +import sys +import os +import random +import argparse +import time +from zoneinfo import available_timezones + + + +# Get the parent directory of the current directory +parent_dir = os.path.dirname(os.getcwd()) + +# Add the parent directory to sys.path +sys.path.append(parent_dir) + +# Now you can import a module from the parent directory +from agents4e import Thing, XYEnvironment, Agent, Obstacle +from search import Node, Problem, best_first_graph_search, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search +from utils4e import PriorityQueue, memoize + +GAME_WON=False + +direction_to_coords = { + 'up': (0, -1), + 'down': (0, 1), + 'left': (-1, 0), + 'right': (1, 0) +} + +def log_message(message): + """Log a message if verbose mode is enabled.""" + if args.verbose: + print(message) + + +# Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position +def draw_grid(agent, obstacle, positive, negative): + # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked + print("\nA = Agent, P = Winning Square, N = Penalty Square, O = Obstacle\n") + rows = args.width + cols = args.depth + content = [["."]*cols for _ in range(rows)] + + grid = [ + (obstacle[0], obstacle[1], "O"), + (agent[0], agent[1], "A"), + (positive[0], positive[1], "P"), + (negative[0], negative[1], "N")] + for (x, y, c) in grid: content[y][x] = c + + # build frame + width = len(str(max(rows, cols)-1)) + contentLine = "# | values |" + + dashes = "-".join("-"*width for _ in range(cols)) + frameLine = contentLine.replace("values", dashes) + frameLine = frameLine.replace("#", " "*width) + frameLine = frameLine.replace("| ", "+-").replace(" |", "-+") + + # x-axis numbers (at the top) + numLine = contentLine.replace("|", " ") + numLine = numLine.replace("#", " "*width) + colNums = " ".join(f"{i:<{width}d}" for i in range(cols)) + numLine = numLine.replace("values", colNums) + print(numLine) + + # print grid + print(frameLine) + for i, row in enumerate(content): + values = " ".join(f"{v:{width}s}" for v in row) + line = contentLine.replace("values", values) + line = line.replace("#", f"{i:{width}d}") + print(line) + print(frameLine) + + +class PositiveDestination(Thing): + """ A destination that awards 100 points and wins the game when an agent reaches it """ + pass + + +class NegativeDestination(Thing): + """ A destination that penalises 50 points when an agent reaches it """ + pass + + +class GridWorldEnvironment(XYEnvironment): + """ This environment has a grid of rows and columns with obstacles """ + def __init__(self, width, depth): + super().__init__() + self.width = width + self.depth = depth + + def percept(self, agent): + # A list of available movements from the agent's current location and the associated cost + x, y = agent.location + obstacle_positions = [] + for thing in self.things: + if isinstance(thing, Obstacle): + if hasattr(thing, 'location') and thing.location is not None: + obstacle_positions.append(thing.location) + + available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.depth, obstacle_positions) + return available_moves_with_costs + + def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): + # Returns a list of tuples containing all possible moves and their associated costs + if obstacles is None: + obstacles = [] + + available_moves = [] + + if y > 0 and (x, y-1) not in obstacles: # UP is ok + available_moves.append(('up', (x + (y-1)))) + + if y < depth-1 and (x, y+1) not in obstacles: # DOWN is ok + available_moves.append(('down', (x + (y+1)))) + + if x < width-1 and (x+1, y) not in obstacles: # RIGHT is ok + available_moves.append(('right', ((x+1) + y))) + + if x > 0 and (x-1, y) not in obstacles: # LEFT is ok + available_moves.append(('left', ((x-1) + y))) + + # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") + return available_moves + + def execute_action(self, agent, action): + global GAME_WON + initial_location = agent.location + + # Calculate obstacle positions + obstacle_positions = [] + for thing in self.things: + if isinstance(thing, Obstacle): + # Safely get location if it exists + if hasattr(thing, 'location') and thing.location is not None: + obstacle_positions.append(thing.location) + + # Check if move is valid + if not self._is_valid_move(agent, action, obstacle_positions): + log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") + return + + # Update agent location based on action using the direction_to_coords dictionary + if action in direction_to_coords: + dx, dy = direction_to_coords[action] + agent.location = (agent.location[0] + dx, agent.location[1] + dy) + + log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") + + # Charge the agent for making a move (the cost is the sum of the x and y co-ordinates) + agent.performance -= (agent.location[0] + agent.location[1]) + + # Check destinations and apply effects + self._check_destinations(agent) + + def _is_valid_move(self, agent, action, obstacle_positions): + available_moves = self.get_available_moves_with_costs( + agent.location[0], + agent.location[1], + self.width, + self.depth, + obstacle_positions + ) + return any(action in tup for tup in available_moves) + + def _check_destinations(self, agent): + # Check if agent has landed on the winning or penalyty squares + global GAME_WON + + # Check for positive destination (winning) + positive_destinations = self.list_things_at(agent.location, PositiveDestination) + if positive_destinations: + agent.performance += 100 + log_message("Agent reached winning destination! Performance increase 100.") + log_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + log_message("👏 Well done! You've successfully completed the game!") + GAME_WON = True + + # Check for negative destination (penalty) + negative_destinations = self.list_things_at(agent.location, NegativeDestination) + if negative_destinations: + agent.performance -= 50 + log_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + + def is_done(self): + """ The environment is done if the agent has won the game or if no agents are alive. """ + global GAME_WON + return GAME_WON or super().is_done() + + +class RandomAgent(Agent): + # A simple agent program that moves randomly. + def __init__(self): + super().__init__(self.random_move) + + def random_move(self, percept): + return random.choice(['down', 'left', 'up', 'right']) + + +class ReflexAgent(Agent): + # """ A reflex agent that always moves to the cheapest adjacent square + def __init__(self): + super().__init__(self.cheapest_move) + + def cheapest_move(self, percept): + # returns the move with the lowest cost + cheapest = min(percept, key=lambda x: x[1]) + return cheapest[0] + + +class TableDrivenAgent(Agent): + # """ A table driven agent that uses a pre-calculated table to determine the best action to take. + def __init__(self): + super().__init__(self.table_action) + + def _get_preferred_move(self, table, available_moves): + for (_, move_list), direction in table.items(): + if set(move_list) == set(available_moves): + return direction + + def table_action(self, percept): + available_moves_list = [] + for allowed_movement in percept: + available_moves_list.append(allowed_movement[0]) + + available_moves = tuple(available_moves_list) + + agent_table = { + (available_moves, ('up',)): 'up', + (available_moves, ('down',)): 'down', + (available_moves, ('right',)): 'right', + (available_moves, ('left',)): 'left', + (available_moves, ('up', 'down')): 'up', + (available_moves, ('up', 'left')): 'up', + (available_moves, ('up', 'right')): 'right', + (available_moves, ('down', 'left')): 'down', + (available_moves, ('down', 'right')): 'right', + (available_moves, ('left', 'right')): 'left', + (available_moves, ('up', 'down', 'left')): 'up', + (available_moves, ('up', 'down', 'right')): 'up', + (available_moves, ('up', 'left', 'right')): 'right', + (available_moves, ('down', 'left', 'right')): 'left', + (available_moves, ('up', 'down', 'left', 'right')): 'up', + } + + return self._get_preferred_move(agent_table, available_moves) + + +def generate_random_starting_positions(width, depth): + # Generate random positions for obstacle, positive destination, negative destination, and the agent. + occupied_positions = [] + + obstacle_x = random.randint(0, width - 1) + obstacle_y = random.randint(0, depth - 1) + occupied_positions.append((obstacle_x, obstacle_y)) + + while True: + pos_x = random.randint(0, width - 1) + pos_y = random.randint(0, depth - 1) + if (pos_x, pos_y) not in occupied_positions: + occupied_positions.append((pos_x, pos_y)) + break + + while True: + neg_x = random.randint(0, width - 1) + neg_y = random.randint(0, depth - 1) + if (neg_x, neg_y) not in occupied_positions: + occupied_positions.append((neg_x, neg_y)) + break + + agent_position = None + while True: + agent_x = random.randint(0, width - 1) + agent_y = random.randint(0, depth - 1) + if (agent_x, agent_y) not in occupied_positions: + occupied_positions.append((agent_x, agent_y)) + break + + log_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") + log_message(f"Positive location is ({pos_x}, {pos_y})") + log_message(f"Negative location is ({neg_x}, {neg_y})") + log_message(f"Agent location is ({agent_x}, {agent_y})") + log_message(f"Occupied positions are [{occupied_positions}]") + + return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions + + +# Create and set up the environment +def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negative_pos): + # Create the 2D grid world with the set width and depth, and Things located at the specified positions + env = GridWorldEnvironment(width, depth) + env.add_thing(Obstacle(), obstacle_pos) + env.add_thing(PositiveDestination(), positive_pos) + env.add_thing(NegativeDestination(), negative_pos) + + return env + + +# Search +class GridSearchProblem(Problem): + def __init__(self, initial, goal, width, depth, obstacles): + super().__init__(initial, goal) + self.width = width + self.depth = depth + self.obstacles = set(obstacles) + + def actions(self, state): + """Return valid directions from the current state.""" + x, y = state + directions = [] + if y > 0 and (x, y - 1) not in self.obstacles: + directions.append('up') + if y < self.depth - 1 and (x, y + 1) not in self.obstacles: + directions.append('down') + if x > 0 and (x - 1, y) not in self.obstacles: + directions.append('left') + if x < self.width - 1 and (x + 1, y) not in self.obstacles: + directions.append('right') + return directions + + def result(self, state, action): + """Return the new state after applying the action.""" + x, y = state + if action == 'up': + return (x, y - 1) + elif action == 'down': + return (x, y + 1) + elif action == 'left': + return (x - 1, y) + elif action == 'right': + return (x + 1, y) + else: + raise ValueError(f"Unknown action: {action}") + + def goal_test(self, state): + """Check if the current state is the goal.""" + return state == self.goal + + def path_cost(self, c, state1, action, state2): + """Cost is the sum of x and y coordinates of the destination.""" + return c + state2[0] + state2[1] + + +class GridSearchProblemWithHeuristic(GridSearchProblem): + def h(self, node): + """Manhattan distance heuristic from current node to goal.""" + x1, y1 = node.state + x2, y2 = self.goal + return abs(x2 - x1) + abs(y2 - y1) + + +def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): + """ This function is used to build the world for the agent to explore.""" + global GAME_WON + + agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action] + + print("\nAGENT RESULTS") + for agent_program in agent_list: + log_message("") + log_message("********************************************************") + log_message(f"* Agent: {agent_program.__name__:45} *") + log_message("********************************************************") + + # Statistics for this agent across all runs + agent_stats = { + 'total_performance': 0, + 'wins': 0 + } + + # Create a new environment for the set of runs per agent type + env = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) + + # Run the agent the specified number of times + for run in range(1, args.runs + 1): + log_message(f"\nRun {run} of {args.runs}") + + # Add an agent to the environment + agent = Agent(agent_program) + env.add_thing(agent, agent_pos) + log_message(f"Starting position is {agent_pos}") + + # Run the simulation and measure time + start_time = time.time() + env.run(args.steps) + end_time = time.time() + elapsed_time = end_time - start_time + + # Update statistics using the dictionary + agent_stats['total_performance'] += agent.performance # Store performance before deletion + if GAME_WON: + agent_stats['wins'] += 1 + + # Print results for this run + log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") + + # Remove the agent from the environment if it's still in the environment + if agent in env.things: + env.delete_thing(agent) + + # Reset the global variable GAME_WON for the next run + GAME_WON = False + + # Print summary statistics for this agent + avg_performance = agent_stats['total_performance'] / args.runs + win_rate = (agent_stats['wins'] / args.runs) * 100 + print(f"=> {agent_program.__name__:20}: Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") + # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") + + +def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): + problem = GridSearchProblem( + initial=agent_pos, + goal=positive_pos, + width=args.width, + depth=args.depth, + obstacles=[obstacle_pos, negative_pos] + ) + + solution_bfs = breadth_first_graph_search(problem) + solution_dfs = depth_first_graph_search(problem) + solution_ucs = uniform_cost_search(problem) + + print("\nUNINFORMED SEARCH RESULTS") + print(f"=> Breadth First Search: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") + print(f"=> Depth First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") + print(f"=> Uniform Cost Search : Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") + + problemInformed = GridSearchProblemWithHeuristic( + initial=agent_pos, + goal=positive_pos, + width=args.width, + depth=args.depth, + obstacles=[obstacle_pos, negative_pos] + ) + + print("\nINFORMED SEARCH RESULTS") + + solution_astar = astar_search(problemInformed, h=problemInformed.h) + print(f"=> A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") + + solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) + print(f"=> RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") + + solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) + if solution_greedy: + print(f"=> Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") + else: + print("=> Greedy: No solution found") + + +if __name__ == "__main__": + + print("\nFYI: Pass the -h parameter to see details on how to configure the run") + # command line arguments + parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') + parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') + parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=25, help='Number of Agent steps per run to attempt to win the game (agent only)') + parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=25, help='Number of times to run each Agent (agent only)') + parser.add_argument('-w', '--width', type=int, nargs='?', const=1, default=10, help='Width of the grid world') + parser.add_argument('-d', '--depth', type=int, nargs='?', const=1, default=10, help='depth of the grid world') + args = parser.parse_args() + + # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent + obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions = generate_random_starting_positions(args.width, args.depth) + + draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) + + building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) From cac914caeb0a51932bbfffd0af42ae70016c4d9b Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 30 Sep 2025 16:09:11 +0100 Subject: [PATCH 20/56] checkpoint --- A1_COMP9016_Nagle_JohnPaul_R00065426.py | 523 ------------------------ 1 file changed, 523 deletions(-) delete mode 100644 A1_COMP9016_Nagle_JohnPaul_R00065426.py diff --git a/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/A1_COMP9016_Nagle_JohnPaul_R00065426.py deleted file mode 100644 index 01b62fdaa..000000000 --- a/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ /dev/null @@ -1,523 +0,0 @@ -""" -A1_COMP9016_Nagle_JohnPaul_R00065426.py - -Name: (John) Paul Nagle -Student ID: R00065426 -Class: Knowledge Representation -Assignment: 1 - -The 2D world is comprised of a grid of blocks. -There is one obstacle block that no agent can move to. -An agent gets penalised points (sum of x and y co-ordinates) for making each move. -An agent gets penalised 50 points if it lands on the penalty block -If the agent reaches the winning block it gets 100 points, wins the game and the game ends. -If the agent does not reach the winning block in the set number of moves, the game ends and the agent has lost the game. - -Here is an example map of the 2D world -Obstacle location is (1, 1) -Positive location is (4, 3) -Negative location is (0, 4) -Agent location is (6, 2) - - 0 1 2 3 4 5 6 7 - +-----------------+ -0 | . . . . . . . . | -1 | . O . . . . . . | -2 | . . . . . . A . | -3 | . . . . P . . . | -4 | N . . . . . . . | -5 | . . . . . . . . | -6 | . . . . . . . . | -7 | . . . . . . . . | - +-----------------+ - -AGENTS: - - Random Agent, picks the next move randomly - - Simple Reflex agent, always moves to the cheapest adjacent square. - - Table based agent, uses a table to decide the next move - -UNINFORMED SEARCHES: - - Breadth First Search - - Depth First Search - - Uniform Cost Search - -INFORMED SEARCHES: -- Greedy Best First Search -- A* Search i.e. Best First Graph Search -- Recursive Best First Search - -""" - -import sys -import os -import random -import argparse -import time -from zoneinfo import available_timezones - - - -# Get the parent directory of the current directory -parent_dir = os.path.dirname(os.getcwd()) - -# Add the parent directory to sys.path -sys.path.append(parent_dir) - -# Now you can import a module from the parent directory -from agents4e import Thing, XYEnvironment, Agent, Obstacle -from search import Node, Problem, best_first_graph_search, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search -from utils4e import PriorityQueue, memoize - -GAME_WON=False - -direction_to_coords = { - 'up': (0, -1), - 'down': (0, 1), - 'left': (-1, 0), - 'right': (1, 0) -} - -def log_message(message): - """Log a message if verbose mode is enabled.""" - if args.verbose: - print(message) - - -# Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position -def draw_grid(agent, obstacle, positive, negative): - # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked - print("\nA = Agent, P = Winning Square, N = Penalty Square, O = Obstacle\n") - rows = args.width - cols = args.depth - content = [["."]*cols for _ in range(rows)] - - grid = [ - (obstacle[0], obstacle[1], "O"), - (agent[0], agent[1], "A"), - (positive[0], positive[1], "P"), - (negative[0], negative[1], "N")] - for (x, y, c) in grid: content[y][x] = c - - # build frame - width = len(str(max(rows, cols)-1)) - contentLine = "# | values |" - - dashes = "-".join("-"*width for _ in range(cols)) - frameLine = contentLine.replace("values", dashes) - frameLine = frameLine.replace("#", " "*width) - frameLine = frameLine.replace("| ", "+-").replace(" |", "-+") - - # x-axis numbers (at the top) - numLine = contentLine.replace("|", " ") - numLine = numLine.replace("#", " "*width) - colNums = " ".join(f"{i:<{width}d}" for i in range(cols)) - numLine = numLine.replace("values", colNums) - print(numLine) - - # print grid - print(frameLine) - for i, row in enumerate(content): - values = " ".join(f"{v:{width}s}" for v in row) - line = contentLine.replace("values", values) - line = line.replace("#", f"{i:{width}d}") - print(line) - print(frameLine) - - -class PositiveDestination(Thing): - """ A destination that awards 100 points and wins the game when an agent reaches it """ - pass - - -class NegativeDestination(Thing): - """ A destination that penalises 50 points when an agent reaches it """ - pass - - -class GridWorldEnvironment(XYEnvironment): - """ This environment has a grid of rows and columns with obstacles """ - def __init__(self, width, depth): - super().__init__() - self.width = width - self.depth = depth - - def percept(self, agent): - # A list of available movements from the agent's current location and the associated cost - x, y = agent.location - obstacle_positions = [] - for thing in self.things: - if isinstance(thing, Obstacle): - if hasattr(thing, 'location') and thing.location is not None: - obstacle_positions.append(thing.location) - - available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.depth, obstacle_positions) - return available_moves_with_costs - - def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): - # Returns a list of tuples containing all possible moves and their associated costs - if obstacles is None: - obstacles = [] - - available_moves = [] - - if y > 0 and (x, y-1) not in obstacles: # UP is ok - available_moves.append(('up', (x + (y-1)))) - - if y < depth-1 and (x, y+1) not in obstacles: # DOWN is ok - available_moves.append(('down', (x + (y+1)))) - - if x < width-1 and (x+1, y) not in obstacles: # RIGHT is ok - available_moves.append(('right', ((x+1) + y))) - - if x > 0 and (x-1, y) not in obstacles: # LEFT is ok - available_moves.append(('left', ((x-1) + y))) - - # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") - return available_moves - - def execute_action(self, agent, action): - global GAME_WON - initial_location = agent.location - - # Calculate obstacle positions - obstacle_positions = [] - for thing in self.things: - if isinstance(thing, Obstacle): - # Safely get location if it exists - if hasattr(thing, 'location') and thing.location is not None: - obstacle_positions.append(thing.location) - - # Check if move is valid - if not self._is_valid_move(agent, action, obstacle_positions): - log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") - return - - # Update agent location based on action using the direction_to_coords dictionary - if action in direction_to_coords: - dx, dy = direction_to_coords[action] - agent.location = (agent.location[0] + dx, agent.location[1] + dy) - - log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") - - # Charge the agent for making a move (the cost is the sum of the x and y co-ordinates) - agent.performance -= (agent.location[0] + agent.location[1]) - - # Check destinations and apply effects - self._check_destinations(agent) - - def _is_valid_move(self, agent, action, obstacle_positions): - available_moves = self.get_available_moves_with_costs( - agent.location[0], - agent.location[1], - self.width, - self.depth, - obstacle_positions - ) - return any(action in tup for tup in available_moves) - - def _check_destinations(self, agent): - # Check if agent has landed on the winning or penalyty squares - global GAME_WON - - # Check for positive destination (winning) - positive_destinations = self.list_things_at(agent.location, PositiveDestination) - if positive_destinations: - agent.performance += 100 - log_message("Agent reached winning destination! Performance increase 100.") - log_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") - log_message("👏 Well done! You've successfully completed the game!") - GAME_WON = True - - # Check for negative destination (penalty) - negative_destinations = self.list_things_at(agent.location, NegativeDestination) - if negative_destinations: - agent.performance -= 50 - log_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") - - def is_done(self): - """ The environment is done if the agent has won the game or if no agents are alive. """ - global GAME_WON - return GAME_WON or super().is_done() - - -class RandomAgent(Agent): - # A simple agent program that moves randomly. - def __init__(self): - super().__init__(self.random_move) - - def random_move(self, percept): - return random.choice(['down', 'left', 'up', 'right']) - - -class ReflexAgent(Agent): - # """ A reflex agent that always moves to the cheapest adjacent square - def __init__(self): - super().__init__(self.cheapest_move) - - def cheapest_move(self, percept): - # returns the move with the lowest cost - cheapest = min(percept, key=lambda x: x[1]) - return cheapest[0] - - -class TableDrivenAgent(Agent): - # """ A table driven agent that uses a pre-calculated table to determine the best action to take. - def __init__(self): - super().__init__(self.table_action) - - def _get_preferred_move(self, table, available_moves): - for (_, move_list), direction in table.items(): - if set(move_list) == set(available_moves): - return direction - - def table_action(self, percept): - available_moves_list = [] - for allowed_movement in percept: - available_moves_list.append(allowed_movement[0]) - - available_moves = tuple(available_moves_list) - - agent_table = { - (available_moves, ('up',)): 'up', - (available_moves, ('down',)): 'down', - (available_moves, ('right',)): 'right', - (available_moves, ('left',)): 'left', - (available_moves, ('up', 'down')): 'up', - (available_moves, ('up', 'left')): 'up', - (available_moves, ('up', 'right')): 'right', - (available_moves, ('down', 'left')): 'down', - (available_moves, ('down', 'right')): 'right', - (available_moves, ('left', 'right')): 'left', - (available_moves, ('up', 'down', 'left')): 'up', - (available_moves, ('up', 'down', 'right')): 'up', - (available_moves, ('up', 'left', 'right')): 'right', - (available_moves, ('down', 'left', 'right')): 'left', - (available_moves, ('up', 'down', 'left', 'right')): 'up', - } - - return self._get_preferred_move(agent_table, available_moves) - - -def generate_random_starting_positions(width, depth): - # Generate random positions for obstacle, positive destination, negative destination, and the agent. - occupied_positions = [] - - obstacle_x = random.randint(0, width - 1) - obstacle_y = random.randint(0, depth - 1) - occupied_positions.append((obstacle_x, obstacle_y)) - - while True: - pos_x = random.randint(0, width - 1) - pos_y = random.randint(0, depth - 1) - if (pos_x, pos_y) not in occupied_positions: - occupied_positions.append((pos_x, pos_y)) - break - - while True: - neg_x = random.randint(0, width - 1) - neg_y = random.randint(0, depth - 1) - if (neg_x, neg_y) not in occupied_positions: - occupied_positions.append((neg_x, neg_y)) - break - - agent_position = None - while True: - agent_x = random.randint(0, width - 1) - agent_y = random.randint(0, depth - 1) - if (agent_x, agent_y) not in occupied_positions: - occupied_positions.append((agent_x, agent_y)) - break - - log_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") - log_message(f"Positive location is ({pos_x}, {pos_y})") - log_message(f"Negative location is ({neg_x}, {neg_y})") - log_message(f"Agent location is ({agent_x}, {agent_y})") - log_message(f"Occupied positions are [{occupied_positions}]") - - return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions - - -# Create and set up the environment -def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negative_pos): - # Create the 2D grid world with the set width and depth, and Things located at the specified positions - env = GridWorldEnvironment(width, depth) - env.add_thing(Obstacle(), obstacle_pos) - env.add_thing(PositiveDestination(), positive_pos) - env.add_thing(NegativeDestination(), negative_pos) - - return env - - -# Search -class GridSearchProblem(Problem): - def __init__(self, initial, goal, width, depth, obstacles): - super().__init__(initial, goal) - self.width = width - self.depth = depth - self.obstacles = set(obstacles) - - def actions(self, state): - """Return valid directions from the current state.""" - x, y = state - directions = [] - if y > 0 and (x, y - 1) not in self.obstacles: - directions.append('up') - if y < self.depth - 1 and (x, y + 1) not in self.obstacles: - directions.append('down') - if x > 0 and (x - 1, y) not in self.obstacles: - directions.append('left') - if x < self.width - 1 and (x + 1, y) not in self.obstacles: - directions.append('right') - return directions - - def result(self, state, action): - """Return the new state after applying the action.""" - x, y = state - if action == 'up': - return (x, y - 1) - elif action == 'down': - return (x, y + 1) - elif action == 'left': - return (x - 1, y) - elif action == 'right': - return (x + 1, y) - else: - raise ValueError(f"Unknown action: {action}") - - def goal_test(self, state): - """Check if the current state is the goal.""" - return state == self.goal - - def path_cost(self, c, state1, action, state2): - """Cost is the sum of x and y coordinates of the destination.""" - return c + state2[0] + state2[1] - - -class GridSearchProblemWithHeuristic(GridSearchProblem): - def h(self, node): - """Manhattan distance heuristic from current node to goal.""" - x1, y1 = node.state - x2, y2 = self.goal - return abs(x2 - x1) + abs(y2 - y1) - - -def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): - """ This function is used to build the world for the agent to explore.""" - global GAME_WON - - # Generate and run the environment for {steps} steps with a list of agents - # agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action] - - agent_list = [TableDrivenAgent().table_action] - print("\nAGENT RESULTS") - for agent_program in agent_list: - log_message("") - log_message("********************************************************") - log_message(f"* Agent: {agent_program.__name__:45} *") - log_message("********************************************************") - - # Statistics for this agent across all runs - agent_stats = { - 'total_performance': 0, - 'wins': 0 - } - - # Create a new environment for the set of runs per agent type - env = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) - - # Run the agent the specified number of times - for run in range(1, args.runs + 1): - log_message(f"\nRun {run} of {args.runs}") - - # Add an agent to the environment - agent = Agent(agent_program) - env.add_thing(agent, agent_pos) - log_message(f"Starting position is {agent_pos}") - - # Run the simulation and measure time - start_time = time.time() - env.run(args.steps) - end_time = time.time() - elapsed_time = end_time - start_time - - # Update statistics using the dictionary - agent_stats['total_performance'] += agent.performance # Store performance before deletion - if GAME_WON: - agent_stats['wins'] += 1 - - # Print results for this run - log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") - - # Remove the agent from the environment if it's still in the environment - if agent in env.things: - env.delete_thing(agent) - - # Reset the global variable GAME_WON for the next run - GAME_WON = False - - # Print summary statistics for this agent - avg_performance = agent_stats['total_performance'] / args.runs - win_rate = (agent_stats['wins'] / args.runs) * 100 - print(f"{agent_program.__name__:20}: Cost: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") - # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") - - -def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): - problem = GridSearchProblem( - initial=agent_pos, - goal=positive_pos, - width=args.width, - depth=args.depth, - obstacles=[obstacle_pos, negative_pos] - ) - - solution_bfs = breadth_first_graph_search(problem) - solution_dfs = depth_first_graph_search(problem) - solution_ucs = uniform_cost_search(problem) - - print("\nUNINFORMED SEARCH RESULTS") - print(f"Breadth First Search: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") - print(f"Depth First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") - print(f"Uniform Cost Search : Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") - - problemInformed = GridSearchProblemWithHeuristic( - initial=agent_pos, - goal=positive_pos, - width=args.width, - depth=args.depth, - obstacles=[obstacle_pos, negative_pos] - ) - - print("\nINFORMED SEARCH RESULTS") - - solution_astar = astar_search(problemInformed, h=problemInformed.h) - print(f"A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") - - solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) - print(f"RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") - - solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) - if solution_greedy: - print(f"Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") - else: - print("Greedy: No solution found") - - -if __name__ == "__main__": - - # command line arguments - parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') - parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') - parser.add_argument('-s', '--steps', type=int, required=True, help='Number of steps per run to attempt to win the game (mandatory)') - parser.add_argument('-r', '--runs', type=int, required=True, help='Number of times to run each agent (mandatory)') - parser.add_argument('-w', '--width', type=int, required=True, help='Width of the grid world (mandatory)') - parser.add_argument('-d', '--depth', type=int, required=True, help='depth of the grid world (mandatory)') - args = parser.parse_args() - - # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent - obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions = generate_random_starting_positions(args.width, args.depth) - - draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) - - building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) - # searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) From a313dbb65d902fbbff3fed2f8ed7665b5c9dbb28 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 30 Sep 2025 16:12:05 +0100 Subject: [PATCH 21/56] checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 9b58c9a2e..3591213bb 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -58,7 +58,7 @@ # Get the parent directory of the current directory -parent_dir = os.path.dirname(os.getcwd()) +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # Add the parent directory to sys.path sys.path.append(parent_dir) From e26fcb5819044a4a3f88bd586fd4cb6de133432a Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 30 Sep 2025 16:13:51 +0100 Subject: [PATCH 22/56] KnowledgeRep Assignment 1 checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 3591213bb..dfeb09b36 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -61,7 +61,8 @@ parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # Add the parent directory to sys.path -sys.path.append(parent_dir) +if parent_dir not in sys.path: + sys.path.insert(0, parent_dir) # Now you can import a module from the parent directory from agents4e import Thing, XYEnvironment, Agent, Obstacle From dc1b1c81d8a5035cfc0ea2f9ea9994349ddc11e6 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 30 Sep 2025 17:13:22 +0100 Subject: [PATCH 23/56] checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index dfeb09b36..2788a31f9 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -66,7 +66,7 @@ # Now you can import a module from the parent directory from agents4e import Thing, XYEnvironment, Agent, Obstacle -from search import Node, Problem, best_first_graph_search, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search +from search import Node, Problem, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search from utils4e import PriorityQueue, memoize GAME_WON=False From c0c5a925a3f4abe10d4b823f5452a05629adef52 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 30 Sep 2025 17:17:18 +0100 Subject: [PATCH 24/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 2788a31f9..16a437680 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -47,15 +47,11 @@ - Recursive Best First Search """ - import sys import os import random import argparse import time -from zoneinfo import available_timezones - - # Get the parent directory of the current directory parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) @@ -83,7 +79,6 @@ def log_message(message): if args.verbose: print(message) - # Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position def draw_grid(agent, obstacle, positive, negative): # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked @@ -124,17 +119,14 @@ def draw_grid(agent, obstacle, positive, negative): print(line) print(frameLine) - class PositiveDestination(Thing): """ A destination that awards 100 points and wins the game when an agent reaches it """ pass - class NegativeDestination(Thing): """ A destination that penalises 50 points when an agent reaches it """ pass - class GridWorldEnvironment(XYEnvironment): """ This environment has a grid of rows and columns with obstacles """ def __init__(self, width, depth): @@ -240,7 +232,6 @@ def is_done(self): global GAME_WON return GAME_WON or super().is_done() - class RandomAgent(Agent): # A simple agent program that moves randomly. def __init__(self): @@ -249,7 +240,6 @@ def __init__(self): def random_move(self, percept): return random.choice(['down', 'left', 'up', 'right']) - class ReflexAgent(Agent): # """ A reflex agent that always moves to the cheapest adjacent square def __init__(self): @@ -260,7 +250,6 @@ def cheapest_move(self, percept): cheapest = min(percept, key=lambda x: x[1]) return cheapest[0] - class TableDrivenAgent(Agent): # """ A table driven agent that uses a pre-calculated table to determine the best action to take. def __init__(self): @@ -298,7 +287,6 @@ def table_action(self, percept): return self._get_preferred_move(agent_table, available_moves) - def generate_random_starting_positions(width, depth): # Generate random positions for obstacle, positive destination, negative destination, and the agent. occupied_positions = [] @@ -337,7 +325,6 @@ def generate_random_starting_positions(width, depth): return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions - # Create and set up the environment def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negative_pos): # Create the 2D grid world with the set width and depth, and Things located at the specified positions @@ -348,7 +335,6 @@ def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negat return env - # Search class GridSearchProblem(Problem): def __init__(self, initial, goal, width, depth, obstacles): @@ -393,7 +379,6 @@ def path_cost(self, c, state1, action, state2): """Cost is the sum of x and y coordinates of the destination.""" return c + state2[0] + state2[1] - class GridSearchProblemWithHeuristic(GridSearchProblem): def h(self, node): """Manhattan distance heuristic from current node to goal.""" @@ -401,7 +386,6 @@ def h(self, node): x2, y2 = self.goal return abs(x2 - x1) + abs(y2 - y1) - def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): """ This function is used to build the world for the agent to explore.""" global GAME_WON @@ -460,7 +444,6 @@ def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): print(f"=> {agent_program.__name__:20}: Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") - def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): problem = GridSearchProblem( initial=agent_pos, @@ -501,7 +484,6 @@ def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): else: print("=> Greedy: No solution found") - if __name__ == "__main__": print("\nFYI: Pass the -h parameter to see details on how to configure the run") From 0766a4299b971b096e36aaa6af1dbfd1b7f4245c Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 30 Sep 2025 17:20:15 +0100 Subject: [PATCH 25/56] checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 16a437680..ad54ebcb3 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -241,7 +241,7 @@ def random_move(self, percept): return random.choice(['down', 'left', 'up', 'right']) class ReflexAgent(Agent): - # """ A reflex agent that always moves to the cheapest adjacent square + # A reflex agent that always moves to the cheapest adjacent square def __init__(self): super().__init__(self.cheapest_move) @@ -251,7 +251,7 @@ def cheapest_move(self, percept): return cheapest[0] class TableDrivenAgent(Agent): - # """ A table driven agent that uses a pre-calculated table to determine the best action to take. + # A table driven agent that uses a pre-calculated table to determine the best action to take. def __init__(self): super().__init__(self.table_action) From 54d91390e4f51a98e317a004301161320e449222 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 30 Sep 2025 17:26:22 +0100 Subject: [PATCH 26/56] checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index ad54ebcb3..db7a4c8b6 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -274,13 +274,13 @@ def table_action(self, percept): (available_moves, ('left',)): 'left', (available_moves, ('up', 'down')): 'up', (available_moves, ('up', 'left')): 'up', - (available_moves, ('up', 'right')): 'right', - (available_moves, ('down', 'left')): 'down', + (available_moves, ('up', 'right')): 'up', + (available_moves, ('down', 'left')): 'left', (available_moves, ('down', 'right')): 'right', (available_moves, ('left', 'right')): 'left', (available_moves, ('up', 'down', 'left')): 'up', (available_moves, ('up', 'down', 'right')): 'up', - (available_moves, ('up', 'left', 'right')): 'right', + (available_moves, ('up', 'left', 'right')): 'up', (available_moves, ('down', 'left', 'right')): 'left', (available_moves, ('up', 'down', 'left', 'right')): 'up', } From b10064389c53f8289c8c2586983218813683ea0d Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 30 Sep 2025 17:36:40 +0100 Subject: [PATCH 27/56] checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index db7a4c8b6..473a821d3 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -82,9 +82,10 @@ def log_message(message): # Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position def draw_grid(agent, obstacle, positive, negative): # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked - print("\nA = Agent, P = Winning Square, N = Penalty Square, O = Obstacle\n") - rows = args.width - cols = args.depth + print(f"\nA = Agent at {agent}, P = Winning Square at {positive} , N = Penalty Square at {negative}, O = Obstacle at {obstacle}\n") + rows = args.depth + cols = args.width + content = [["."]*cols for _ in range(rows)] grid = [ @@ -486,12 +487,12 @@ def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): if __name__ == "__main__": - print("\nFYI: Pass the -h parameter to see details on how to configure the run") + print("\n*** Pass the -h parameter to see details on how to configure the run ***") # command line arguments parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') - parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=25, help='Number of Agent steps per run to attempt to win the game (agent only)') - parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=25, help='Number of times to run each Agent (agent only)') + parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only)') + parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only)') parser.add_argument('-w', '--width', type=int, nargs='?', const=1, default=10, help='Width of the grid world') parser.add_argument('-d', '--depth', type=int, nargs='?', const=1, default=10, help='depth of the grid world') args = parser.parse_args() From bcef32237ea577a00bf1c33ed30ecb617b0070bb Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 30 Sep 2025 19:52:23 +0100 Subject: [PATCH 28/56] latest --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 473a821d3..ee8d6644d 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -82,10 +82,9 @@ def log_message(message): # Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position def draw_grid(agent, obstacle, positive, negative): # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked - print(f"\nA = Agent at {agent}, P = Winning Square at {positive} , N = Penalty Square at {negative}, O = Obstacle at {obstacle}\n") - rows = args.depth - cols = args.width - + print("\nA=Agent, P=Winning Square, N=Penalty Square, O=Obstacle\n") + rows = args.width + cols = args.depth content = [["."]*cols for _ in range(rows)] grid = [ From 091f8807d032c2391bfac2d4019c041b82b85d29 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Thu, 2 Oct 2025 16:29:14 +0100 Subject: [PATCH 29/56] lab4 kr --- assignment1/lab4.py | 109 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 assignment1/lab4.py diff --git a/assignment1/lab4.py b/assignment1/lab4.py new file mode 100644 index 000000000..3858a5419 --- /dev/null +++ b/assignment1/lab4.py @@ -0,0 +1,109 @@ +""" Paul Nagle R00065426 Knowledge Representation Lab 4 """ +import sys +import os +import random + +# Get the parent directory of the current directory +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + +# Add the parent directory to sys.path +if parent_dir not in sys.path: + sys.path.insert(0, parent_dir) + +# Now you can import a module from the parent directory +from agents import Dirt, XYEnvironment, Agent +from search import Problem, breadth_first_graph_search + + +class RandomVacuumAgent(Agent): + def __init__(self): + super().__init__(self.random_program) + + def random_program(self, percept): + return random.choice(['Suck', 'Down', 'Left', 'Up', 'Right']) + + +class RandomDirtVacuumEnvironment(XYEnvironment): + def __init__(self, width, height): + super().__init__(width, height) + self.width = width + self.height = height + self.dirt_positions = [] + + def populate_with_dirt(self): + dirt_probability = 0.8 + for x in range(0, self.width): + for y in range(0, self.height): + if random.random() < dirt_probability: + self.add_thing(Dirt(), (x, y), True) + self.dirt_positions.append((x, y)) + + +class VacuumProblem(Problem): + def __init__(self, initial_state, width, height): + super().__init__(initial_state) + self.width = width + self.height = height + self.state = initial_state + + def actions(self, state): + possible_actions = ['Suck'] + + x, y = state[0] + if y > 0: + possible_actions.append('Down') + if y < self.height - 1: + possible_actions.append('Up') + if x > 0: + possible_actions.append('Left') + if x < self.width - 1: + possible_actions.append('Right') + return possible_actions + + def result(self, state, action): + x, y = state[0] + position = (x, y) + if action == 'Up': + state[0] = (x, y + 1) + elif action == 'Down': + state[0] = (x, y - 1) + elif action == 'Left': + state[0] = (x - 1, y) + elif action == 'Right': + state[0] = (x + 1, y) + elif action == 'Suck': + if position in state[1]: + state[1].remove((x, y)) + else: + raise ValueError(f"Unknown action: {action}") + return state + + def goal_test(self, state): + if not state[1]: + return True + else: + return False + + def path_cost(self, c, state1, action, state2): + if action in ['Up', 'Down', 'Left', 'Right']: + return 1 + if action in ['Suck']: + return 100 + + +def get_initial_state_from_env(agent_position, env): + return (agent_position, env.dirt_positions) + + +if __name__ == "__main__": + print("Hello") + width = height = 8 + agent_position = (0, 0) + env = RandomDirtVacuumEnvironment(width, height) + env.populate_with_dirt() + agent = RandomVacuumAgent() + env.add_thing(agent, agent_position) + initial_state = get_initial_state_from_env(agent_position, env) + my_problem = VacuumProblem(initial_state, width, height) + solution_bfgs = breadth_first_graph_search(my_problem) + print(solution_bfgs) From be1edb58c885d2cb1feb063cd4347518108b29d9 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Fri, 3 Oct 2025 09:37:53 +0100 Subject: [PATCH 30/56] lab 4 --- assignment1/lab4.py | 52 +++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/assignment1/lab4.py b/assignment1/lab4.py index 3858a5419..0af006c29 100644 --- a/assignment1/lab4.py +++ b/assignment1/lab4.py @@ -1,4 +1,9 @@ -""" Paul Nagle R00065426 Knowledge Representation Lab 4 """ +""" +Student Name : Paul Nagle +Student Number : R00065426 +Module : Knowledge Representation +Lab Number : 4 +""" import sys import os import random @@ -61,22 +66,25 @@ def actions(self, state): return possible_actions def result(self, state, action): - x, y = state[0] - position = (x, y) + agent_pos, dirt_positions = state + x, y = agent_pos + new_dirt_positions = list(dirt_positions) + if action == 'Up': - state[0] = (x, y + 1) + new_agent_pos = (x, y + 1) elif action == 'Down': - state[0] = (x, y - 1) + new_agent_pos = (x, y - 1) elif action == 'Left': - state[0] = (x - 1, y) + new_agent_pos = (x - 1, y) elif action == 'Right': - state[0] = (x + 1, y) + new_agent_pos = (x + 1, y) elif action == 'Suck': - if position in state[1]: - state[1].remove((x, y)) + new_agent_pos = (x, y) + if (x, y) in new_dirt_positions: + new_dirt_positions.remove((x, y)) else: raise ValueError(f"Unknown action: {action}") - return state + return (new_agent_pos, tuple(new_dirt_positions)) def goal_test(self, state): if not state[1]: @@ -86,18 +94,17 @@ def goal_test(self, state): def path_cost(self, c, state1, action, state2): if action in ['Up', 'Down', 'Left', 'Right']: - return 1 + return c + 1 if action in ['Suck']: - return 100 + return c + 100 def get_initial_state_from_env(agent_position, env): - return (agent_position, env.dirt_positions) + return (agent_position, tuple(env.dirt_positions)) if __name__ == "__main__": - print("Hello") - width = height = 8 + width = height = 3 agent_position = (0, 0) env = RandomDirtVacuumEnvironment(width, height) env.populate_with_dirt() @@ -106,4 +113,17 @@ def get_initial_state_from_env(agent_position, env): initial_state = get_initial_state_from_env(agent_position, env) my_problem = VacuumProblem(initial_state, width, height) solution_bfgs = breadth_first_graph_search(my_problem) - print(solution_bfgs) + + if solution_bfgs is not None: + solution_path = solution_bfgs.path() + print("\nSequence of Actions:\n") + for node in solution_path: + print(f" => Location of agent : {node.state[0]}") + print(f" => Action taken by agent : {node.action}") + print(f" => State i.e. squares with dirt : {node.state[1]}") + print("") + + print(f"\nOverall Solution : {solution_bfgs.solution()}\n") + print(f"\nOverall Solution Cost : {solution_bfgs.path_cost}\n") + else: + print("\nNo Solution Found\n") From 57af66693ba796c74270db705977ba7942450d89 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Mon, 6 Oct 2025 16:36:04 +0100 Subject: [PATCH 31/56] c heckopint --- assignment1/1-result1.txt | 2550 ++++++++++++ assignment1/1-result3.txt | 306 ++ assignment1/2-result1.txt | 3570 +++++++++++++++++ assignment1/2-result3.txt | 306 ++ .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 30 +- .../A1_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 40666 -> 315530 bytes assignment1/graph.py | 38 + assignment1/result.txt | 102 + assignment1/result1.txt | 2142 ++++++++++ assignment1/result3.txt | 306 ++ assignment1/strategy_performance.xlsx | Bin 0 -> 7850 bytes assignment1/strategy_performance_latest.xlsx | Bin 0 -> 7475 bytes assignment1/strategy_performance_new.xlsx | Bin 0 -> 6917 bytes 13 files changed, 9340 insertions(+), 10 deletions(-) create mode 100644 assignment1/1-result1.txt create mode 100644 assignment1/1-result3.txt create mode 100644 assignment1/2-result1.txt create mode 100644 assignment1/2-result3.txt create mode 100644 assignment1/graph.py create mode 100644 assignment1/result.txt create mode 100644 assignment1/result1.txt create mode 100644 assignment1/result3.txt create mode 100644 assignment1/strategy_performance.xlsx create mode 100644 assignment1/strategy_performance_latest.xlsx create mode 100644 assignment1/strategy_performance_new.xlsx diff --git a/assignment1/1-result1.txt b/assignment1/1-result1.txt new file mode 100644 index 000000000..f0fbc79d2 --- /dev/null +++ b/assignment1/1-result1.txt @@ -0,0 +1,2550 @@ + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . W . . | +1 | . . P . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . O . . . . . . . | +5 | . . . . . . . . A . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -384.72 Win Rate: 16.80% (84/500) +=> cheapest_move : Performance: 43.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 43.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . W O . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . P . | +8 | . . . . . . . . . . | +9 | . . . A . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -367.40 Win Rate: 4.40% (22/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . P . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . O . . . . . | +5 | A . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . W . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -250.48 Win Rate: 10.60% (53/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . P . . . . . . . O | +1 | . . A . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . W . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -239.06 Win Rate: 5.20% (26/500) +=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -1022.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . A . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . O . . P . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . W | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -165.79 Win Rate: 1.00% (5/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | O . . . . . W . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . P . . . . . A . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -404.20 Win Rate: 24.00% (120/500) +=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . P . W | +1 | . . . . . . . A . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | O . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -246.60 Win Rate: 37.20% (186/500) +=> cheapest_move : Performance: -94.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | O . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . A W . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . P . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -108.54 Win Rate: 60.20% (301/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . A . . . . . . W . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . P . . . O . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -201.32 Win Rate: 6.80% (34/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . O . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . P . . . . | +4 | . . . A . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . W . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -295.30 Win Rate: 7.60% (38/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | A . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . W . . . . | +5 | . . . . . . . . O . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | P . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -121.55 Win Rate: 11.60% (58/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | P . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . A . . . . . . | +5 | . W . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | O . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -199.68 Win Rate: 34.80% (174/500) +=> cheapest_move : Performance: -888.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -888.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . O . . . | +3 | . . . . W . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . P . . . . | +8 | A . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -299.06 Win Rate: 10.00% (50/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | P . . . . . . . . . | +1 | . . . . W . . . . . | +2 | . . . . . . . . . . | +3 | . . . O . . . . . . | +4 | . . . . . . . . . . | +5 | A . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -241.88 Win Rate: 12.00% (60/500) +=> cheapest_move : Performance: -928.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -928.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . O . . . . . | +5 | . . . . . . . . A . | +6 | . . . . . . . W P . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -252.17 Win Rate: 51.60% (258/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . O . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . W . . . P . | +9 | . . . . . . . A . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -423.29 Win Rate: 33.20% (166/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . A . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . P . . | +4 | . . . . . . . . . . | +5 | . . . . W . . . . . | +6 | . . . . . . . . O . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -273.54 Win Rate: 14.20% (71/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . W | +1 | . . . O . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . A . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . P | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -371.75 Win Rate: 5.40% (27/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . O . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . P . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . W | +7 | . . . . . . . A . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -324.96 Win Rate: 35.20% (176/500) +=> cheapest_move : Performance: -318.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -318.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | P . . . . . . . . . | +1 | . . . A . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . W | +8 | . . . O . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -232.57 Win Rate: 1.20% (6/500) +=> cheapest_move : Performance: -974.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -974.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . W . . . | +1 | . . . . . . . . . . | +2 | . . . . . A . . . . | +3 | O . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . P . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -202.46 Win Rate: 34.60% (173/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | A . P . . . . . O . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . W . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -161.26 Win Rate: 29.00% (145/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . A . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . P . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . O . . . . . W | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -238.73 Win Rate: 3.20% (16/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . W | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . A . | +7 | . . . . . . . . . . | +8 | . . . . P O . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -405.07 Win Rate: 18.20% (91/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . A . . . . | +1 | . . . . . W . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . P . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . O . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -20.07 Win Rate: 73.20% (366/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . P . . . | +7 | . . . A . . . . . . | +8 | . . . . . . . . . . | +9 | W . . . . O . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -318.18 Win Rate: 18.40% (92/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . P . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . O . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | W . . . . A . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -344.35 Win Rate: 11.20% (56/500) +=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . O . . . . | +3 | . . . . . . . P . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . W . A . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -239.58 Win Rate: 38.00% (190/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . P . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . A . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . W . . O . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -244.16 Win Rate: 25.80% (129/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . W . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . O . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . P | +9 | . A . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -306.30 Win Rate: 1.20% (6/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . P . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . W . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . A . . . . . . | +9 | . . . . . O . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -338.49 Win Rate: 4.20% (21/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . O . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . W . . . . . | +7 | . . . . . . . . . P | +8 | . . . A . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -261.66 Win Rate: 36.20% (181/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . O . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . A . . | +9 | . . . . W . P . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -418.90 Win Rate: 23.40% (117/500) +=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . W O . . . . . P . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . A . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -483.45 Win Rate: 5.40% (27/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | A . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . P . . . . . . . . | +8 | . . . . . . W . . . | +9 | . . . . . . . . . O | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -245.04 Win Rate: 6.60% (33/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . O . . . . . W . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . P | +9 | . . . . . . . . A . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -548.67 Win Rate: 4.00% (20/500) +=> cheapest_move : Performance: 0.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 0.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | O . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . W . . . . | +7 | . . . . . . . . . . | +8 | . A . . . . . . . . | +9 | . . . . . . . P . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -283.08 Win Rate: 18.40% (92/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . P . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . W . O . . . . . . | +6 | . . . . . A . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -367.95 Win Rate: 11.80% (59/500) +=> cheapest_move : Performance: -120.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -120.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . A . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . P . . . . . . . | +6 | . . . . . . . . . . | +7 | W . . . . . . . O . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -328.24 Win Rate: 2.60% (13/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . A . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . P . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | W . . . . . . . . O | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -233.14 Win Rate: 3.80% (19/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . P . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . W . . . . . A . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . O . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -419.78 Win Rate: 5.80% (29/500) +=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . P . . | +3 | . . . . . . . . . . | +4 | O . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . A . . . . . . . . | +8 | . . . . . . . . . . | +9 | . W . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -149.65 Win Rate: 49.60% (248/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . O | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . P . . | +6 | . . . . . . . . . W | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . A | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -317.43 Win Rate: 45.00% (225/500) +=> cheapest_move : Performance: 52.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 52.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . A . . . . . . . . | +1 | . W . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . O . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . P . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: 38.90 Win Rate: 83.40% (417/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . W . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . O . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | P A . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -382.59 Win Rate: 4.60% (23/500) +=> cheapest_move : Performance: 55.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 55.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | O . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . W . A . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | P . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -259.05 Win Rate: 39.20% (196/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . W | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . A . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . O . . . . . | +9 | . . P . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -316.88 Win Rate: 22.00% (110/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . O A . . . | +8 | . . . . . . . P . . | +9 | . . . W . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -420.23 Win Rate: 21.60% (108/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . W . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . O | +4 | . . . . . . . . . . | +5 | . . . . . . P . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . A . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -463.21 Win Rate: 0.60% (3/500) +=> cheapest_move : Performance: -55.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -55.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . P . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | W . . . . O . . . . | +6 | . . . . . . . . . . | +7 | . . . . . A . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -392.91 Win Rate: 8.20% (41/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . O . . . P . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . W . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . A | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -337.29 Win Rate: 39.60% (198/500) +=> cheapest_move : Performance: -262.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -262.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . P | +2 | . . . . . A . . . O | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . W . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -278.97 Win Rate: 9.80% (49/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . W | +3 | . . A . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . P . . | +9 | O . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -225.41 Win Rate: 5.00% (25/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . O . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . W . . . | +6 | A . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . P . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -246.37 Win Rate: 10.60% (53/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . O . . . . . | +2 | . . . . . . . . . . | +3 | . . W . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . A . . . . P . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -362.62 Win Rate: 10.60% (53/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . W . . . . | +1 | . P . O . . . . . . | +2 | . . . . . . . A . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -261.50 Win Rate: 29.00% (145/500) +=> cheapest_move : Performance: 74.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 74.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . W . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . P . . . . . . . . | +7 | A . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . O . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -327.32 Win Rate: 9.60% (48/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . A . . . . . . . | +5 | . . . . . . . . . . | +6 | . . W . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . O . . . . P . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -145.68 Win Rate: 36.60% (183/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | A . . . W . . . . . | +2 | . . . . . . . . . O | +3 | . . P . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -133.06 Win Rate: 30.00% (150/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . W . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | A . . . . . . . . . | +8 | . O . . . . . . . . | +9 | . . P . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -297.60 Win Rate: 1.40% (7/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . O . W . | +6 | . . . . . . . . . . | +7 | . P . . . . . . . . | +8 | . . A . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -388.41 Win Rate: 4.80% (24/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | W . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . A . . . . | +3 | . . P . . . . . . . | +4 | . . O . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -280.81 Win Rate: 9.80% (49/500) +=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . W . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . O . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . P . . . . . . . . | +8 | . . A . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -403.86 Win Rate: 3.00% (15/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . P . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . O | +4 | . . . . . . . . . . | +5 | . . . . . . . . A . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . W . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -428.05 Win Rate: 2.60% (13/500) +=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . W | +3 | . . . . P . . . . . | +4 | . . . . . . . . . . | +5 | O . . . . . . . A . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -366.54 Win Rate: 23.00% (115/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . O . . | +2 | . . . . . . . . . . | +3 | . . . . . W . . P . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . A . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -407.28 Win Rate: 8.80% (44/500) +=> cheapest_move : Performance: 37.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 37.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . A . | +3 | . . . . . . . . . . | +4 | . . . . . . . . P . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . W . . . . . . | +9 | . . . . . . . O . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -385.98 Win Rate: 3.80% (19/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . O . . . . | +1 | . . . . . . . . . . | +2 | . . . . W . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . A . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . P . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -316.57 Win Rate: 13.60% (68/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . W . . . P . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . A . | +7 | . . . . . . . . . . | +8 | . . . . O . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -441.26 Win Rate: 3.80% (19/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . P . . | +4 | . . . . . . . . . . | +5 | . . . . W . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | A . . . . O . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -254.61 Win Rate: 19.20% (96/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . A . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . O . . | +8 | . . . . . . . . . . | +9 | . . . . . . . P W . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -237.72 Win Rate: 1.40% (7/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . P . . . . . | +5 | . . . . . . . . O . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . W . . . . . . . | +9 | . . A . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -57.04 Win Rate: 76.80% (384/500) +=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . P . | +3 | . W . . . . . . . . | +4 | . . O . . . . . . . | +5 | A . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -127.70 Win Rate: 47.20% (236/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . A . | +1 | . . . . . . . . . . | +2 | . . . . . . . P W . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . O . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -108.82 Win Rate: 65.60% (328/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . O . . . . . A . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | W . . . . . . . P . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -301.46 Win Rate: 1.00% (5/500) +=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . O . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . W . . . . | +7 | . . . . A . . P . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -227.53 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . O . . . . . W | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . P . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . A . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -322.73 Win Rate: 0.20% (1/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . O . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . P . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . W . . . . | +9 | A . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -238.74 Win Rate: 24.40% (122/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . A . . . . . . . . | +3 | . . . . . . . P . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . O . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . W . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -177.57 Win Rate: 4.40% (22/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | A . . P . . . . . . | +2 | . . . . . W . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . O . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -160.44 Win Rate: 17.00% (85/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . A . | +5 | . . . . . . . . . . | +6 | . . . . . . . P . . | +7 | . . . . . . . W . . | +8 | . . . . . . . . . . | +9 | . . . . . . O . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -310.24 Win Rate: 30.20% (151/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . P . . W . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | A . . . . . O . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -269.23 Win Rate: 4.80% (24/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | O . . . . . . . . . | +5 | . . . . . . . . . . | +6 | P . . . . . . . . . | +7 | W . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . A . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -248.14 Win Rate: 38.40% (192/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . P . | +2 | . . . . . . . . . . | +3 | . . A . . . . . . . | +4 | . . . . . . . . . . | +5 | W . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . O . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -178.28 Win Rate: 25.60% (128/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . W . | +1 | . . . . . . . . . . | +2 | . . . . . . P . . . | +3 | . . . O . . A . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -327.20 Win Rate: 22.80% (114/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | W . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . A . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . O | +8 | P . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -165.04 Win Rate: 25.60% (128/500) +=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . O . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . W . . . . A | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . P . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -431.52 Win Rate: 13.20% (66/500) +=> cheapest_move : Performance: -190.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -190.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . P . . A | +8 | . O . . . . . . . W | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -162.69 Win Rate: 62.80% (314/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . O . . . . | +1 | P . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . W . A | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -203.66 Win Rate: 53.60% (268/500) +=> cheapest_move : Performance: -278.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -278.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . W . . . . . . . . | +2 | . . P . . . O . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . A . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -366.18 Win Rate: 9.00% (45/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . W . . . . | +4 | . . . P . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . O . | +8 | A . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -302.27 Win Rate: 8.40% (42/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . O . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | P . . . . . . . . . | +9 | W A . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -109.90 Win Rate: 65.40% (327/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . O . . . . | +1 | . . . . . . . . P . | +2 | . . . . A . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . W . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -263.98 Win Rate: 4.80% (24/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . A . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | P . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . W . . . . . . | +8 | . . . . . . . . . . | +9 | O . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -298.03 Win Rate: 3.60% (18/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | A . . . O . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . W . . . . . . . | +8 | . . . . . P . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -130.56 Win Rate: 9.80% (49/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . A . . . | +6 | . . . . . . W . P . | +7 | . . . . . . . . . . | +8 | O . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -176.39 Win Rate: 52.00% (260/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | O . . P . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . W | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . A . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -404.98 Win Rate: 15.80% (79/500) +=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . W . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . P . O . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . A . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -344.52 Win Rate: 9.40% (47/500) +=> cheapest_move : Performance: 67.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 67.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | W . . . . . . . . . | +1 | . . . . . . . . . . | +2 | . . . . . . O . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . P | +8 | . . . . . . . . . . | +9 | . . . . . . . A . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -490.33 Win Rate: 0.80% (4/500) +=> cheapest_move : Performance: -20.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -20.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . W . . . . . . . | +1 | . . . . . . . O A . | +2 | . . . . . . . . . . | +3 | . . . . P . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -315.47 Win Rate: 7.00% (35/500) +=> cheapest_move : Performance: 65.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 65.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . O . . . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . A . . | +4 | W . . . . . . . . . | +5 | . . . P . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . . . . . . . | +8 | . . . . . . . . . . | +9 | . . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -350.04 Win Rate: 5.00% (25/500) +=> cheapest_move : Performance: -302.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -302.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 + +---------------------+ +0 | . . . . . . . . P . | +1 | . . . . . . . . . . | +2 | . . . . . . . . . . | +3 | . . . . . . . . . . | +4 | . . . . . . . . . . | +5 | . . . . . . . . . . | +6 | . . . . . . . . . . | +7 | . . . . W . . . O . | +8 | . . . . . . . . . . | +9 | A . . . . . . . . . | + +---------------------+ + +AGENT RESULTS +=> random_move : Performance: -224.67 Win Rate: 29.40% (147/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/1-result3.txt b/assignment1/1-result3.txt new file mode 100644 index 000000000..732966f1a --- /dev/null +++ b/assignment1/1-result3.txt @@ -0,0 +1,306 @@ +=> random_move : Performance: -384.72 Win Rate: 16.80% (84/500) +=> cheapest_move : Performance: 43.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 43.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -367.40 Win Rate: 4.40% (22/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -250.48 Win Rate: 10.60% (53/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -239.06 Win Rate: 5.20% (26/500) +=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -1022.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -165.79 Win Rate: 1.00% (5/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -404.20 Win Rate: 24.00% (120/500) +=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -246.60 Win Rate: 37.20% (186/500) +=> cheapest_move : Performance: -94.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -108.54 Win Rate: 60.20% (301/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -201.32 Win Rate: 6.80% (34/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -295.30 Win Rate: 7.60% (38/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -121.55 Win Rate: 11.60% (58/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -199.68 Win Rate: 34.80% (174/500) +=> cheapest_move : Performance: -888.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -888.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -299.06 Win Rate: 10.00% (50/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -241.88 Win Rate: 12.00% (60/500) +=> cheapest_move : Performance: -928.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -928.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -252.17 Win Rate: 51.60% (258/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -423.29 Win Rate: 33.20% (166/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -273.54 Win Rate: 14.20% (71/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -371.75 Win Rate: 5.40% (27/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -324.96 Win Rate: 35.20% (176/500) +=> cheapest_move : Performance: -318.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -318.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -232.57 Win Rate: 1.20% (6/500) +=> cheapest_move : Performance: -974.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -974.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -202.46 Win Rate: 34.60% (173/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -161.26 Win Rate: 29.00% (145/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -238.73 Win Rate: 3.20% (16/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -405.07 Win Rate: 18.20% (91/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -20.07 Win Rate: 73.20% (366/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -318.18 Win Rate: 18.40% (92/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -344.35 Win Rate: 11.20% (56/500) +=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -239.58 Win Rate: 38.00% (190/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -244.16 Win Rate: 25.80% (129/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -306.30 Win Rate: 1.20% (6/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -338.49 Win Rate: 4.20% (21/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -261.66 Win Rate: 36.20% (181/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -418.90 Win Rate: 23.40% (117/500) +=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -483.45 Win Rate: 5.40% (27/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -245.04 Win Rate: 6.60% (33/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -548.67 Win Rate: 4.00% (20/500) +=> cheapest_move : Performance: 0.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 0.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -283.08 Win Rate: 18.40% (92/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -367.95 Win Rate: 11.80% (59/500) +=> cheapest_move : Performance: -120.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -120.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -328.24 Win Rate: 2.60% (13/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -233.14 Win Rate: 3.80% (19/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -419.78 Win Rate: 5.80% (29/500) +=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -149.65 Win Rate: 49.60% (248/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -317.43 Win Rate: 45.00% (225/500) +=> cheapest_move : Performance: 52.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 52.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: 38.90 Win Rate: 83.40% (417/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -382.59 Win Rate: 4.60% (23/500) +=> cheapest_move : Performance: 55.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 55.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -259.05 Win Rate: 39.20% (196/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -316.88 Win Rate: 22.00% (110/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -420.23 Win Rate: 21.60% (108/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -463.21 Win Rate: 0.60% (3/500) +=> cheapest_move : Performance: -55.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -55.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -392.91 Win Rate: 8.20% (41/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -337.29 Win Rate: 39.60% (198/500) +=> cheapest_move : Performance: -262.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -262.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -278.97 Win Rate: 9.80% (49/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -225.41 Win Rate: 5.00% (25/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -246.37 Win Rate: 10.60% (53/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -362.62 Win Rate: 10.60% (53/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -261.50 Win Rate: 29.00% (145/500) +=> cheapest_move : Performance: 74.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 74.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -327.32 Win Rate: 9.60% (48/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -145.68 Win Rate: 36.60% (183/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -133.06 Win Rate: 30.00% (150/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -297.60 Win Rate: 1.40% (7/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -388.41 Win Rate: 4.80% (24/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -280.81 Win Rate: 9.80% (49/500) +=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -403.86 Win Rate: 3.00% (15/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -428.05 Win Rate: 2.60% (13/500) +=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -366.54 Win Rate: 23.00% (115/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -407.28 Win Rate: 8.80% (44/500) +=> cheapest_move : Performance: 37.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 37.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -385.98 Win Rate: 3.80% (19/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -316.57 Win Rate: 13.60% (68/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -441.26 Win Rate: 3.80% (19/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -254.61 Win Rate: 19.20% (96/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -237.72 Win Rate: 1.40% (7/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -57.04 Win Rate: 76.80% (384/500) +=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -127.70 Win Rate: 47.20% (236/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -108.82 Win Rate: 65.60% (328/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -301.46 Win Rate: 1.00% (5/500) +=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -227.53 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -322.73 Win Rate: 0.20% (1/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -238.74 Win Rate: 24.40% (122/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -177.57 Win Rate: 4.40% (22/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -160.44 Win Rate: 17.00% (85/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -310.24 Win Rate: 30.20% (151/500) +=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -269.23 Win Rate: 4.80% (24/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -248.14 Win Rate: 38.40% (192/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -178.28 Win Rate: 25.60% (128/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -327.20 Win Rate: 22.80% (114/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -165.04 Win Rate: 25.60% (128/500) +=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -431.52 Win Rate: 13.20% (66/500) +=> cheapest_move : Performance: -190.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -190.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -162.69 Win Rate: 62.80% (314/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -203.66 Win Rate: 53.60% (268/500) +=> cheapest_move : Performance: -278.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -278.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -366.18 Win Rate: 9.00% (45/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -302.27 Win Rate: 8.40% (42/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -109.90 Win Rate: 65.40% (327/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -263.98 Win Rate: 4.80% (24/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -298.03 Win Rate: 3.60% (18/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -130.56 Win Rate: 9.80% (49/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -176.39 Win Rate: 52.00% (260/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -404.98 Win Rate: 15.80% (79/500) +=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -344.52 Win Rate: 9.40% (47/500) +=> cheapest_move : Performance: 67.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 67.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -490.33 Win Rate: 0.80% (4/500) +=> cheapest_move : Performance: -20.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -20.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -315.47 Win Rate: 7.00% (35/500) +=> cheapest_move : Performance: 65.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 65.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -350.04 Win Rate: 5.00% (25/500) +=> cheapest_move : Performance: -302.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -302.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -224.67 Win Rate: 29.40% (147/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/2-result1.txt b/assignment1/2-result1.txt new file mode 100644 index 000000000..e7c4b8655 --- /dev/null +++ b/assignment1/2-result1.txt @@ -0,0 +1,3570 @@ + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . O . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . W . . . . . . . . | +13 | . . . . . . . . . . . . . . P . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | A . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . W | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . P . . . . . . A . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . O . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . O . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . A . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . P . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . W . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . A . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . W . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . O . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . P . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . A . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . O . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . W . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . P . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -251.74 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . P . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . O . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . W . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . A . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . P . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . O . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . W . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . A . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -426.07 Win Rate: 14.40% (72/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . P . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . W . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . O . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . A . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . W . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . A . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . O . . . . . . . . . . . . | +16 | . . . . . . . P . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . A | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . W . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . P . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . O . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . A . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . W . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . O . | +16 | . . . . . . . . P . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -633.72 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . A . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . W . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . P . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . O . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -420.94 Win Rate: 11.00% (55/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . O . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . P . . . . . . . . . . . . . . . A . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . W . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . W . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . P . . . | +11 | . . A . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . O . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . P . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . W . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . A . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | O . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -644.11 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . O . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . W . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . A | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | P . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . P . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . W . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . A | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . O | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . O . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . P | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | A . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . W . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . P . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . O . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . A . . . . . . . . . . W . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -521.65 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . W . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . A | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . O . . . . | +16 | . . . . . . P . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . O . . . . P . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . W | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . A . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -502.46 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . O . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . A . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . P . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . W . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | O . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . P . . W . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . A . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . P . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . O . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . A . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . W . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . O . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . W . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . P . . . . . . . . . . . . . | +17 | . . . . . . . . . . A . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . W . . . . . . . . . . . | + 8 | . . P . . . . . A . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | O . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -314.78 Win Rate: 52.80% (264/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . W . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | O . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | A P . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -404.60 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -42.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . W . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | O . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . P . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . A . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . W . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . P . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . O | +11 | . . . . . . . . . . . . . . . . . A . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . A . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . O . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . P . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . W . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . P . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . O . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . A . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . W . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . W . . . . . . . . . . P . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . A . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . O . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . O . . . . . . . . . | + 6 | . . . . . . . P . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . A . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . W . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . A . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . W . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . P . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . O . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -559.45 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . P . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . W . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . A . . . . . . . . . . . O . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -446.72 Win Rate: 5.60% (28/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . P . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . W . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . A . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . O . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . A . . . . . . . | + 1 | W . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . P . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . O . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . O . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . W . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . A . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . P . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | W . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . A . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . P . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . O . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . W . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . A . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . P | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . O . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . P | + 3 | . . . . . . . . . . . . . W . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . O . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . A . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . O . . . . . . . . . . . . . . . . . | + 4 | . . . . . . P . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . A | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . W . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . A . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . P . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . W . . . . . . . O . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . A . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . P . | + 9 | . . . . . . . . . . . O . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . W . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . P | + 5 | . . . . . . . . . . . . A . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . O . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . W . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . O . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . P W . . . . . . . . . . | +11 | . . . . . . . A . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . O . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . P . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . W . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . A . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | W . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . O . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . A | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . P . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . O . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . A . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . P . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . W . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . O . . . . . . . . . . . . . . | + 9 | . . . . . . . . W . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . A . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . P . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . P . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . W . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . O . . . . . . . . . . . . . | +13 | . . . . . A . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . W . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . O . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . P | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . A . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . W . . | +10 | . . . . . . . A . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . O . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . P . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -665.08 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . O . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . W . . . . P . . . . . . . . | +17 | . . . . . . . . . A . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . A . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . P . O . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . W . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . O . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . A . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . W P . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . A | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . P . . O . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . W . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . O . . . . . . P . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . A . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . W . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -414.04 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . W . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . O . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . P . . . . . . . . . . . . . . | +15 | . . A . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . P . . . . . . . . . . . . . . . . . | +10 | . . . . . . . O . . . . . . . . . . . . | +11 | . W . . . . . . . . . . . . . . . . A . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . O . . . . . . . . W . . . . . P | + 6 | . . . . . . . . . A . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -598.68 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . O . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . A . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . P . | +14 | . . . . . . . . . . . . . . . . . W . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -243.55 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . W . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . A . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . O . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . P . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -464.21 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . O . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . P . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . A . . . . . . | + 7 | . . . . . . . . W . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . W . . . . . | + 5 | . . . . . . P . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . O . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . A . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . W . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . O . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . P . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . A . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . W . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . P . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . O . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . A . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . O . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . A . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . W . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . P . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . A . . . . . . . . . . . . . . | +14 | . O . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . P . | +18 | . . . . . . W . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . O A | +13 | . . . . W . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . P . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . O . . . . . . . | +13 | . . . . . . . . . . . . . . P . . . . . | +14 | . . . . . . . . . . . . . W . . . . . . | +15 | . . . . . . . . . A . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . P . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . A . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . O . . | +10 | . W . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . A . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . P . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . O . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . W . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . A . . . . | + 1 | . . . . . . . . . P . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . O . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . W . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . O . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . P A . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . W . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -615.36 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . W . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . P . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . O . . . . . . . . . . . . . . . . . . | +19 | . . . . . . A . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . A . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . O . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . P . W | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -561.21 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . O . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . W . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . P . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . A . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . P . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | O . . . . . . . . . . . . . . . . . . A | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . W . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . P A . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . W . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . O . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -459.20 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . A . | + 6 | . . . . . W . O . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . P . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | A . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . P . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . O . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . W . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -203.30 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . A . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . O . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . P . . . | +19 | . . . . . . . . . . . . . . . . . . . W | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -313.17 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . A . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . W . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | O . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . P . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . A . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . P . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . O . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . W . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . W . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . A . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . P . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . O . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -330.95 Win Rate: 28.60% (143/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . P . . . . . . . . . A . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . O . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . W . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . W . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . A . . . . . . O . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . P . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -651.45 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . W . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . A . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . O . . . . . . | +16 | . . . . . . . . . . . . . . . . . P . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . A . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . P . W . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . O . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -211.08 Win Rate: 1.80% (9/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . A . . . . . . . . | + 6 | W . . . . . . . . . . . . . . . . . . . | + 7 | . . . . O . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . P | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . P . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . O . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . A . W . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . A . . . . . . . . . . . . . . . . | + 1 | . . . . W . . . . . . . . . . . . . . . | + 2 | . P . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . O . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -63.95 Win Rate: 63.20% (316/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . O . . | + 7 | . . . . . . . . P . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . A . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . W . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . P . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . O . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . A . . . . W . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | P . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . A . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . O . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . W . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -361.02 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | O . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . P . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | W . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . A . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . O . . | + 4 | . . . . . . . P . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . A . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . W . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . O . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . W . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . A . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . P . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -604.14 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -230.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -230.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . A . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . W . . O . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . P . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -211.44 Win Rate: 1.60% (8/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . O . . . . | + 3 | . . . . . . . . . . . . . . . . . . . . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . A . . . . . . . . . . | + 7 | . W . . . . . . . . . . . . . . . . . . | + 8 | . . . . . . . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . P . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . . . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: -595.88 Win Rate: 2.60% (13/500) +=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + +-------------------------------------------------------------+ + 0 | . . . . . . . . . . . . . . . . . . . . | + 1 | . . . . . . . . . . . . . . . . . . . . | + 2 | . . . . . . . . . . . . . . . . . . . . | + 3 | . . . . . . . . . . . . . . . . P . W . | + 4 | . . . . . . . . . . . . . . . . . . . . | + 5 | . . . . . . . . . . . . . . . . . . . . | + 6 | . . . . . . . . . . . . . . . . . . . . | + 7 | . . . . . . . . . . . . . . . . . . . . | + 8 | . . . . . O . . . . . . . . . . . . . . | + 9 | . . . . . . . . . . . . . . . . . . . . | +10 | . . . . . . . . . . . . . . . . . . . . | +11 | . . . . . . . . . . . . . . . . . . . . | +12 | . . . . . . . . . . . . . . . . . . . . | +13 | . . . . . . . . . . . . . . . . . . . . | +14 | . . . . . . . . . . . . . . . . . . . . | +15 | . . . . . . . . . . . . . . . . . . . . | +16 | . . . . . . . . . . . . . . . . . . . . | +17 | . . . . . . . . . . . . . . . . . . . . | +18 | . . . . . . . . . . . . . . A . . . . . | +19 | . . . . . . . . . . . . . . . . . . . . | + +-------------------------------------------------------------+ + +AGENT RESULTS +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/2-result3.txt b/assignment1/2-result3.txt new file mode 100644 index 000000000..1f33ad3ab --- /dev/null +++ b/assignment1/2-result3.txt @@ -0,0 +1,306 @@ +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -251.74 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -426.07 Win Rate: 14.40% (72/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -633.72 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -420.94 Win Rate: 11.00% (55/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -644.11 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -521.65 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -502.46 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -314.78 Win Rate: 52.80% (264/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -404.60 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -42.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -559.45 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -446.72 Win Rate: 5.60% (28/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -665.08 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -414.04 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -598.68 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -243.55 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -464.21 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -615.36 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -561.21 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -459.20 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -203.30 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -313.17 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -330.95 Win Rate: 28.60% (143/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -651.45 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -211.08 Win Rate: 1.80% (9/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -63.95 Win Rate: 63.20% (316/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -361.02 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -604.14 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: -230.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -230.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -211.44 Win Rate: 1.60% (8/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -595.88 Win Rate: 2.60% (13/500) +=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index ee8d6644d..97a7ab53f 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -82,7 +82,7 @@ def log_message(message): # Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position def draw_grid(agent, obstacle, positive, negative): # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked - print("\nA=Agent, P=Winning Square, N=Penalty Square, O=Obstacle\n") + print("\nA=Agent, W=Winning Square, P=Penalty Square, O=Obstacle\n") rows = args.width cols = args.depth content = [["."]*cols for _ in range(rows)] @@ -90,8 +90,8 @@ def draw_grid(agent, obstacle, positive, negative): grid = [ (obstacle[0], obstacle[1], "O"), (agent[0], agent[1], "A"), - (positive[0], positive[1], "P"), - (negative[0], negative[1], "N")] + (positive[0], positive[1], "W"), + (negative[0], negative[1], "P")] for (x, y, c) in grid: content[y][x] = c # build frame @@ -484,22 +484,32 @@ def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): else: print("=> Greedy: No solution found") -if __name__ == "__main__": - print("\n*** Pass the -h parameter to see details on how to configure the run ***") +def print_args(args): + print("\nCURRENT ARGUMENTS:" + f" STEPS=> {args.steps}" + f" RUNS=> {args.runs}" + f" WIDTH=> {args.width}" + f" DEPTH=> {args.depth}" + ) + print("\n*** Pass the -h parameter to see details on how to configure the arguments ***") + +if __name__ == "__main__": # command line arguments parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') - parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only)') - parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only)') - parser.add_argument('-w', '--width', type=int, nargs='?', const=1, default=10, help='Width of the grid world') - parser.add_argument('-d', '--depth', type=int, nargs='?', const=1, default=10, help='depth of the grid world') + parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only) (DEFAULT: 40)') + parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only) (DEFAULT: 500)') + parser.add_argument('-w', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') + parser.add_argument('-d', '--depth', type=int, nargs='?', const=1, default=6, help='depth of the grid world (DEFAULT: 6)') args = parser.parse_args() + print_args(args) + # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions = generate_random_starting_positions(args.width, args.depth) draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) - searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + # searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) diff --git a/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx index 1160aab28ae5b374b5e50edf99ab6bbf1cf65866..7d2da30b84da6716e2e1caf5015b45daf9d46c5f 100644 GIT binary patch literal 315530 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

@da1yyNBjJs1JDz9oSX}A&rLK^J5wp9lDF{ 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 IfC%V+0Us1wvj6}9 delta 29533 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

+LV5fQqa9Uy1p(Kck={<^B|7E1C0uXN%8?ao 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 W5bHm{5ezWCM;;7!@J#!8ng0WZL!tEm diff --git a/assignment1/graph.py b/assignment1/graph.py new file mode 100644 index 000000000..29c60cdb3 --- /dev/null +++ b/assignment1/graph.py @@ -0,0 +1,38 @@ +import pandas as pd + +# Load the Excel file +df = pd.read_excel("~/github/aima-python/assignment1/strategy_performance_latest.xlsx", engine="openpyxl") + +grouped = df.groupby("Strategy").agg({ + "Performance": "mean", + "Win Rate (%)": "mean" +}).reset_index() +import plotly.graph_objects as go + +fig = go.Figure() + +# Add average performance bars +fig.add_trace(go.Bar( + x=grouped["Strategy"], + y=grouped["Performance"], + name="Average Performance", + marker_color="indianred" +)) + +# Add average win rate bars +fig.add_trace(go.Bar( + x=grouped["Strategy"], + y=grouped["Win Rate (%)"], + name="Average Win Rate (%)", + marker_color="lightsalmon" +)) + +# Customize layout +fig.update_layout( + title="Average Performance and Win Rate by Strategy", + xaxis_title="Strategy", + yaxis_title="Value", + barmode="group" +) + +fig.show() diff --git a/assignment1/result.txt b/assignment1/result.txt new file mode 100644 index 000000000..d6646006b --- /dev/null +++ b/assignment1/result.txt @@ -0,0 +1,102 @@ +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py +python ./A1_COMP9016_Nagle_JohnPaul_R00065426.py diff --git a/assignment1/result1.txt b/assignment1/result1.txt new file mode 100644 index 000000000..1ae9900b0 --- /dev/null +++ b/assignment1/result1.txt @@ -0,0 +1,2142 @@ + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . O . A . W | +4 | P . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -108.17 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . A . | +1 | O . P . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . W . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -173.84 Win Rate: 26.60% (133/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . A . | +2 | O . . . . P | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . . W . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -184.16 Win Rate: 24.80% (124/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . W . . | +1 | . . . . . . | +2 | . . O . A . | +3 | . . . P . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -161.94 Win Rate: 42.40% (212/500) +=> cheapest_move : Performance: 88.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 88.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | A O . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . W | +4 | . P . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -127.51 Win Rate: 16.80% (84/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . W . | +1 | . . . . . . | +2 | . . . . . . | +3 | . A . . . . | +4 | . . . . P . | +5 | . . . . O . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -140.46 Win Rate: 26.40% (132/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | O . P . . . | +1 | . . . . . . | +2 | . . W . . . | +3 | . . A . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -27.72 Win Rate: 68.80% (344/500) +=> cheapest_move : Performance: 96.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 96.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . W . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . A . . . . | +5 | . O . P . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -141.68 Win Rate: 35.00% (175/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . A . . . . | +3 | . . . . . W | +4 | . O . P . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -120.02 Win Rate: 24.40% (122/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . P | +4 | . O W . . . | +5 | . . . . . A | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -158.60 Win Rate: 50.60% (253/500) +=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . P | +4 | . O . . . A | +5 | . . . . . W | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -74.29 Win Rate: 68.00% (340/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | O . A . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . P W . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -106.60 Win Rate: 33.00% (165/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . P . | +2 | . . O . W . | +3 | . A . . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -108.18 Win Rate: 30.60% (153/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | W . . . A . | +2 | O P . . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -166.32 Win Rate: 22.00% (110/500) +=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | W . A . . . | +3 | . . P . . . | +4 | . . . . . . | +5 | . . . . . O | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -137.74 Win Rate: 46.60% (233/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . P | +2 | W . . . . . | +3 | . . . . . . | +4 | . O . . . A | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -204.44 Win Rate: 21.40% (107/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . P . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . A . . . . | +4 | . W . . O . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -12.35 Win Rate: 71.00% (355/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . W . . | +2 | . . . . . . | +3 | . O . . A . | +4 | . . . . . . | +5 | P . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -117.18 Win Rate: 47.60% (238/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | P . . . . . | +1 | A . . . W . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . O . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -130.89 Win Rate: 34.20% (171/500) +=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -1020.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . P | +1 | O . . . . . | +2 | W . . . . . | +3 | . . . . . . | +4 | A . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -63.88 Win Rate: 51.80% (259/500) +=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | P . . . . O | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . A . . | +4 | . . W . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -71.42 Win Rate: 57.60% (288/500) +=> cheapest_move : Performance: -932.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -932.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | W . . . . . | +1 | . . . . . . | +2 | . . . . . P | +3 | . . . . . . | +4 | . . . . . . | +5 | O . . . A . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -231.44 Win Rate: 13.80% (69/500) +=> cheapest_move : Performance: 64.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 64.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | W . . . . P | +1 | . . . . . . | +2 | . . . . A O | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -179.22 Win Rate: 20.80% (104/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . P | +1 | . . . . . . | +2 | . . A . . . | +3 | . O . . . . | +4 | . . . W . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -86.03 Win Rate: 43.40% (217/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . O | +1 | . . . . . . | +2 | . . . P . . | +3 | . . . . . . | +4 | A . . . . . | +5 | . . . . W . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -136.52 Win Rate: 28.20% (141/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . P . | +2 | A . . . . . | +3 | . . . . . . | +4 | . . W . . . | +5 | O . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -76.77 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | A . . . . . | +1 | P . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . O . W . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -175.67 Win Rate: 28.80% (144/500) +=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | P . . . . . | +3 | . . . . A . | +4 | . . O . . W | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -72.70 Win Rate: 52.60% (263/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . W | +3 | . O A . . . | +4 | . . . . . . | +5 | . . . P . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -150.71 Win Rate: 32.00% (160/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . W . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . A . . O P | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -139.08 Win Rate: 26.60% (133/500) +=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . O . . . W | +2 | . . . . . A | +3 | . . . . . . | +4 | . P . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -39.20 Win Rate: 70.60% (353/500) +=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | A . . . . . | +1 | . . . O . . | +2 | . . . W . . | +3 | . . P . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -75.75 Win Rate: 36.60% (183/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . P W . . . | +2 | . . . . . . | +3 | . . A . . O | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -96.52 Win Rate: 48.40% (242/500) +=> cheapest_move : Performance: 93.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 93.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . P . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | A . . . . O | +5 | . . . . . W | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -147.91 Win Rate: 12.80% (64/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . P . . . | +1 | . . A . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | O . . . W . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -151.34 Win Rate: 32.60% (163/500) +=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -72.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . W | +2 | . . . . . . | +3 | . . . . . . | +4 | . P . A O . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -198.01 Win Rate: 25.60% (128/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . P . | +2 | . . . O . . | +3 | . . . . . . | +4 | A . . . W . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -94.95 Win Rate: 37.00% (185/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . P . . | +1 | W . . . . . | +2 | . . . . O . | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . A . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -179.48 Win Rate: 20.80% (104/500) +=> cheapest_move : Performance: 21.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . P . . . | +1 | . . . . . . | +2 | . . . O . . | +3 | . . . . . . | +4 | . . . . . . | +5 | A . W . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -34.42 Win Rate: 61.60% (308/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . W . | +2 | . . . . P . | +3 | . . . A . . | +4 | . . . . . O | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -123.39 Win Rate: 48.00% (240/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . W . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . A | +4 | . O . . P . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -250.31 Win Rate: 22.20% (111/500) +=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . P . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | O . . . . . | +4 | A . W . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -1.90 Win Rate: 77.20% (386/500) +=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . A . . | +1 | . . . . . . | +2 | W . P . . . | +3 | . . O . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -132.50 Win Rate: 34.20% (171/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | W . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | P . . . . . | +5 | . . . A . O | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -213.10 Win Rate: 15.40% (77/500) +=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . O . . . . | +2 | A . . P . . | +3 | . . . W . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -66.35 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . O . . A | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . W . | +5 | P . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -91.75 Win Rate: 41.60% (208/500) +=> cheapest_move : Performance: -140.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -140.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . W . . . . | +1 | . . . . . . | +2 | . . . O . . | +3 | . . . . . . | +4 | . . A . . . | +5 | . . . . P . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -196.02 Win Rate: 25.00% (125/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . A O . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . W . . | +5 | . . . P . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -68.12 Win Rate: 37.60% (188/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . O . A | +1 | P . . . . . | +2 | . W . . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -134.65 Win Rate: 27.20% (136/500) +=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -180.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | A . . . . . | +2 | . . . . . . | +3 | . . . O . . | +4 | . . . . P . | +5 | . . . . . W | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -115.94 Win Rate: 11.20% (56/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . W . . . . | +2 | . . . . . . | +3 | . . O . . . | +4 | . . . . . . | +5 | . . . . P A | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -305.07 Win Rate: 19.80% (99/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . W . . . | +1 | . . P O . . | +2 | . . . . . . | +3 | A . . . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -120.23 Win Rate: 33.20% (166/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . A . | +1 | . W . . . . | +2 | . . . . O . | +3 | . . . . . P | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -112.61 Win Rate: 42.20% (211/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . A . . . | +1 | . . . . . . | +2 | . . . . . O | +3 | . . . . . . | +4 | . . . . P W | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -115.25 Win Rate: 19.40% (97/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . W . . | +3 | . . . . O . | +4 | . . . . A . | +5 | . . . P . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -186.72 Win Rate: 44.80% (224/500) +=> cheapest_move : Performance: 82.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 82.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . W . . | +4 | . . . . P O | +5 | . A . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -83.88 Win Rate: 50.80% (254/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . A . . | +2 | . . P . . . | +3 | . . . . . O | +4 | . . . . . . | +5 | . W . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -174.18 Win Rate: 24.00% (120/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . P | +1 | . W . . . . | +2 | . . . O . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . A . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -119.15 Win Rate: 34.80% (174/500) +=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . A . . . . | +1 | . . . . . . | +2 | . . W . . O | +3 | . . . . . . | +4 | . . . . . . | +5 | . . P . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -14.17 Win Rate: 63.40% (317/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . W . . | +1 | . . . . . . | +2 | . P . . . . | +3 | . . . . . . | +4 | . . . O . . | +5 | . . A . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -179.94 Win Rate: 22.20% (111/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | P . . . . . | +3 | . . . . . . | +4 | . . O . A W | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -23.64 Win Rate: 71.60% (358/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | W . . . . . | +3 | . . . P . . | +4 | A . . . . . | +5 | O . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -65.95 Win Rate: 59.80% (299/500) +=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . O . P | +2 | . . . . . . | +3 | . . . . . . | +4 | . A . W . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -52.03 Win Rate: 55.80% (279/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . O . . | +4 | A . . . . . | +5 | . . . . P W | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -129.10 Win Rate: 19.60% (98/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | W . . . . . | +1 | . . . O . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . P . | +5 | . . . . A . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -297.86 Win Rate: 10.40% (52/500) +=> cheapest_move : Performance: 14.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 14.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . W . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . P . | +4 | . O . . . . | +5 | . . . A . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -221.51 Win Rate: 23.00% (115/500) +=> cheapest_move : Performance: 73.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 73.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . W . O | +2 | . . . . A . | +3 | P . . . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -68.55 Win Rate: 58.20% (291/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | W . . P A . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . O . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -212.14 Win Rate: 25.00% (125/500) +=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . O . | +2 | . . W . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . A . P . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -136.14 Win Rate: 48.60% (243/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | W . . . . . | +2 | . . O . . . | +3 | . . . . A . | +4 | . . . P . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -244.01 Win Rate: 18.40% (92/500) +=> cheapest_move : Performance: 78.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . O A W . | +3 | . . . . . . | +4 | . . . . . . | +5 | P . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -3.02 Win Rate: 74.40% (372/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . O . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . P . . . . | +4 | W . A . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -123.17 Win Rate: 47.60% (238/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . P | +3 | . . . . . . | +4 | O . A . . . | +5 | W . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -152.42 Win Rate: 25.40% (127/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . W . P . . | +2 | . . . . . A | +3 | . . . . . . | +4 | . . . . . O | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -181.96 Win Rate: 34.60% (173/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . O . . . . | +2 | W . . . P . | +3 | . . . . . . | +4 | . . . . . . | +5 | . A . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -124.54 Win Rate: 42.60% (213/500) +=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . P . | +2 | . . . . . . | +3 | . . . . . O | +4 | W . . . . . | +5 | . . . A . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -146.05 Win Rate: 37.20% (186/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . O . . . | +4 | . P A . . W | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -193.13 Win Rate: 40.00% (200/500) +=> cheapest_move : Performance: -82.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -82.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . O | +1 | . A . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . P . . . | +5 | . W . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -108.94 Win Rate: 26.80% (134/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . W P . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . O A . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -149.03 Win Rate: 35.20% (176/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | W . . . . . | +1 | . . . . . O | +2 | . . . . . . | +3 | . . . . A . | +4 | . . . . . . | +5 | P . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -188.66 Win Rate: 16.60% (83/500) +=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . A . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . . P | +5 | . . . . W O | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -117.00 Win Rate: 19.60% (98/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . W . . . | +1 | . . A . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . O P . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -27.57 Win Rate: 65.20% (326/500) +=> cheapest_move : Performance: 98.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 98.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . P O | +2 | . . . . . . | +3 | . . . . . . | +4 | . . A . . . | +5 | . W . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -76.45 Win Rate: 57.00% (285/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . W . . . . | +1 | . . . . . . | +2 | . P . O . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . A . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -175.19 Win Rate: 24.60% (123/500) +=> cheapest_move : Performance: 35.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 35.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . P . . . . | +1 | . . . . . . | +2 | A . . . W . | +3 | . . . . . . | +4 | . . O . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -133.16 Win Rate: 29.80% (149/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -970.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | A . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | W . . . . P | +4 | . . . . . . | +5 | . . . . . O | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -48.43 Win Rate: 48.20% (241/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . P . . | +4 | . . A . . O | +5 | . . . . W . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -131.70 Win Rate: 39.60% (198/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . O . W . . | +2 | . P . . . . | +3 | . . . . A . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -128.62 Win Rate: 46.20% (231/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . W | +1 | O . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | P . . A . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -201.53 Win Rate: 17.80% (89/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | O . . . . . | +1 | . P A . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | W . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -208.59 Win Rate: 20.00% (100/500) +=> cheapest_move : Performance: -1010.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . W O . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . . A . P . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -231.20 Win Rate: 15.40% (77/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . W . P . | +1 | . . . . . . | +2 | . . . A . . | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . . O . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -120.61 Win Rate: 44.40% (222/500) +=> cheapest_move : Performance: 91.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 91.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . W . . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | P . . . . . | +5 | . O A . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -180.97 Win Rate: 28.80% (144/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . W . . . . | +1 | . . A . . . | +2 | . . . . . . | +3 | . . . . . . | +4 | . O . . . P | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -66.94 Win Rate: 54.40% (272/500) +=> cheapest_move : Performance: 97.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 97.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . P . . | +1 | . . . . . . | +2 | . . . . . W | +3 | . . . . . . | +4 | . . . . . A | +5 | . O . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -97.27 Win Rate: 53.00% (265/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . W . . . | +2 | . . . . A . | +3 | . . . . . P | +4 | . . . . . . | +5 | O . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -149.35 Win Rate: 49.00% (245/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . O | +3 | . . . P . . | +4 | . . . A . . | +5 | . . . . . W | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -165.89 Win Rate: 39.40% (197/500) +=> cheapest_move : Performance: -88.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -88.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . A . | +1 | . . . . . . | +2 | . . O . P W | +3 | . . . . . . | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -71.16 Win Rate: 55.20% (276/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . O . | +1 | . . P . . A | +2 | . . . . . . | +3 | . . . . . . | +4 | . . . . . . | +5 | W . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -193.54 Win Rate: 13.60% (68/500) +=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -220.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . O W . | +1 | . . . . . . | +2 | . . . . . P | +3 | . . . . . . | +4 | . . . . . . | +5 | . A . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -167.91 Win Rate: 14.40% (72/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . . . | +1 | . . . . . . | +2 | . . . . . . | +3 | . O . . . P | +4 | . . . . . A | +5 | . . . . . W | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -77.93 Win Rate: 65.40% (327/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) + +CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 + +*** Pass the -h parameter to see details on how to configure the arguments *** + +A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle + + 0 1 2 3 4 5 + +-------------+ +0 | . . . . O . | +1 | . P A . . . | +2 | . . . . . . | +3 | . . . . . W | +4 | . . . . . . | +5 | . . . . . . | + +-------------+ + +AGENT RESULTS +=> random_move : Performance: -189.15 Win Rate: 26.00% (130/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/result3.txt b/assignment1/result3.txt new file mode 100644 index 000000000..16c239721 --- /dev/null +++ b/assignment1/result3.txt @@ -0,0 +1,306 @@ +=> random_move : Performance: -108.17 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -173.84 Win Rate: 26.60% (133/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -184.16 Win Rate: 24.80% (124/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -161.94 Win Rate: 42.40% (212/500) +=> cheapest_move : Performance: 88.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 88.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -127.51 Win Rate: 16.80% (84/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -140.46 Win Rate: 26.40% (132/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -27.72 Win Rate: 68.80% (344/500) +=> cheapest_move : Performance: 96.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 96.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -141.68 Win Rate: 35.00% (175/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -120.02 Win Rate: 24.40% (122/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -158.60 Win Rate: 50.60% (253/500) +=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -74.29 Win Rate: 68.00% (340/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -106.60 Win Rate: 33.00% (165/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -108.18 Win Rate: 30.60% (153/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -166.32 Win Rate: 22.00% (110/500) +=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -137.74 Win Rate: 46.60% (233/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -204.44 Win Rate: 21.40% (107/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -12.35 Win Rate: 71.00% (355/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -117.18 Win Rate: 47.60% (238/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -130.89 Win Rate: 34.20% (171/500) +=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -1020.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -63.88 Win Rate: 51.80% (259/500) +=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -71.42 Win Rate: 57.60% (288/500) +=> cheapest_move : Performance: -932.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -932.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -231.44 Win Rate: 13.80% (69/500) +=> cheapest_move : Performance: 64.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 64.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -179.22 Win Rate: 20.80% (104/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -86.03 Win Rate: 43.40% (217/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -136.52 Win Rate: 28.20% (141/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -76.77 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -175.67 Win Rate: 28.80% (144/500) +=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -72.70 Win Rate: 52.60% (263/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -150.71 Win Rate: 32.00% (160/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -139.08 Win Rate: 26.60% (133/500) +=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -39.20 Win Rate: 70.60% (353/500) +=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -75.75 Win Rate: 36.60% (183/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -96.52 Win Rate: 48.40% (242/500) +=> cheapest_move : Performance: 93.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 93.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -147.91 Win Rate: 12.80% (64/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -151.34 Win Rate: 32.60% (163/500) +=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -72.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -198.01 Win Rate: 25.60% (128/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -94.95 Win Rate: 37.00% (185/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -179.48 Win Rate: 20.80% (104/500) +=> cheapest_move : Performance: 21.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -34.42 Win Rate: 61.60% (308/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -123.39 Win Rate: 48.00% (240/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -250.31 Win Rate: 22.20% (111/500) +=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -1.90 Win Rate: 77.20% (386/500) +=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -132.50 Win Rate: 34.20% (171/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -213.10 Win Rate: 15.40% (77/500) +=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -66.35 Win Rate: 45.80% (229/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -91.75 Win Rate: 41.60% (208/500) +=> cheapest_move : Performance: -140.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -140.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -196.02 Win Rate: 25.00% (125/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -68.12 Win Rate: 37.60% (188/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -134.65 Win Rate: 27.20% (136/500) +=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -180.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -115.94 Win Rate: 11.20% (56/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -305.07 Win Rate: 19.80% (99/500) +=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -120.23 Win Rate: 33.20% (166/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -112.61 Win Rate: 42.20% (211/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -115.25 Win Rate: 19.40% (97/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -186.72 Win Rate: 44.80% (224/500) +=> cheapest_move : Performance: 82.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 82.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -83.88 Win Rate: 50.80% (254/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -174.18 Win Rate: 24.00% (120/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -119.15 Win Rate: 34.80% (174/500) +=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -14.17 Win Rate: 63.40% (317/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -179.94 Win Rate: 22.20% (111/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -23.64 Win Rate: 71.60% (358/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -65.95 Win Rate: 59.80% (299/500) +=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -52.03 Win Rate: 55.80% (279/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -129.10 Win Rate: 19.60% (98/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -297.86 Win Rate: 10.40% (52/500) +=> cheapest_move : Performance: 14.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 14.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -221.51 Win Rate: 23.00% (115/500) +=> cheapest_move : Performance: 73.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 73.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -68.55 Win Rate: 58.20% (291/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -212.14 Win Rate: 25.00% (125/500) +=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -136.14 Win Rate: 48.60% (243/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -244.01 Win Rate: 18.40% (92/500) +=> cheapest_move : Performance: 78.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -3.02 Win Rate: 74.40% (372/500) +=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -123.17 Win Rate: 47.60% (238/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -152.42 Win Rate: 25.40% (127/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -181.96 Win Rate: 34.60% (173/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -124.54 Win Rate: 42.60% (213/500) +=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -146.05 Win Rate: 37.20% (186/500) +=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -193.13 Win Rate: 40.00% (200/500) +=> cheapest_move : Performance: -82.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -82.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -108.94 Win Rate: 26.80% (134/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -149.03 Win Rate: 35.20% (176/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -188.66 Win Rate: 16.60% (83/500) +=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -117.00 Win Rate: 19.60% (98/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -27.57 Win Rate: 65.20% (326/500) +=> cheapest_move : Performance: 98.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 98.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -76.45 Win Rate: 57.00% (285/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -175.19 Win Rate: 24.60% (123/500) +=> cheapest_move : Performance: 35.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 35.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -133.16 Win Rate: 29.80% (149/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -970.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -48.43 Win Rate: 48.20% (241/500) +=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -131.70 Win Rate: 39.60% (198/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -128.62 Win Rate: 46.20% (231/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -201.53 Win Rate: 17.80% (89/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -208.59 Win Rate: 20.00% (100/500) +=> cheapest_move : Performance: -1010.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -231.20 Win Rate: 15.40% (77/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -120.61 Win Rate: 44.40% (222/500) +=> cheapest_move : Performance: 91.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 91.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -180.97 Win Rate: 28.80% (144/500) +=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -66.94 Win Rate: 54.40% (272/500) +=> cheapest_move : Performance: 97.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 97.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -97.27 Win Rate: 53.00% (265/500) +=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) +=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) +=> random_move : Performance: -149.35 Win Rate: 49.00% (245/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -165.89 Win Rate: 39.40% (197/500) +=> cheapest_move : Performance: -88.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -88.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -71.16 Win Rate: 55.20% (276/500) +=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -193.54 Win Rate: 13.60% (68/500) +=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -220.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -167.91 Win Rate: 14.40% (72/500) +=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -77.93 Win Rate: 65.40% (327/500) +=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) +=> random_move : Performance: -189.15 Win Rate: 26.00% (130/500) +=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) +=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/strategy_performance.xlsx b/assignment1/strategy_performance.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0e4664acb82ff994a89415e80a25d76f3f696fd5 GIT binary patch literal 7850 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 literal 0 HcmV?d00001 diff --git a/assignment1/strategy_performance_latest.xlsx b/assignment1/strategy_performance_latest.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..701522710dbc3c4890c42db3d4b8e0a772a5b5c7 GIT binary patch literal 7475 zcmZ{J2RNKv^ZpXOTV2#FLaa{o7QI9#N|dmx_fCisL6k)AC0a!E-X+@VMDLv-h!#Zu z@5=Rkd0+qUx7YRTbDeeWIWzZ}GiS`GDcwUM1^@sUfMz#Y1KF;p^6~J|0Q@0j_jUxwoiwiVz+VPpe=pTaIZ}cqshgS77fd28e(^QQ^R5xbiTKXB5v>H z)qOvk{p|y$nk1P6_BA^m?k-%33DCJ%UvE}e*4oPwuK9q7a!UMMTAF+9*>;ouZ@6#- z`d4bpw#L|HE!>6@o_JIUsWY{&=<*7cKcp?3qrxKC@MaVXCsGnjWJSFR*X$$F%=q5x za0x;Eg5E%;_Ae8Te&XQo!BuBP1^@{EX@Z%9GZbONKuoJjJ10)CG3xq4!|sHFv>`j4 z3LQNcW(S*d6I-@bcE_jr+0lezqCoT|@{6I3p_uzPK;PVr&3iI6arS7F?h2+;VIY?% z0OtEO*WNB^{>P_cLIbNjG<24i-_Qd;Ge2GmtsX9Vfo%SQ9&4ODj$EPgy+uQmy`W|9=oQ}vj9St2 zrMFM=QiwkkPjSB3Tsp>CwD7bH5!?~B}Hg1!XY-I%8hsUj%gt&2e! zxs6Q$ucM#rrklZ`afhBJ(;TxCjkO#LOV79&2qifw@=N!>V&y3tRqI;;+68=jh=A>L zf#DcRp2U3<&zB4+IY1LXs%GbPf~;(_$mJj=zD8h6iEmo!`VPi)RqM1oze)PEBB41* zM9(Cd>O-pz&ulv{XBNbuLt8@B+yVBS_jT#~1|9O(RP;lawc0wqT3d+g*mMn#$omKO z_{O0&D4gVsl3;M-3Jay{4!ZlCbnIqE^v<~Q+EFg89(W4W^o@i&QlTuVH)gb@|FZp( zD~VZ^WAzO(buv>D{qb|8rt0Xa@8Wi4)<`Ws$k(EEG~8f8*507wqJ(Q^l9!#??3wdGcb8UaEX$N&=GUDo zOR%uR>^BW9o0D3m`8nDOMk{g&pjV*KQK zX+3kDh{4)cX_l)Pc<4;Tc%y0nn@6hFS?NbjTuU{Rfa0(6en%CWJ{(~Skr?V4j}O#* z7bk}9YoI(%%|xj>$|o)N>>ASNgak5@qU*6nHKH8a&$c=}DOUuiQR;n@p4n|o4G&*z zw5pfo?1>~$cZD8i)Bns0P8w>L3h{broMaIXQ{yGJvn^r(%hsCIO&)-Wmmnr=AJAWy zsv{q2Xq#{u!0xd|W&0>c$ZR@pBtAD@9gbO@{RpkLFJXApzy0;f=?GZ6~4i2yj(&C1Ull4ly zZ58ElmYULHJSv%C!hSQmqBYP+*}`O^)b4Gc&i3$T)@V$$icD1YC?|P|rZU7O)w`}u zrszg@g652SQP6Q#XyKmGcOtM^KaI(w=7DHrGD0#-iiv%OF z93;mj*2QPXa4k=8d8wjNjkuC)9_Os7V2R9K@8OoUb-Y{N4gZ4l?+b)f?dH`!1^{p> z4*-z=xj;M|oNZhzp-@*Bj@#GmEs~yQ=&&+D8hnHGL`dT$*V6muD=x(cZsr9-%>o*{ z+OvJV_f!J01o#GXuTHzrf~ynTy{U^+RhABzN~am|FFI3GCqG_o?`uuY?_|!q`_-k3 zyUibUtsj* zJTJ$*du8d~?DR6Uws6Kze0=u%u{+Jsm&F6<(eE)_5AdFSMq$_aWW&YoS<9{i8^`;K zg`FQ)FGhDP?5-SzZ&k??NtH3XJhvhbot!w>%y&ZjUscs6Da_)pFR@<`3BbvGZoiyq9C9N$qszb@8>JIMK4d7DZGVI>RcG z3Pn@~dTtIozIm!43n z04H>>%L?)4K0&5L7v(r~%fhRM>8pC17Q?=aEnZtsE1$-2`-H_d7o><1o@lmah*G@m z6>FV$34VGCJL(o7XInYfCDBzyVN%<;_BeC=pxTQq?cOrt_n@Oh$A!nmG?06@&_+mK z(P&D5tN*YY)5v97 z(3>PV*jrKjrVM;ZjStG?o3a;XVqA?IPKpu$g#d24#s?D+F2PQ&L)5@r35w`=LYu*) zH0T-*3jB}sHlT?nF226y#T)#$@5$=#cS)bCeTe8me#`e-d8nF9GTcdijS#gr$~Hz< zvuDlLLI70p78xpgqELhhwQh-4BVa)7_1}rpjqUxV3@W9Q$BHA=V=Moj(Bma*FBwJ5 zyeLy?2pnM7+{=-Y@o`kB2|YZR-P(_uVv{ZP28yW0eJVm6w&t*K3L0lt z3&u%cOtJoGE~4NlTPNTZVgq!4nq6;hJs53$yIfIk(C$0SCA=D#Dk$Goe4|ytYlxB|+9hqO{vm?mm(j@z zD{)7NfNw0Y#(1wxsn=bh7*+QN(~}2Z;C4X1pq^PN+7@Ae zc`9_Z$S_%|O}H*K=It5h=KG(M5Q|vkIe*u32K!C!%F%w+aZH& zFuzQ3;os_g!VIgr+=FxRf?3IRI9nvO+H7SbwUWAHu77$F<~;WWp>RDxITEoJa&slwdv|1-_gM(TU??X;jB zGKZZmkr8afenlOx3|uA2U6CUOT)(LnXWo1LRu{Vj-%#rx6p_FuHkE~`uE>1v;)>QK zW;UzPZK`KHGTj9>mS2lhgu@lB39luEwj^P^z08IydbJX1m@MawV5F4eMKk1k30UfO zM?n=P+&0e==)e5gKaS*b);{TH-*X_#6;8?w6sWyP;Nl%XB*)JP~#sZ*z3!w`=XyCxbp`m&dt4Bw>%EKWwm^5 z!W}HvcS|I_0V98nnV^2t?aF#A_4QPzO$38EUi1UIz>7qc zCd0(Al%goIco}=HSLjA`)68lgA=AX)ONt04V;OsXL$&Bu5kIXGPc#$}Y$x+$ZzHqF z1#p8{^EpY)QMvJMH#AZ+3A++m5FH+UBDx1zir(l2#35XT39?QMYb%m~{h`GP%SBt~ z0~F_W->1;cc6+euNYH-1@#+%#Xwpdxiz$*QB!|13b1hz99&aLqQ6Gk|pKuzSSIxjW zEQE%LZrwU8k&Jq8b-4aGy`oh~mm&kn?SWOwt4c6qbVdY)ag<4wtk}C1&oKRXTgHl|-PJ!R_qekZQ|l$G21&nC|A5o;iY1ayk3}rliT&lv ztWN?R?-!F}zqY~{l6j}xtQOrV&R2F--U91o19F-Zm%l4r{OrSk#rdRZ=Hz^6rRnc( zz~l*R2RQ&9Thzg{; zoh-}^x=859V6#UIozYUcK}RLkZg%vyVn;Hjo=NM-(7HTM;E@YBm|nF#Uo@>@MLl=HYj|96%YQg!<6 z8lD|pApro0>I&lD>=&lCP?tZi+YHGrYF@Ejg5ZrYRFB{nY<}#4Zj8ScR$y2aYUw0o z1iYgc`xQAQ9i)8H!w8VU)md(K_}Zzm{#u*3uZ(CaNFb6A zpa(M75W_00TJ`#@f5>Ww(Y7uao&WkQkH6ThJM3UH&3JQkxFi_e(mhCw9%t}5lIC1{ z^u@@#;#DE{moEIMgF_NKNKQXbzdC&4+5hp#&!qO@0kz`%%x|5dt57`0aR1oi;_3z8 zdqi<%US~FJmXqL$WEuZcY!aW7!l9a!NfsM+BfhV;sUYFzO7CIJuWezFpnGMZ914McT&I0ho7Bd|HKELVuh0^h1N@f``ifN4XfC zGwX6@mw~(<_xn7X%_pM5Gp)bvYPt{SKUSO9fGaKibDm?L^o~C+tdBu|*sfQS*C2a@ zg)3KBWJaSwD37Le!`jyO=|w^gEnB3UWxrX_{$^`|mbIcuyiB|OsMFpXo|kIK56KrL zZR3nfs3DHdmkrNFAw2XVblt5DvUQC@Iaamm*~b!&hpw>vTEllAPIX>?lYdna971Iu zp$@2(%NpZ(w<-5><6@*@YP$<^tHqC`%4;j0QbxNjMyYFW zS!p^&Nj?pjp^nIW_gXmqJ29$Cd~c-pYpdMP%qSjQ%{fp7*ZdA)QQ9ADEMcD&L7{m( z%ve~hwb8Pla5&MiSi<(HeU3zX9Tp3GuJdazaQ_{562ls)zQTQu2=0H_@b{mSb9-LW zW9seUWlsse&Tko<=-=o=d7uZRC}&7I+4xgH)G(R!FQqeiPEpttUZNtvIT|a8U4h)1 z@B;EH0u3wu@j4{=8piilgV9e)#=tauAtMsfvu09d`d~2$b_(;_W(aA%OYXDK=acDq zqO%;Tk`Df*Lds50tmKt=@b(8r{J2k#aQI}_6+!U^l%AvO*X~OS!&wh>NmFEcMzg8& z{HVK5qDHq$%^p;F8*H9AS!!Xun=@mKa5AmB<_qk>-+2Z2x1o__Fj`@FaOHv_sw(zQAk!k&obmcJ;279n*sx~4!Y z#|&`H>&dGhr!61@nNe7nrwN6FTrSf+I0avHhzi9i*`GJwi}l3WJivn5bH{e143>6y z=Fv^qVKZ$w^H87(o3yUrH}5LHn)cnHD8EoGly&Cm(<*!NZp7i&xsGUtL?ZeamS_&q zQap+03+wwhAu6((x%^z`G%y!tr@@2*A)dWlIHMN%2cKu-pPDALZ3VX88CiJWaC(jD z>u+SlU0^ss`nV2$8}!lsn`Z`^)a+t7zrW#JQ~u%kk5B!R?OXq7lc;((x@*RjJzWBI7@mDH&MBELp^H z^mM(xQ_~nCvGQYt8>ou%rzmb9}HdZ?M8G}?2##cVYsXg;`yk#Pm9a~m5RnrPL(cY41K7OO(qOh%ZS<3JrjV1q(yCQ z=#FVtK2>3!_iMR7ebzLHdVh2lThs({jME$;=nJW8C?ZVokKJP1mFYIj+~as#n!Wt@^GoQx^mAgXdo-EHHx+tzzu6*|7c9u7OOx7R z7e5zNMLOFa?W*_)UdkmHt0^HN6W{y4yGd~Wx&8RVx&HrqOLx(C8##Zl0DwPI`#;hD zY3tmD-|ck#g)hUG{~vviy8`Z3y8bI5-~qh;1sCv-4CQa#>#mf$nc#n=Aj!kKQ~xV3 zyer{uZuD1zC-ANw|1(p%EAVcD@>ifVyd?xz>2JDn7kc-8`3wC@@~_+GF7R%={tGN1 z{jU-KiQad?cZ1MhFd@7I30L_42uXM4+&$-i<($Cf{Et(wri2Rbl_9QDY``%5rcp+O HK*0Y4SezC_ literal 0 HcmV?d00001 diff --git a/assignment1/strategy_performance_new.xlsx b/assignment1/strategy_performance_new.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..adc286412a1978bb50ca2ecd51182013b1ff1b7c GIT binary patch literal 6917 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 Z?0OY>1ZeZ>A(f&6#-N#o;-QBH_%EYJ?qdJ| literal 0 HcmV?d00001 From 677dab69b77f259b6732ea147afe8be0028bc999 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 7 Oct 2025 15:48:16 +0100 Subject: [PATCH 32/56] checkpoint --- 1-result1.txt | 0 assignment1/1-result1.txt | 2550 ------------ assignment1/1-result3.txt | 306 -- assignment1/2-result1.txt | 3570 ----------------- assignment1/2-result3.txt | 306 -- ...A1_COMP9016_Nagle_JohnPaul_R00065426.docx} | Bin 315530 -> 313694 bytes .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 4 +- assignment1/Doc2.docx | Bin 29326 -> 0 bytes assignment1/part1.2.docx | Bin 18005 -> 0 bytes assignment1/result.txt | 102 - assignment1/result1.txt | 2142 ---------- assignment1/result3.txt | 306 -- assignment1/strategy_performance.xlsx | Bin 7850 -> 0 bytes assignment1/strategy_performance_latest.xlsx | Bin 7475 -> 0 bytes assignment1/strategy_performance_new.xlsx | Bin 6917 -> 0 bytes .../~$_COMP9016_OReilly_Ruairi_R00065426.docx | Bin 162 -> 0 bytes assignment1/~$art1.2.docx | Bin 162 -> 0 bytes 17 files changed, 2 insertions(+), 9284 deletions(-) create mode 100644 1-result1.txt delete mode 100644 assignment1/1-result1.txt delete mode 100644 assignment1/1-result3.txt delete mode 100644 assignment1/2-result1.txt delete mode 100644 assignment1/2-result3.txt rename assignment1/{A1_COMP9016_OReilly_Ruairi_R00065426.docx => A1_COMP9016_Nagle_JohnPaul_R00065426.docx} (94%) delete mode 100644 assignment1/Doc2.docx delete mode 100644 assignment1/part1.2.docx delete mode 100644 assignment1/result.txt delete mode 100644 assignment1/result1.txt delete mode 100644 assignment1/result3.txt delete mode 100644 assignment1/strategy_performance.xlsx delete mode 100644 assignment1/strategy_performance_latest.xlsx delete mode 100644 assignment1/strategy_performance_new.xlsx delete mode 100644 assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx delete mode 100644 assignment1/~$art1.2.docx diff --git a/1-result1.txt b/1-result1.txt new file mode 100644 index 000000000..e69de29bb diff --git a/assignment1/1-result1.txt b/assignment1/1-result1.txt deleted file mode 100644 index f0fbc79d2..000000000 --- a/assignment1/1-result1.txt +++ /dev/null @@ -1,2550 +0,0 @@ - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . W . . | -1 | . . P . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . O . . . . . . . | -5 | . . . . . . . . A . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -384.72 Win Rate: 16.80% (84/500) -=> cheapest_move : Performance: 43.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 43.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . W O . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . P . | -8 | . . . . . . . . . . | -9 | . . . A . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -367.40 Win Rate: 4.40% (22/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . P . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . O . . . . . | -5 | A . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . W . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -250.48 Win Rate: 10.60% (53/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . P . . . . . . . O | -1 | . . A . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . W . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -239.06 Win Rate: 5.20% (26/500) -=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -1022.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . A . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . O . . P . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . W | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -165.79 Win Rate: 1.00% (5/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | O . . . . . W . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . P . . . . . A . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -404.20 Win Rate: 24.00% (120/500) -=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . P . W | -1 | . . . . . . . A . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | O . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -246.60 Win Rate: 37.20% (186/500) -=> cheapest_move : Performance: -94.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | O . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . A W . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . P . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -108.54 Win Rate: 60.20% (301/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . A . . . . . . W . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . P . . . O . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -201.32 Win Rate: 6.80% (34/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . O . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . P . . . . | -4 | . . . A . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . W . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -295.30 Win Rate: 7.60% (38/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | A . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . W . . . . | -5 | . . . . . . . . O . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | P . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -121.55 Win Rate: 11.60% (58/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | P . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . A . . . . . . | -5 | . W . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | O . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -199.68 Win Rate: 34.80% (174/500) -=> cheapest_move : Performance: -888.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -888.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . O . . . | -3 | . . . . W . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . P . . . . | -8 | A . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -299.06 Win Rate: 10.00% (50/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | P . . . . . . . . . | -1 | . . . . W . . . . . | -2 | . . . . . . . . . . | -3 | . . . O . . . . . . | -4 | . . . . . . . . . . | -5 | A . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -241.88 Win Rate: 12.00% (60/500) -=> cheapest_move : Performance: -928.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -928.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . O . . . . . | -5 | . . . . . . . . A . | -6 | . . . . . . . W P . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -252.17 Win Rate: 51.60% (258/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . O . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . W . . . P . | -9 | . . . . . . . A . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -423.29 Win Rate: 33.20% (166/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . A . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . P . . | -4 | . . . . . . . . . . | -5 | . . . . W . . . . . | -6 | . . . . . . . . O . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -273.54 Win Rate: 14.20% (71/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . W | -1 | . . . O . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . A . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . P | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -371.75 Win Rate: 5.40% (27/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . O . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . P . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . W | -7 | . . . . . . . A . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -324.96 Win Rate: 35.20% (176/500) -=> cheapest_move : Performance: -318.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -318.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | P . . . . . . . . . | -1 | . . . A . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . W | -8 | . . . O . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -232.57 Win Rate: 1.20% (6/500) -=> cheapest_move : Performance: -974.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -974.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . W . . . | -1 | . . . . . . . . . . | -2 | . . . . . A . . . . | -3 | O . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . P . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -202.46 Win Rate: 34.60% (173/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | A . P . . . . . O . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . W . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -161.26 Win Rate: 29.00% (145/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . A . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . P . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . O . . . . . W | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -238.73 Win Rate: 3.20% (16/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . W | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . A . | -7 | . . . . . . . . . . | -8 | . . . . P O . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -405.07 Win Rate: 18.20% (91/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . A . . . . | -1 | . . . . . W . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . P . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . O . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -20.07 Win Rate: 73.20% (366/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . P . . . | -7 | . . . A . . . . . . | -8 | . . . . . . . . . . | -9 | W . . . . O . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -318.18 Win Rate: 18.40% (92/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . P . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . O . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | W . . . . A . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -344.35 Win Rate: 11.20% (56/500) -=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . O . . . . | -3 | . . . . . . . P . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . W . A . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -239.58 Win Rate: 38.00% (190/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . P . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . A . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . W . . O . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -244.16 Win Rate: 25.80% (129/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . W . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . O . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . P | -9 | . A . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -306.30 Win Rate: 1.20% (6/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . P . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . W . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . A . . . . . . | -9 | . . . . . O . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -338.49 Win Rate: 4.20% (21/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . O . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . W . . . . . | -7 | . . . . . . . . . P | -8 | . . . A . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -261.66 Win Rate: 36.20% (181/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . O . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . A . . | -9 | . . . . W . P . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -418.90 Win Rate: 23.40% (117/500) -=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . W O . . . . . P . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . A . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -483.45 Win Rate: 5.40% (27/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | A . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . P . . . . . . . . | -8 | . . . . . . W . . . | -9 | . . . . . . . . . O | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -245.04 Win Rate: 6.60% (33/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . O . . . . . W . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . P | -9 | . . . . . . . . A . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -548.67 Win Rate: 4.00% (20/500) -=> cheapest_move : Performance: 0.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 0.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | O . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . W . . . . | -7 | . . . . . . . . . . | -8 | . A . . . . . . . . | -9 | . . . . . . . P . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -283.08 Win Rate: 18.40% (92/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . P . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . W . O . . . . . . | -6 | . . . . . A . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -367.95 Win Rate: 11.80% (59/500) -=> cheapest_move : Performance: -120.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -120.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . A . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . P . . . . . . . | -6 | . . . . . . . . . . | -7 | W . . . . . . . O . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -328.24 Win Rate: 2.60% (13/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . A . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . P . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | W . . . . . . . . O | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -233.14 Win Rate: 3.80% (19/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . P . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . W . . . . . A . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . O . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -419.78 Win Rate: 5.80% (29/500) -=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . P . . | -3 | . . . . . . . . . . | -4 | O . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . A . . . . . . . . | -8 | . . . . . . . . . . | -9 | . W . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -149.65 Win Rate: 49.60% (248/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . O | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . P . . | -6 | . . . . . . . . . W | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . A | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -317.43 Win Rate: 45.00% (225/500) -=> cheapest_move : Performance: 52.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 52.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . A . . . . . . . . | -1 | . W . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . O . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . P . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: 38.90 Win Rate: 83.40% (417/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . W . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . O . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | P A . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -382.59 Win Rate: 4.60% (23/500) -=> cheapest_move : Performance: 55.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 55.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | O . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . W . A . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | P . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -259.05 Win Rate: 39.20% (196/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . W | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . A . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . O . . . . . | -9 | . . P . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -316.88 Win Rate: 22.00% (110/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . O A . . . | -8 | . . . . . . . P . . | -9 | . . . W . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -420.23 Win Rate: 21.60% (108/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . W . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . O | -4 | . . . . . . . . . . | -5 | . . . . . . P . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . A . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -463.21 Win Rate: 0.60% (3/500) -=> cheapest_move : Performance: -55.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -55.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . P . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | W . . . . O . . . . | -6 | . . . . . . . . . . | -7 | . . . . . A . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -392.91 Win Rate: 8.20% (41/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . O . . . P . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . W . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . A | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -337.29 Win Rate: 39.60% (198/500) -=> cheapest_move : Performance: -262.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -262.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . P | -2 | . . . . . A . . . O | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . W . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -278.97 Win Rate: 9.80% (49/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . W | -3 | . . A . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . P . . | -9 | O . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -225.41 Win Rate: 5.00% (25/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . O . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . W . . . | -6 | A . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . P . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -246.37 Win Rate: 10.60% (53/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . O . . . . . | -2 | . . . . . . . . . . | -3 | . . W . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . A . . . . P . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -362.62 Win Rate: 10.60% (53/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . W . . . . | -1 | . P . O . . . . . . | -2 | . . . . . . . A . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -261.50 Win Rate: 29.00% (145/500) -=> cheapest_move : Performance: 74.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 74.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . W . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . P . . . . . . . . | -7 | A . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . O . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -327.32 Win Rate: 9.60% (48/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . A . . . . . . . | -5 | . . . . . . . . . . | -6 | . . W . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . O . . . . P . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -145.68 Win Rate: 36.60% (183/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | A . . . W . . . . . | -2 | . . . . . . . . . O | -3 | . . P . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -133.06 Win Rate: 30.00% (150/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . W . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | A . . . . . . . . . | -8 | . O . . . . . . . . | -9 | . . P . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -297.60 Win Rate: 1.40% (7/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . O . W . | -6 | . . . . . . . . . . | -7 | . P . . . . . . . . | -8 | . . A . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -388.41 Win Rate: 4.80% (24/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | W . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . A . . . . | -3 | . . P . . . . . . . | -4 | . . O . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -280.81 Win Rate: 9.80% (49/500) -=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . W . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . O . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . P . . . . . . . . | -8 | . . A . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -403.86 Win Rate: 3.00% (15/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . P . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . O | -4 | . . . . . . . . . . | -5 | . . . . . . . . A . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . W . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -428.05 Win Rate: 2.60% (13/500) -=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . W | -3 | . . . . P . . . . . | -4 | . . . . . . . . . . | -5 | O . . . . . . . A . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -366.54 Win Rate: 23.00% (115/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . O . . | -2 | . . . . . . . . . . | -3 | . . . . . W . . P . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . A . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -407.28 Win Rate: 8.80% (44/500) -=> cheapest_move : Performance: 37.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 37.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . A . | -3 | . . . . . . . . . . | -4 | . . . . . . . . P . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . W . . . . . . | -9 | . . . . . . . O . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -385.98 Win Rate: 3.80% (19/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . O . . . . | -1 | . . . . . . . . . . | -2 | . . . . W . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . A . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . P . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -316.57 Win Rate: 13.60% (68/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . W . . . P . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . A . | -7 | . . . . . . . . . . | -8 | . . . . O . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -441.26 Win Rate: 3.80% (19/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . P . . | -4 | . . . . . . . . . . | -5 | . . . . W . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | A . . . . O . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -254.61 Win Rate: 19.20% (96/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . A . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . O . . | -8 | . . . . . . . . . . | -9 | . . . . . . . P W . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -237.72 Win Rate: 1.40% (7/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . P . . . . . | -5 | . . . . . . . . O . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . W . . . . . . . | -9 | . . A . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -57.04 Win Rate: 76.80% (384/500) -=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . P . | -3 | . W . . . . . . . . | -4 | . . O . . . . . . . | -5 | A . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -127.70 Win Rate: 47.20% (236/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . A . | -1 | . . . . . . . . . . | -2 | . . . . . . . P W . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . O . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -108.82 Win Rate: 65.60% (328/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . O . . . . . A . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | W . . . . . . . P . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -301.46 Win Rate: 1.00% (5/500) -=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . O . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . W . . . . | -7 | . . . . A . . P . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -227.53 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . O . . . . . W | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . P . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . A . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -322.73 Win Rate: 0.20% (1/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . O . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . P . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . W . . . . | -9 | A . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -238.74 Win Rate: 24.40% (122/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . A . . . . . . . . | -3 | . . . . . . . P . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . O . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . W . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -177.57 Win Rate: 4.40% (22/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | A . . P . . . . . . | -2 | . . . . . W . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . O . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -160.44 Win Rate: 17.00% (85/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . A . | -5 | . . . . . . . . . . | -6 | . . . . . . . P . . | -7 | . . . . . . . W . . | -8 | . . . . . . . . . . | -9 | . . . . . . O . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -310.24 Win Rate: 30.20% (151/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . P . . W . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | A . . . . . O . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -269.23 Win Rate: 4.80% (24/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | O . . . . . . . . . | -5 | . . . . . . . . . . | -6 | P . . . . . . . . . | -7 | W . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . A . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -248.14 Win Rate: 38.40% (192/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . P . | -2 | . . . . . . . . . . | -3 | . . A . . . . . . . | -4 | . . . . . . . . . . | -5 | W . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . O . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -178.28 Win Rate: 25.60% (128/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . W . | -1 | . . . . . . . . . . | -2 | . . . . . . P . . . | -3 | . . . O . . A . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -327.20 Win Rate: 22.80% (114/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | W . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . A . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . O | -8 | P . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -165.04 Win Rate: 25.60% (128/500) -=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . O . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . W . . . . A | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . P . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -431.52 Win Rate: 13.20% (66/500) -=> cheapest_move : Performance: -190.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -190.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . P . . A | -8 | . O . . . . . . . W | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -162.69 Win Rate: 62.80% (314/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . O . . . . | -1 | P . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . W . A | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -203.66 Win Rate: 53.60% (268/500) -=> cheapest_move : Performance: -278.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -278.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . W . . . . . . . . | -2 | . . P . . . O . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . A . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -366.18 Win Rate: 9.00% (45/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . W . . . . | -4 | . . . P . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . O . | -8 | A . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -302.27 Win Rate: 8.40% (42/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . O . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | P . . . . . . . . . | -9 | W A . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -109.90 Win Rate: 65.40% (327/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . O . . . . | -1 | . . . . . . . . P . | -2 | . . . . A . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . W . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -263.98 Win Rate: 4.80% (24/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . A . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | P . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . W . . . . . . | -8 | . . . . . . . . . . | -9 | O . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -298.03 Win Rate: 3.60% (18/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | A . . . O . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . W . . . . . . . | -8 | . . . . . P . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -130.56 Win Rate: 9.80% (49/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . A . . . | -6 | . . . . . . W . P . | -7 | . . . . . . . . . . | -8 | O . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -176.39 Win Rate: 52.00% (260/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | O . . P . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . W | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . A . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -404.98 Win Rate: 15.80% (79/500) -=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . W . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . P . O . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . A . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -344.52 Win Rate: 9.40% (47/500) -=> cheapest_move : Performance: 67.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 67.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | W . . . . . . . . . | -1 | . . . . . . . . . . | -2 | . . . . . . O . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . P | -8 | . . . . . . . . . . | -9 | . . . . . . . A . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -490.33 Win Rate: 0.80% (4/500) -=> cheapest_move : Performance: -20.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -20.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . W . . . . . . . | -1 | . . . . . . . O A . | -2 | . . . . . . . . . . | -3 | . . . . P . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -315.47 Win Rate: 7.00% (35/500) -=> cheapest_move : Performance: 65.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 65.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . O . . . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . A . . | -4 | W . . . . . . . . . | -5 | . . . P . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . . . . . . . | -8 | . . . . . . . . . . | -9 | . . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -350.04 Win Rate: 5.00% (25/500) -=> cheapest_move : Performance: -302.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -302.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 10 DEPTH=> 10 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 - +---------------------+ -0 | . . . . . . . . P . | -1 | . . . . . . . . . . | -2 | . . . . . . . . . . | -3 | . . . . . . . . . . | -4 | . . . . . . . . . . | -5 | . . . . . . . . . . | -6 | . . . . . . . . . . | -7 | . . . . W . . . O . | -8 | . . . . . . . . . . | -9 | A . . . . . . . . . | - +---------------------+ - -AGENT RESULTS -=> random_move : Performance: -224.67 Win Rate: 29.40% (147/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/1-result3.txt b/assignment1/1-result3.txt deleted file mode 100644 index 732966f1a..000000000 --- a/assignment1/1-result3.txt +++ /dev/null @@ -1,306 +0,0 @@ -=> random_move : Performance: -384.72 Win Rate: 16.80% (84/500) -=> cheapest_move : Performance: 43.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 43.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -367.40 Win Rate: 4.40% (22/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -250.48 Win Rate: 10.60% (53/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -239.06 Win Rate: 5.20% (26/500) -=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -1022.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -165.79 Win Rate: 1.00% (5/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -404.20 Win Rate: 24.00% (120/500) -=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -246.60 Win Rate: 37.20% (186/500) -=> cheapest_move : Performance: -94.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -108.54 Win Rate: 60.20% (301/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -201.32 Win Rate: 6.80% (34/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -295.30 Win Rate: 7.60% (38/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -121.55 Win Rate: 11.60% (58/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -199.68 Win Rate: 34.80% (174/500) -=> cheapest_move : Performance: -888.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -888.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -299.06 Win Rate: 10.00% (50/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -241.88 Win Rate: 12.00% (60/500) -=> cheapest_move : Performance: -928.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -928.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -252.17 Win Rate: 51.60% (258/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -423.29 Win Rate: 33.20% (166/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -273.54 Win Rate: 14.20% (71/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -371.75 Win Rate: 5.40% (27/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -324.96 Win Rate: 35.20% (176/500) -=> cheapest_move : Performance: -318.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -318.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -232.57 Win Rate: 1.20% (6/500) -=> cheapest_move : Performance: -974.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -974.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -202.46 Win Rate: 34.60% (173/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -161.26 Win Rate: 29.00% (145/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -238.73 Win Rate: 3.20% (16/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -405.07 Win Rate: 18.20% (91/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -20.07 Win Rate: 73.20% (366/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -318.18 Win Rate: 18.40% (92/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -344.35 Win Rate: 11.20% (56/500) -=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -239.58 Win Rate: 38.00% (190/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -244.16 Win Rate: 25.80% (129/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -306.30 Win Rate: 1.20% (6/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -338.49 Win Rate: 4.20% (21/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -261.66 Win Rate: 36.20% (181/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -418.90 Win Rate: 23.40% (117/500) -=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -483.45 Win Rate: 5.40% (27/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -245.04 Win Rate: 6.60% (33/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -548.67 Win Rate: 4.00% (20/500) -=> cheapest_move : Performance: 0.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 0.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -283.08 Win Rate: 18.40% (92/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -367.95 Win Rate: 11.80% (59/500) -=> cheapest_move : Performance: -120.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -120.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -328.24 Win Rate: 2.60% (13/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -233.14 Win Rate: 3.80% (19/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -419.78 Win Rate: 5.80% (29/500) -=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -149.65 Win Rate: 49.60% (248/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -317.43 Win Rate: 45.00% (225/500) -=> cheapest_move : Performance: 52.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 52.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: 38.90 Win Rate: 83.40% (417/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -382.59 Win Rate: 4.60% (23/500) -=> cheapest_move : Performance: 55.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 55.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -259.05 Win Rate: 39.20% (196/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -316.88 Win Rate: 22.00% (110/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -420.23 Win Rate: 21.60% (108/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -463.21 Win Rate: 0.60% (3/500) -=> cheapest_move : Performance: -55.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -55.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -392.91 Win Rate: 8.20% (41/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -337.29 Win Rate: 39.60% (198/500) -=> cheapest_move : Performance: -262.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -262.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -278.97 Win Rate: 9.80% (49/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -225.41 Win Rate: 5.00% (25/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -246.37 Win Rate: 10.60% (53/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -362.62 Win Rate: 10.60% (53/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -261.50 Win Rate: 29.00% (145/500) -=> cheapest_move : Performance: 74.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 74.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -327.32 Win Rate: 9.60% (48/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -145.68 Win Rate: 36.60% (183/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -133.06 Win Rate: 30.00% (150/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -297.60 Win Rate: 1.40% (7/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -388.41 Win Rate: 4.80% (24/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -280.81 Win Rate: 9.80% (49/500) -=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -403.86 Win Rate: 3.00% (15/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -428.05 Win Rate: 2.60% (13/500) -=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -366.54 Win Rate: 23.00% (115/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -407.28 Win Rate: 8.80% (44/500) -=> cheapest_move : Performance: 37.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 37.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -385.98 Win Rate: 3.80% (19/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -316.57 Win Rate: 13.60% (68/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -441.26 Win Rate: 3.80% (19/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -254.61 Win Rate: 19.20% (96/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -237.72 Win Rate: 1.40% (7/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -57.04 Win Rate: 76.80% (384/500) -=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -127.70 Win Rate: 47.20% (236/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -108.82 Win Rate: 65.60% (328/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -301.46 Win Rate: 1.00% (5/500) -=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -227.53 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -322.73 Win Rate: 0.20% (1/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -238.74 Win Rate: 24.40% (122/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -177.57 Win Rate: 4.40% (22/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -160.44 Win Rate: 17.00% (85/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -310.24 Win Rate: 30.20% (151/500) -=> cheapest_move : Performance: -80.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -80.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -269.23 Win Rate: 4.80% (24/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -248.14 Win Rate: 38.40% (192/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -178.28 Win Rate: 25.60% (128/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -327.20 Win Rate: 22.80% (114/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -165.04 Win Rate: 25.60% (128/500) -=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -431.52 Win Rate: 13.20% (66/500) -=> cheapest_move : Performance: -190.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -190.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -162.69 Win Rate: 62.80% (314/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -203.66 Win Rate: 53.60% (268/500) -=> cheapest_move : Performance: -278.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -278.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -366.18 Win Rate: 9.00% (45/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -302.27 Win Rate: 8.40% (42/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -109.90 Win Rate: 65.40% (327/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -263.98 Win Rate: 4.80% (24/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -298.03 Win Rate: 3.60% (18/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -130.56 Win Rate: 9.80% (49/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -176.39 Win Rate: 52.00% (260/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -404.98 Win Rate: 15.80% (79/500) -=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -344.52 Win Rate: 9.40% (47/500) -=> cheapest_move : Performance: 67.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 67.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -490.33 Win Rate: 0.80% (4/500) -=> cheapest_move : Performance: -20.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -20.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -315.47 Win Rate: 7.00% (35/500) -=> cheapest_move : Performance: 65.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 65.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -350.04 Win Rate: 5.00% (25/500) -=> cheapest_move : Performance: -302.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -302.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -224.67 Win Rate: 29.40% (147/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/2-result1.txt b/assignment1/2-result1.txt deleted file mode 100644 index e7c4b8655..000000000 --- a/assignment1/2-result1.txt +++ /dev/null @@ -1,3570 +0,0 @@ - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . O . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . W . . . . . . . . | -13 | . . . . . . . . . . . . . . P . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | A . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . W | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . P . . . . . . A . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . O . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . O . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . A . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . P . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . W . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . A . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . W . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . O . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . P . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . A . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . O . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . W . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . P . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -251.74 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . P . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . O . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . W . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . A . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . P . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . O . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . W . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . A . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -426.07 Win Rate: 14.40% (72/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . P . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . W . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . O . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . A . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . W . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . A . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . O . . . . . . . . . . . . | -16 | . . . . . . . P . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . A | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . W . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . P . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . O . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . A . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . W . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . O . | -16 | . . . . . . . . P . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -633.72 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . A . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . W . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . P . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . O . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -420.94 Win Rate: 11.00% (55/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . O . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . P . . . . . . . . . . . . . . . A . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . W . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . W . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . P . . . | -11 | . . A . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . O . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . P . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . W . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . A . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | O . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -644.11 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . O . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . W . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . A | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | P . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . P . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . W . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . A | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . O | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . O . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . P | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | A . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . W . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . P . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . O . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . A . . . . . . . . . . W . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -521.65 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . W . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . A | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . O . . . . | -16 | . . . . . . P . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . O . . . . P . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . W | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . A . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -502.46 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . O . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . A . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . P . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . W . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | O . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . P . . W . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . A . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . P . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . O . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . A . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . W . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . O . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . W . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . P . . . . . . . . . . . . . | -17 | . . . . . . . . . . A . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . W . . . . . . . . . . . | - 8 | . . P . . . . . A . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | O . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -314.78 Win Rate: 52.80% (264/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . W . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | O . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | A P . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -404.60 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -42.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . W . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | O . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . P . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . A . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . W . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . P . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . O | -11 | . . . . . . . . . . . . . . . . . A . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . A . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . O . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . P . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . W . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . P . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . O . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . A . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . W . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . W . . . . . . . . . . P . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . A . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . O . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . O . . . . . . . . . | - 6 | . . . . . . . P . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . A . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . W . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . A . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . W . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . P . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . O . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -559.45 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . P . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . W . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . A . . . . . . . . . . . O . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -446.72 Win Rate: 5.60% (28/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . P . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . W . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . A . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . O . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . A . . . . . . . | - 1 | W . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . P . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . O . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . O . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . W . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . A . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . P . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | W . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . A . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . P . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . O . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . W . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . A . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . P | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . O . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . P | - 3 | . . . . . . . . . . . . . W . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . O . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . A . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . O . . . . . . . . . . . . . . . . . | - 4 | . . . . . . P . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . A | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . W . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . A . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . P . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . W . . . . . . . O . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . A . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . P . | - 9 | . . . . . . . . . . . O . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . W . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . P | - 5 | . . . . . . . . . . . . A . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . O . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . W . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . O . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . P W . . . . . . . . . . | -11 | . . . . . . . A . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . O . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . P . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . W . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . A . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | W . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . O . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . A | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . P . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . O . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . A . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . P . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . W . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . O . . . . . . . . . . . . . . | - 9 | . . . . . . . . W . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . A . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . P . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . P . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . W . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . O . . . . . . . . . . . . . | -13 | . . . . . A . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . W . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . O . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . P | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . A . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . W . . | -10 | . . . . . . . A . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . O . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . P . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -665.08 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . O . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . W . . . . P . . . . . . . . | -17 | . . . . . . . . . A . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . A . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . P . O . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . W . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . O . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . A . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . W P . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . A | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . P . . O . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . W . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . O . . . . . . P . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . A . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . W . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -414.04 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . W . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . O . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . P . . . . . . . . . . . . . . | -15 | . . A . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . P . . . . . . . . . . . . . . . . . | -10 | . . . . . . . O . . . . . . . . . . . . | -11 | . W . . . . . . . . . . . . . . . . A . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . O . . . . . . . . W . . . . . P | - 6 | . . . . . . . . . A . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -598.68 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . O . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . A . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . P . | -14 | . . . . . . . . . . . . . . . . . W . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -243.55 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . W . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . A . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . O . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . P . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -464.21 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . O . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . P . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . A . . . . . . | - 7 | . . . . . . . . W . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . W . . . . . | - 5 | . . . . . . P . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . O . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . A . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . W . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . O . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . P . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . A . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . W . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . P . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . O . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . A . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . O . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . A . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . W . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . P . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . A . . . . . . . . . . . . . . | -14 | . O . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . P . | -18 | . . . . . . W . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . O A | -13 | . . . . W . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . P . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . O . . . . . . . | -13 | . . . . . . . . . . . . . . P . . . . . | -14 | . . . . . . . . . . . . . W . . . . . . | -15 | . . . . . . . . . A . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . P . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . A . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . O . . | -10 | . W . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . A . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . P . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . O . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . W . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . A . . . . | - 1 | . . . . . . . . . P . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . O . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . W . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . O . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . P A . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . W . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -615.36 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . W . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . P . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . O . . . . . . . . . . . . . . . . . . | -19 | . . . . . . A . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . A . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . O . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . P . W | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -561.21 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . O . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . W . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . P . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . A . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . P . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | O . . . . . . . . . . . . . . . . . . A | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . W . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . P A . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . W . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . O . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -459.20 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . A . | - 6 | . . . . . W . O . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . P . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | A . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . P . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . O . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . W . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -203.30 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . A . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . O . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . P . . . | -19 | . . . . . . . . . . . . . . . . . . . W | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -313.17 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . A . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . W . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | O . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . P . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . A . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . P . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . O . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . W . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . W . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . A . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . P . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . O . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -330.95 Win Rate: 28.60% (143/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . P . . . . . . . . . A . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . O . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . W . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . W . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . A . . . . . . O . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . P . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -651.45 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . W . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . A . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . O . . . . . . | -16 | . . . . . . . . . . . . . . . . . P . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . A . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . P . W . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . O . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -211.08 Win Rate: 1.80% (9/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . A . . . . . . . . | - 6 | W . . . . . . . . . . . . . . . . . . . | - 7 | . . . . O . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . P | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . P . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . O . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . A . W . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . A . . . . . . . . . . . . . . . . | - 1 | . . . . W . . . . . . . . . . . . . . . | - 2 | . P . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . O . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -63.95 Win Rate: 63.20% (316/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . O . . | - 7 | . . . . . . . . P . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . A . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . W . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . P . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . O . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . A . . . . W . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | P . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . A . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . O . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . W . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -361.02 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | O . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . P . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | W . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . A . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . O . . | - 4 | . . . . . . . P . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . A . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . W . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . O . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . W . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . A . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . P . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -604.14 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -230.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -230.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . A . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . W . . O . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . P . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -211.44 Win Rate: 1.60% (8/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . O . . . . | - 3 | . . . . . . . . . . . . . . . . . . . . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . A . . . . . . . . . . | - 7 | . W . . . . . . . . . . . . . . . . . . | - 8 | . . . . . . . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . P . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . . . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: -595.88 Win Rate: 2.60% (13/500) -=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 20 DEPTH=> 20 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 - +-------------------------------------------------------------+ - 0 | . . . . . . . . . . . . . . . . . . . . | - 1 | . . . . . . . . . . . . . . . . . . . . | - 2 | . . . . . . . . . . . . . . . . . . . . | - 3 | . . . . . . . . . . . . . . . . P . W . | - 4 | . . . . . . . . . . . . . . . . . . . . | - 5 | . . . . . . . . . . . . . . . . . . . . | - 6 | . . . . . . . . . . . . . . . . . . . . | - 7 | . . . . . . . . . . . . . . . . . . . . | - 8 | . . . . . O . . . . . . . . . . . . . . | - 9 | . . . . . . . . . . . . . . . . . . . . | -10 | . . . . . . . . . . . . . . . . . . . . | -11 | . . . . . . . . . . . . . . . . . . . . | -12 | . . . . . . . . . . . . . . . . . . . . | -13 | . . . . . . . . . . . . . . . . . . . . | -14 | . . . . . . . . . . . . . . . . . . . . | -15 | . . . . . . . . . . . . . . . . . . . . | -16 | . . . . . . . . . . . . . . . . . . . . | -17 | . . . . . . . . . . . . . . . . . . . . | -18 | . . . . . . . . . . . . . . A . . . . . | -19 | . . . . . . . . . . . . . . . . . . . . | - +-------------------------------------------------------------+ - -AGENT RESULTS -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/2-result3.txt b/assignment1/2-result3.txt deleted file mode 100644 index 1f33ad3ab..000000000 --- a/assignment1/2-result3.txt +++ /dev/null @@ -1,306 +0,0 @@ -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -251.74 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -426.07 Win Rate: 14.40% (72/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -633.72 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -420.94 Win Rate: 11.00% (55/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -644.11 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -182.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -182.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -521.65 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -142.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -142.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -502.46 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -92.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -92.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -314.78 Win Rate: 52.80% (264/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -404.60 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -42.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -559.45 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -446.72 Win Rate: 5.60% (28/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -665.08 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -148.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -148.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -414.04 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -598.68 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -243.55 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -464.21 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -70.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -70.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -615.36 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -561.21 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -104.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -104.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -459.20 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -52.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -52.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -203.30 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -313.17 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -330.95 Win Rate: 28.60% (143/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -651.45 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -132.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -132.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -211.08 Win Rate: 1.80% (9/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -63.95 Win Rate: 63.20% (316/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -361.02 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -604.14 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: -230.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -230.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -211.44 Win Rate: 1.60% (8/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -595.88 Win Rate: 2.60% (13/500) -=> cheapest_move : Performance: -118.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -118.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> cheapest_move : Performance: 0.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: 0.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx similarity index 94% rename from assignment1/A1_COMP9016_OReilly_Ruairi_R00065426.docx rename to assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx index 7d2da30b84da6716e2e1caf5015b45daf9d46c5f..03cc845950c937f92cd5054a0ee3484e9198b7d1 100644 GIT binary patch delta 12843 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 delta 14675 zcmZ8|1CS;#w`JS5rp;;Fwl!_rHovy*`P#OpZM%Egwry+Y{rmQ9?WQV~s#KDjO72bW zImz8hLXXNvue*iB~4*;}RoB(3gtL$ac%z~uW~@hFyw z6#T#TdN>tAI$@HmP)cDx9i0{LlY4YOX1;Ha*YBlW*pLY!;`&~>1Jl8 z?;I7dh5g$j`st?TwVd!uq8nW~qD8#jGtK8&rO8Qowau-h?g_e&A;#nra#MyvJqBbl z&HLy(V<3M5EOz-u;k;XDf-m$Uyv=iPH-n16;exPaigZ#sJ(SmQmnu{foRx%?Dix&9 zj3^%26nLx1%XO0cHKm$)QjfAeW(bHZd5HC_Xa?3+fc9;!Vs0DpDQ>#(v69PdsneZjV&t-ak*| zKH{?xK54yVc}ZMHaWPhSG?M(;ukE0yW2(qDV}s%;krs$gvvJiV(8k-y(g@wSAnlzZ zt;y-oOA4%LMqJaK4wDZQtuVN=N4*DLGbBcUw?>LrZR4nf9&uIz>4btfi3B3p*!PkG zcT_O}#BOkZMR@*d{xZWc!?oCz=%~-K%+ppobgVJto(-!rC5CFIRi!m-U#o{Q(cDKVzlPd z)fZGy7BoM#Zlj_1*0svzNbrlEo+mU*g)@K#>XzfO6i8x7G!V}<-6 z{|W^XWQzHgmnDCs*9#3nT}!Qcgk|!b~2|`7ZrV#E!%0DnWP}5o_S~n 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 diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 97a7ab53f..369d3af90 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -246,7 +246,7 @@ def __init__(self): super().__init__(self.cheapest_move) def cheapest_move(self, percept): - # returns the move with the lowest cost + # returns the move with the lowest cost, based on the percepts available cheapest = min(percept, key=lambda x: x[1]) return cheapest[0] @@ -512,4 +512,4 @@ def print_args(args): draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) - # searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) diff --git a/assignment1/Doc2.docx b/assignment1/Doc2.docx deleted file mode 100644 index 14b90cb6396abfc5e62f112be8c552ff3a4c5778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29326 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 b_}|B11!>SP@d5yV`Fa6 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . O . A . W | -4 | P . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -108.17 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . A . | -1 | O . P . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . W . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -173.84 Win Rate: 26.60% (133/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . A . | -2 | O . . . . P | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . . W . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -184.16 Win Rate: 24.80% (124/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . W . . | -1 | . . . . . . | -2 | . . O . A . | -3 | . . . P . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -161.94 Win Rate: 42.40% (212/500) -=> cheapest_move : Performance: 88.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 88.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | A O . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . W | -4 | . P . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -127.51 Win Rate: 16.80% (84/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . W . | -1 | . . . . . . | -2 | . . . . . . | -3 | . A . . . . | -4 | . . . . P . | -5 | . . . . O . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -140.46 Win Rate: 26.40% (132/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | O . P . . . | -1 | . . . . . . | -2 | . . W . . . | -3 | . . A . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -27.72 Win Rate: 68.80% (344/500) -=> cheapest_move : Performance: 96.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 96.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . W . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . A . . . . | -5 | . O . P . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -141.68 Win Rate: 35.00% (175/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . A . . . . | -3 | . . . . . W | -4 | . O . P . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -120.02 Win Rate: 24.40% (122/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . P | -4 | . O W . . . | -5 | . . . . . A | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -158.60 Win Rate: 50.60% (253/500) -=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . P | -4 | . O . . . A | -5 | . . . . . W | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -74.29 Win Rate: 68.00% (340/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | O . A . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . P W . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -106.60 Win Rate: 33.00% (165/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . P . | -2 | . . O . W . | -3 | . A . . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -108.18 Win Rate: 30.60% (153/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | W . . . A . | -2 | O P . . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -166.32 Win Rate: 22.00% (110/500) -=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | W . A . . . | -3 | . . P . . . | -4 | . . . . . . | -5 | . . . . . O | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -137.74 Win Rate: 46.60% (233/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . P | -2 | W . . . . . | -3 | . . . . . . | -4 | . O . . . A | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -204.44 Win Rate: 21.40% (107/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . P . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . A . . . . | -4 | . W . . O . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -12.35 Win Rate: 71.00% (355/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . W . . | -2 | . . . . . . | -3 | . O . . A . | -4 | . . . . . . | -5 | P . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -117.18 Win Rate: 47.60% (238/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | P . . . . . | -1 | A . . . W . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . O . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -130.89 Win Rate: 34.20% (171/500) -=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -1020.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . P | -1 | O . . . . . | -2 | W . . . . . | -3 | . . . . . . | -4 | A . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -63.88 Win Rate: 51.80% (259/500) -=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | P . . . . O | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . A . . | -4 | . . W . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -71.42 Win Rate: 57.60% (288/500) -=> cheapest_move : Performance: -932.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -932.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | W . . . . . | -1 | . . . . . . | -2 | . . . . . P | -3 | . . . . . . | -4 | . . . . . . | -5 | O . . . A . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -231.44 Win Rate: 13.80% (69/500) -=> cheapest_move : Performance: 64.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 64.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | W . . . . P | -1 | . . . . . . | -2 | . . . . A O | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -179.22 Win Rate: 20.80% (104/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . P | -1 | . . . . . . | -2 | . . A . . . | -3 | . O . . . . | -4 | . . . W . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -86.03 Win Rate: 43.40% (217/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . O | -1 | . . . . . . | -2 | . . . P . . | -3 | . . . . . . | -4 | A . . . . . | -5 | . . . . W . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -136.52 Win Rate: 28.20% (141/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . P . | -2 | A . . . . . | -3 | . . . . . . | -4 | . . W . . . | -5 | O . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -76.77 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | A . . . . . | -1 | P . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . O . W . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -175.67 Win Rate: 28.80% (144/500) -=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | P . . . . . | -3 | . . . . A . | -4 | . . O . . W | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -72.70 Win Rate: 52.60% (263/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . W | -3 | . O A . . . | -4 | . . . . . . | -5 | . . . P . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -150.71 Win Rate: 32.00% (160/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . W . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . A . . O P | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -139.08 Win Rate: 26.60% (133/500) -=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . O . . . W | -2 | . . . . . A | -3 | . . . . . . | -4 | . P . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -39.20 Win Rate: 70.60% (353/500) -=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | A . . . . . | -1 | . . . O . . | -2 | . . . W . . | -3 | . . P . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -75.75 Win Rate: 36.60% (183/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . P W . . . | -2 | . . . . . . | -3 | . . A . . O | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -96.52 Win Rate: 48.40% (242/500) -=> cheapest_move : Performance: 93.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 93.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . P . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | A . . . . O | -5 | . . . . . W | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -147.91 Win Rate: 12.80% (64/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . P . . . | -1 | . . A . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | O . . . W . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -151.34 Win Rate: 32.60% (163/500) -=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -72.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . W | -2 | . . . . . . | -3 | . . . . . . | -4 | . P . A O . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -198.01 Win Rate: 25.60% (128/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . P . | -2 | . . . O . . | -3 | . . . . . . | -4 | A . . . W . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -94.95 Win Rate: 37.00% (185/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . P . . | -1 | W . . . . . | -2 | . . . . O . | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . A . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -179.48 Win Rate: 20.80% (104/500) -=> cheapest_move : Performance: 21.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . P . . . | -1 | . . . . . . | -2 | . . . O . . | -3 | . . . . . . | -4 | . . . . . . | -5 | A . W . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -34.42 Win Rate: 61.60% (308/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . W . | -2 | . . . . P . | -3 | . . . A . . | -4 | . . . . . O | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -123.39 Win Rate: 48.00% (240/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . W . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . A | -4 | . O . . P . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -250.31 Win Rate: 22.20% (111/500) -=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . P . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | O . . . . . | -4 | A . W . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -1.90 Win Rate: 77.20% (386/500) -=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . A . . | -1 | . . . . . . | -2 | W . P . . . | -3 | . . O . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -132.50 Win Rate: 34.20% (171/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | W . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | P . . . . . | -5 | . . . A . O | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -213.10 Win Rate: 15.40% (77/500) -=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . O . . . . | -2 | A . . P . . | -3 | . . . W . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -66.35 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . O . . A | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . W . | -5 | P . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -91.75 Win Rate: 41.60% (208/500) -=> cheapest_move : Performance: -140.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -140.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . W . . . . | -1 | . . . . . . | -2 | . . . O . . | -3 | . . . . . . | -4 | . . A . . . | -5 | . . . . P . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -196.02 Win Rate: 25.00% (125/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . A O . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . W . . | -5 | . . . P . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -68.12 Win Rate: 37.60% (188/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . O . A | -1 | P . . . . . | -2 | . W . . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -134.65 Win Rate: 27.20% (136/500) -=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -180.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | A . . . . . | -2 | . . . . . . | -3 | . . . O . . | -4 | . . . . P . | -5 | . . . . . W | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -115.94 Win Rate: 11.20% (56/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . W . . . . | -2 | . . . . . . | -3 | . . O . . . | -4 | . . . . . . | -5 | . . . . P A | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -305.07 Win Rate: 19.80% (99/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . W . . . | -1 | . . P O . . | -2 | . . . . . . | -3 | A . . . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -120.23 Win Rate: 33.20% (166/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . A . | -1 | . W . . . . | -2 | . . . . O . | -3 | . . . . . P | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -112.61 Win Rate: 42.20% (211/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . A . . . | -1 | . . . . . . | -2 | . . . . . O | -3 | . . . . . . | -4 | . . . . P W | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -115.25 Win Rate: 19.40% (97/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . W . . | -3 | . . . . O . | -4 | . . . . A . | -5 | . . . P . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -186.72 Win Rate: 44.80% (224/500) -=> cheapest_move : Performance: 82.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 82.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . W . . | -4 | . . . . P O | -5 | . A . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -83.88 Win Rate: 50.80% (254/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . A . . | -2 | . . P . . . | -3 | . . . . . O | -4 | . . . . . . | -5 | . W . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -174.18 Win Rate: 24.00% (120/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . P | -1 | . W . . . . | -2 | . . . O . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . A . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -119.15 Win Rate: 34.80% (174/500) -=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . A . . . . | -1 | . . . . . . | -2 | . . W . . O | -3 | . . . . . . | -4 | . . . . . . | -5 | . . P . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -14.17 Win Rate: 63.40% (317/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . W . . | -1 | . . . . . . | -2 | . P . . . . | -3 | . . . . . . | -4 | . . . O . . | -5 | . . A . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -179.94 Win Rate: 22.20% (111/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | P . . . . . | -3 | . . . . . . | -4 | . . O . A W | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -23.64 Win Rate: 71.60% (358/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | W . . . . . | -3 | . . . P . . | -4 | A . . . . . | -5 | O . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -65.95 Win Rate: 59.80% (299/500) -=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . O . P | -2 | . . . . . . | -3 | . . . . . . | -4 | . A . W . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -52.03 Win Rate: 55.80% (279/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . O . . | -4 | A . . . . . | -5 | . . . . P W | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -129.10 Win Rate: 19.60% (98/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | W . . . . . | -1 | . . . O . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . P . | -5 | . . . . A . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -297.86 Win Rate: 10.40% (52/500) -=> cheapest_move : Performance: 14.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 14.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . W . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . P . | -4 | . O . . . . | -5 | . . . A . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -221.51 Win Rate: 23.00% (115/500) -=> cheapest_move : Performance: 73.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 73.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . W . O | -2 | . . . . A . | -3 | P . . . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -68.55 Win Rate: 58.20% (291/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | W . . P A . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . O . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -212.14 Win Rate: 25.00% (125/500) -=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . O . | -2 | . . W . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . A . P . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -136.14 Win Rate: 48.60% (243/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | W . . . . . | -2 | . . O . . . | -3 | . . . . A . | -4 | . . . P . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -244.01 Win Rate: 18.40% (92/500) -=> cheapest_move : Performance: 78.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . O A W . | -3 | . . . . . . | -4 | . . . . . . | -5 | P . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -3.02 Win Rate: 74.40% (372/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . O . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . P . . . . | -4 | W . A . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -123.17 Win Rate: 47.60% (238/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . P | -3 | . . . . . . | -4 | O . A . . . | -5 | W . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -152.42 Win Rate: 25.40% (127/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . W . P . . | -2 | . . . . . A | -3 | . . . . . . | -4 | . . . . . O | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -181.96 Win Rate: 34.60% (173/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . O . . . . | -2 | W . . . P . | -3 | . . . . . . | -4 | . . . . . . | -5 | . A . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -124.54 Win Rate: 42.60% (213/500) -=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . P . | -2 | . . . . . . | -3 | . . . . . O | -4 | W . . . . . | -5 | . . . A . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -146.05 Win Rate: 37.20% (186/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . O . . . | -4 | . P A . . W | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -193.13 Win Rate: 40.00% (200/500) -=> cheapest_move : Performance: -82.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -82.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . O | -1 | . A . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . P . . . | -5 | . W . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -108.94 Win Rate: 26.80% (134/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . W P . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . O A . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -149.03 Win Rate: 35.20% (176/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | W . . . . . | -1 | . . . . . O | -2 | . . . . . . | -3 | . . . . A . | -4 | . . . . . . | -5 | P . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -188.66 Win Rate: 16.60% (83/500) -=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . A . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . . P | -5 | . . . . W O | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -117.00 Win Rate: 19.60% (98/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . W . . . | -1 | . . A . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . O P . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -27.57 Win Rate: 65.20% (326/500) -=> cheapest_move : Performance: 98.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 98.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . P O | -2 | . . . . . . | -3 | . . . . . . | -4 | . . A . . . | -5 | . W . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -76.45 Win Rate: 57.00% (285/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . W . . . . | -1 | . . . . . . | -2 | . P . O . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . A . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -175.19 Win Rate: 24.60% (123/500) -=> cheapest_move : Performance: 35.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 35.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . P . . . . | -1 | . . . . . . | -2 | A . . . W . | -3 | . . . . . . | -4 | . . O . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -133.16 Win Rate: 29.80% (149/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -970.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | A . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | W . . . . P | -4 | . . . . . . | -5 | . . . . . O | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -48.43 Win Rate: 48.20% (241/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . P . . | -4 | . . A . . O | -5 | . . . . W . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -131.70 Win Rate: 39.60% (198/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . O . W . . | -2 | . P . . . . | -3 | . . . . A . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -128.62 Win Rate: 46.20% (231/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . W | -1 | O . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | P . . A . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -201.53 Win Rate: 17.80% (89/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | O . . . . . | -1 | . P A . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | W . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -208.59 Win Rate: 20.00% (100/500) -=> cheapest_move : Performance: -1010.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . W O . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . . A . P . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -231.20 Win Rate: 15.40% (77/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . W . P . | -1 | . . . . . . | -2 | . . . A . . | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . . O . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -120.61 Win Rate: 44.40% (222/500) -=> cheapest_move : Performance: 91.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 91.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . W . . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | P . . . . . | -5 | . O A . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -180.97 Win Rate: 28.80% (144/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . W . . . . | -1 | . . A . . . | -2 | . . . . . . | -3 | . . . . . . | -4 | . O . . . P | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -66.94 Win Rate: 54.40% (272/500) -=> cheapest_move : Performance: 97.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 97.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . P . . | -1 | . . . . . . | -2 | . . . . . W | -3 | . . . . . . | -4 | . . . . . A | -5 | . O . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -97.27 Win Rate: 53.00% (265/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . W . . . | -2 | . . . . A . | -3 | . . . . . P | -4 | . . . . . . | -5 | O . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -149.35 Win Rate: 49.00% (245/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . O | -3 | . . . P . . | -4 | . . . A . . | -5 | . . . . . W | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -165.89 Win Rate: 39.40% (197/500) -=> cheapest_move : Performance: -88.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -88.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . A . | -1 | . . . . . . | -2 | . . O . P W | -3 | . . . . . . | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -71.16 Win Rate: 55.20% (276/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . O . | -1 | . . P . . A | -2 | . . . . . . | -3 | . . . . . . | -4 | . . . . . . | -5 | W . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -193.54 Win Rate: 13.60% (68/500) -=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -220.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . O W . | -1 | . . . . . . | -2 | . . . . . P | -3 | . . . . . . | -4 | . . . . . . | -5 | . A . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -167.91 Win Rate: 14.40% (72/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . . . | -1 | . . . . . . | -2 | . . . . . . | -3 | . O . . . P | -4 | . . . . . A | -5 | . . . . . W | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -77.93 Win Rate: 65.40% (327/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) - -CURRENT ARGUMENTS: STEPS=> 40 RUNS=> 500 WIDTH=> 6 DEPTH=> 6 - -*** Pass the -h parameter to see details on how to configure the arguments *** - -A=Agent, W=Winning Square, P=Penalty Square, O=Obstacle - - 0 1 2 3 4 5 - +-------------+ -0 | . . . . O . | -1 | . P A . . . | -2 | . . . . . . | -3 | . . . . . W | -4 | . . . . . . | -5 | . . . . . . | - +-------------+ - -AGENT RESULTS -=> random_move : Performance: -189.15 Win Rate: 26.00% (130/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/result3.txt b/assignment1/result3.txt deleted file mode 100644 index 16c239721..000000000 --- a/assignment1/result3.txt +++ /dev/null @@ -1,306 +0,0 @@ -=> random_move : Performance: -108.17 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -173.84 Win Rate: 26.60% (133/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -184.16 Win Rate: 24.80% (124/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -161.94 Win Rate: 42.40% (212/500) -=> cheapest_move : Performance: 88.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 88.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -127.51 Win Rate: 16.80% (84/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -140.46 Win Rate: 26.40% (132/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -27.72 Win Rate: 68.80% (344/500) -=> cheapest_move : Performance: 96.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 96.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -141.68 Win Rate: 35.00% (175/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -120.02 Win Rate: 24.40% (122/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -158.60 Win Rate: 50.60% (253/500) -=> cheapest_move : Performance: -110.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -110.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -74.29 Win Rate: 68.00% (340/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -106.60 Win Rate: 33.00% (165/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -108.18 Win Rate: 30.60% (153/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -166.32 Win Rate: 22.00% (110/500) -=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -137.74 Win Rate: 46.60% (233/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -204.44 Win Rate: 21.40% (107/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -12.35 Win Rate: 71.00% (355/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -117.18 Win Rate: 47.60% (238/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -130.89 Win Rate: 34.20% (171/500) -=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -1020.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -63.88 Win Rate: 51.80% (259/500) -=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -71.42 Win Rate: 57.60% (288/500) -=> cheapest_move : Performance: -932.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -932.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -231.44 Win Rate: 13.80% (69/500) -=> cheapest_move : Performance: 64.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 64.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -179.22 Win Rate: 20.80% (104/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -86.03 Win Rate: 43.40% (217/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -136.52 Win Rate: 28.20% (141/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -76.77 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -175.67 Win Rate: 28.80% (144/500) -=> cheapest_move : Performance: -1020.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -72.70 Win Rate: 52.60% (263/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -150.71 Win Rate: 32.00% (160/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -139.08 Win Rate: 26.60% (133/500) -=> cheapest_move : Performance: 90.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 90.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -39.20 Win Rate: 70.60% (353/500) -=> cheapest_move : Performance: 94.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 94.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -75.75 Win Rate: 36.60% (183/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -96.52 Win Rate: 48.40% (242/500) -=> cheapest_move : Performance: 93.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 93.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -147.91 Win Rate: 12.80% (64/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -151.34 Win Rate: 32.60% (163/500) -=> cheapest_move : Performance: -72.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -72.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -198.01 Win Rate: 25.60% (128/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -94.95 Win Rate: 37.00% (185/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -179.48 Win Rate: 20.80% (104/500) -=> cheapest_move : Performance: 21.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -94.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -34.42 Win Rate: 61.60% (308/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -123.39 Win Rate: 48.00% (240/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -250.31 Win Rate: 22.20% (111/500) -=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -1.90 Win Rate: 77.20% (386/500) -=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -132.50 Win Rate: 34.20% (171/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -213.10 Win Rate: 15.40% (77/500) -=> cheapest_move : Performance: 72.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 72.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -66.35 Win Rate: 45.80% (229/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -91.75 Win Rate: 41.60% (208/500) -=> cheapest_move : Performance: -140.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -140.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -196.02 Win Rate: 25.00% (125/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -68.12 Win Rate: 37.60% (188/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -134.65 Win Rate: 27.20% (136/500) -=> cheapest_move : Performance: -180.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -180.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -115.94 Win Rate: 11.20% (56/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -305.07 Win Rate: 19.80% (99/500) -=> cheapest_move : Performance: -60.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -120.23 Win Rate: 33.20% (166/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -112.61 Win Rate: 42.20% (211/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -115.25 Win Rate: 19.40% (97/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -186.72 Win Rate: 44.80% (224/500) -=> cheapest_move : Performance: 82.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 82.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -83.88 Win Rate: 50.80% (254/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -174.18 Win Rate: 24.00% (120/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -119.15 Win Rate: 34.80% (174/500) -=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -14.17 Win Rate: 63.40% (317/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -179.94 Win Rate: 22.20% (111/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -23.64 Win Rate: 71.60% (358/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -65.95 Win Rate: 59.80% (299/500) -=> cheapest_move : Performance: 95.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 95.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -52.03 Win Rate: 55.80% (279/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -129.10 Win Rate: 19.60% (98/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -297.86 Win Rate: 10.40% (52/500) -=> cheapest_move : Performance: 14.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 14.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -221.51 Win Rate: 23.00% (115/500) -=> cheapest_move : Performance: 73.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 73.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -68.55 Win Rate: 58.20% (291/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -212.14 Win Rate: 25.00% (125/500) -=> cheapest_move : Performance: 89.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -136.14 Win Rate: 48.60% (243/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -244.01 Win Rate: 18.40% (92/500) -=> cheapest_move : Performance: 78.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -3.02 Win Rate: 74.40% (372/500) -=> cheapest_move : Performance: -28.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -28.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -123.17 Win Rate: 47.60% (238/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -152.42 Win Rate: 25.40% (127/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -181.96 Win Rate: 34.60% (173/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -124.54 Win Rate: 42.60% (213/500) -=> cheapest_move : Performance: 86.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 86.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -146.05 Win Rate: 37.20% (186/500) -=> cheapest_move : Performance: -44.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -44.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -193.13 Win Rate: 40.00% (200/500) -=> cheapest_move : Performance: -82.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -82.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -108.94 Win Rate: 26.80% (134/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -149.03 Win Rate: 35.20% (176/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -188.66 Win Rate: 16.60% (83/500) -=> cheapest_move : Performance: 79.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 79.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -117.00 Win Rate: 19.60% (98/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -27.57 Win Rate: 65.20% (326/500) -=> cheapest_move : Performance: 98.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 98.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -76.45 Win Rate: 57.00% (285/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -175.19 Win Rate: 24.60% (123/500) -=> cheapest_move : Performance: 35.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 35.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -133.16 Win Rate: 29.80% (149/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -970.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -48.43 Win Rate: 48.20% (241/500) -=> cheapest_move : Performance: -20.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -20.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -131.70 Win Rate: 39.60% (198/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -128.62 Win Rate: 46.20% (231/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -201.53 Win Rate: 17.80% (89/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -208.59 Win Rate: 20.00% (100/500) -=> cheapest_move : Performance: -1010.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -60.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -231.20 Win Rate: 15.40% (77/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -120.61 Win Rate: 44.40% (222/500) -=> cheapest_move : Performance: 91.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 91.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -180.97 Win Rate: 28.80% (144/500) -=> cheapest_move : Performance: -38.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -38.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -66.94 Win Rate: 54.40% (272/500) -=> cheapest_move : Performance: 97.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 97.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -97.27 Win Rate: 53.00% (265/500) -=> cheapest_move : Performance: 85.00 Win Rate: 100.00% (500/500) -=> table_action : Performance: 85.00 Win Rate: 100.00% (500/500) -=> random_move : Performance: -149.35 Win Rate: 49.00% (245/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -165.89 Win Rate: 39.40% (197/500) -=> cheapest_move : Performance: -88.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -88.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -71.16 Win Rate: 55.20% (276/500) -=> cheapest_move : Performance: -24.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -24.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -193.54 Win Rate: 13.60% (68/500) -=> cheapest_move : Performance: -220.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -220.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -167.91 Win Rate: 14.40% (72/500) -=> cheapest_move : Performance: -32.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -32.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -77.93 Win Rate: 65.40% (327/500) -=> cheapest_move : Performance: -102.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -102.00 Win Rate: 0.00% (0/500) -=> random_move : Performance: -189.15 Win Rate: 26.00% (130/500) -=> cheapest_move : Performance: -22.00 Win Rate: 0.00% (0/500) -=> table_action : Performance: -22.00 Win Rate: 0.00% (0/500) diff --git a/assignment1/strategy_performance.xlsx b/assignment1/strategy_performance.xlsx deleted file mode 100644 index 0e4664acb82ff994a89415e80a25d76f3f696fd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7850 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 diff --git a/assignment1/strategy_performance_latest.xlsx b/assignment1/strategy_performance_latest.xlsx deleted file mode 100644 index 701522710dbc3c4890c42db3d4b8e0a772a5b5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7475 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 HK*0Y4SezC_ diff --git a/assignment1/strategy_performance_new.xlsx b/assignment1/strategy_performance_new.xlsx deleted file mode 100644 index adc286412a1978bb50ca2ecd51182013b1ff1b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6917 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 Z?0OY>1ZeZ>A(f&6#-N#o;-QBH_%EYJ?qdJ| diff --git a/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx b/assignment1/~$_COMP9016_OReilly_Ruairi_R00065426.docx deleted file mode 100644 index 8d582a58df2a8b1d7f96904b0c63fed6fc725b6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Z#Z!U2P@qgIPz5fqLU9%gBQ8lKaR8jB5mf*H diff --git a/assignment1/~$art1.2.docx b/assignment1/~$art1.2.docx deleted file mode 100644 index 8d582a58df2a8b1d7f96904b0c63fed6fc725b6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Z#Z!U2P@qgIPz5fqLU9%gBQ8lKaR8jB5mf*H From 532e9788711eefa9691bbd4f6178d42ab898ea58 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Tue, 7 Oct 2025 19:42:22 +0100 Subject: [PATCH 33/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.docx | Bin 313694 -> 314062 bytes .../A1_COMP9016_Nagle_JohnPaul_R00065426.pdf | Bin 0 -> 430522 bytes assignment1/lab2_solution.py | 460 ++++++++++++++++++ .../~$_COMP9016_Nagle_JohnPaul_R00065426.docx | Bin 0 -> 162 bytes 4 files changed, 460 insertions(+) create mode 100644 assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.pdf create mode 100644 assignment1/lab2_solution.py create mode 100644 assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx index 03cc845950c937f92cd5054a0ee3484e9198b7d1..9ddea98cb06a5e234b53a10ff34a7c94a28538b5 100644 GIT binary patch delta 12777 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 ZX8S>K;IKXrHCS;3gp0g92>NgFe*yMW$PoYl delta 12390 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�i{a1>$nfnLW(JSe0@wl!_5k%X8z%*%ueCv3PN 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∓ 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⋘ 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 t>jYZlh{1s^4(#+~2P{qj@n@B actions +# Mapping percepts to actions +percept_action_table = { + (('A', 'A', 'A', 'A'),): 'Move(Chicken)', + (('A', 'A', 'A', 'A'), ('B', 'B', 'A', 'A')): 'ReturnAlone', + (('A', 'A', 'A', 'A'), ('B', 'B', 'A', 'A'), ('A', 'B', 'A', 'A')): 'Move(Fox)', + (('A', 'A', 'A', 'A'), ('B', 'B', 'A', 'A'), ('A', 'B', 'A', 'A'), ('B', 'B', 'A', 'B')): 'Move(Chicken)', + (('A', 'A', 'A', 'A'), ('B', 'B', 'A', 'A'), ('A', 'B', 'A', 'A'), ('B', 'B', 'A', 'B'), ('A', 'A', 'A', 'B')): 'Move(Feed)', + (('A', 'A', 'A', 'A'), ('B', 'B', 'A', 'A'), ('A', 'B', 'A', 'A'), ('B', 'B', 'A', 'B'), ('A', 'A', 'A', 'B'), ('B', 'A', 'B', 'B')): 'ReturnAlone', + (('A', 'A', 'A', 'A'), ('B', 'B', 'A', 'A'), ('A', 'B', 'A', 'A'), ('B', 'B', 'A', 'B'), ('A', 'A', 'A', 'B'), ('B', 'A', 'B', 'B'), ('A', 'A', 'B', 'B')): 'Move(Chicken)', + (('A', 'A', 'A', 'A'), ('B', 'B', 'A', 'A'), ('A', 'B', 'A', 'A'), ('B', 'B', 'A', 'B'), ('A', 'A', 'A', 'B'), ('B', 'A', 'B', 'B'), ('A', 'A', 'B', 'B'), ('B', 'B', 'B', 'B')): 'GoalReached' +} + +# Implementing the Table-Driven Agent Program for the Farmer Problem +class FarmerRiverCrossingEnvironment(Environment): + def __init__(self): + super().__init__() + self.state = initial_state + + def percept(self, agent): + # Return the current state as the percept + return self.state + + def execute_action(self, agent, action): + # Perform the action and update the state accordingly + if action == 'Move(Chicken)': + # Move farmer and chicken across + self.state = ('B' if self.state[0] == 'A' else 'A', 'B' if self.state[1] == 'A' else 'A', self.state[2], self.state[3]) + elif action == 'Move(Fox)': + # Move farmer and fox across + self.state = ('B' if self.state[0] == 'A' else 'A', self.state[1], self.state[2], 'B' if self.state[3] == 'A' else 'A') + elif action == 'Move(Feed)': + # Move farmer and feed across + self.state = ('B' if self.state[0] == 'A' else 'A', self.state[1], 'B' if self.state[2] == 'A' else 'A', self.state[3]) + elif action == 'ReturnAlone': + # Move only the farmer across + self.state = ('B' if self.state[0] == 'A' else 'A', self.state[1], self.state[2], self.state[3]) + # Print the current state after action + print(f"State after action {action}: {self.state}") + + def is_done(self): + # Check if the goal state has been reached + return self.state == goal_state + + +def run_farmers_dilemma(): + # Create the agent with the table-driven program + farmer_agent = Agent(TableDrivenAgentProgram(percept_action_table)) + + #USEFUL CODE TO SEE MORE INFO ON AGENT# + # Wrap the farmer_agent in a TraceAgent to log percepts and actions + traced_farmer_agent = TraceAgent(farmer_agent) + + # Create the environment and add the agent + env = FarmerRiverCrossingEnvironment() + env.add_thing(traced_farmer_agent) + + # Run the environment to solve the problem + while not env.is_done(): + action = traced_farmer_agent.program(env.percept(traced_farmer_agent)) + env.execute_action(traced_farmer_agent, action) + + print("Problem Solved!") + + + +""" B. Agent performance """ + +# Specify the PEAS for each (in a 5x5 table). +""" +| Agent | Perf Measure | Env | Actuators | Sensors | +|----------------------|-----------------------------|-----------------|------------|-----------------| +| RandomVacuumAgent | Dirt cleaned (+10), rnd (-1)| TrivialVacEnv | Move, Suck | Loc, Dirt | +| TableDrivenVacuumAgent| Dirt cleaned (+10), tbl (-1)| TrivialVacEnv | Move, Suck | Loc, Dirt | +| ReflexVacuumAgent | Dirt cleaned (+10), rct (-1)| TrivialVacEnv | Move, Suck | Loc, Dirt | +| ModelBasedVacuumAgent | Dirt cleaned (+10), mem (-1)| TrivialVacEnv | Move, Suck | Loc, Dirt, Mem | + +""" +# Perform a comparative analysis of the agents operating in a TrivialVacuumEnvironment. + +# Define factories for the agents +def random_vacuum_agent_factory(): + agent = RandomVacuumAgent() + agent.__name__ = "RandomVacuumAgent" # Add a custom name to identify this agent + print(f"Created agent: {agent.__name__}") + return agent + +def table_driven_vacuum_agent_factory(): + agent = TableDrivenVacuumAgent() + agent.__name__ = "TableDrivenVacuumAgent" # Add a custom name to identify this agent + print(f"Created agent: {agent.__name__}") + return agent + +def reflex_vacuum_agent_factory(): + agent = ReflexVacuumAgent() + agent.__name__ = "ReflexVacuumAgent" # Add a custom name to identify this agent + print(f"Created agent: {agent.__name__}") + return agent + +def model_based_vacuum_agent_factory(): + agent = ModelBasedVacuumAgent() + agent.__name__ = "ModelBasedVacuumAgent" # Add a custom name to identify this agent + print(f"Created agent: {agent.__name__}") + return agent + + +# Define the environment factory +def env_factory_trivial_vac(): + return TrivialVacuumEnvironment() + +# Environment factory for the one-dimensional vacuum environment +def env_factory_1d(n_tiles=5): + return OneDimensionalVacuumEnvironment(n_tiles=n_tiles) + +# List of agent factories for comparison - part B +agent_factories = [ + random_vacuum_agent_factory, + table_driven_vacuum_agent_factory, + reflex_vacuum_agent_factory, + model_based_vacuum_agent_factory +] + +# List of agent factories for comparison +agent_factories_part_c = [ + random_vacuum_agent_factory, + reflex_vacuum_agent_factory, + model_based_vacuum_agent_factory +] + +def run_agent_comparison(): + # Run the comparison between the agents + results = compare_agents(env_factory_trivial_vac, agent_factories, n=10, steps=1000) + + # Loop through the results and print each agent's name and average score + for agent, avg_score in results: + print(f"Agent: {agent.__name__}, Average Score: {avg_score}") + +# Detail the different characteristics of the agents and how that relates to their performance. +""" +| Agent | Strengths | Weaknesses | +|----------------------|---------------------------------|-------------------------------------| +| RandomVacuumAgent | Simple, no knowledge needed | Random moves, inefficient, high step cost | +| TableDrivenVacuumAgent| Can work well with good table | Inflexible, depends on predefined table | +| ReflexVacuumAgent | Quick response, simple logic | Redundant moves, no memory, inefficient in large env | +| ModelBasedVacuumAgent | Efficient, minimizes moves | Overly complex for trivial env, step cost can be mitigated | + +""" + +#OK Lets run multiple iterations of the compare_agents against increasing no. step sizes (powers of 2, from 2^1 to 2^8) and plot the performance results against agent type. +def run_agent_comparison_visualise_results(): + + # Line styles for different agents + line_styles = ['-.', '--', ':', '-'] + + # Step sizes (powers of 2: 2^1 to 2^8) + step_sizes = [2**i for i in range(1, 9)] + + # Store results for each agent + performance_results = {agent.__name__: [] for agent in agent_factories} + + # Run comparison for each step size + for steps in step_sizes: + results = compare_agents(TrivialVacuumEnvironment, agent_factories, n=10, steps=steps) + for agent, avg_score in results: + performance_results[agent.__name__].append(avg_score) + # Plot results + plt.figure(figsize=(10, 6)) + + for agent, style in zip(performance_results, line_styles): + plt.plot(step_sizes, performance_results[agent], label=agent, linestyle=style) + + # Plot formatting + plt.title('Agent Performance Across Different Step Sizes (Powers of 2)') + plt.xlabel('Step Size') + plt.ylabel('Average Performance') + plt.xscale('log', base=2) + plt.grid(True) + plt.legend(loc='lower left') + plt.show() + +# Define a one-dimensional vacuum environment +class OneDimensionalVacuumEnvironment(VacuumEnvironment): + """A one-dimensional vacuum environment with n tiles.""" + + def __init__(self, n_tiles=5): + super().__init__() + self.n_tiles = n_tiles + self.status = {i: random.choice(['Clean', 'Dirty']) for i in range(n_tiles)} + + def percept(self, agent): + """Return the agent's current location and the status of the tile.""" + return agent.location, self.status[agent.location] + + def execute_action(self, agent, action): + """Execute the action of the agent: Move or Clean.""" + if action == 'Left' and agent.location > 0: + agent.location -= 1 + agent.performance -= 1 # Moving costs + elif action == 'Right' and agent.location < self.n_tiles - 1: + agent.location += 1 + agent.performance -= 1 + elif action == 'Suck': + if self.status[agent.location] == 'Dirty': + self.status[agent.location] = 'Clean' + agent.performance += 10 # Cleaning reward + + def is_done(self): + """The environment is done if all tiles are clean.""" + return all(state == 'Clean' for state in self.status.values()) + + def default_location(self, agent): + """Ensure the agent starts within valid tile range.""" + return random.choice(range(self.n_tiles)) + +# List of agent factories for the one-dimensional vacuum environment +agent_factories_part_c = [random_vacuum_agent_factory, reflex_vacuum_agent_factory, model_based_vacuum_agent_factory] + +# Define the environment factory for the one-dimensional environment +def env_factory_1d(n_tiles=5): + return OneDimensionalVacuumEnvironment(n_tiles=n_tiles) + +# Use compare_agents to test agents in the one-dimensional vacuum environment +def compare_agents_in_1D_env(n_tiles, steps): + # Pass the factories, not instances + results = compare_agents(lambda: env_factory_1d(n_tiles), agent_factories_part_c, # Pass factories + n=10, steps=steps) + return results + +# Test for different environment sizes and gather performance +def test_one_dimensional_vacuum_environment(): + n_tiles_list = [5, 10, 15, 20] + steps = 1000 + + # Initialize performance_results with the agent names as keys + performance_results = { + 'RandomVacuumAgent': [], + 'ReflexVacuumAgent': [], + 'ModelBasedVacuumAgent': [] + } + + for n_tiles in n_tiles_list: + results = compare_agents_in_1D_env(n_tiles, steps) + for agent_name, performance in results: + print(f"Agent class name during result processing: {agent_name}") + + # Check for agent_name in performance_results + if agent_name in performance_results: + performance_results[agent_name].append(performance) + else: + print(f"KeyError: {agent_name} not found in performance_results") + + # Plot the results + plt.figure(figsize=(10, 6)) + for agent_name, performance in performance_results.items(): + plt.plot(n_tiles_list, performance, label=agent_name) + + plt.xlabel('Number of Tiles') + plt.ylabel('Average Performance') + plt.title('Agent Performance in One-Dimensional Vacuum Environment') + plt.legend(loc='best') + plt.show() + + +### + +""" B. Goal-based Agent """ + +""" +Converting a Reflex Agent into a Goal-Based Agent: +- Define a Goal: The agent's goal is to clean the entire environment. It should know when it's done (when all tiles are clean). +- Percept History: The agent should keep track of the state of the environment (which tiles are clean/dirty) and where it has been. +- World Model: The agent needs a model of the environment (e.g., a 1-dimensional grid) to understand how its movements affect the world. +- Action Planning: Before deciding on an action, the agent should evaluate if that action will lead to progress towards the goal (cleaning the environment). + + +Goal: The goal is to clean all the dirty tiles in the environment. + +Percept History and World Model: We'll keep track of the environment's state (clean or dirty) and the vacuum's position on the grid. + +Planning Mechanism: The agent will decide its next action based on the goal of cleaning the entire room. It will try to visit every tile and clean if necessary + +""" + +# Goal-Based Vacuum Agent Program with Complete Tile Tracking +def GoalBasedVacuumAgentProgram(n_tiles): + """A goal-based vacuum agent for a one-dimensional environment.""" + state = {i: 'Unknown' for i in range(n_tiles)} # Initialize state for all tiles + goal = 'Clean' # Goal is to clean the entire environment + + def program(percept): + location, status = percept # Get the location and status (clean/dirty) + state[location] = status # Update the state of the current tile + + # Check if the environment is fully clean + if all(tile_status == 'Clean' for tile_status in state.values()): + print("Goal achieved: The entire environment is clean!") + return 'NoOp' # Stop acting + + # If the current tile is dirty, clean it, print the state, and return 'Suck' + if status == 'Dirty': + print(f"Current state: {state}") + return 'Suck' + + # If the current tile is clean, move to the next unexplored or dirty tile, print the state, and return 'Left' or 'Right' + if location > 0 and state[location - 1] != 'Clean': # Check left + print(f"Current state: {state}, Moving Left") + return 'Left' + elif location < len(state) - 1 and state[location + 1] != 'Clean': # Check right + print(f"Current state: {state}, Moving Left") + return 'Right' + else: + # If both sides are clean or unknown, move randomly (since it's a 1D environment) + print(f"Current state: {state}, Moving Randomly") + return random.choice(['Left', 'Right']) + + return program + +""" +World Model & Percept History: The agent maintains a state dictionary that tracks the status of each tile (whether it's clean or dirty). It updates the state with each percept it receives. + +Goal: The agent's goal is to clean all the dirty tiles. Once all tiles are clean, the agent will stop working. + +Action Planning: The agent evaluates whether the current tile is dirty. If it is, the agent cleans it. If the tile is already clean, the agent moves to the next tile that might be dirty, based on its percept history (state). The agent chooses to move left or right depending on which neighboring tile it thinks is still dirty. + +Stopping Condition: Once all tiles are clean, the agent stops and does nothing (NoOp). + +Improvements Over Reflex Agent: + +- Memory: The agent now keeps track of where it has been and which tiles are clean or dirty. +- Goal: It has a defined goal: cleaning the entire environment. It knows when it has achieved this goal and stops acting. +- Simple Planning: The agent evaluates which action is more likely to help it achieve its goal (moving to dirty tiles). + +""" + + +# Test the Goal-Based Agent in the 1D environment +def test_goal_based_agent(): + env = OneDimensionalVacuumEnvironment(n_tiles=5) # Create a 5-tile environment + agent = Agent(program=GoalBasedVacuumAgentProgram(env.n_tiles)) # Create the agent + agent.location = env.default_location(agent) # Place the agent in the environment + + # Run the environment until all tiles are clean + while not env.is_done(): + percept = env.percept(agent) # Get the agent's percept + action = agent.program(percept) # Get the action based on the goal-based program + if action == 'NoOp': + break # Stop if NoOp is returned + env.execute_action(agent, action) # Execute the action in the environment + + print(f"Final performance: {agent.performance}") + +# Run the test +test_goal_based_agent() + +# run_farmers_dilemma() +# run_agent_comparison() +# run_agent_comparison_visualise_results() +# NOT WORKING - UNDER CONSTRUCTION --- Run the test +# test_one_dimensional_vacuum_environment() + + diff --git a/assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx b/assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx new file mode 100644 index 0000000000000000000000000000000000000000..1215360c558324f168a348f977b46d5a160ee437 GIT binary patch literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Q#Z!U2P@qgIPz9v`0A Date: Wed, 8 Oct 2025 10:54:48 +0100 Subject: [PATCH 34/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 30 +++++++++++++++--- .../~$_COMP9016_Nagle_JohnPaul_R00065426.docx | Bin 162 -> 0 bytes 2 files changed, 25 insertions(+), 5 deletions(-) delete mode 100644 assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 369d3af90..8a85561fc 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -61,9 +61,8 @@ sys.path.insert(0, parent_dir) # Now you can import a module from the parent directory -from agents4e import Thing, XYEnvironment, Agent, Obstacle -from search import Node, Problem, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search -from utils4e import PriorityQueue, memoize +from agents import Thing, XYEnvironment, Agent, Obstacle +from search import Problem, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search GAME_WON=False @@ -181,6 +180,8 @@ def execute_action(self, agent, action): obstacle_positions.append(thing.location) # Check if move is valid + if not action: + return if not self._is_valid_move(agent, action, obstacle_positions): log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") return @@ -287,6 +288,25 @@ def table_action(self, percept): return self._get_preferred_move(agent_table, available_moves) +class GoalBasedAgent(Agent): + def __init__(self): + super().__init__(self.goalbased_action) + + + def goalbased_action(self, percept): + # A goal based search, wher ethe goal is the Winning position i.e. positive_pos + state = self.show_state() + problem = GridSearchProblemWithHeuristic( + initial=self.location, + goal=positive_pos, + width=args.width, + depth=args.depth, + obstacles=[obstacle_pos, negative_pos] + ) + star_search_result = astar_search(problem) + return star_search_result.action + + def generate_random_starting_positions(width, depth): # Generate random positions for obstacle, positive destination, negative destination, and the agent. occupied_positions = [] @@ -390,7 +410,7 @@ def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): """ This function is used to build the world for the agent to explore.""" global GAME_WON - agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action] + agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action, GoalBasedAgent().goalbased_action] print("\nAGENT RESULTS") for agent_program in agent_list: @@ -512,4 +532,4 @@ def print_args(args): draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) - searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + # searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) diff --git a/assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx b/assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx deleted file mode 100644 index 1215360c558324f168a348f977b46d5a160ee437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Q#Z!U2P@qgIPz9v`0A Date: Wed, 8 Oct 2025 14:33:53 +0100 Subject: [PATCH 35/56] checkpoint --- .vscode/launch.json | 16 ++ .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 231 ++++++++++++------ 2 files changed, 179 insertions(+), 68 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..83b59b022 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Current File with Arguments", + "type": "debugpy", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "args": "" + } + ] +} \ No newline at end of file diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 8a85561fc..db164485d 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -47,10 +47,12 @@ - Recursive Best First Search """ +from operator import neg import sys import os import random import argparse +import copy import time # Get the parent directory of the current directory @@ -168,7 +170,6 @@ def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): return available_moves def execute_action(self, agent, action): - global GAME_WON initial_location = agent.location # Calculate obstacle positions @@ -286,24 +287,37 @@ def table_action(self, percept): (available_moves, ('up', 'down', 'left', 'right')): 'up', } - return self._get_preferred_move(agent_table, available_moves) + preferred_move = self._get_preferred_move(agent_table, available_moves) + return preferred_move class GoalBasedAgent(Agent): - def __init__(self): + # GOAL is self.location == goal_location + def __init__(self, agent_pos, positive_pos, negative_pos, obstacle_pos): + self.location = agent_pos + self.goal_location = positive_pos + self.penalty_location = negative_pos + self.obstacle_location = obstacle_pos + super().__init__(self.goalbased_action) def goalbased_action(self, percept): - # A goal based search, wher ethe goal is the Winning position i.e. positive_pos - state = self.show_state() + # A goal based search, where the goal is the Winning position i.e. positive_pos + # We will use the astar search to find the next move towards the goal + problem = GridSearchProblemWithHeuristic( initial=self.location, - goal=positive_pos, + goal=self.goal_location, width=args.width, depth=args.depth, - obstacles=[obstacle_pos, negative_pos] + obstacles=[self.obstacle_location, self.penalty_location] ) - star_search_result = astar_search(problem) + star_search_result = astar_search(problem) + # Update state based on the action + if star_search_result.action in direction_to_coords: + dx, dy = direction_to_coords[star_search_result.action] + self.location = (self.location[0] + dx, self.location[1] + dy) + return star_search_result.action @@ -329,7 +343,6 @@ def generate_random_starting_positions(width, depth): occupied_positions.append((neg_x, neg_y)) break - agent_position = None while True: agent_x = random.randint(0, width - 1) agent_y = random.randint(0, depth - 1) @@ -406,63 +419,147 @@ def h(self, node): x2, y2 = self.goal return abs(x2 - x1) + abs(y2 - y1) -def building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): +def compare_agents(EnvFactory, AgentFactories, n, steps): + """See how well each of several agents do in n instances of an environment.""" + envs = [EnvFactory() for i in range(n)] + results = [(agent, test_agent(agent, steps, copy.deepcopy(envs))) for agent in AgentFactories] + return results + +def test_agent(AgentFactory, steps, envs): + """Return the mean score of running an agent in each of the envs, for steps + """ + def score(env): + global GAME_WON + run_stat = {} + + agent = AgentFactory() + GAME_WON = False + env.add_thing(agent) + # Run the simulation and measure time + start_time = time.time() + env.run(steps) + end_time = time.time() + elapsed_time = end_time - start_time + + run_stat['time_taken'] = elapsed_time + run_stat['performance'] = agent.performance + run_stat['game_won'] = GAME_WON + agent_stats.append(run_stat) + return agent_stats + + agent_stats = [] + for env in envs: + agent_stats.append(score(env)) + + return agent_stats + +def building_your_world(): """ This function is used to build the world for the agent to explore.""" global GAME_WON - agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action, GoalBasedAgent().goalbased_action] - - print("\nAGENT RESULTS") - for agent_program in agent_list: - log_message("") - log_message("********************************************************") - log_message(f"* Agent: {agent_program.__name__:45} *") - log_message("********************************************************") - - # Statistics for this agent across all runs - agent_stats = { - 'total_performance': 0, - 'wins': 0 - } - - # Create a new environment for the set of runs per agent type - env = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) - - # Run the agent the specified number of times - for run in range(1, args.runs + 1): - log_message(f"\nRun {run} of {args.runs}") - - # Add an agent to the environment - agent = Agent(agent_program) - env.add_thing(agent, agent_pos) - log_message(f"Starting position is {agent_pos}") - - # Run the simulation and measure time - start_time = time.time() - env.run(args.steps) - end_time = time.time() - elapsed_time = end_time - start_time - - # Update statistics using the dictionary - agent_stats['total_performance'] += agent.performance # Store performance before deletion - if GAME_WON: - agent_stats['wins'] += 1 - - # Print results for this run - log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") - - # Remove the agent from the environment if it's still in the environment - if agent in env.things: - env.delete_thing(agent) - - # Reset the global variable GAME_WON for the next run - GAME_WON = False - - # Print summary statistics for this agent - avg_performance = agent_stats['total_performance'] / args.runs - win_rate = (agent_stats['wins'] / args.runs) * 100 - print(f"=> {agent_program.__name__:20}: Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") - # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") + # Define factories for the agents + def random_agent_factory(): + agent = RandomAgent() + agent.__name__ = "RandomAgent" + return agent + + def reflex_agent_factory(): + agent = ReflexAgent() + agent.__name__ = "ReflexAgent" + return agent + + def table_agent_factory(): + agent = TableDrivenAgent() + agent.__name__ = "TableDrivenAgent" + return agent + + def goal_agent_factory(): + obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.depth) + agent = GoalBasedAgent(agent_pos, positive_pos, negative_pos, obstacle_pos) + agent.__name__ = "GoalBasedAgent" + return agent + + # Define the environment factory + def env_factory_gridworld(): + # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent + obstacle_pos, positive_pos, negative_pos, _, _ = generate_random_starting_positions(args.width, args.depth) + # draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) + return create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) + + # List of agent factories for comparison + agent_factories = [ + random_agent_factory, + reflex_agent_factory, + table_agent_factory, + goal_agent_factory + ] + + def run_agent_comparison(): + # Run the comparison between the agents + results = compare_agents(env_factory_gridworld, agent_factories, n=args.runs, steps=args.steps) + + # Loop through the results and print each agent's name and average score + for agent, stats in results: + print(f"Agent: {agent.__name__}") + for agent_results in list(stats): + print(f"Result: {'Win' if agent_results[1]['game_won'] else 'Loss'}") + + run_agent_comparison() + + # agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action, GoalBasedAgent().goalbased_action] + + # print("\nAGENT RESULTS") + # for agent_program in agent_list: + # log_message("") + # log_message("********************************************************") + # log_message(f"* Agent: {agent_program.__name__:45} *") + # log_message("********************************************************") + + # # Statistics for this agent across all runs + # agent_stats = { + # 'total_performance': 0, + # 'wins': 0 + # } + + # # Create a new environment for the set of runs per agent type + # env = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) + + # # Run the agent the specified number of times + # for run in range(1, args.runs + 1): + # log_message(f"\nRun {run} of {args.runs}") + + # # Add an agent to the environment + # agent = Agent(agent_program) + # env.add_thing(agent, agent_pos) + # log_message(f"Starting position is {agent_pos}") + + # # Run the simulation and measure time + # start_time = time.time() + # env.run(args.steps) + # end_time = time.time() + # elapsed_time = end_time - start_time + + # # Update statistics using the dictionary + # agent_stats['total_performance'] += agent.performance # Store performance before deletion + # if GAME_WON: + # agent_stats['wins'] += 1 + + # # Print results for this run + # log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") + + # # Remove the agent from the environment if it's still in the environment + # if agent in env.things: + # env.delete_thing(agent) + # del agent + + # # Reset the global variable GAME_WON for the next run + # GAME_WON = False + + # # Print summary statistics for this agent + # avg_performance = agent_stats['total_performance'] / args.runs + # win_rate = (agent_stats['wins'] / args.runs) * 100 + # print(f"=> {agent_program.__name__:20}: Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") + # # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): problem = GridSearchProblem( @@ -519,17 +616,15 @@ def print_args(args): parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only) (DEFAULT: 40)') - parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only) (DEFAULT: 500)') + parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=10, help='Number of times to run each Agent (agent only) (DEFAULT: 500)') parser.add_argument('-w', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') parser.add_argument('-d', '--depth', type=int, nargs='?', const=1, default=6, help='depth of the grid world (DEFAULT: 6)') args = parser.parse_args() print_args(args) - # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent - obstacle_pos, positive_pos, negative_pos, agent_pos, occupied_positions = generate_random_starting_positions(args.width, args.depth) - draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) - building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + # building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + building_your_world() # searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) From 3a54b4d86642ca9941e44a2563278916b7ab95a9 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Wed, 8 Oct 2025 18:06:38 +0100 Subject: [PATCH 36/56] checkpoint --- .vscode/launch.json | 2 +- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 151 ++++++++++-------- 2 files changed, 85 insertions(+), 68 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 83b59b022..7e6484ce2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "program": "${file}", "console": "integratedTerminal", - "args": "" + "args": "-v" } ] } \ No newline at end of file diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index db164485d..3462e617a 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -14,31 +14,32 @@ If the agent does not reach the winning block in the set number of moves, the game ends and the agent has lost the game. Here is an example map of the 2D world -Obstacle location is (1, 1) -Positive location is (4, 3) -Negative location is (0, 4) -Agent location is (6, 2) +Obstacle location is (1, 6) +Winning location is (4, 4) +Penalty location is (0, 4) +Agent location is (6, 5) - 0 1 2 3 4 5 6 7 +-----------------+ -0 | . . . . . . . . | -1 | . O . . . . . . | -2 | . . . . . . A . | -3 | . . . . P . . . | -4 | N . . . . . . . | -5 | . . . . . . . . | -6 | . . . . . . . . | 7 | . . . . . . . . | +6 | . O . . . . . . | +5 | . . . . . . A . | +4 | . . . . W . . . | +3 | P . . . . . . . | +2 | . . . . . . . . | +1 | . . . . . . . . | +0 | . . . . . . . . | +-----------------+ + 0 1 2 3 4 5 6 7 AGENTS: - Random Agent, picks the next move randomly - Simple Reflex agent, always moves to the cheapest adjacent square. - Table based agent, uses a table to decide the next move + - Goal based action. "current_location = Winning location" is the goal. We use a search algoithm to decide the next move UNINFORMED SEARCHES: - Breadth First Search - - Depth First Search + - height First Search - Uniform Cost Search INFORMED SEARCHES: @@ -69,8 +70,8 @@ GAME_WON=False direction_to_coords = { - 'up': (0, -1), - 'down': (0, 1), + 'up': (0, 1), + 'down': (0, -1), 'left': (-1, 0), 'right': (1, 0) } @@ -85,7 +86,7 @@ def draw_grid(agent, obstacle, positive, negative): # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked print("\nA=Agent, W=Winning Square, P=Penalty Square, O=Obstacle\n") rows = args.width - cols = args.depth + cols = args.height content = [["."]*cols for _ in range(rows)] grid = [ @@ -130,10 +131,10 @@ class NegativeDestination(Thing): class GridWorldEnvironment(XYEnvironment): """ This environment has a grid of rows and columns with obstacles """ - def __init__(self, width, depth): - super().__init__() + def __init__(self, width, height): + super().__init__(width, height) self.width = width - self.depth = depth + self.height = height def percept(self, agent): # A list of available movements from the agent's current location and the associated cost @@ -144,29 +145,29 @@ def percept(self, agent): if hasattr(thing, 'location') and thing.location is not None: obstacle_positions.append(thing.location) - available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.depth, obstacle_positions) + available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.height, obstacle_positions) return available_moves_with_costs - def get_available_moves_with_costs(self, x, y, width, depth, obstacles=None): + def get_available_moves_with_costs(self, x, y, width, height, obstacles=None): # Returns a list of tuples containing all possible moves and their associated costs if obstacles is None: obstacles = [] available_moves = [] - if y > 0 and (x, y-1) not in obstacles: # UP is ok - available_moves.append(('up', (x + (y-1)))) + if y < height -1 and ((x, y+1) not in obstacles) : + available_moves.append(('up', (x + (y+1)))) - if y < depth-1 and (x, y+1) not in obstacles: # DOWN is ok - available_moves.append(('down', (x + (y+1)))) + if y > 0 and (x, y-1) not in obstacles: + available_moves.append(('down', (x + (y-1)))) - if x < width-1 and (x+1, y) not in obstacles: # RIGHT is ok + if x < width-1 and (x+1, y) not in obstacles: available_moves.append(('right', ((x+1) + y))) - if x > 0 and (x-1, y) not in obstacles: # LEFT is ok + if x > 0 and (x-1, y) not in obstacles: available_moves.append(('left', ((x-1) + y))) - # print(f"AVAILABLE MOVES FROM {x, y}: {available_moves}") + # print(f"*********AVAILABLE MOVES FROM {x, y}: {available_moves}") return available_moves def execute_action(self, agent, action): @@ -195,7 +196,7 @@ def execute_action(self, agent, action): log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") # Charge the agent for making a move (the cost is the sum of the x and y co-ordinates) - agent.performance -= (agent.location[0] + agent.location[1]) + agent.performance = agent.performance - (agent.location[0] + agent.location[1]) # Check destinations and apply effects self._check_destinations(agent) @@ -205,10 +206,10 @@ def _is_valid_move(self, agent, action, obstacle_positions): agent.location[0], agent.location[1], self.width, - self.depth, + self.height, obstacle_positions ) - return any(action in tup for tup in available_moves) + return any(action in tup[0] for tup in available_moves) def _check_destinations(self, agent): # Check if agent has landed on the winning or penalyty squares @@ -293,59 +294,67 @@ def table_action(self, percept): class GoalBasedAgent(Agent): # GOAL is self.location == goal_location def __init__(self, agent_pos, positive_pos, negative_pos, obstacle_pos): + # Maintain some state info for the agent self.location = agent_pos self.goal_location = positive_pos self.penalty_location = negative_pos self.obstacle_location = obstacle_pos - super().__init__(self.goalbased_action) def goalbased_action(self, percept): # A goal based search, where the goal is the Winning position i.e. positive_pos # We will use the astar search to find the next move towards the goal + global GAME_WON problem = GridSearchProblemWithHeuristic( initial=self.location, goal=self.goal_location, width=args.width, - depth=args.depth, + height=args.height, obstacles=[self.obstacle_location, self.penalty_location] ) star_search_result = astar_search(problem) + + if star_search_result is None: + return None + # Update state based on the action if star_search_result.action in direction_to_coords: dx, dy = direction_to_coords[star_search_result.action] self.location = (self.location[0] + dx, self.location[1] + dy) + if self.location == self.goal_location: + GANE_WON = True + return star_search_result.action -def generate_random_starting_positions(width, depth): +def generate_random_starting_positions(width, height): # Generate random positions for obstacle, positive destination, negative destination, and the agent. occupied_positions = [] obstacle_x = random.randint(0, width - 1) - obstacle_y = random.randint(0, depth - 1) + obstacle_y = random.randint(0, height - 1) occupied_positions.append((obstacle_x, obstacle_y)) while True: pos_x = random.randint(0, width - 1) - pos_y = random.randint(0, depth - 1) + pos_y = random.randint(0, height - 1) if (pos_x, pos_y) not in occupied_positions: occupied_positions.append((pos_x, pos_y)) break while True: neg_x = random.randint(0, width - 1) - neg_y = random.randint(0, depth - 1) + neg_y = random.randint(0, height - 1) if (neg_x, neg_y) not in occupied_positions: occupied_positions.append((neg_x, neg_y)) break while True: agent_x = random.randint(0, width - 1) - agent_y = random.randint(0, depth - 1) + agent_y = random.randint(0, height - 1) if (agent_x, agent_y) not in occupied_positions: occupied_positions.append((agent_x, agent_y)) break @@ -359,9 +368,9 @@ def generate_random_starting_positions(width, depth): return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions # Create and set up the environment -def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negative_pos): - # Create the 2D grid world with the set width and depth, and Things located at the specified positions - env = GridWorldEnvironment(width, depth) +def create_gridworld_environment(width, height, obstacle_pos, positive_pos, negative_pos): + # Create the 2D grid world with the set width and height, and Things located at the specified positions + env = GridWorldEnvironment(width, height) env.add_thing(Obstacle(), obstacle_pos) env.add_thing(PositiveDestination(), positive_pos) env.add_thing(NegativeDestination(), negative_pos) @@ -370,23 +379,23 @@ def create_gridworld_environment(width, depth, obstacle_pos, positive_pos, negat # Search class GridSearchProblem(Problem): - def __init__(self, initial, goal, width, depth, obstacles): + def __init__(self, initial, goal, width, height, obstacles): super().__init__(initial, goal) self.width = width - self.depth = depth + self.height = height self.obstacles = set(obstacles) def actions(self, state): """Return valid directions from the current state.""" x, y = state directions = [] - if y > 0 and (x, y - 1) not in self.obstacles: + if y < self.height and (x, y + 1) not in self.obstacles: directions.append('up') - if y < self.depth - 1 and (x, y + 1) not in self.obstacles: + if y > 0 and (x, y - 1) not in self.obstacles: directions.append('down') if x > 0 and (x - 1, y) not in self.obstacles: directions.append('left') - if x < self.width - 1 and (x + 1, y) not in self.obstacles: + if x < self.width and (x + 1, y) not in self.obstacles: directions.append('right') return directions @@ -394,9 +403,9 @@ def result(self, state, action): """Return the new state after applying the action.""" x, y = state if action == 'up': - return (x, y - 1) - elif action == 'down': return (x, y + 1) + elif action == 'down': + return (x, y - 1) elif action == 'left': return (x - 1, y) elif action == 'right': @@ -441,11 +450,12 @@ def score(env): end_time = time.time() elapsed_time = end_time - start_time + run_stat['agent'] = agent.__name__ run_stat['time_taken'] = elapsed_time run_stat['performance'] = agent.performance run_stat['game_won'] = GAME_WON - agent_stats.append(run_stat) - return agent_stats + + return run_stat agent_stats = [] for env in envs: @@ -474,7 +484,7 @@ def table_agent_factory(): return agent def goal_agent_factory(): - obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.depth) + obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) agent = GoalBasedAgent(agent_pos, positive_pos, negative_pos, obstacle_pos) agent.__name__ = "GoalBasedAgent" return agent @@ -482,9 +492,9 @@ def goal_agent_factory(): # Define the environment factory def env_factory_gridworld(): # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent - obstacle_pos, positive_pos, negative_pos, _, _ = generate_random_starting_positions(args.width, args.depth) + obstacle_pos, positive_pos, negative_pos, _, _ = generate_random_starting_positions(args.width, args.height) # draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) - return create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) + return create_gridworld_environment(args.width, args.height, obstacle_pos, positive_pos, negative_pos) # List of agent factories for comparison agent_factories = [ @@ -500,9 +510,16 @@ def run_agent_comparison(): # Loop through the results and print each agent's name and average score for agent, stats in results: - print(f"Agent: {agent.__name__}") + print(f"** {stats[0]['agent']} **") + print("Result:\t\tTime:\t\tPerformance:") for agent_results in list(stats): - print(f"Result: {'Win' if agent_results[1]['game_won'] else 'Loss'}") + print( + + f"{'Win' if agent_results['game_won'] else 'Loss'}\t\t" + f"{agent_results['time_taken']:.5f} seconds\t\t" + f"{agent_results['performance']}" + ) + run_agent_comparison() @@ -522,7 +539,7 @@ def run_agent_comparison(): # } # # Create a new environment for the set of runs per agent type - # env = create_gridworld_environment(args.width, args.depth, obstacle_pos, positive_pos, negative_pos) + # env = create_gridworld_environment(args.width, args.height, obstacle_pos, positive_pos, negative_pos) # # Run the agent the specified number of times # for run in range(1, args.runs + 1): @@ -561,12 +578,15 @@ def run_agent_comparison(): # print(f"=> {agent_program.__name__:20}: Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") # # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") -def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): +def searching_your_world(): + + obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) + problem = GridSearchProblem( initial=agent_pos, goal=positive_pos, width=args.width, - depth=args.depth, + height=args.height, obstacles=[obstacle_pos, negative_pos] ) @@ -576,14 +596,14 @@ def searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos): print("\nUNINFORMED SEARCH RESULTS") print(f"=> Breadth First Search: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") - print(f"=> Depth First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") + print(f"=> height First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") print(f"=> Uniform Cost Search : Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") problemInformed = GridSearchProblemWithHeuristic( initial=agent_pos, goal=positive_pos, width=args.width, - depth=args.depth, + height=args.height, obstacles=[obstacle_pos, negative_pos] ) @@ -607,7 +627,7 @@ def print_args(args): f" STEPS=> {args.steps}" f" RUNS=> {args.runs}" f" WIDTH=> {args.width}" - f" DEPTH=> {args.depth}" + f" height=> {args.height}" ) print("\n*** Pass the -h parameter to see details on how to configure the arguments ***") @@ -616,15 +636,12 @@ def print_args(args): parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only) (DEFAULT: 40)') - parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=10, help='Number of times to run each Agent (agent only) (DEFAULT: 500)') + parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only) (DEFAULT: 10)') parser.add_argument('-w', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') - parser.add_argument('-d', '--depth', type=int, nargs='?', const=1, default=6, help='depth of the grid world (DEFAULT: 6)') + parser.add_argument('-d', '--height', type=int, nargs='?', const=1, default=6, help='height of the grid world (DEFAULT: 6)') args = parser.parse_args() print_args(args) - - - # building_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) building_your_world() - # searching_your_world(obstacle_pos, positive_pos, negative_pos, agent_pos) + searching_your_world() From e6e50ea186fb39ac99e9f8521d8505a71b0c97ab Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Wed, 8 Oct 2025 18:29:31 +0100 Subject: [PATCH 37/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 81 +++++-------------- 1 file changed, 20 insertions(+), 61 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 3462e617a..1faf50bc1 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -508,75 +508,33 @@ def run_agent_comparison(): # Run the comparison between the agents results = compare_agents(env_factory_gridworld, agent_factories, n=args.runs, steps=args.steps) + agent_name = '' # Loop through the results and print each agent's name and average score for agent, stats in results: - print(f"** {stats[0]['agent']} **") - print("Result:\t\tTime:\t\tPerformance:") + agent_name = stats[0]['agent'] + log_message("Result:\t\tTime:\t\tPerformance:") + total_games_won = total_games_lost = total_time_taken = total_performance = 0 + for agent_results in list(stats): - print( - + if agent_results['game_won']: + total_games_won += 1 + else: + total_games_lost += 1 + total_time_taken += agent_results['time_taken'] + total_performance += agent_results['performance'] + log_message( f"{'Win' if agent_results['game_won'] else 'Loss'}\t\t" f"{agent_results['time_taken']:.5f} seconds\t\t" f"{agent_results['performance']}" ) - + print(f"=> {agent_name}\t\t" + f"Games won: {total_games_won / total_games_lost * 100:.1f}%\t\t" + f"Average performance: {total_performance / len(stats):.2f}\t\t" + f"Average time taken: {total_time_taken / len(stats):.6f} seconds") + print("AGENT RESULTS") run_agent_comparison() - # agent_list = [RandomAgent().random_move, ReflexAgent().cheapest_move, TableDrivenAgent().table_action, GoalBasedAgent().goalbased_action] - - # print("\nAGENT RESULTS") - # for agent_program in agent_list: - # log_message("") - # log_message("********************************************************") - # log_message(f"* Agent: {agent_program.__name__:45} *") - # log_message("********************************************************") - - # # Statistics for this agent across all runs - # agent_stats = { - # 'total_performance': 0, - # 'wins': 0 - # } - - # # Create a new environment for the set of runs per agent type - # env = create_gridworld_environment(args.width, args.height, obstacle_pos, positive_pos, negative_pos) - - # # Run the agent the specified number of times - # for run in range(1, args.runs + 1): - # log_message(f"\nRun {run} of {args.runs}") - - # # Add an agent to the environment - # agent = Agent(agent_program) - # env.add_thing(agent, agent_pos) - # log_message(f"Starting position is {agent_pos}") - - # # Run the simulation and measure time - # start_time = time.time() - # env.run(args.steps) - # end_time = time.time() - # elapsed_time = end_time - start_time - - # # Update statistics using the dictionary - # agent_stats['total_performance'] += agent.performance # Store performance before deletion - # if GAME_WON: - # agent_stats['wins'] += 1 - - # # Print results for this run - # log_message(f"AGENT:{agent_program.__name__}\tRUN:{run}/{args.runs}\tSTEPS:{args.steps}\tRESULT:{'WIN' if GAME_WON else 'LOSE'}\tPERFORMANCE:{agent.performance:5}\t\tTIME:{elapsed_time:.4f}s") - - # # Remove the agent from the environment if it's still in the environment - # if agent in env.things: - # env.delete_thing(agent) - # del agent - - # # Reset the global variable GAME_WON for the next run - # GAME_WON = False - - # # Print summary statistics for this agent - # avg_performance = agent_stats['total_performance'] / args.runs - # win_rate = (agent_stats['wins'] / args.runs) * 100 - # print(f"=> {agent_program.__name__:20}: Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") - # # print(f"\nSummary for [{agent_program.__name__:30}]: Average Performance: {avg_performance:.2f} Win Rate: {win_rate:.2f}% ({agent_stats['wins']}/{args.runs})") def searching_your_world(): @@ -623,13 +581,14 @@ def searching_your_world(): def print_args(args): + print("\n*** Pass the -h parameter to see details on how to configure the arguments ***") print("\nCURRENT ARGUMENTS:" f" STEPS=> {args.steps}" f" RUNS=> {args.runs}" f" WIDTH=> {args.width}" - f" height=> {args.height}" + f" HEIGHT=> {args.height}\n" ) - print("\n*** Pass the -h parameter to see details on how to configure the arguments ***") + if __name__ == "__main__": # command line arguments From 62df86a7640be87561f1ba75aa51d58834ebab3e Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Wed, 8 Oct 2025 19:18:39 +0100 Subject: [PATCH 38/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 64 ++++++++++++------- 1 file changed, 40 insertions(+), 24 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 1faf50bc1..fa93f5bea 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -65,7 +65,7 @@ # Now you can import a module from the parent directory from agents import Thing, XYEnvironment, Agent, Obstacle -from search import Problem, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search +from search import Problem, InstrumentedProblem, name, print_table, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search GAME_WON=False @@ -181,6 +181,10 @@ def execute_action(self, agent, action): if hasattr(thing, 'location') and thing.location is not None: obstacle_positions.append(thing.location) + if agent.location[0] > 6 or agent.location[1] > 6: + print("WHOOPS!!") + + # Check if move is valid if not action: return @@ -318,15 +322,10 @@ def goalbased_action(self, percept): if star_search_result is None: return None - - # Update state based on the action - if star_search_result.action in direction_to_coords: - dx, dy = direction_to_coords[star_search_result.action] - self.location = (self.location[0] + dx, self.location[1] + dy) - + if self.location == self.goal_location: - GANE_WON = True - + GAME_WON = True + return star_search_result.action @@ -389,13 +388,13 @@ def actions(self, state): """Return valid directions from the current state.""" x, y = state directions = [] - if y < self.height and (x, y + 1) not in self.obstacles: + if y + 1 < self.height and (x, y + 1) not in self.obstacles: directions.append('up') if y > 0 and (x, y - 1) not in self.obstacles: directions.append('down') if x > 0 and (x - 1, y) not in self.obstacles: directions.append('left') - if x < self.width and (x + 1, y) not in self.obstacles: + if x + 1 < self.width and (x + 1, y) not in self.obstacles: directions.append('right') return directions @@ -528,7 +527,7 @@ def run_agent_comparison(): f"{agent_results['performance']}" ) print(f"=> {agent_name}\t\t" - f"Games won: {total_games_won / total_games_lost * 100:.1f}%\t\t" + f"Games won: {(total_games_won / (total_games_won + total_games_lost)) * 100:.1f}%\t\t" f"Average performance: {total_performance / len(stats):.2f}\t\t" f"Average time taken: {total_time_taken / len(stats):.6f} seconds") @@ -538,6 +537,15 @@ def run_agent_comparison(): def searching_your_world(): + def compare_searchers(problems, header,searchers): + def do(searcher, problem): + p = InstrumentedProblem(problem) + searcher(p) + return p + + table = [[name(s)] + [do(s, p) for p in problems] for s in searchers] + print_table(table, header) + obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) problem = GridSearchProblem( @@ -565,19 +573,27 @@ def searching_your_world(): obstacles=[obstacle_pos, negative_pos] ) - print("\nINFORMED SEARCH RESULTS") + # print("\nINFORMED SEARCH RESULTS") + + # solution_astar = astar_search(problemInformed, h=problemInformed.h) + # print(f"=> A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") + + # solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) + # print(f"=> RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") + + # solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) + # if solution_greedy: + # print(f"=> Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") + # else: + # print("=> Greedy: No solution found") + searchers = [astar_search, recursive_best_first_search, greedy_best_first_graph_search] + header=['Searcher', 'romania_map(Arad, Bucharest)','romania_map(Oradea, Neamt)', 'australia_map'] + compare_searchers([problemInformed], header, searchers) + + - solution_astar = astar_search(problemInformed, h=problemInformed.h) - print(f"=> A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") - solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) - print(f"=> RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") - solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) - if solution_greedy: - print(f"=> Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") - else: - print("=> Greedy: No solution found") def print_args(args): @@ -596,8 +612,8 @@ def print_args(args): parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only) (DEFAULT: 40)') parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only) (DEFAULT: 10)') - parser.add_argument('-w', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') - parser.add_argument('-d', '--height', type=int, nargs='?', const=1, default=6, help='height of the grid world (DEFAULT: 6)') + parser.add_argument('-x', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') + parser.add_argument('-y', '--height', type=int, nargs='?', const=1, default=6, help='height of the grid world (DEFAULT: 6)') args = parser.parse_args() print_args(args) From e27cb27e8850f79512d9dfdb15f1c852ea17ccfc Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Wed, 8 Oct 2025 19:23:03 +0100 Subject: [PATCH 39/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index fa93f5bea..a54266198 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -76,7 +76,7 @@ 'right': (1, 0) } -def log_message(message): +def verbose_message(message): """Log a message if verbose mode is enabled.""" if args.verbose: print(message) @@ -189,7 +189,7 @@ def execute_action(self, agent, action): if not action: return if not self._is_valid_move(agent, action, obstacle_positions): - log_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") + verbose_message(f"❌ Tried to go [{action:5}] from {agent.location}, but cant go in that direction") return # Update agent location based on action using the direction_to_coords dictionary @@ -197,7 +197,7 @@ def execute_action(self, agent, action): dx, dy = direction_to_coords[action] agent.location = (agent.location[0] + dx, agent.location[1] + dy) - log_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") + verbose_message(f"✅ You moved [{action:5}] from {initial_location} to {agent.location} successfully : Performance penalty: {agent.location[0] + agent.location[1]:4} Performance Total: {agent.performance:4}") # Charge the agent for making a move (the cost is the sum of the x and y co-ordinates) agent.performance = agent.performance - (agent.location[0] + agent.location[1]) @@ -223,16 +223,16 @@ def _check_destinations(self, agent): positive_destinations = self.list_things_at(agent.location, PositiveDestination) if positive_destinations: agent.performance += 100 - log_message("Agent reached winning destination! Performance increase 100.") - log_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") - log_message("👏 Well done! You've successfully completed the game!") + verbose_message("Agent reached winning destination! Performance increase 100.") + verbose_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") + verbose_message("👏 Well done! You've successfully completed the game!") GAME_WON = True # Check for negative destination (penalty) negative_destinations = self.list_things_at(agent.location, NegativeDestination) if negative_destinations: agent.performance -= 50 - log_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + verbose_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") def is_done(self): """ The environment is done if the agent has won the game or if no agents are alive. """ @@ -358,11 +358,11 @@ def generate_random_starting_positions(width, height): occupied_positions.append((agent_x, agent_y)) break - log_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") - log_message(f"Positive location is ({pos_x}, {pos_y})") - log_message(f"Negative location is ({neg_x}, {neg_y})") - log_message(f"Agent location is ({agent_x}, {agent_y})") - log_message(f"Occupied positions are [{occupied_positions}]") + verbose_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") + verbose_message(f"Positive location is ({pos_x}, {pos_y})") + verbose_message(f"Negative location is ({neg_x}, {neg_y})") + verbose_message(f"Agent location is ({agent_x}, {agent_y})") + verbose_message(f"Occupied positions are [{occupied_positions}]") return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions @@ -511,7 +511,7 @@ def run_agent_comparison(): # Loop through the results and print each agent's name and average score for agent, stats in results: agent_name = stats[0]['agent'] - log_message("Result:\t\tTime:\t\tPerformance:") + verbose_message("Result:\t\tTime:\t\tPerformance:") total_games_won = total_games_lost = total_time_taken = total_performance = 0 for agent_results in list(stats): @@ -521,7 +521,7 @@ def run_agent_comparison(): total_games_lost += 1 total_time_taken += agent_results['time_taken'] total_performance += agent_results['performance'] - log_message( + verbose_message( f"{'Win' if agent_results['game_won'] else 'Loss'}\t\t" f"{agent_results['time_taken']:.5f} seconds\t\t" f"{agent_results['performance']}" From 05031d12046159fad20fe40c6cea0d9822a2094d Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Wed, 8 Oct 2025 19:32:04 +0100 Subject: [PATCH 40/56] checkpoint --- .vscode/launch.json | 2 +- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 34 +++++++------------ 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7e6484ce2..83b59b022 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "program": "${file}", "console": "integratedTerminal", - "args": "-v" + "args": "" } ] } \ No newline at end of file diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index a54266198..df342e51e 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -537,15 +537,6 @@ def run_agent_comparison(): def searching_your_world(): - def compare_searchers(problems, header,searchers): - def do(searcher, problem): - p = InstrumentedProblem(problem) - searcher(p) - return p - - table = [[name(s)] + [do(s, p) for p in problems] for s in searchers] - print_table(table, header) - obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) problem = GridSearchProblem( @@ -573,22 +564,21 @@ def do(searcher, problem): obstacles=[obstacle_pos, negative_pos] ) - # print("\nINFORMED SEARCH RESULTS") + problemInstrumented = InstrumentedProblem(problemInformed) + + print("\nINFORMED SEARCH RESULTS") - # solution_astar = astar_search(problemInformed, h=problemInformed.h) - # print(f"=> A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") + solution_astar = astar_search(problemInstrumented, h=problemInformed.h) + print(f"=> A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") - # solution_rbfs = recursive_best_first_search(problemInformed, h=problemInformed.h) - # print(f"=> RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") + solution_rbfs = recursive_best_first_search(problemInstrumented, h=problemInformed.h) + print(f"=> RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") - # solution_greedy = greedy_best_first_graph_search(problemInformed, f=problemInformed.h) - # if solution_greedy: - # print(f"=> Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") - # else: - # print("=> Greedy: No solution found") - searchers = [astar_search, recursive_best_first_search, greedy_best_first_graph_search] - header=['Searcher', 'romania_map(Arad, Bucharest)','romania_map(Oradea, Neamt)', 'australia_map'] - compare_searchers([problemInformed], header, searchers) + solution_greedy = greedy_best_first_graph_search(problemInstrumented, f=problemInformed.h) + if solution_greedy: + print(f"=> Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") + else: + print("=> Greedy: No solution found") From 3ebf226e52a99c2e7ef2c61dc42e3573a4561123 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Wed, 8 Oct 2025 19:37:01 +0100 Subject: [PATCH 41/56] checkpoint --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index df342e51e..c0e1ea897 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -39,7 +39,7 @@ UNINFORMED SEARCHES: - Breadth First Search - - height First Search + - Depth First Search - Uniform Cost Search INFORMED SEARCHES: @@ -553,7 +553,7 @@ def searching_your_world(): print("\nUNINFORMED SEARCH RESULTS") print(f"=> Breadth First Search: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") - print(f"=> height First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") + print(f"=> Depth First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") print(f"=> Uniform Cost Search : Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") problemInformed = GridSearchProblemWithHeuristic( From 19516e99bbec8fc71f9e608df7bdfb3f7473d914 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Thu, 9 Oct 2025 17:10:40 +0100 Subject: [PATCH 42/56] checkpoint --- .vscode/launch.json | 2 +- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 319 ++++++++++-------- assignment1/Lab4_solution.py | 147 ++++++++ search.ipynb | 10 + 4 files changed, 339 insertions(+), 139 deletions(-) create mode 100644 assignment1/Lab4_solution.py diff --git a/.vscode/launch.json b/.vscode/launch.json index 83b59b022..7e6484ce2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "program": "${file}", "console": "integratedTerminal", - "args": "" + "args": "-v" } ] } \ No newline at end of file diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index c0e1ea897..9f8bc20e0 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -19,17 +19,15 @@ Penalty location is (0, 4) Agent location is (6, 5) - +-----------------+ -7 | . . . . . . . . | -6 | . O . . . . . . | -5 | . . . . . . A . | -4 | . . . . W . . . | -3 | P . . . . . . . | -2 | . . . . . . . . | -1 | . . . . . . . . | -0 | . . . . . . . . | - +-----------------+ - 0 1 2 3 4 5 6 7 +7 . . . . . . . . +6 . O . . . . . . +5 . . . . . . A . +4 . . . . W . . . +3 P . . . . . . . +2 . . . . . . . . +1 . . . . . . . . +0 . . . . . . . . + 0 1 2 3 4 5 6 7 AGENTS: - Random Agent, picks the next move randomly @@ -65,7 +63,7 @@ # Now you can import a module from the parent directory from agents import Thing, XYEnvironment, Agent, Obstacle -from search import Problem, InstrumentedProblem, name, print_table, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search +from search import Problem, InstrumentedProblem, depth_limited_search, name, print_table, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search GAME_WON=False @@ -81,51 +79,11 @@ def verbose_message(message): if args.verbose: print(message) -# Based on https://stackoverflow.com/questions/61626953/python-printing-an-ascii-cartesian-coordinate-grid-from-a-2d-array-of-position -def draw_grid(agent, obstacle, positive, negative): - # Just for reference, draw the grid with the agent, obstacles, winning and penalty squares marked - print("\nA=Agent, W=Winning Square, P=Penalty Square, O=Obstacle\n") - rows = args.width - cols = args.height - content = [["."]*cols for _ in range(rows)] - - grid = [ - (obstacle[0], obstacle[1], "O"), - (agent[0], agent[1], "A"), - (positive[0], positive[1], "W"), - (negative[0], negative[1], "P")] - for (x, y, c) in grid: content[y][x] = c - - # build frame - width = len(str(max(rows, cols)-1)) - contentLine = "# | values |" - - dashes = "-".join("-"*width for _ in range(cols)) - frameLine = contentLine.replace("values", dashes) - frameLine = frameLine.replace("#", " "*width) - frameLine = frameLine.replace("| ", "+-").replace(" |", "-+") - - # x-axis numbers (at the top) - numLine = contentLine.replace("|", " ") - numLine = numLine.replace("#", " "*width) - colNums = " ".join(f"{i:<{width}d}" for i in range(cols)) - numLine = numLine.replace("values", colNums) - print(numLine) - - # print grid - print(frameLine) - for i, row in enumerate(content): - values = " ".join(f"{v:{width}s}" for v in row) - line = contentLine.replace("values", values) - line = line.replace("#", f"{i:{width}d}") - print(line) - print(frameLine) - -class PositiveDestination(Thing): +class WinningDestination(Thing): """ A destination that awards 100 points and wins the game when an agent reaches it """ pass -class NegativeDestination(Thing): +class PenaltyDestination(Thing): """ A destination that penalises 50 points when an agent reaches it """ pass @@ -149,7 +107,7 @@ def percept(self, agent): return available_moves_with_costs def get_available_moves_with_costs(self, x, y, width, height, obstacles=None): - # Returns a list of tuples containing all possible moves and their associated costs + # Returns a list of tuples containing all possible moves and their associated costs if obstacles is None: obstacles = [] @@ -181,10 +139,6 @@ def execute_action(self, agent, action): if hasattr(thing, 'location') and thing.location is not None: obstacle_positions.append(thing.location) - if agent.location[0] > 6 or agent.location[1] > 6: - print("WHOOPS!!") - - # Check if move is valid if not action: return @@ -216,21 +170,21 @@ def _is_valid_move(self, agent, action, obstacle_positions): return any(action in tup[0] for tup in available_moves) def _check_destinations(self, agent): - # Check if agent has landed on the winning or penalyty squares + # Check if agent has landed on the winning or penalty squares global GAME_WON - # Check for positive destination (winning) - positive_destinations = self.list_things_at(agent.location, PositiveDestination) - if positive_destinations: + # Check for winninf destination + winning_destinations = self.list_things_at(agent.location, WinningDestination) + if winning_destinations: agent.performance += 100 verbose_message("Agent reached winning destination! Performance increase 100.") verbose_message(f"🎉 Congratulations, you WON the game with a score of {agent.performance}!!") verbose_message("👏 Well done! You've successfully completed the game!") GAME_WON = True - # Check for negative destination (penalty) - negative_destinations = self.list_things_at(agent.location, NegativeDestination) - if negative_destinations: + # Check for penalty destination + penalty_destinations = self.list_things_at(agent.location, PenaltyDestination) + if penalty_destinations: agent.performance -= 50 verbose_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") @@ -297,17 +251,17 @@ def table_action(self, percept): class GoalBasedAgent(Agent): # GOAL is self.location == goal_location - def __init__(self, agent_pos, positive_pos, negative_pos, obstacle_pos): + def __init__(self, agent_pos, winning_pos, penalty_pos, obstacle_pos): # Maintain some state info for the agent self.location = agent_pos - self.goal_location = positive_pos - self.penalty_location = negative_pos + self.goal_location = winning_pos + self.penalty_location = penalty_pos self.obstacle_location = obstacle_pos super().__init__(self.goalbased_action) def goalbased_action(self, percept): - # A goal based search, where the goal is the Winning position i.e. positive_pos + # A goal based search, where the goal is the Winning position i.e. winning_pos # We will use the astar search to find the next move towards the goal global GAME_WON @@ -330,7 +284,7 @@ def goalbased_action(self, percept): def generate_random_starting_positions(width, height): - # Generate random positions for obstacle, positive destination, negative destination, and the agent. + # Generate random positions for obstacle, winning destination, penalty destination, and the agent. occupied_positions = [] obstacle_x = random.randint(0, width - 1) @@ -359,20 +313,20 @@ def generate_random_starting_positions(width, height): break verbose_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") - verbose_message(f"Positive location is ({pos_x}, {pos_y})") - verbose_message(f"Negative location is ({neg_x}, {neg_y})") + verbose_message(f"Winning location is ({pos_x}, {pos_y})") + verbose_message(f"Penalty location is ({neg_x}, {neg_y})") verbose_message(f"Agent location is ({agent_x}, {agent_y})") verbose_message(f"Occupied positions are [{occupied_positions}]") return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions # Create and set up the environment -def create_gridworld_environment(width, height, obstacle_pos, positive_pos, negative_pos): +def create_gridworld_environment(width, height, obstacle_pos, winning_pos, penalty_pos): # Create the 2D grid world with the set width and height, and Things located at the specified positions env = GridWorldEnvironment(width, height) env.add_thing(Obstacle(), obstacle_pos) - env.add_thing(PositiveDestination(), positive_pos) - env.add_thing(NegativeDestination(), negative_pos) + env.add_thing(WinningDestination(), winning_pos) + env.add_thing(PenaltyDestination(), penalty_pos) return env @@ -401,14 +355,9 @@ def actions(self, state): def result(self, state, action): """Return the new state after applying the action.""" x, y = state - if action == 'up': - return (x, y + 1) - elif action == 'down': - return (x, y - 1) - elif action == 'left': - return (x - 1, y) - elif action == 'right': - return (x + 1, y) + if action in direction_to_coords: + dx, dy = direction_to_coords[action] + return (x + dx, y + dy) else: raise ValueError(f"Unknown action: {action}") @@ -418,7 +367,12 @@ def goal_test(self, state): def path_cost(self, c, state1, action, state2): """Cost is the sum of x and y coordinates of the destination.""" - return c + state2[0] + state2[1] + # print(f"Calculating cost c:{c} + state2[0]:{state2[0]} + state2[1]:{state2[1]}") + + # if state1 == self.goal: + # # 100 point bonus for reaching the goal + # return 100 + return c + (state2[0] + state2[1]) class GridSearchProblemWithHeuristic(GridSearchProblem): def h(self, node): @@ -483,17 +437,17 @@ def table_agent_factory(): return agent def goal_agent_factory(): - obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) - agent = GoalBasedAgent(agent_pos, positive_pos, negative_pos, obstacle_pos) + obstacle_pos, winning_pos, penalty_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) + agent = GoalBasedAgent(agent_pos, winning_pos, penalty_pos, obstacle_pos) agent.__name__ = "GoalBasedAgent" return agent # Define the environment factory def env_factory_gridworld(): # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent - obstacle_pos, positive_pos, negative_pos, _, _ = generate_random_starting_positions(args.width, args.height) - # draw_grid(agent_pos, obstacle_pos, positive_pos, negative_pos) - return create_gridworld_environment(args.width, args.height, obstacle_pos, positive_pos, negative_pos) + obstacle_pos, winning_pos, penalty_pos, _, _ = generate_random_starting_positions(args.width, args.height) + # draw_grid(agent_pos, obstacle_pos, winning_pos, penalty_pos) + return create_gridworld_environment(args.width, args.height, obstacle_pos, winning_pos, penalty_pos) # List of agent factories for comparison agent_factories = [ @@ -534,58 +488,148 @@ def run_agent_comparison(): print("AGENT RESULTS") run_agent_comparison() +def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True): + solution_stats = [] + solution_totals = {'path_cost': 0, 'goal_tests': 0, 'states': 0, 'succs': 0} + + for i in range(runs): + obstacle_pos, winning_pos, penalty_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) + + # Create appropriate problem type based on whether we need a heuristic + if use_heuristic: + problem = GridSearchProblemWithHeuristic( + initial=agent_pos, + goal=winning_pos, + width=args.width, + height=args.height, + obstacles=[obstacle_pos, penalty_pos] + ) + else: + problem = GridSearchProblem( + initial=agent_pos, + goal=winning_pos, + width=args.width, + height=args.height, + obstacles=[obstacle_pos, penalty_pos] + ) + + run_stat = {} + instrumented_problem = InstrumentedProblem(problem) + + # Call the appropriate search function + solution = None + try: + if search_type == "astar": + solution = astar_search(instrumented_problem, h=instrumented_problem.h) + elif search_type == "dls": + solution = depth_limited_search(instrumented_problem, limit=args.steps) + elif search_type == "rbfs": + solution = recursive_best_first_search(instrumented_problem, h=instrumented_problem.h) + elif search_type == "greedy": + solution = greedy_best_first_graph_search(instrumented_problem, f=instrumented_problem.h) + elif search_type == "bfs": + solution = breadth_first_graph_search(instrumented_problem) + elif search_type == "dfs": + solution = depth_first_graph_search(instrumented_problem) + elif search_type == "ucs": + solution = uniform_cost_search(instrumented_problem) + except RecursionError as e: + verbose_message(f"{algorithm_name} failed with: {e}") + continue + + if solution is not None: + run_stat['run_id'] = i + run_stat['path_cost'] = solution.path_cost + run_stat['goal_tests'] = instrumented_problem.goal_tests + run_stat['states'] = instrumented_problem.states + run_stat['succs'] = instrumented_problem.succs + + solution_totals['path_cost'] += solution.path_cost + solution_totals['goal_tests'] += instrumented_problem.goal_tests + solution_totals['states'] += instrumented_problem.states + solution_totals['succs'] += instrumented_problem.succs + + verbose_message(f" {algorithm_name} {run_stat}") + solution_stats.append(run_stat) + + # Clean up + del problem, instrumented_problem + if solution is not None: + del solution + + return solution_stats, solution_totals def searching_your_world(): - - obstacle_pos, positive_pos, negative_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) - - problem = GridSearchProblem( - initial=agent_pos, - goal=positive_pos, - width=args.width, - height=args.height, - obstacles=[obstacle_pos, negative_pos] - ) - - solution_bfs = breadth_first_graph_search(problem) - solution_dfs = depth_first_graph_search(problem) - solution_ucs = uniform_cost_search(problem) - - print("\nUNINFORMED SEARCH RESULTS") - print(f"=> Breadth First Search: Cost: {solution_bfs.path_cost:5} solution {solution_bfs.solution()} ") - print(f"=> Depth First Search : Cost: {solution_dfs.path_cost:5} solution {solution_dfs.solution()} ") - print(f"=> Uniform Cost Search : Cost: {solution_ucs.path_cost:5} solution {solution_ucs.solution()} ") - - problemInformed = GridSearchProblemWithHeuristic( - initial=agent_pos, - goal=positive_pos, - width=args.width, - height=args.height, - obstacles=[obstacle_pos, negative_pos] - ) - - problemInstrumented = InstrumentedProblem(problemInformed) - - print("\nINFORMED SEARCH RESULTS") - - solution_astar = astar_search(problemInstrumented, h=problemInformed.h) - print(f"=> A*: Cost: {solution_astar.path_cost:5} Solution: {solution_astar.solution()}") - - solution_rbfs = recursive_best_first_search(problemInstrumented, h=problemInformed.h) - print(f"=> RBFS: Cost: {solution_rbfs.path_cost:5} Solution: {solution_rbfs.solution()}") - - solution_greedy = greedy_best_first_graph_search(problemInstrumented, f=problemInformed.h) - if solution_greedy: - print(f"=> Greedy: Cost: {solution_greedy.path_cost:5} Solution: {solution_greedy.solution()}") + # Uninformed searches + # Breadth First Search + _, solution_bfs_totals = run_search_experiment("BFS", args.runs, "bfs", use_heuristic=False) + # Depth First Search + _, solution_dfs_totals = run_search_experiment("DFS", args.runs, "dfs", use_heuristic=False) + # Uniform Cost Search + _, solution_ucs_totals = run_search_experiment("UCS", args.runs, "ucs", use_heuristic=False) + + # Print results for uninformed searches + print("") + print(" UNINFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS ") + print("--------------------------------------------------------------") + print(f"Breadth First Search | " + f"{solution_bfs_totals['path_cost'] / args.runs:^5.2f}|" + f"{solution_bfs_totals['goal_tests'] / args.runs:^12.2f}|" + f"{solution_bfs_totals['states'] / args.runs:^8.2f}|" + f"{solution_bfs_totals['succs'] / args.runs:^9.2f}") + print(f"Depth First Search | " + f"{solution_dfs_totals['path_cost'] / args.runs:^5.2f}|" + f"{solution_dfs_totals['goal_tests'] / args.runs:^12.2f}|" + f"{solution_dfs_totals['states'] / args.runs:^8.2f}|" + f"{solution_dfs_totals['succs'] / args.runs:^9.2f}") + print(f"Uniform Cost Search | " + f"{solution_ucs_totals['path_cost'] / args.runs:^5.2f}|" + f"{solution_ucs_totals['goal_tests'] / args.runs:^12.2f}|" + f"{solution_ucs_totals['states'] / args.runs:^8.2f}|" + f"{solution_ucs_totals['succs'] / args.runs:^9.2f}") + + # Informaed searches + # A* Search + _, solution_astar_totals = run_search_experiment("A*", args.runs, "astar", use_heuristic=True) + # Depth Limited Search + _, solution_dls_totals = run_search_experiment("DLS", args.runs, "dls", use_heuristic=True) + print("") + print( " INFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS ") + print("----------------------------------------------------------------") + print(f"A* Search | " + f"{solution_astar_totals['path_cost'] / args.runs:^7.2f}|" + f"{solution_astar_totals['goal_tests'] / args.runs:^12.2f}|" + f"{solution_astar_totals['states'] / args.runs:^8.2f}|" + f"{solution_astar_totals['succs'] / args.runs:^9.2f}") + print(f"Depth Limited Search | " + f"{solution_dls_totals['path_cost'] / args.runs:^7.2f}|" + f"{solution_dls_totals['goal_tests'] / args.runs:^12.2f}|" + f"{solution_dls_totals['states'] / args.runs:^8.2f}|" + f"{solution_dls_totals['succs'] / args.runs:^9.2f}") + + # Recursive Best First Search + try: + _, solution_rbfs_totals = run_search_experiment("RBFS", 1, "rbfs", use_heuristic=True) + print(f"Recurs Best 1st Srch | " + f"{solution_rbfs_totals['path_cost']:^7.2f}|" + f"{solution_rbfs_totals['goal_tests']:^12}|" + f"{solution_rbfs_totals['states']:^8}|" + f"{solution_rbfs_totals['succs']:^9}") + except Exception as e: + print(f"Recurs Best 1st Srch | {e}!") + + # Greedy Best First Search + _, solution_greedy_totals = run_search_experiment("Greedy", 1, "greedy", use_heuristic=True) + if solution_greedy_totals: + print(f"Greedy Best 1st Srch | " + f"{solution_greedy_totals['path_cost']:^7.2f}|" + f"{solution_greedy_totals['goal_tests']:^12}|" + f"{solution_greedy_totals['states']:^8}|" + f"{solution_greedy_totals['succs']:^9}") else: print("=> Greedy: No solution found") - - - - - def print_args(args): print("\n*** Pass the -h parameter to see details on how to configure the arguments ***") print("\nCURRENT ARGUMENTS:" @@ -595,13 +639,12 @@ def print_args(args): f" HEIGHT=> {args.height}\n" ) - if __name__ == "__main__": # command line arguments parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only) (DEFAULT: 40)') - parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only) (DEFAULT: 10)') + parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=100, help='Number of times to run each Agent (agent only) (DEFAULT: 10)') parser.add_argument('-x', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') parser.add_argument('-y', '--height', type=int, nargs='?', const=1, default=6, help='height of the grid world (DEFAULT: 6)') args = parser.parse_args() diff --git a/assignment1/Lab4_solution.py b/assignment1/Lab4_solution.py new file mode 100644 index 000000000..59884ff79 --- /dev/null +++ b/assignment1/Lab4_solution.py @@ -0,0 +1,147 @@ +# Import necessary modules and ensure the correct path to aima-python +import sys +sys.path.append('./aima-python') # Adjust the path to where aima-python is located + +import random +from agents import Agent, XYEnvironment, Dirt +from search import Problem, breadth_first_graph_search + +# Step 1: Define the RandomVacuumAgent +# This agent will be placed in the environment but is not directly used in the search-based solution. +class RandomVacuumAgent(Agent): + """An agent that randomly selects an action at each step.""" + + def __init__(self): + super().__init__() + self.program = self.random_program # Attach the agent's program + + def random_program(self, percept): + """The agent's program that returns a random action.""" + return random.choice(['Suck', 'Left', 'Right', 'Up', 'Down']) + +# Step 2: Define the RandomDirtVacuumEnvironment +# This environment simulates a grid where dirt is placed at random locations. +class RandomDirtVacuumEnvironment(XYEnvironment): + """Environment where dirt is randomly placed on a grid.""" + + def __init__(self, width=5, height=5, dirt_prob=0.2): + super().__init__(width, height) + self.dirt_prob = dirt_prob + self.populate_with_dirt() # Populate the environment with dirt + + def populate_with_dirt(self): + """Randomly place dirt in the environment based on dirt_prob.""" + for x in range(self.width): + for y in range(self.height): + if random.random() < self.dirt_prob: + self.add_thing(Dirt(), (x, y)) + +# Step 3: Define the VacuumProblem for search +# Convert the vacuum environment into a search problem. +class VacuumProblem(Problem): + """Search problem representation of the vacuum environment.""" + + def __init__(self, initial_state, width, height): + """ + initial_state: ((x, y), dirt_locations) + width, height: dimensions of the grid + """ + print("Initial state:", initial_state) + self.width = width + self.height = height + super().__init__(initial_state) + + def actions(self, state): + """Return the possible actions from the current state.""" + print("Current state:", state) + (x, y), dirt_locations = state # Unpack the agent's position and dirt locations + actions = [] + + # Check boundaries and add possible movement actions + if x > 0: + actions.append('Left') + if x < self.width - 1: + actions.append('Right') + if y > 0: + actions.append('Up') + if y < self.height - 1: + actions.append('Down') + + # 'Suck' action to clean dirt at the current position + actions.append('Suck') + return actions + + def result(self, state, action): + """Return the new state after performing the given action.""" + (x, y), dirt_locations = state # Unpack the current state + dirt_locations = set(dirt_locations) # Convert to set for easy manipulation + + # Define the result of each possible action + if action == 'Left': + return ((x - 1, y), tuple(dirt_locations)) + elif action == 'Right': + return ((x + 1, y), tuple(dirt_locations)) + elif action == 'Up': + return ((x, y - 1), tuple(dirt_locations)) + elif action == 'Down': + return ((x, y + 1), tuple(dirt_locations)) + elif action == 'Suck': + # Remove dirt at the current position if present + if (x, y) in dirt_locations: + dirt_locations.remove((x, y)) + return ((x, y), tuple(dirt_locations)) + + def goal_test(self, state): + """Check if all dirt has been cleaned.""" + _, dirt_locations = state + return len(dirt_locations) == 0 + + def step_cost(self, state, action, result): + """Define the cost of each action.""" + if action == 'Suck': + return -100 # Negative cost to represent a reward for cleaning + else: + return 1 # Positive cost for movement + +# Step 4: Automatically Generate the Initial State from the Environment +def get_initial_state_from_env(env): + """Extract the agent's position and dirt locations from the environment.""" + agent_location = None + dirt_locations = set() + + # Iterate over all things in the environment + for thing in env.things: + if isinstance(thing, Dirt): + dirt_locations.add(thing.location) + elif isinstance(thing, Agent): + agent_location = thing.location + + return (agent_location, tuple(dirt_locations)) # Return as a tuple for hashability + +# Step 5: Solve the Problem Using Search Algorithms +if __name__ == '__main__': + # Create an instance of the agent + agent = RandomVacuumAgent() + + # Initialize the environment and add the agent + env = RandomDirtVacuumEnvironment(width=5, height=5, dirt_prob=0.3) + env.add_thing(agent, (0, 0)) # Place the agent at position (0, 0) + + # Generate the initial state from the environment + initial_state = get_initial_state_from_env(env) + print("Initial state:", initial_state) # For debugging + + # Define the vacuum problem for the search + vacuum_problem = VacuumProblem(initial_state, env.width, env.height) + + # Use breadth-first search to find a solution + solution_node = breadth_first_graph_search(vacuum_problem) + + # Output the results + if solution_node: + print("Solution found!") + print("Solution steps:", solution_node.solution()) + print("Path to solution:", [node.state for node in solution_node.path()]) + print("Total cost:", solution_node.path_cost) + else: + print("No solution found.") diff --git a/search.ipynb b/search.ipynb index caf231dcc..6a7b17c14 100644 --- a/search.ipynb +++ b/search.ipynb @@ -5,6 +5,16 @@ "metadata": { "collapsed": true }, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ "# Solving problems by Searching\n", "\n", From f91c3db40e6c7e9c3470c5046274853669b081c8 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Fri, 10 Oct 2025 11:44:33 +0100 Subject: [PATCH 43/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.pdf | Bin 430522 -> 0 bytes .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 137 +++++++++--------- .../~$_COMP9016_Nagle_JohnPaul_R00065426.docx | Bin 0 -> 162 bytes 3 files changed, 65 insertions(+), 72 deletions(-) delete mode 100644 assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.pdf create mode 100644 assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.pdf b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.pdf deleted file mode 100644 index 239a7ba3b706b0b6fb7815d114d119570bfd7c96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430522 zcmdRVWmH_x_GKUtEVv~Q+=3Hag1fuB1$TD{4#6$BySux)Hx7Z|1W52k=aS^Dd9&W{ z&Bs~)`9ia9SC^bRwQKKl&Lxu*5~2M-#{^H-w{y00RCt~>)i(goM94sBV_**d@gpI< zh?%9Mu|4olPQWCs(mZY#*Nf12aWCi}E4K@Tb(HyFA}O*?o@KYHu>zWxlxeUGeSxuyeYl9`?FR+_y?kUy#~ob#i7 z*w*q-^oWQ0w!3Uk515E(8CL2nSop7z8rKC@LF+q$mBmY~J_Vn4OXxq9*hsNaA+{DJ z)P|E&>cw=NN~%F||2k&3L7qjL#$W5hH-gg!8HF~K4WqGpg4613mV2&KD_oBSk0!-8 z3*wLDe~G?#s~7~o7$pdYYfuSF2x_tOJ@)hk)xXG}*}pJ|zeKe36uIn2yOiBmhp-`> z*JL_Po)!Gg$z66KWmc{^d)c*B=MUBW+4Cn{JJE*Jt|*h?Y*ZIN7e+S)$*ZB20xSA) z)_kbf6V0HDp!eOJH!d($Zwtp38*rN-m*v+jkhnb;# zpurBF)jN66`|8H91evNR0K9QcYkedz3ElQJ4lZ2e4K1~_J{HQ1}ENBUsJ5M zKXIawO~tTxi?}yTk(b#@-(EpUBfCn}>**7Rc4G)lFPxDcWP1BEhtTXp(?cwTCL1D@ zzWSxq5TK>d^=c?zUXzX4oR2;t0v{#lWN`3`P{}&f-OCjPMq$^GG*m=3{E;gwsk% zfs4ELFYQU~?eB8whq!Oau8$n6RwHmh*e6ys(>c6e3oJjclOsOY_Eu^+ZIdUJaNwzV z@Q)jp-w3tboxPy<^#c#QL6rBZudJ*f;9qyvc3B;wKKVt>IB%TLr}e&DCCUq#k^7}4 z{>vl(RPOl_{)yeeR%D!YJeC>XE^Cd@w@@dEgDT0hev?tFfyN8uC~(f-*r<38IC(TX z5EhHg4Tiq)^BeHz?Zb@NbUGiXcU(D5nuHPTMcNPQ2zmbKe@PSQ%SZ^PLZFy@kc^XHb5mEBpGznBd2TVsrm1bp+*wbF<7c*uYU^>wVI>{t_va?*kOJ zCdHu*$-*)-E+;y!4JZqw4w;81ltafK;?C^c1kT)&nqD@3B;^+cJ&S06Yf7SdF5Gz&T=wNM{}1v+uB<{h9*}# zc!LcI^U4`g{vRKALRIHo)<#IiP|$Qy0w7&f-Z6qvg?F;Qg5;wyuoJJGlZBB#S+4pj z8HSabCL%VC)D;CoDCg^eW;r}S&3m`boxTuq=9Pc zWSH9pt)0=GFgng9rl*%fS;Xe?GQe)OODAB2(NKD~+jG+~deN?Iz0E7UPM48&IF*|}za`R)5r z*=duHmKQ3o^2oBKW@sT>D?e~^_J1IfaLyFR5gyhl$55pc9qv)B>Tz_!BD?0}5*EMs zv}u0%ignbJO?X&~(DS-cYWT~ieg=~v#@E5grD#Z#l`#2Q6F3aP$SKXvf>Sj2IitJD z`Nz_)Qo~Uk!Z$V|h@{L_@BwkkUc8edT+K;^_{GhOlh4b$O(f%%-RaKd!hzwz9}xWR z49wYB*HA8ME=CcxzIMyB^0R$!>3Y(XI*z%_6IcCGyjvDp(={lIU%Ej{V#!btFr<1% z+&PZ}Eld-plUthE`7c$VnJ$1YVM<( zNzW$|rMFI)EPHpU#ng<`U+yMv^iIGy{rKPI0^U~H$J=7MKuE#;U>=1EAD@1KP)G<> zMpe%CE3Mw8U(VQAyPScI+L1FU^gD7TrV_%XpN{kqe_BLfyoDkUSEY)X1|A5>vc9B9 zU1ccZGPaBn|H>^Mrko`nEG3SXl_1qsb4CiiOAc*bmNW~|uj=GkUn;=xX0{H#AA$zG zK#E2t;L6tW4Xy;zm-fODd+ihlv7l&<#xaKp$YJ`=GQJo?)dnjv_Sa?~G>77jiDti0 ze$6ezwFxo8_70XN@9~6)Mx?6G8kv0XFZ(W214{2VryjwTTQT{5C{GJ^;#DQNr@O5m znD@u>2XHlivn#Eqvy2Ca!HMh`X?E=}TE!03vp=vK)(@@#7T zgwcYhWLT|kDXnKiR~X_(XLR8f+FHZnPpg)zPEfldNVa@&Ro2IS&KU848&U9@g$+S2 zL>RVMzle64P1QWuobc+PjHN1HD;eQOy;%!ZU_;wr(bpf<9>_)+aZQrN+*#t`l5WV^ zv&Nt2{4TGAj{FL+in!#c(KIsTU_dX&X{F?TD13X>z8kv0=Mc^WX=XA+myIPJW?w{A z@!G?``bZ<;A}*8O~S9m6BMi(^^~=4dS-Eku#AxLP=>w|(_#XcdoRR)rO}+@;lE+L zzQK~9qu~*c|2oh-K+Ze*>LAS`2#Kq=ijoM|EFyL{R}ytmc7>3VgTyXMQAkiP_hsSN z7?>-BS+$0AgqL+4QRhf1teU%2hd7#!itR2|irAg+o5v`XX_wljDu{G06&BSa?r5~{&X;yL(-7tCkR`P;xVUhFZ^B!|8##a0l(2nmIx2r&Uk-0cVCB)6M3ZW9p4g0uoYH0#r1fVpx_ z$4Lq?114la1+`5fJ5{Xltk}}n)#tY|ZrL5V-$)^@Y6j7pyG}xd>lUlhqWvm`?#dvp zNJw1z2smgFL=6~+J;AgX7!Ahe=h~+2g8bb`i@OjC+E?}nVzuwsU%zb?#X27-gmoAd zAio&2_$=TUrD4Y2nR?`?=O2Ox0&!*^f94Hd(h7HY-~SfFH2WAyUHfdSfBDDidXWpU z+r=2I^@L1;b$-%UXoXidL;b|%a(-R+Y)5Fv&Kt%|zirUOSW8F@pMytl0PLFFMk{%;{h14_W zw$x4mi<|TVww95V;?95#(q3ncmGz{4w$3)rl!)%7)}uRr55#rIF9&5Wvg^m2T`Q-) z&V_9Iw{M^`vqE6F4dnUX{@5;b3QxfIX9C|Fuleoq zYXV2`uF37UGoScwUKe;{Yoouq2Ket;4So1GRixx*3&0^2e?JBPeu@)n6VeOXSlZYt z+Ugq`6Fw_AL5B~7EYD*D-2*xfn9lFVN=l4`Y=5Stq{K|f@vnbb2|qlq6qu=!5&wZ-N8kid!{^?fS>I2~i_TL=a zzkWuq=w#sd+n~SKL`bh{W(259b|!X0dNE@&6H`Y*W;O<3g@7ULZEc=~D50ahlQI0i zuk`QK1k4;A|9=;NeE`|ld|I2|EMsULLRIdBfAGh{3N zCEyL(mk@nM31XtG4}2)(FvKXYliuSK3w?PX!Ux6AZw>jG$7rkjJ5=*X`dAwB<)iMx zUD;f1tH*W6+)44tqqLY}tMjpPskgGl@qB%$^V5RQFBk||z88=vzAvB%U;K~xmz#{i z60x#2+1}fBRcON>RbbKBz zn>B|9)EdPV8$%~54% zm{^vSDkRZ7L%E&(kHzYWq&*DS{J?|TSO=igLN{e zq-%yjT^ozsGiOzU@h-GDU2XpUP}gCLf|MlS*-3I zdB@|){%1-leJZ4HAM89uhAV8$)DP%L$2-e!%6dmStbSBTd?~d8h&)%Uq!M-tC z%UHj;lilpz9Z$WK9z45LKh%^h5_gF0)xeRsGmN<);iSpW{t%6NH!Vs4jt0H7<|=g} zw5Cj0po)+E_!BkVklxteTe&O%Qu1iY=jm=EQBDk9*wrC6w`f6pNJ`j|$0faX`EV$P z1SHzx<}}mE(#bJg?u6(T*&}n5B_pe9@{s}mD-z>`qM~9l*6~K?hRgwzL&-ONhgbwE zxk9z#)?q0yCku*X@$6`R#XK4w?u=%GB^>?5oxqM+i$ZMZzQE0Re!bF6%Uzr-PqWuu zLw>H3s>B)K)X4ZBi;5JGS(p>-zI8zyWEI|Tc;A&L#y1|G9~5Rj{u(5RBH(Q}yB)}W z!Kf$&e}D5miroBoxqfdlbHVFsI#=}RVdE)%Nj)u#$Zm-Ydd8W@JxbTbQ74c*x z+<;t7e)yu^k#e>D7Y7R=3h?9C)+3(Wh7qMWtpJgwZru`?a$0SY7KIL(3B_Dula|Q= zslY)_HHnpKZ0=bSlkra`0i%xIGhi1#aeU+Pm~qF#f*Bos${5GPwxcDgeybymfFT}idY)^nyk zdqpb7U8;P2_5|ur*6S#ZZh#Jx1TET9SiD``WL!7Nyu6$UkTn-+&KP;^*6S&&e7VFnyvaM`N5NpnP zv46Q{qe@YA+4dH*1ma^2w<+zhI~(QB(ZxfLY25>H)?H2dIJjjYls7T9SLuase%jb;JFrTq@!SR6a@rJ}>pY*@U6jGXHo~ z0{>};O-{87J-L`@wxkqMqk7A`7gv*1e~Ni2zh^X&mPy$Myp!}(qd!OZF;CxB8Fg4? zy_X}<|`ZQQ5Ck@>Bcu5a_M`>ezRN{8N+l=H5GpC+D(?ULO=f+$Vkfh{T z_+sW!EBR^o=IJRZ12i;cvp%2QMEt$7+77OQU~Id#u!weHgUJ~tl6s|CoAIYHMzUi$*~RvxOKzo(iQvW^ z)yVz(&0GP4Jg~+fPDF3e736hSE(A9R;N!!GswiXBZGKL?zp_sL`m%4I1Rt?0f} zv2Y)S|9w1-q5v^2Am!rqv0??OW@;DAJ%=JLQktQzo~J!+3j45Eb=#v z%1dd7l(Fe0&zHYyKT+nBO1i$8HWO{2{tn)h46c(~Eg5Bht6i_(8zeJ18un#R;Zy!# zH-4~@3hv0eyylE5SHX|+eXk_Jh)Js~n@2UPes?dE7?yukjL9}hDz!tCmF5kqCI=sg zM&Z{V3PkCvlRBfpdxUmxXwhw%$bU_h$}0s*6+v<{}Ki&&DmCCw|Z0mWhBM0 zWO;><)~Zoe(&d5KET7b5S>asCMWr#rw1JYbG4RFHlJcUXl3VBAF zei?5i=p=K`zR}P42Q?0@^>O87Ro2G*kcIzorhLMSn!$MHEoe5Y}{ic5RuOCT{EYuqa(Qd>)(3Z(t zmi5#-ryCMMQeOG>9au2DrN*j>Z(oghH|XUw8D+LC9Hy&m7KDmA;@BjTY!Ih2`E-zW znY>x``9ylR72P0-K&nz7AaA{Uwu@9R!>7Db=g%RPoc;E52kIT+HQfAG%3O@r$M})` z*+hqWnV9X6XWvQ|N#MNy=8w#reR#T7Gkv7%*(TU)OhmqcZ8I0Te^Iy4UZjlY9cHqK z6}8_}X|E3oFyu8O+c7}Ad+ITWS zio1C#)B9F@H<3Uc^W9|s_{it5nr=Q-T$&>`jnMjW4!5(sO$Fxs@$$#Qke)N@GMD#(B%D4MmPwAc7tjL64~3Mvwn}xv8ceg-I2P{R8im!_!FUo!%4j^O z+MCwOqV|1q5}qYaVRT=LM2h8AYh{n^y(rHw#X1=KxRfluFx9&`mydaofe&D^T1Z@=*%B*s&716Bkfa|S^&SK zJdUdwO<<6)y1ormj+Zv1G!ETKx(@zsMIZ*=iUUCtfeoA*%C^%&CXU~05f+k}pQ*Br z^~iF=9p`Dr{L&gJD_aMNa-?Ha-B+;gA0w{Jr(B7VcXIL`DW;d_&Hny! z7*E~?xQh4Ks;*R|_*ICE;@iaBXdPSuu7}Vpr%KtQxhY0GDo4Zj~gbSIZq0T{BI@ zmVc)JGEP8+OI)yQcTrWSH{)r|Q!-q#nkiE<3Pikj(V9Y?No7Ag&ot6(FgL&wGWSEIKPGMIs2 ze7&Q@4>MkCp}xpsTN06ZM8c-lT3s-sZwQ^|o?sLE#A@0K zd5NwjQRWe*!)$_AI4RY6Lr&=e{hK=}AETycNEmMx)ViOZ1iW;bcw_o{spF%{5N65c1cHa4Du58lsNq` zK7sfbAn>V-9TPV21BKrf4rP=LDT(8%-3>9<6g(BpKRE@9isD$Nw@~tS#v38O zzJQ{_IO-fii7Xnsh)lZXH>ICC_mp(Rn=~FD@z+^WIx2Ww9&wOo0wC=U8{@d8hpEcJ z5iz528e_L0N<5`4U=7up z08dKITFIX;Z7s+5K5)w?m%qeL{8h(`S1b9k(_TO~Nh+R4JH#cJ5rN0<%7R;7-M*cKifoC5vpAcmgezp%6?3B5@O7i`{%(cmanfArfF+gM zIqsv3p_}9&CV5Nb9w3$EOSd4v3M&G{N!C&FoX4mq=KlHjB8vkJ2gfUosmiyG76o7N zdo>{B$J0i5%g8yHg38Uu)y%6X@m`sgtTisGRgamdEy7rdm}D0JHUS3 z$VOJ4cW>faBB0@7i=NL_uUo-YV=;4Ok)AXrJ{R+&byORXtgS*JO%n5piUw645srrC zkTJ!P^WshkmP#sk&0K)lpcgXHnI2ojk?PcAwny?_U64Ja*KMt;YHY;fwQ4y=)PA0b z9qw!X{(1}xrSv=bBF(RK)XnS>3jUpz$nNMD+zW$IF74KQI)qa3XHJh1gy&9#7-|d= z`9&508y}*r$QP@j@4x<~2Nw}1BikzAWk1soC`{~ziOcETkSZ);NAD7r7^dPyr;n-( z)R|+J^LdIws(r7*?;@h5R_Z!+i!STobk=nnvRv1hTFI#-K~#3oy`Y6d3~3N}Bmz{W zh|t2As{6WLB51PJs@>Q^?r=iLM%`?MxEy5)T}0R1xW^%fMfa@mw8sh>Yw|)l|mG@i;z?G6QWzrR_J`e2fU|(TxvQ8?Q4%AOA3b7Lt}s96eMt8nyok zUgp8QI{x;xiNt5?jw{;SS)`7)@~Lk z^|BIQ!HYa73L}3DNg37B-72e3nY_868=MmV(`zY(NnF&8hAh2<4;}Um#1pqxdE_jk zO;pT9f}D+|SaK|+3?*ftMFqWdbA*41=18vf&l5#8iOl7gMBc#C3=Lf+uG-@sg-?mR z^@3RmzBZTj>RwM{OHI>MMk4lgdW^O2yhP@*X5gU|@SXf!GJ6!LUQc7t{VL{Y-T|dA zGgS~JGJe zv~kmGcrTA{_^xIcAs2=x`x9c91XpNy8XgeJbW`M}97LYzUoG-;8I$Ef- z(JT|&m85T7TSqlsxyn@lwZ!^aPVoDo}Wb2|sZ)nw|q z)|ZF#{gwHoe{xz`W{`z4>9>md+*rK6Q9;$+E=+y+_LY;+te*JaRVJV&it(m>D2hp=#SP5bE_VcCq2W(h!I zr@UdO^%GTxc|zi_+tm+sRgQG{{ksqm0g)^u3UYGufkyaC-8R>ln6m0>gZ?m?k!a*U zCu9GuACt+%jWku8K4p=|Ub@R+X|=@y9Y9mZL#$6$o3oko^G&|i+I=4w;gpq;3Cdx# z``)^%XKIEqt9C{oYsT`FoB)tR=;T zQMn#WY$+gUHa@EEv`MPA)FSoymCkMt5M5s`HlIEiB=E6JviQ^#XJpkql(vQPX9uTn zAzKtzyd-4f%S5E@OkI3u+}lhGA8(H;M@AL}nV~ger~E@Eu30?KhA9%9tUa<%zKeVZ za#2+}GGYA})upDnpse;~5VK;(WvC|f z1LlCKhKNOlXL(0}#kfASymzPyX-d$tie9oE2`BnVW*Bbg{h4HCyQP3lFq6E%CP{Z7 zHN}a6@P@7SIqe7f&ik5mPXl-O%9bAsx;~fvPFLgkH1G-6?ZX_h+7G32&|oddKaNr) z$cIkvd|G=K529bnzQUKVjCbvww_whhweUMOE4Zj^lb%sl?qLted`|EoD2c6ninB$c zg4a*YRb;n&di0`2L(l~gJzSPV!p_D~hkTv6_yIP|=&OQdaY^hV)1|{(05(6?+V^Bew>&1wWrD!P2*?S&?E)QLGbKf3 zOxOZ{iVqG^rjX$m)5R*a;@*|J)e5HOo)@Y*mHf0w4d1`e)GlZsFK%m5gQKN5=Tn`Q zuh-73Y<57yYkqQWA}L4Xc2!`88~9@(?$SCQ-&7@k&*bh}sgA)XtoN~z2|QeZBn zJGY@Tm)uGEbVqIsCvQX5Rm)RfT_~H;667Di{QI7`i1oF0bLOo<^wp5E4rZk+D=8Q7Oi-;4R7-JZjBVhX-tm~);Xp;lk5%@-tkS8q^yimo zFyBEI*OW~dpVq4lI}{b7lkjI{VgdtsV|CgT8=BJWqy?>_w}GKGvgM6+-j)a>m1Gcq zT*EZd7oTKVdw4gJnWa#$vwFFhv$N{0`MQwMUKAsyo*D)Y=nb0{bII{N;z9;ohHYM%tQk-b8SJ4~zp8v$4@NJF*gni@KKnbovA+c@~x> z3V#|r;}z&o*?y&=riy;R`O8<-QKWU&q+T`O$-InSX7)~m69{`;FND^4B_4;5*pp&> z+_7DE{T}f-$&sqSs(C==RMm_&SG96+Ddp5@SnO)UW4>Vdf5Qkj$+yN`DY3 za%-WzQ*C*6?43rH^OYh|SFG1c9&=ZYp@*zhiW3QAA=N~>@gTL^HVU&NrEl@ zBA65G{+g*XFT84q8Gnj3D3RdE>{DNeOe>c(+gdKk`o#;SDO?qK+T+fS5hHOsGT_cVeJYzMG%WYJa ztig;~G)@gwn<5a?Z!XQ?;bK;n3vRM4l&mm0UB>I-a)G?9<9%fh+g+WqW~JIitTDRA z?t)4IY-ZJ{@X|st!$`kBlv% z5KAv9qa-x<>FVRTKx7Nh`*f!>#Y|`vf0fUg%Qi4PrN^eesYzF`fB*XL;Z5=Vv|Yy^ z3%%~X&dI}5!Son8;ZH(0{9tGlt$0;{AAwYi`nWI{hX5&>c!_4Z5gpr+7tz|I4 z?u#Ygbh(R&w0*G4OGz6(6HaW}_}r-fr8x8UeGlTVvM_{O*;Ab)E_ekdJbZxVd%>kSlzZ&4Fai}~#`kO2KLU)}kc)&)y9L82bEDQoHvSL=xRWowya25+ z%_%_vP4x!g)b2r-4)*plO58yCiuWelhUYA3t%}03T|`?thSCDH=JQHf<)NGvZf7jjLTPOlm49b3ogG3YAcm; z4JU?c8(>CAemzsLFbK@|x8j?CDh2pIwZ3kfbBFuRGt>a7XR zOf#bcCiaCb(`mmQNuUNOUC=9_l^#^p3B-|H%FEwl{`Xz|e^(qRj{4^9+qby5xOjNd z64dd2FQ5+5yIOwlDzN?#D4;U03fNDe1}=l$&H$)WLM4-&Q`Pml%LG45)ukNvSlWlhWEl?GRHT{f;mmL4;(XTQ6fC5L&#jE{k z5{o9#gm$O5_5qn>;$m^<<83Jqx~I2SkeDxD3a~cjJLvM?YpZgLwPHgXHrsmOxQ}df#MHgFU=jianN z!dg4{0hDJR{*y^qA%W09b=FD!f)2up_f{X=s4DSTWuo=mUQ}dciZoADq`{t9 z5E0S7g}C+Bm4ScIVH=&@aX(tv`YKkR`lHK(n3iUqlmqa) zMS-ZOa8rf0*Rg^sQ@$c%gi>rKYx=Z#zd2VHJH+^q)l!WyaD@BmDb;G^Gdn+x<8af^ z6^R!ch#}eWzr-PekYzJp(?R${OvU_O@bCue@WH?`^S?N<{!GRA+!5f4nVFwDvoQY; zobV>{ojm=0EyM#zkVGcp_H3gENdQwjy@Gd9hA03`J>R5x##G?CnIy=1NeKJzZ~)(z5QP*rTw}I85kKESy@>*IXT~qXJZ0@ z3t$%>^zZo}ptxSIxokY$(N{>6rALmUoB2!d@s8=gx&d_hwIpu!iT45J1)$D?g1dlt z#zUbtHl5a+>dl+`5C&A1BBbL}P(|CQnIa_v21%#4b1}i=<$X!Ygu=HkmKuE>leK8Uwu`O^ZPQAW9URl6a z3)#QTNtHtbPV+0st9y58SZv(socj1jl!dV|TlXoMX9BC4R6Z-_N4S33D5 zJ4Czxgg_I4&;4|Kbv+7zd`uOZs?Z_(EyOv`QW%IN5#}6mJD3M_0d?ZEIkOcGxxavb zn8pMUgGApG6iRZ1$;Jon$}}jzB()o6mt$zIK+t51joa0U#rb5_40R3Q%-l@lP^j8} z!6F*y688*(@7zO{uM)ZD8?C2ys7j;8?rfo~N2NkBPUybGW)8#e!BK$05lzhfe9_r~ zN)u?Cr`v_jy5{+(x{!%8Yi^3UNsJ{wq+>B}IddcH1L;G)b@B-{f7ku=G-*r?hg?f%w)%S@r|4~AGf zIyxE|<%QA#K!AxOJ;iSO%~#kO7;lbY;vRh3Y^tuU=27n`$So$MTF%u3;JhziF4Qeu zPAh;zYbZdMxJkgV&X_U{831BamM`u+BzwYu`$gXb0B3YSZ?Y};3prx8_)9)h2WEb~ z!AQJYVb!~Hj%PNeK2dErc&NG@JxM@7(0G^5^W7Rw$bRu)$}}~b&sfJn5f)*P!mfxIA(4{(1}RITqT>&hni8i{5@G2`S^ zd)+zXc5MPPYPmoG!8^i(dwMtycHQL?SdG>=#(y&@2-rF@Tfi@)!k5XHb(E=UIWjAY zIcC8?{c*n1p~jnGB4Sf!{_o567Od_-1@)T|1RcL z&*b@6|A=9q(tN$gOf4-f0rwbS;Rig9kPf)J>16W&>Vr}wsJGVQ1Y~;p!RLFGTFp6` zvooje3o#&fT8l!>f&v zUnb*YvnSZz;t{APwchBkvP+i{*8e;i^%<22MJ)OSC|$2G3+*@eMS90R)i4hv7pk(J zlL1x;@gseENj<{)uotKhWvx-12+BmyW7{4tvxM&>;eS-?1mE1>zK(g}#|&HoW>*Lr z&nsqtT&UD-3^@U6>Wlw@&AfmV;q%a@&G7&V!T*U~Jo9bc&h;LS@`7+ks7wNA5&^j6g*f8sz?JJolpXp#UAZ~k$Wd`{#UU;w7!+9H2+r6Kk_WnVrXzX)754R$sbmP_FB z+rzH#Yyi$5-n)Y53;}iN!j%ANu-Y>_;`?en(bB6SCiwejND$Ii(z3FeLd+jN*tM-? z3Us`KgO+94J|7$$ly>tnXA}Le+=ei?i|e%QJF0wPfcG~RQGsqnM6joi4$aP`%Jye~ z*#!L~vqADxE>&@Y-~RXn009RYe1`eN-reaWKBr?*79(^x5eF1BqG0|O$WqAcgJ8zMR?Ttp_|0g?w`!2O<6MnLRp6G$-;oA)mt0E7kFFAs21aVMA&U}b`m z-+-*zBYK6tfw{TF2OS!k|8!))f9&lU(T4(qf!9;4Fn|{SAiWARy<32E*wyh0@OFyL z_`*5p`9{@hG#ZY*Rr?9Pd`k@RY{r(^AJ}!DffedOVeG2QH3GExR_dR>9#R)7JVv`r z{!f_&+@NV6-DZee0I4!(@_Djy5(N%LEDktXzuD&V$x`d^1Yca#2|G$G{6hnVI;abr zmgh9-Oul5J%|?ToOs2_XM#MiLf!m3>Xr&jaz zMFrl<`7%Ct(C_%qONP6tRh=wO>)KNl84N@bO9STchyA?pD=wx)I6Tbl`VR#N^g1=! zrompA4|K|Wcn-vVL`6gnsh6lAhKbNk`AA5=9f*{#SP=aQb8|pp0U>E1XWRfyPEJmf zlbV)hshOqp$$Gp;cXv=>ny$tCG+@5$q z>~%WiH620E3T*7{Ip$4A{p7d->0V;a^YRyoLnw{Xps!$j19mztaG=njLtt zOaAx#qcI>J^!k8W0l>O+i3Wi95w`EzHhq`}GS>9kEf;_)diYN8^cCQBzAUzHQvCl# zRk8@+Ry({_yeXA4t1kxk28lVu>;a$g%yWC*a{svjeNzMw_v>~kT;MYAAgMB$#P4iG zo4(Y(zKrPsv==+yG&iSeYaEzC$s`Eh)*Axv z=SEq6rA+hyL|VB#5VX0jW&_Axx9I^x9pn*ykWN7aU~(VSszN=Wn8Ew@qIgZy@E{5} zto97stL+{OuND(&HG8nY4r&Dl0yLq8)ql+fke4bT#oIb;J`oUNz3ASVbUbeji))sW zH9FU7_g#bwh$r~~iR7;|5X3D;t*`ol{oW+~c@K72lLB6F%icwwM%;U|FI`%H-QCmh z{Kizh2v`0jNO3z)+&6^oZ(M~PE{)4Y=2~t%xed@z#C$?*X}wu&6Gs7E)|fF?k-WfkuIfEy1S&My9A`A8$miG1?ldT@48)U?dREht^I!A zukScse{tZP_dS{Oy2d!id7fiT+wx;jq&UAS<Clz^(V9fUj>BoIe{~+dW?|x=px(>Q$=H>uxR{QVQ*d^J%q>)2h3ORe(x>RY5S@AB|uajN83V% zcyeYm!8BaAU}*AE`Jewhqw+P)akW7WSO;7V771mAyou` zI2i-~n~H-`68^42JRi$zL%w*t<7_Iinotq;LdC66s9yW2od{^q9erzK^|n&AJCbC!xc7D(92RpH^G9>^Vdowh88T4 zU7Vg_L6&=-{0dO8@WymoT&uri{$t5#HB(U+qNrr>&lMr&>?hN32}jUKtL;VikLQEb zRuggnAoc%8G{vHEG;dW|hetq6Tw|}81u@OBDsvYCK$2YXp~U0zfVEWJ+wD)f`9BIO zU(mqMNYdnSS#cp!rd@BlJ)VEq_V6p^nc0is7yozEKYW9pQH1PBpt6 zPM_9EgyT82=2`nndi?_F1&>`%=T$z{&sY*wKX^`2=uF$mrdGT^)YKSgK$al4zDL6_ z_XENothxyV2mx3xDD*p%PJ-R~TjBs%3TTU2%fE?M2DwMOY;qANkZZn4ek9oDbBp$s zGDhjq?#O1BCZu@t7k`u`^m|=mfK4ez^qb^HeF0@7Wn(V2)1I5_`)_C(L|sTl3qd3Q z`J=yxfr*L99~=xvsu(jk0$dY6^6%@%qOAHik0iZfI_LrSV(HP~CxvV_u))gs>&QgN zL2mhgw3XbJ`NA#k+Tu0oQj-(&KQSw-G#|;GGE!5KyLg3KJT7f~!=)BC@PL|JkB$E6a4~5J*@rixps2__$L-vl`WSh5$c2AI0J zl@C3e&z2}Sia_iX+1H#0a_t#D6v`&Zmy1R7S9g-fR3y;PK#7wna`h6DsoD{@oM`dJ zNQJyTS33iN?$iLs)MbSOXO+keli~TYG5+YW{AXm3RMwvLI<^ubKwg84@o zsuv-AYyL}Xw>}sjFvLF74N6m_m?6p-5Rv}}R&14b;*Bk~`LxwdLA0ov^1{K5mDAtJ z>?RN_{6F;r1MDiB^7)DR`Qhzt3kgT}i+T4FYsFkaA4f;dg$b2c_305Sq)vETbKN$9+R zA^yXM4_oeTvCw~(Zk_I)I^ywurZFUbzjyw>oy8yuv5G8*RuRaAZ*iKwUZ1BjO+CF% zO??)KPRjREJpKnb@6+$|44Zg&(X1%{P~v-#wqkcdna4?41NPpJ*SL&xzX_g5?tMI! zTx&v_;O@T(dH*-yjc;~6QIV06QBi1;@66#~DOO;sY^6jX3{|^4rt5Zo^3vf&JbGaDku}Q1XUBL2mX;8c?r8Ql2IC5V)KC0KUcOmlEMF9 z(&dNLR8?^ZIShyRH;w%fY{dJGpVoc{K&esruyUGfAdU$3CBR#M>Lu-n0Ce|JHQ_S9 z68~p*^&9$)2G1qXt~G>@uB)Y~5TJ_z5>VU4JOj=Hz#omI^BQ9=0zJ<7Ne3uELrDbPZq$2B;D`^Da6H`{jqU*i?|+0~K=4+X4&k9}{sKc)LckaN##}Ps3*vXs zAl3%(1z@fYYmS;Zek`yMP|1sn05GoMqPpn&6p|gp4M3Q~8`(B>bnsm{T{{scf*l8L zkirRkbBLW3FjPDaom5T0%ie7Ycq5=GVn_!A&PGxHBhqhR1}P)Mw;&$827m}1+^8Ny zZv)D4VjG1M^7RxDLZ!<70Q`MpzW<_ba&}pKrO}E-|8v(fNUwnLI3WD;*neE1?Fr}F zJUv`)v$H&0Y_4w*l#r$3&HJ6<|BVg}!}wOZ$-*|i30y(pI;th|e^4`1pn|qwOgurM z=3R&R8!S)`Xa_~HP4-xKw|MM{=@94oDFjPkX5c|3O)(X|h!f-aEhxv^_BTDNv;V_` zErIyL{j6VnOiv*@)nguVgS zj|{n#7mGzs9;`IKQ!_Z^>JG;pij?9TEFf8sO8P;NhBz8Ly?<+cMF0a-K$t-YG6)37 zK;Io%fKoZ>(X?(7!B2=leZ~%seYhY^6{E-kk7hKu268OGv4TD^?(v_6DZqM#;B5#W z;|e_=HUBMY(pO3fhB5{)DE!B0q5}UNEByW>|Mvd={@K~tt*tEs&fr%7SO6Kw8Rz%) z=Ls836et9vlYarFSmV3Ri^FB|=Ql?Cj>x(Z{|kSugu6L-c`c69 zut1dHh6c8bOAb4r9-deKop41ZhKgQzimm}j55w4{e7WR*j4IsFc%NHckEte(0Go8P zpu6!hP|VXC&RhrD_X{ZPE+w94(*Vl!2)3Z00H@KSfNerGdW%i}OFFOmDn^z*6j8G9 zM|M!zc#SDAAOUvag)aci-*pxMp+Ls{%7co>eJ8xH7m5vcgxGV%{JFREB}~E5 z4h!^sTg*iu+-ju(!rz#`85G^qHTiFku78WqUgAKK%pDO`2hdX)$^3a~kM-*c9Sa-d zw&5|5WPt6Zc1K?bVSrNXHzjOA#rLmdqfuv>DB*~_1o3Z`K-63Q{Q9XtfRDaj-+_WI zEfW+mr7(y=jm?qR9k6EK}s^?$DkJ2;2idotIV=7Eo+#F)4M2x=*ePzJtvE&Jy_i^0$3J zcuY4+_Y+yfs03;9@0%~qUGV9$T-EkvN$zQmxq&Q(! zd;aPQMpvjNF?HUXH8e#d7fe@+P{WW8c>nmdm$uv5p%ClyDJ(=U@@h{nx?hVlNlx_R zq(u<51Q6h5T6Kd5MCGTCKmz=v28M6B-xu_pTw`Nn7fkuVq3~Hat@mRx=YBUTe7Y`1 zK?=>SQ#V4HI}W6j{RF{hg>iflri(IM$fl5Nc82c@NTOL=LNEw#*!&Bq@A;j82X(j@ zIk?*MixSz!-eQC2^(Tv8fKO0YPL!kgW(+=08?>CSqUbaq!0%L#7&=v#@h8aqA$7`P z9zEL5dbl&&=rkQlnu`RGjz2{W7tQ$k4)6*ouK*3q$#qv;T~d`kFd)OMCZfdVD}0Ew zF77zLXl!==xb!j%x9mxh6Mk8g5hRsSe3M<7ELL-FyIPM|dTJ(+W93DW#;Cc@ku*Ak zA|t;FX)@WV1M|0h%fS3Ce2IN3g!iVWZ{8VK_bp{_M4qSCK)%xVMHk6uJWJ_ zX7ZN?k~qv77UH{X8q|Q12hV~+terY%nvivw5c8)k*4XCvK`NBlv!^D-o0ZxrAnXvC zU-p5pYeFP($d2Xm=%_LPG=}KtZcITsvMG zlnC*me`T=LTmemd3j3fdElEA@1mgoHG`G=rZ_C=vmLfCBTAOmt9H)9@dI-*a1RI8Z z1t$04P?*{>%)^&TRS#NwQE2OYN{-k%1xe6KO&uFQNu$<$4D=_Ko&iaCyYfi(L2%1n z8kHA{xc7!Gf6U59OXPAR&F%svDFoD?3X;Dq+XGl1fCvCeUeJK)wLMNt3vvLpy3HrH zL88nMLH*;xMJOB0jHD?U^{@SmY7X0wwvPZ#B|NS$5%55I-z5wjMXWE8NY)-KG03w* zt~4m@{lgOQZ~fA0TgCK(SVi{Giu4)Oet_6hkZC&4#NXPU_hke)WdG%rftw@YT;04C zPQft0g?1>!Nt%y6FPxLBS@XH_w@(@bm-U;OXdyXp$D*=gyG%(yu%hx5kd+E6-~sH) zq0mwg0*fQ@8wDxHuaQj+)1-0#Q*kMV5s;I+Sg2eCH4sTVmM!APifXVx65348W*S1&SIQTb|WGgWv;TNDFo# zbo475A^L1J;DtawEzRHm$r`sIcV04J(TWTahGz{v>wc$9Y1rQ20aw^i4so48tUe!K zH*IUT=uMTfRw&fADtUb|hrn|r3P?!;^kAJP$`LQi#jg&MPa(%c(E<17%1FM27(l&b z5YHVzYS|D=XURc9wHV-($sj*~qBaINtk4=P&btTQ3pfO8Scp1n!`}l)1moVgy|M zpYA>o&A^Az0Ba-LUk;+*VN*Hm5vDGq4o(noOMd_j)SwdhWI7a-U0sU_{re8A9MI(u z|Ne`MBq99u!}V?D{7)UgxBba~?J!GMV9jKaCx2?30eHCF@ymxPSK_P(!>hXB}D?q%RH8G$@+Sdx__HlOZ zydAe)v~8rhi30aw*@+NYjDipN6^gf4Mi;$fE+67RwtRISh=SiD|GoRWUE98_Dgn_d zg|B3^MM9lzy$+U_)ccT%!zR=~%5R+i-k(uH6PS&OhG%}38AP0mrCZL=BHz>o@mRk0 z$!3Mv@UoU+`d>o%5(20^ig>Z~QdWG1cw`dVR}d`0!{2Z?0kpFucTVXChHl-Iwtd5c z7N7wC1qIA|?Gd1=GK2N7W1{`T1S(7p^rTA_vuq|6@eYl3{4H zx}SroyP%j^@NX&tM9mg0C`prRJ#>J(Gul^;^j~W&L=h|zK2_M?{%pvq0iIFdGks!T z@;|&}*jYk@B4%@SSNuz30rb`^~z<@&2fNEcT z^9EMxN*sFfu2moy5j>DIG}G)D+qI5Q)fm6uX!S92p^ zvvoeuu9)R|BAB+mlu3Q`^O9j=;woMK5eH6+{_rMUwsq)J2^_+M&=crKhzZ@iEpO4n zuX)WgAGsEot%t#e$`}=3&U~==xz+#X=D0@f+UN;$LYKm7h^zeQSuJW52mbp?yCexH zT1}f2^Vt1zlKp+n=?(Miwz*|8Z?$`Ye)n7TW4gW3Op%C8&1LJoGWJ%yM;A0&X{0q@ z64f8o+Q19{TrE>NqE_}-rNJE$xxHs-D8w^@F6gKa^) zmnlOBx3BmM@P&M-WpJOFO8hJ+ERYi)9!5n=9yPhY#CTY1=e77c(8ZFT)sBB0xTUVL zm4FlwYTg|9!dD}P%>+5XXKK}lfSVqH&^yBl$J|N(kyjwEa)S&)zn#D%F=`kZTOoI7 zuU&17C&>L@TFlF1E8j&wb^o<_Lyn>oX1gjcLZ!BGff{Y{mNtilFn2k?x&s<32Ep+o zGN&&a2Q-VpW0LpJ>|vHD9tFIY#(+tJVUvco5QhCEA~^d9S>(wql(WC3{i8`=_iwO@ ze%$u(I36BAM9!GY-! z3yr~u6TbdNS46<%Uy?1REO18cNYsR=>wohR;Tr`f{5_Oc0Okki3B$*;k3PSjtKug? zl5qHH+N5F6YzAD>*Cx}+xiN8vG^oS);zcU_DxE~Q_Oi}}p_*h&tMuP?llhP`d zDi69?A~gmrkGL^XI@Vzw20l33@B;x}FX39SX2hz|E5m6cS&pd>#vfkE<8N@k!Fc9- z?U!#fRb8M#Unb;?#EqF2$=dzOAlg8?D!CeF)^LxX1g)=~@CS*#cLRaWQ(LYI*n0Gt zi01dZU5{7kj$K=rmT(UJ&^z888F^BELG~f>AzO|n?`@-xLDGV?@-$p1l1i6OfUcD? zet^$J>Men$u%1!{O%{bdEqa`gasmS#j*={igy@_iuWX~Ro3NW$zUt#5+ewX*4^0_b zO0D8vvR>>`@z0V^lh+2y<4a?$5_gk5Xq6IXl3kMZ*|O;MDSc#r72GvIt8@r=sQKnr zy~>tct?d*Dl#xiyNi+&EN;L{K^8dlrqe9yf=Nng#rBp1uT{TXdPe~*?k?%I%P^(bO zH*Y%6K`Qk;?{*@7yXTC2tMv@Yl-5-HC&N#YpF}@v236rZISj6zsS@T##78toM4xhQ zG>)!~e&?>V(0gcMOuS~YW%5j+Dl^9(juWmPmGnG+dQ=&A%E~D4DaDi!jwTbs+U;>LzDj zt+^IT9jw+*t<5?;j>MFM;g@e{Yr=W6%PaN^S;qwP7E1-njf-kD%yJcLMzD3`*tDOE z)a%r%xri#sv1_pFSE?Ll3#w$5XXUj?wQ2hdwtu6THwYI=>nO?&%WgBwG|XK!rY?ys z9b?MX%H{9nG5+ijb}YE2O;;6~ArmJPIiR36JGu1IplP&r6xC|OoQ|`UtGO?yYC%)8 zOmg}oZ`X@{&s?{(Yi1OIaEQ4qt!S6Cj?N6t0bWy> zyIZRbBgYYI2=pHG)e|y>%Nd#@j3bXna#2w6kMJj13Eqx5tTvFmjb$@oi_mwq&z@BO zp17v9do!#s6S?W!ZPUFtD=>H8aLbG?haM{x-j`4qzezNTq8E}}`8xJ>WqsVG(V^vG zp&*}Ns9>ZZ_7~?brC#h;hWF6-&NqvvGe?^@Gq*~xJg{X*TgZ8^lCZB31W}$MVZk}U zc6C5?H2aaWkL%OuOyWU{-ibK}zChwa)y2JeN5ICySw^?#)}Zd{?dk%{Y9t{p*4-=} z-9O$h6&{Hvhvy|sjO#(;{I>XVd{HiV zZSM#2+5y`$ourz*`L}gHi-$%lV)Q#S9hk_7$w`+n9zwA@i+{>joar~Z{Dhr}Zw|hV z+w5iDj6Bx8GQEq1O%C`JFeaYdts81AQz3&Zvj(jsQn%vtN&m!my*MEzA(!!4@mTR! zi-6jz+6hrw!>}r5-Dd*yt?XT#xg27kcYf+X9Xm&OELNW3o#vb74^hA5&!r=1(rEoP zQEDtdEtyG~W(}$gV{V+Sr>@%$kq(>=+-F{G@I}CWYyL(4t;>otqRYbKcGIawijk(? z+_#Dq-SVHqCpjne&9C>qyfV~wFhIA6Hi@o%TJ)(^w$f5+s&FT7$CoHNb)$91qkcbQ zzVG`?+p>+%1XLtU4}u^W4oQno|E023xrj}V;lgTJ*XVA}PE(tikG_xizVvbIs8pa- zeqU#_(-i;Y%=4n>3EZ8LalO@R4t;j_E9YV!*rnUb&vF~DV0kEckAL)CksoHFzL;|h z^D5bojI`nfMw}pqi$MW|3i44*aQdXg~2hX#Ji*E;}RTWD^zR8t($Bl1`zqj7rsVA43Rq*Qadu4dF z?g!mRPLnlfCh6~aTWr@I+O%%l*W4$ql}CMn^V+=8y=7mzX!80Q^^idf6ApiK!1l%C zL2p4|+iU55451iZPiWYk=idC@cyBF-9$ASgvqY%;e(GxGO>yhl-p3h((V7sm=%5BM z_J_plN~JEi(c)2N$y&)BsdA~&i0g<&_v*8rqoIi8iM7Bs#$TT=6UR!kyj^Zv&5Q=R zkF3UaQ-oxfioWpPOkdb+nry94xL6z(6oxI8ei6Fxz0bZiKI@C!-c!0#O3aEBa`8mE zJ8`A6d9$&68E|_0cVG&6mkb1#f*0<{h>3|BzB4tUc=E>!a&-TCLC;gjOLG1Kum7i) zr1J2BH|6~A7tECFT13+{I^1WrQ3>oU?q68XtZN3-u)_|VP>S^p8V?0&W#Qq$8uq z@0Ul8mWK}q**!W39=EntLR%awtI?<@Nr#VcS*Y8rV24b;C0}g9G`Z~G57Y5|8zaM; zq&WFyqVS8%=l#t#lo||oRu5$+li%g^baDH_uSxGa_1mFngGLUoud5q@B({-VftB|h zO2G~di0{(E8arE~ed;>YRjC>$>_3d`Tcn~VXWvg=^r8BYAMtQ5*X;AuF4y~5Je1+2 z2VHPp?C0Cvy5&D-vLak}+I@};v@J8E ztIUtlR0?To5pNTzE3gBp`-W)W<#qT`OI7`-lKkk{^!Ds9qf6g&KuKR9G_^kZhU+Zz z>%*jS$|Y*MB~$XmvHf1P^6O5E3M4bi2&H|V#|UFWZzHRitY{f6naS{0_eyp-l5xi( zjA;oG)CuMfoU0q2uo!JOPqb|K6Lee#F6wt(y)?R3Wr+&?!AyX2U%?rC&q%lNrub~l zQ!s*$u%2)-x>S^M!a}6L`~9j*cDp&oE5T|94uw~!WF^Xq%6q!R;}LW63X8|>PYfbR z&M1#0R@$0gO^c><2b8e{yB7RJ=4n??p~yTy*I+Sfo?>p5gzhu;*@_Z;tC#(nRv1kU z`ZOj9jz(A`rL(t#GWHQ!3GB@;O-%XwZHza!YWyf4@`Pvm#y&q8W`=c0b%up{ZDp-r zDkKVhUDAmDJ&?WI-o?!{0 z{^^?(lzPhT1Ulkp!cIr4T^3LC+qgPfkfF~<;6#3w;bTHS5l>cntWc>$DV*gOk^BTX z$lUlHMhv2e>H8>3Eq-~_J?N2%@hcKkmKJ>@98`7u4vrEzZf=Yd%;c*wpY0==eX`o+ z2Fo|f9l{2YG9ss&O~I5gQ>JS}O$t^D?GcK-X4sDAReTn3Wj^l(DTv>Bo<-A*i($a> zT8fukOMXwg5xWdkn5R!mIOjOyVjV6QY=1OEvJ zblI=>N9{%i-PdT^sHm=AB2EO7mEU)|Kgs!kpJ_q!LeCjSD5#z!JiD@!7AMF;pmd;W zHu_@(uJgv5Lp|sp4i>{J(=j+>p@|&Ojj;lESj9t5w~Z$`?_BsI3Xz`h?{3U}rpV}GmJxrJKcqq?MMcl2gZ@GY?lo`bz?fE{NSJpZn#nm(iCg4XX*ilf+a_ zsyQmBrxdYiV~;$u%}lALIVOH4$@;$YoKP(5i;*MpXekt?>J#sqjRTm8;KJK*p?lsU zW+usbc`A{tuRL4SP?F2Xe!eD+JYG<3iGnX-b=*+AqRBR$4iCLIaA3V$mN~SfB67N) ziSr&}&J|UZVtCEdJT0=Pisdcdr-}{mmlipHOL@`fAhLdMM@Cfg{p*$Dy(iDeA}S%v z5tnk94>uRtKva}x4xi`#9pAxmG0W(Nc>+RKKjJ1fYTpxPnAMf|kMp@!rUOQ97awi% zQMGsERi0~Y%n_R>5@z)ghGHY*mOALsMxQQ_E3Vc0RyIByS9*KhZC5CSs+&ZhaK}fF zY;2?6qUK6Fy(F+YqT{YCLg!X0(>gaD2%LW*u;5@Qu$WaOzuD~bZeN5hX`*P;I zSYUqAUs?4>K$y-)B~A&c;APn@rY}>m5Fh#QSUh6hF3q*7^q?znQz!1Npy;Z_p_Sg3nIC{P%^xc z{?me{+l_7Cn{%?* z)e0_*ud?sLws&z1>oQV9asyPMpKm8<9u=WJdbJmn8uG zRjL==&I0oKMcL;DDRnk@X%r)p2o6zmYUObGg1Ty(rm(1&=!OTc4iXJH7e*%T5j4!S zPzrG9~<4$ym7CnxUrKHY@<`(bmbewO@pfY>|fYNLFO)S6>qT4XJ_?a_gb@9cxxp6&xdv#)k&Z zX9?Ukw?WuWF$Yp2yv%dCM_M zn^b*_pE11(s7L?63_I!+xRvy>Rh&p5?i0b3b6U$Q0)CY*vWUT*t1ufyE4xnemxbe^ zNTj!y*W0Vxz9o|?G%m)nO3BAihB&w0CkuQh0zA2SdmXV)RR`5dG54L# zVXoggYW+j=Bh@xU3clA3dEgUiYCflbgGX!Umm1>SHK*o8uTg@bIeE9!yv~&-JtO_f zbQ(%}lZ!3IiPO+5l6STdmcq(pZ=cj;OQnQT^4%jrJ9H%~&+4Udk!a#MvOJOvWtGt4 zR}}92mcjWhwXrE_Hm_fPhSDMt8)nidEQwI*3UBRco%;+^@-$zUi#` z%p0P#;TQA$v*%w7^VP@LA|v?B0|LVHjSU)}o6C46sqEGnm3}e^ufz3f@oM+WonFY> zcq*n|)r9k7pP3}vK{nB1Pj!^7kM73x_C50)e^h=1$!Eb2$?e|?k)^&aQX!gs9-wvC z*nP^JB4OQ*J0cd|xg?`syb*W$t`Z3u-3*qYh(;CPmy)^TT2frXqwv~VZAQhIVR3TG zVov$<0Dl%+@G-+1O&1U7glzL^yGzpQ;#;1Ty9D|m?_rgQ-gr`H%W%N_@hiYJXsE| z#*%wFk=xA!scW_pM}u^x$*;IOb+$TXy8d2M_UloYNwizhDH3zSx<5$gYc!rW)b+5|cTEQ&wc2SEd zY3Eg{!L>qv&qOu`sv&Y$8god`%OOdUPDuybugo&ROmhLa9>x{TWrQ}dmU-e8#NP3F zWMm>1E*-V*+p;VnsRf;i2YRZ7Volkxwe)j5osbDpg9IQOdL| z;mF_L=!ej9(crN+oyp81e{qOaLUfg}W_hc~*B^rZ69>Q8RQqj*$@hh}w%lKZOa#PG z%jX7t!>T81V$ZWyaM|~bGtc>E=k#QH%R6qIx$o zF?=9&0!8C*^c_>KdVI}5Ft}u?S55AoC7$Iv+WGTvY`^TUF3%!PbkylUB%*k=;A}J0 z;ZUl&O8bPonK-qpbc#;DhXiKLCyaL~%5hk*w1Jp~$30jhC|*( z2fCG*Q#(`D+7Dmq4qxgu94%F193t4@m$F#Meqoe#QJMjhO#83iGzz|*lacdIs?SRb<#m;9LByn+ za%OkOMS!nA!m8JSCSF*lL>E~CoM8&wDZ|U8{E!ze_@OkitKBOcB-nb-0!6=}!Z8%J z*!!8O@}xw+R_sd7Zc)Y(BYdG7rOI&9DTDnH6*uVZC{Cr{95`SUAO2Uq{ag1Yp=Zz7 zY2%3(CI&Z@T%C-Ci>tl5g==pGza7ZwIyVs?3k$-MqvrI+iJ&2z>h8keeZ??baU&kr zNUXM&r-8Xf^(35-rRB>bcnv28ug8SMV>Mpk5g_k8(r)%D(WanO({0}6izd2kF->US z(6d`4gSvfb7{eb7ih(UBJ!C%sAbwZAa$WO7#YsBYQj}YdIGc}v;8TpM%p$|x)Vb?u zYZ4s37Vgg*3C{lVz}ukT7?2P5NmP^Ins}ju?N&X?_leLSJ9d+@Fbun+9>Xm?>dcb3 z;D&faa71WD$KP^UuC#FTbo<-d*QUOy_a|>;NVZm8<)5X*^vZlSDt!BSyNo4_DW(3j zuqys8XM|)Fi@JLFDdtP(&h9TqE0sx_iindt>qpU%3rsm_+}r)QasOCpTl z`?rN##FG|ixcXbeSaAz;V-%XCxs3&Fme!{TSJ&Pt`WW^`ST_>9(X`Cn^W(-kIjiF9 za_gh=Q(0c99F%=dI-=1NDmJ4O{A|hI;{~aq-Z>z%<3E|5QxUOl%jWHqSL$Z%3LP3DCA_zERT-X9?~win|Kc?Twsp|c5P z)#FV{`wq=<=N|?ho$c9`amj+Tom8yyg|orN7)fp##056h^`y0vP-5xDMOPi%d~B+V zrpS^X);aY?KQ7npP*d&)94a(tQK|KklI#r z7;Wra14NnR+6?_P!5~xNYbHStrQk-kAG_ldZv~vrk}frsjNILns;8cmm3l<%4oMi0 zfB1@<+rM+ufyUO{o8x!l0n*&)2o_2m9IS3zw^!6)?ADUiP>o}qHwP20J zgbPr68IqO=GOQq$ol5iI;AxdOggGISe2HTwAuL=edd(j$Y)X0~yVOZoo9A#8!INJ2 zEjU1IGjkq+wK(#JhU5l3a~m`Q5xkA4oXxY&PUW8Al^Cp~3dGW+>0B%^PDTPpwBouQ zuT*~*H%xea#-H>2u)#dP+;8h#$m9~_=GH$o_dR3d`6S(E*F1#(NhVS9M=!okN3iCi zJzUl(T<}t}Z96f|5dRe!`)01x^KC3a5_NBLhcvPSc#pkfMIov|=+*h$T)l6>Lr2~; zJx^=fEvW9=^b|~Ahpvtb9(wXukRpJ@XjDjoCk%TX9=KXRYuugl z>M}`tv%Vo<*9w!&vpP2lUVR`D6#MdaV>FF`pU@hJq^k#Yp?vM2jhmtBL^Ik8BDnRKbD`DXCk-x5D5*O~ zYJ>I%#0Sm0x&8aiV^Ezgv09z?>TC_Sh8W|XrYH7`(phH(H<$F5M#gxPD5mZCKE8d@ zV>H+N#h?Sfw!k&xm^)Uc7z{U7<9q(zeS@VQ+h)YV&Wx^K5;T>sngqv$hWH!m%YR6n zM=+C6HZuF{-s$-=$hx$Um6be+c`62%zYwOfy7)NT0u{$yPE?*WTw774$I}K;d8gSk zi272bNZ#KF-vnp&_9f5a(zF+B@E386Q^Z*Z@!O~9EPe}8qWr8Zuu<<}g6r9NT9jh* zBodGU_jD1?ZjRb#ip?Z2m8ikdDaz1uu9=qk+zIJV&lrWB~E)pHTE!y|aBU4+Wv-Wk4x*HKc z|0P>*zEI~CP4c!_3W~rF#CLlapQ%Nrgq?EOd0pdm%=HzQaUL)>*K0x@^nJBy?3(Va z)%ha6kCJ&1pM6$4nc4_sA&ZogXZwUE$`%7-h}@Zmjq@h(Fvx(SmvvzBaCgFA4L`2$ z6%=NH`0Uc^>w`D6=$SMxM+P1c1Yp4+%dTVFoaPYK=Oyg}9)}HniB^1T(^G4lVa)yh zVqft*w8PySW0xAB#hGX6! zabS#u<#bnQ{6(6aCg1!WS-kft{}V&0RlKB1JgH@uMMFts=p?Bf8LGF2UhzLo3=MfT zEm``!z8V!{4IwQz(3qFmqCJXNhIjquo+}(^l%7S$#NkqeEM*fsqd&Kb}{1!ZStl{G>$0&k48@6exTAzL=SAwDMzs z#PY?KM#{6RGQFh`YQ_^WjOPT1n|jJt7&-+nPqYgLkGX;brbeJ2`=_^ zcz^F@X>M4Uj*w6Yf1efFFe0=iqD%H3yEDJNAyJ-nyYpmSy`d`4nTY!$7cD4@sKuw0bp2-5{aL(k;dYFWPYy$%b7yz(>Me|o;Tx* zyby_{U-KkZR;IXP=}BQCstb6>8$1qcOyu_xLyT*1P=utG^L3at+L*WsM{gbPlMPlj zqfk}*NiUW*PWIgNqV$nVEk(_7mDDSm-jXVMeSTd$9Qx-QY*bt-IF6=y0Gm?f!jdlF z9Lu8Cv*&QEA(5vvb~B_SHpN)t-rJv#y@j5ssa-dV_y6e`wCE%vm)8GX{3ZmxAQjZ#z~ipE==4o+K5GDVbrs zjApmOW$CQ>exgl`h-|lA=GVyubDSzOVvEGIyd1X}rK{829J@Hq=Y3J%?h!HcaaGH( zsYQ?Ja0G`7tNH_4kz$C34y`EKG>`CVQV3kMI@|7<^V(OLg3<~^`7s?qSVoM`udb%5 z^<~lIg~MHthkELcMRnbk!g%L+o~eJFdDalRYrdl)Pf7(HE6tEewxj|Rl8wy!r3de; zAiLd3pp_k)lpFioJAqw9>ZzXQt=I6CoWVllH2I_~`Ef|9jySYvJ?rA%M8-(xgRJ<~ zemW1aNDEXa`Kx!+w{4y$Cg2#iYCU}};WoP}J+)JF2Q40a$PxT6%C(KYu=T-M#t zW&?6+^pZ+pb2En6Ur+D@wq{3e3*2{B)y>9 zdlk$(8HCy7eyyQuS zv?rATG%i)H+Vw^{1L_&kBc|Ffj>eaowB$K2nmzSKr@)Y!6NId+(Q`T9I{T%|47ZlH zw=MNGmFqXV7N%Ufrb$0gWCO?>AIXa$yVBy-V`HTv_e)iaP1!09Ft@Uc29d~l?8(0z z7vgF+h?PnBHB6(*P;oD?@~LVR8xB5{R#PU_pR#|;&>@v+Fu0|kmx2C#<3AOuaaQn=k#WAymTd@ z*stDn@D{S(H zBUvs8msjHVxdV@yPa3nTuJa3`Xs9jsCtlB~EN(3mt2X0|@ZON|Hr1CVT5u`OA z{7ULE-AWQT@(<)~WE~YbN8VcnFy2b4RI^j;oTmEK3Dp_>Z@HoqC?_*{VV00(-KJIy z>TEAHzNA_iU8f(6*FByc&3qD5H}p}pVl(t3)~e;N#6YU~bVch=73z8kCgEk2Ya1y- zEjdy@;XCcjNcEz%X|+qwLeOJ)=8{Zs;FOtHl8;fXKc*sBQE9=d={z~F8{R*&Hx0Qt zh#=?fVO;Mc!^dTLgW40JpD`#h>^ISK`@u{lUcN?HKPL&{O*=9BV@$HOLEVI?7%iKt zfEzDY^fQYa)o#X-7>dW3Fv^{k*yRW}yHnw~zL(;xE;qp`J30pxVLT6T>UnRA9dt|I zD?11*qLfH`gfE>@By!%Mu>EM$;q37a^)2}jZu;3o(6C> zysD*g{7d`AoJ#yCW$xj)JR_>`R9HtU zoz92%r0#Fg6c6fOm=2qn7&TTOl9o|u{lcF*lF^I&M#Ufa_HtQAx!OFWqG{`KD_*cc zgqp0oiWXG-__&XX1rkbOx4Pc38M_bV;^a+0aw(pQgsLXdBccF`bo8X-UH5{l)&BMf z96fKY$C8y4isEiIcfCn~ObpH%k;UrgRg>Xi(v zVx_ zKGW0UeBvW%C@JL65uE2^`El*Lt?dr_S(qX<3;&{mv-AUo6kghZjB^0Sd^N>NR)*d9 z=$G)Qd`6EQFU=)Yp?Bgo$X1^jp5fRR(qr!G+9VWEmRb@lWqdWZc2?b)3GJ@G|3kF%{p>ayZ5E~@3@_MsR);t!pY8{=I z0ft=un;bD zcj+DxV{G(tFYPR(-EgzvyxPKgZXX(r2|rU=#%&sXH0TjG!_9CVpU_R@kx`Ju!@ z{L#&7q38K2IYz_Q_r@Q&$Jx=(C5c-)ZKS=7)2l^ymivK)He<2~S)p@(8 z5Z;nkbcE&Rma4Yy)ESMEULayyi6BxzO&o#7%Kbguzw~5iw#pjuf|4TGa2~bSkCd+E zKEl+J^s0TaQ5nWR`cyz#=62#uq=t)1?Vi=_Dni~yh@b^$VC=jRNBTF@3?2dHcXvT* zf?XUvcHi{)ZKz8a68BRXH_A_Id%huVkI*0ySbio-n zfz>;J$HiGM%=WNV)hnE~<~4~}{v?EshGv(xpWf7bD&)-*{I=+KzR1BYKSImx+*Fk{ zE4eEEANIa7Dz0X0^Cf{KK!6~P1q;F5U4py22X}AWLh#1j-90!o9xS-K25&UD!*ufM zy>sVV^JmtYANLQ{Xg@%dYAM_YyH#;b!TVCJv*Ix%?8z2!A z^s*umy`r(Bt&@YHu_F=FA7_MYZGg}lpeKG3Y@oNu7#o@E3);FOX#IR7D<>-*6A=ds zBOND`&QDs6v5nDB7S6BYf6{T}9c&GijDbW@{*Jt`C=tD~u`7^BhlpOt*2>mF$xh$U zn23i5dg#bV^ponN2z?HeSPp&huhYuP97K%FKhGo3D=Ray5HYd*{w2@@1|r74O8n#H zY|tD2eEI*x1!7@fX8RW|(4m%8Bwhn*+f`+j+WX?Z(nHd_<%BZqdZ%C%iPto5hzJOu z2?U}akVU88KY5CrQdbk!FxN;rAYdw@H20Snw3g02jCe|729N4 z2n^3~2^v>j>X{D_2GfLNF$+C84c+X?2JhNR-S^!E+M}wgTduur zep5lo`N~fbx7$j=c$ih{#}s(d`hAYt8})#g!s`nn?z1&lDYK6+-xhrNz{R4Q0GdLY z&J+I49B&dfEi+SDD5?Y(KX!V6BoHa~iv`-4JbfuOmXC66sE*?t;lRGlLa4g5M07s< zb6fn&2f7Eo16$%UwG+uX*gEb5PMvJ0OnOX6ti71)rMsB?bla!)2AQGn^1Z}g-?UkPILve5=qFzm@Tg7T3urr;O& zcN{$vWMS`UV^XELqF+-$U>j^bUV)w;@f@gK8{Y);EO+|8$o?Vm2yvii0W;HfSo^Mi(XD<`YmS5}sP%7~^S?dWHLd5Y>SZ zOB0PLK>Xe83Sq~haQ>QlfHn^rqMEE`z|!mYtww04I|?$z?Rt*Xn=c5p1!Rqxc(zJ4 zC761I=E?Ba+=VyH)GiMLxk%JH@ABt*F9 zlmOO(0MHBmOOelnSCet^HljhgL9!~fb{~42MYOJpC?i#C&$&mNlj-RO_*}?LJ%a1S z+?KQGMyoPtEH+f@il)o^a_R|Dh23Xv1CU3zhN3mw>ycX3OD^=7$J&e)B{A^_R%vYC z2?uo7A@rErE!3=^$Hf%+@$_z}w2h%m`1?-yJ_Z=ofkco}J@mE0DP~2Z*l*Y0xnoo1 zErc|{l^dvBP`^-_Pj$vM=X%5GzNIoBAq}s>4!P{FFk7LG^ zN@*myUHk20Mb+z?)OeUl8VkvUn1CD(ss5zPYKAYf@Nk*$AQE-qn0=Zb)=sdFdtGc# z9aJr*)xTADZ(@oAD)SQNibk5X9u2Cq@7A8{mSYOR#!SX=BT&t2Z$r05a2%!YBIa?B zmV!Py%|(9mv{{qb?*CwACn(O z_>63)VY4ze?uPAM?w85DhO(DMlERnnS2CqKm=(Er@fMqDnn|ogEUwl5sFICQH4Xa# zX?}RDh$s%i{<&$Wj$R%~4%^r0){Aw#`1;k>P~QJ^I>K+X!CwS$;cv!|<8t+!fSybQztNVAI)zVFV=nCsAD3pjh>-9uQXKw*cHh`k>l!{_fl7giBuO(je zlStg!lS#yt+1)NUM4`<@@+-t_i1rD4xMl(M?zeYD{3SjsB^VITFI7L0s8ePWv_&)s}zqfz8?3Li^~Xmo5xG#qOj*M z-8prwcG+Bc>m`0G^pHjVQBy{4t&g$t5jJwwtRfY!&Dn~j_Un8( zo4MZ3BG=QVnZ-*M>8KNvqB^O^qaY;V1w7g*Vo2%qO`fr5Tw0WSypV*Ro|p?6xc`Nq zxJbst2MRjwZw_5ks_FQ%cpru+WZB>Zs|vPAEZI5mIPG4~8&DkHXnDRSygTcamyx6# zoz8Y2O57PU$>%+>1!T1ahfAEG<;kPYd=ZbY=23M%!B+0W3BxPs7~`xaqdsf`&|2*D zH#v~m`Dw{`#z7d0Iw)k8g<5eXHIF)&M}*{zIoIxY|>t1ro9+!^>zY(X(SmA(jxQAwZ|oiWpvP?NJnKIfRP>60RHQzVvk5 z3>Y7-e&gcx>MR<|8@u(gU(k8lRIUY^)yI-`qP3zv`8x_=6;Dz$7o>kB!j&2cxDMdi zUsh**Z{!s_j_&C;QsbuI>cmq<1+dntOH7e-%6GDtzUc9Ko_-l{5%{cdL!Wc5U$BTh znWo#FcRL9*c!MW)MqQ>1NyO4f{>*qomxp41;F`3)@Qnw11UWy@g4VHyD)`N2Uh?;o zlzxOs_5z`_F!ZIUQ^%f)t@q(zTpCodzGZ7MY!G)d>L866Ajc-T`L9xdirBmGYTZ_9r1dQB0UtBw8-0&t>u?Q&#s72As;UVqTR*4vVemtL@Nkps#cT`$!W9@(-X1-NtlX@L{)#0_A>Ni zh)0~_(itF>)bfv@d3eqG%0R~A1LNdgt7UWt{`9t>n&aM@C19=g#$jU&CoFs?k8ca+$vOOqqe*c{lSQcL>=(z z679~_GmerCUnFDqWiw~W?hYyceC_tdw#0YhHH^2F+v)iDOPk=5s!7b|5l*VO;1EMB zlN$SPxq{(^jHws;viF*j1P=yep_*2Lf#S|xry4e8Z?>ga2+3d=HzJAhp1und9j`0jJTHRE-BcmP69nDCaemEaGl`_3w?4mMa?>Jew`@Hz^W314ksc~fQM z8`Wb>8?GQy&Xzax-(}XT%GF2>jGOJtQY%nhxWlYBH1qI>%~Fdi>2 zU4!(wN#dCic$QIfYSo2Hql+xmHM#WhJ>ve?eq83HMTxJ#nY7qPU>KF(W1{A5M2}^zgoWrdwLUq)U2|yFzJIjaGo3O`{E1`7wFw zGx`|1wCRbBbIoug;Gi+L5Q*Ocr!yTsTWgnwy~u5oxw;m2FVt6>RUTWK~VcZ z5XV&ym{CG%AVRm`;Z&qOda3&iL=Yd`Q4W+P8WBag9>dmFC6{dF}@9J2r9l z$4|DfTc^>eFYHrKolr%!Qunt%(JktCS8wJR&_)>WiU}Fcr?J#JW9ATiFJ$t|3S0-& zDBnah#AC21Ja1q5hq6K$hpzH9^yUIFWRmO0E^p(G&_$&N_}lhv_1hN_a9l|>$4?o? zhisKh4V1`Ao>LR^cL0pXqZqP|kgBK%J?>?!fzv?)d*GFkV zbJ|oC7v~LU02wo9<)Um`H12u!JsCE0V-Dt?-bE28-=iBe{dk>!jc#!BwSZ`pwHBwi)I>JjC5N@@JYPi3WSLlyliT?=_LHIXF#ux2J={zEhp)+|KK96zP<^TYl| zUVh#CXWf67^`DQUS8_4{{sNwU)tZQ2&D;oRM#RVl1##%bjm=HXfJB^Z98h6E0VfAL zTdSX82Y?Pv#t8q!iJ1SW&d-~m_z=CkF%+$`13Kwj5zz~p10A8qLbld+wl+VnLLc@= ztO9m6CQi0LgB2jqi~fALu(6@7k@3I4KL_cMQT(3xr>9i6%)~P?T*`@-V3rBt+z_&H zlH7YHfn+1W7jR_3{vYP9dOjL-B=vj@>-@-YXHbvLfbFLdZs-TI=(>v4(sAE5q>oHK z?RD351*vFTzVa>;Q+0B=C|1g>*gLviQJQ{&8p6MWQ2c)p7y=sC;%8iy{}*8>3gS8* zp9igY+IDq~w%mUMsp+cMU3SUUL&GvVNNUI*j=bT3=7;1a^fdAji|}5-X}8PEg{?na zGAuXlDxk%8LT&ixmoY5EBIEOcy=HZvxSj92foHq!hjM8g5UfFTZs)^gmo@p>ie)`E z>&Hj>$7^<0B>-m^_CJ>|50Uf}VgA7DPh z+k41S)K9D7SofmWCbHZGttWlYP^c?yn+1t zMjAON96r2X-Axkhd^*kC@!4-KG$Y@eX{7p^beR@7C%B|>LWv7BI z=O-B>`8t1WB91;9p*_Lvw^>x-H?fVq-qhvUrJZYIr&65RsN2?wrvTO-aiK> zHj^z++g!zym+5iCW!6;|dhH|z>943ZAF?)JYxm09w^qLV5Xh7)fCUMgR_fr{wp}kQ zitw|-4AAFS9B;9&C=JDWL~g&+oSg8?UozGwd{#pwue1!3dRy+j@0asjtKO?-H{l{c zK+3jf-e{j6*AG(%xNn;?nv(oDYl}B60L-*n z_TFonrG%=9lsR(Dbqf{)TearrrG6^T? z0C@YEPy5Nx?yvE9P--~~NaU{IaB&WTny*}^<3zs8uYodJFLab3{&Fop7Q7<)Dk*~X z>C#+F2+cdL4+d@bn0O!WOG`q(?!B0={GpxGd5glYk`=I!k#kxbp&_!p88xC(GrKb} z6$&t9-sF+L;M>w`@eD|t)sTTK>U_+ZAteG6Tj+pnYpHdWmfhWkn^$@sfjdI|q+W_woF!HyWXA^1(;LR)W65q?KC(85R;a}^ z7-e6#1RCIe0ti^I-6CmcGcC7a^>(DzagoX_o*s6FU%t1S|}No-xXun~lYq zjaQo{@Sd3RR*P{p$%vAQr`14KdgKa9ocf)7FD?ATKH({aMfY6x_LVj3x%{NCu zp*ZUVUZ8OY3p+JDeMp_^{c**G}SCKh;ZLboN*u4GB-iLWStc>HAX zPP;W?;EAIMc$W}m>t07k+f$l#aE?vrXc@R?|{8!Hv{dalhUiEoWfj-SmF`>}nkkYD!JDKi_9e>U?_7 zhwXd*9%yo6nPCU2dOU6yY|}gosu~l8rsuf677Y2u9j#kh8UuDm(+$lT?|CJu$;?gH z<26%WoQ}K6jkbDeKR5X?4^ETxc6X-&(;3I?s>o!Xq` zK7qdtPLINbc){gKbW-cW@r#t5cL_KoY*wyQ%66e)jq1du9Ec3DvG#^2L4(GGw-tFvDGdPL1=CZ2PGCL464G z0!@x8eNy}N`1QeAb?vqKgkK9?!r0xX6~fJ?OapiT@bGg!*f8n&2{jt6_I$Sl+dqPH zNy3W<|7hR{kkue){dzMZ93cN9JmR59mx#J|0awmV76~EeIj)~2#(0x%_cJ|pem6V~skq^YA=Z8T19A;lgzNlnh&jf520cv=}n( zJ@P;$YC|Hx55eS63vbDs!D*$=rO``{#^;t)4n?xt3`WErLk#^y7zsq`1K8&XV@4RB z2tmNM^TTCSF_TAgGqFnJYNY^_#3{=357zm!(Ak$3g~|^#pJi{BH5S7;f(jQ2bPSMI z4Ymz5A4oZM3=b!wvocF{vo1ViY66$=xX}aPLz-sui4_(?P0LKCc0yqYkX74p8)L|D z$QkcOZf(EP03?#|RNgu_T!en$!F^kQ*W5eIh+NFet&~@5j_<& zewqsi$-BMX$|0`7k3qm6Ot~1Q#l?xc^oRgCL#n5QE)13>mLf99G7e{VbdT>s;ftv= zl%g|xUi)2&C!e6li>C}^)vSA`qtV6{Oy@md`0(x3Qwp@5ZyPq)&~9j0(9RdH?DfX~ zpo=vMP32W7%_rCnYg~Kz>%E*;uWM`FlR>U(;4!gl7}Z_jSW? zL8+L$2i&o0V$1+mq+uT%BYrx`T-I2_dcdxJ?CcG>Zt!%*aHE;RM*qhjQ8=JcjoK-ARI_;Oo;+wYX&WOws~d zF5kzQbu~-U1#*$s#Wu+&peHBxV0S4+$sUt~aezzeoIS{K7}{5*r#Pm0K(oYj&$q^? z_5fIWm5z?3L~B8!dxa8Fx(A3U&kooO1zleBQ80;wF*-8h6VlaO(}iJ_AdEOu)a$y` zt(Pe}NvY{oU>?gd?H<1?S+=Er+4^f_l|I_7myl7BodbQ8rehRI z!V)bu6qaMsF)OUrX;c5P@PYTm4gj;tTqbY)TU?)atCJg-qo-(*Xb|!v+5|%Do4s9KFyqF43yo>x^uY_Dnr~$5K^jd zAd2qG)J}@=6=queDIB>n?Sqgqj?}x7)MFWhi9+#ZS$l#iGJ;zLR^>Xyoq|vb@(nqM z5b*TZcqcNFKc^T_vmpuJ{Z6RbRm4*ykx8CM$4}J|sE8#hA>OQS<*Hiar>)vP)Mj_8snRU`yp6FTG=l%v$QDx@$yKXV| zRkVSIVyvEYnB}~hUwY)|bt1v%G^;qAuW_q-&GBzhmqyAVT1<^f+~W=dejFZftYdbg zhQzYmF&vmE8k)54kh4gndU?9IV~ey>#&G+DO(p>^9JSB{6zM7X8SCZSL`>skPsznL z8dazPILozSmpccvqcn*8uc7atPz;Y z;!Xx((s`V&hrrQjS#@At4i*-3;?a1(kJNZN?V*iXHVx$e+Z zX?7{xdjE&@w0Vwm)#r9KUF0S$i^0}m3RA=@`MtT$DMoK#XKh6&IZNJ_=?xf6g_~Bm zIXZF!;M)sM#n`6}UM1WHs|mZE;{h$XHf2PdXu=0Ux6%&HKW}mJv^A8KhUcx^YFhWN zqf>+I-3pk{NSn==CH6UYRR}ig z+Yk=j*2QEu;-p&>NZLi+1iWo>Z0hWcmtX!$7WGGq=fip?W3;N1J&TxGJH_He43MPh zMpc3gwOuC=Ja<^<5J99PHStp7*GheUI_yG)+NXg)lYAn=n~|Eg>h6;}s}MTfm#fgM z)GflZ2?5zxwTBPhOfc5r*ca!y<6zP=k`V_%*K>@vX^tfpx5T5YUZH;6;qg2fw71*l zeca;9AirFJtej^Fu*|QIr7>WpfXiJ;!Eh2x;Xyp*0$sb$RWk9IKgc`8F+ z6hd=pwL4eG!ajAsX#{<5$BTWtoiW9EwR5{jNO7UT4X9n4uVuK-vZ`6kjF-@cqmXqD ztx!E*Pb%jsho6d|K=`!M;-yV`}cJ z2hKL-m(C08r+Ne$!L7emKuUX{kuyUjCmhFMHWLlYtbkYbPC!f1GYJCTW~s>=hjt}%OoVLEgu~@* z?bU8__jHNBnrJTd99uM>^6?b$!Wl0bPQQvO%sGL!-e6!#iUQC0)wPtziPy^6Ye`{b z;xgazZk!N)$v(7zDYBgcOv{p&iL$j_TX`;2jHg4&onpcVT7tNA{Qh~ljKVzKdjo$Kd7KbC@W!$MQ_5&S;&!2BSwiQ}|=z@1Nx#)zV%hH`JuK|2GVP>bF6H7BKUq18%aIjnrOGR#! z=}*zhxQ(qb(&cRB_X&FvUe;yBXS2`@rxjyk-HnOT??ESP4<}fc2-&0i1nAL1W#Wvq z#*}Rpv**@Ho#}Uwk+>2qdnWPC<3f+GJN*_P*SX`dSCT1MU!%dS!^KBnAfBG<_1v|d z2OeMf*K*89mU43XCncqW0XuBHd~YRGYt>yQ&@_z)bxO?gxi;rL19c2a+#PA8bNC3S zm%FE3$4j>cHoF^fZuDFhXBF&Lgy6=Q`$&YY2CkJSw9+2novUd0`UvuBlE>tthP2HwxJ$@EjzB2(NZC({Bg=k7VZ00 zVBLO=nz=adB9G`zo7pT$^ZlcgSK2pIw6vb&pLB;6eM|~%AW9)NGUZZHFCX049$s%M zw{8_N-;Nl39i=VN8dzG0r{(G;_^YomY{BMu<`F6atmE%{w%q7b8ybVDkzZd7?BS41 zU9aU|Cmcxzv{Q^EjZs&Tmk!-kZ~$EnMb}ht=1F0w5&| zGQk7%=EO(fp((Xd(u&LWqVM0aZLW&#*c7F>?-7rAY zh?l)$9({SSj>JQDSJp#LH>0E9bOWtHc!| zs8}V6Fh$8$GQnFT->|p3lvCQxC9PX|z47_9`%brI{r1Q&Q*qqDkg}_= zj^h*A4%IjL2sgy@b+l=&AaMRmZKHJ&EcAXET_-#;XKKE>P&TP6S2YzPu<4k=H9(nH zs~F6hK&|ziHt4TuM@QV7U_&k+{ZetWgM=1nhFy+?S?a38FvN@QN~c8y!WXI-iFlwv zM-i1m&E<&_`4IdE|8l}=RxF`x;}l{HLpA6iv)cS1T>ijUBq1EAunh9WvoY=U_sKAq zx9@-aCU7wk3Vy`MDOk;AO;u#}+H|wONWE=C;%sELZJo*An`w>otf@~m$caJd9p<0` zWd*tvP&!FPlj{}>FUQ2~F$HXm7kCe=1?L)QoQLn&fvO{rBHdcBR&ZRdaH zvico)QWE@-xpR3{`wqP)f3SxNLAb4;3T5>?C8cFEl`ycjH_4p1US@�i{a1>$nfnLW(JSe0@wl!_5k%X8z%*%ueCv3PN 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∓ zl~k?7AeG*IEpA_v`&4v9<}te|606M?rPX53G#sqrh%ix`ex-WTdU=p&#>Z7stG=8O zFahO48UBabM}u~^R_1zqeK=fT`H-c^P-v6Yq!Ze9?s3IH7a85FA;j8BMU(h;YV`nC zNspUyV!HEipOXSPnWDD@!+dQ9E*5REfw`C;R2EX*H%r~gGwa4yjC;eGG3PYnY}y6X8cXg7!(mk%EpzHV`kvqG z$XTHYDVl>;dKDZQ4Zq5>5B$${KL8HCXhXW*i-pk;93#0iCGjy@y-7M`ht_*CuQ6~L z9=B3M{4(X%`kpav`Txh>H-P zEt6~fJ@SUL0tts7!*IVwU0`Lf1-Tp}u!d6V&#|udX)OFOw>64G#n9U2JdHvd<+B{V z!dff+5M6s4nFHC#c+YZpK;ZF9bnT1t-EaZQK6$&BbaRjEHO>6G0<_ExQ2Jc5(#vFv%V9W9T|L_1g-46I=!TiTEU!T+znX_7g;X; z^#N{U)_LlCb|o5ep2*u4o%sFe%6Zi?YrvVWys7&<3Bbu|IZa1S+|vk6$L!q$XTC{H z^uK?BJR;Fm0i4^rle$uhO5gNwlIJq8oTr`J=Pzmm+_`Y!f-oS;?6S+ ze-GTn>G906_(Hl}9@Gt?cjVM*??Sw+ZVD9f3p`xXPU7NQLw{eQ>x%!&-G~YFgrx3v z2}@B&P-V0Lr6Wvli>6TG+uwb9vC+tnw=r~A{khrClb`w@VKH!BUx}XX6iIDY6faWe z*$&hJ0B={NBu|-rkkT5fhnmV9pN^n9PSOt34+tPwVbr(PI&yUuzsiEF3=e+BBYnJW za6GX+p&Diz2mVF%5h{D!yR2Zg`SI@0Bt(e}PrvIj$sfC#;<(uZcU`dg3ZUJtQc;%+ zCh^zunh|7{{9Gd8e^rBU{s`mjv4$t$P*)+kvQcmUA- zu6H_Q__~tH^fhZy__>=|es}mUDlVfRtsJY2$YZNR(_=ekR2K0MaL>X?me(i)y2W z7}7rp{L;25MuJ9L#;IDQ#{Vh-KA@I%cXurmF9A#kkCfD|eHz>% zsF#ND3Cn?7-MAS#xGHb$_EWK6{#{EeGEoV$$@qL%T?M%;0yo3m5{7t=j zv+pe3E&o;ETDO#|TnPRVFYpoMbuz-wR!9hE5R$hlz<(z9pUM4a za{rm!|7%h1`M7|MQy{}d`Jen{4}TiwO3}ASr(QyQ#Pj^Ocr2uR#7s@f_x~i0pVtb5 zzWW|UemjoG^2%K{{O;C&JC0MxtE&n=>3z>%9EB`Km-;U#~AvY)A*8b}_-o~DEgYy3% zj=$uR6Hxyy@SpVZpW?XUY3AsQ-zD(daopEL8JYg?-*>XR$NJB`rd;UIJU&zGdSR*~a?Ci_b>r+_Ac3Paaq7raHf+j%-4g zzhxiO8f&I-`mN9JeEUWhL(saMeV z`_MKX90WJLyCm85@=3_`$R-uy*coc8j)V((iMim*8TlX z1M8t~&l)|G+?F*^Q)M&U$pjmq2WG4icLw`o#P;F1KY;Ad<)F*giI&9N zLFcVWGpw$YjkEK&=l-4seW!H<_j*@wa^jW{LWcZUclbB%a&4Epgt=YDWeNO4PWg)+ z92tFfl#s0{N(_}}dZ0Ab(UFL|WWu<9uc^%<)C-G+AWvb%S9iQ+dSIR_R>mE!BC=9&tI zKE-=D7ic(rO|0O|J?J$*&Es%r%6e}5tCblF*V>3SF5(w^FV&P7o&3|2`*0aY;BM+(m6f( z!oJ*vb{(J3sE`g)n0Lhuy&U&&f^Ec8FFRU3a=w3vn8;hx3DpSQHEAbD%eC!_FN2Dd z-lQbOLq(8=LCIyusle;ftj`aof@%?)fYmM|!FAeO+^WC$%bL>b`l-a~xVW_*)K0w9 zs>RgIoG2iM^=au>D>-c@$WG0u4gcyl>;XDwzy;w~?xRdU$?}jVO;0~@k0xZw)98E@pLR(UzW!5g{B>VE)Ml+2K08F< zKWS-J9Ut3!$z;#b3l#ijk%aXX$S5gprIgX^EhOU2yoj~86n zndQz!sZR%!{R5} z7YO2iacmlpaKYW;@*Zyl`M)?5%k3VLG_;iYoUNq{ZD{@&Heu3mHxB9-C_`+oBy-GzpjM*f?EG`p??%#et{1E z#lSzxL_d=o|Bqu}L`>P2@Nn)v$E`7^;6cx>eKejspXLqMX2i4H<}A@upI=yE$1v}~#b%?qQIOQL>VdKj9`zg_oLL}?Jb5Qr?I_hnQT8Aq_O2&=j>BU;` z8-M(104lop_3alK8W{6Gl@@;?H~#Q1cf^PWu`N7q)+^Nw5Ui3w9>nKZW-+eBY{jPp z={C4{Eoz$b=|2=Ye<4V3X*3ER2gN`zVk%WYe9#g$%j%ao-P_i{*9`}q94$C#w)hw> z9$C;s7Gh-d`{HM~$!-z?QYi^*qMhv$h?`3XZuHY!|JG9Og)OPB>C*QOgEsV2(Kc>t ztk@E?mw>fP;;Ko6+ZF*_{}xCd%}8_?0+unvMEd^y*$upLC1j0R>o}m56dy?VH2h=X z_LtKgQ>Wj=+kt9e*-J)g=+*)n?UWw`%R|oDiq6l6rk)8s6HnlFev7J0kQz0*1(wFZ zF%tEgXYUxY+`h@%kO)Gd+)wpI*rd@yi-{J zg=5NEHVq@gYa~N6)xXGJn$>EId3W<+d8L1oE=|_4(USwyXQSvYm@Kr>SqlyIn(>%f z8IC#@CH*h_bUjRL8Q-~*ddxcpiW)EQVzt#9kFXY2q!panmL(*%f881JOK|QivAV^qJ(nFDJI~i+NB6S?vij5<3cF1T1nhwFT(a7z* zqRo8+OW933>zXvkxjYA=`_9L_)>gH+e&53x{6WWG48{W#vN&AIz?c5@5!Hzz2+y>$ z>AV`Qn!XR-CUzg155w{g$9Z56KBN&4?V|VksF`v4I|=q%zOKiw;tEii`xX@43$+fJUK-Prf~e8TFCc(d0$3OnB9s5n>PIF-G#)Q~~r^+2ht zRn!&cRp%{m>{t zrY1O%`Ngjxm*2&d+ATE|N!Oz0TN_mmwsZ*KichMdZTPTCqD@c-{kv1aXDfQP`d2-> z$UHZv3~hcNX?-WzB@$RKZaI9O)%4jH>f$)HY_|hfy#sET`!MZqoYhzv7#PVG@C5D|3TgSuO#N56pv;0kQ<_&yL^6HQ$HYK*G z+R@VePGH=1PU(EH?NrChL9fn6N`TH|n?ZHPJpsODzNFIwOPhRy$gu*$^jun^Sah$` z(7f*s`^?RR1KuYcr(L!Jg7fXTqiSqPt=t^3wJ+E21e{qgzz06O{oUd6Zq!lEsNn_oC+cAC;4U%T!=bu3vC|1n+BHqZ z*@&X%1@}#T7DY<3#z$pb-qxP4qQ00($D*Tgnz?~xCd7Fgrbf@GT5!C!IWO*miw)lj zPWS!D*XMRz7AfPgo7#H9PIJ0O8ZZRpN7HiI1H5yabDeJqtjL((w*eX?Ev-VerxyDE zr!Nds2zh!@arqSNTPr{l8sCcfhnk)zhJu7dudsM>2ilWo?5pJ%<9%TEuPU_lvpe(C7y*%<%2#VUN)9Ebsr>3%>^EGmg;|lo5 zg75XTnT>ZIP#q=vxs#ce=D=W)jn|qF6?Pja);GR4PZqxNr*_DnvyC#VN<$iaMnFw6 z4bXsD92yzX1>lzA{@Y*pfK8(ffu~m8p@qw%T4nByOP7EfhdQPaOafl` ze!=}u{dB+N9)Gyzhh-u}tXUBBi2J3iYpKM(r)tMp*>e1wW(Hw&V(;@7^u zUos<`49^98s%W4^dREYRVzQx0e4&0PZpgtx%*nE3yYd@g8q29#`ct>%FB#FwJBI496Ox%5|ymaGZE^7IeKdJ-u47IPD zUmsm!b5(3zQtamM3-*LcuOK_{8vq&4?Tp8kGzwu4YdSQwZ?;8Pdn{!K#`w4lJgCNb zjF*s!2-)|7hWT%mk>5E-0p%!Xyi>|DAr@N;pIaHj0LNPtyjlx$+Z@A@iCuATo#olH zjXQnP9*52?45AgjvfTH*R$v^{u1)r9r|K^W-1|HZTm0R#EO%lta1l$`dbfAN>jS7$ zm!LOWn&x6~S$I!Wy7Q7%pkcL7kNO+V{4GOLXZC%J&x-(2B7SdbZhIrQB6TW0$6-=k z;HW6N%7)(aT|Ptrv}W{p_QB47OJ{#aE7Zf8j^WFC5g}!hEqwHdD0b|Ks9*t(AfO;1QmrUTQKW`mr6eF# zYQzGfA}Z3GSU^eur9?tiRHWC?LK2WF5JF8TDR1q7V!7vD?;CHtaewdm4+C-UwfA0Y zu35f0=eM*LDw?rTmD_87*{eTAbJ|*uj%4i6vFq*oS#UTU&|o)MLYRl6yr~IB&s6a2cU?yk{v@fn-U$8F7_&j?LgnF(0Lpb9Vh)bp3O}ta-4!|2UX# zwYU-hlE`-#RAO5AC4wI!yI#c7vwCmfXCVXDqwLo6wZ8p#Y{j?Iu}Stg0*&^9Sdcdd zyA#_vc)mqh(Q78F)`7!1Xkokj&J<^U-17kkiQ7GPOu%Ks=^U~mKuXNZ?#EWqI18?f zTC8)fDql!2{+1x9C2qX3W`6r&6g^v+gi(;fPo0~%U0XQX@W`hmOi}Ik6@`BKwW_s1 zs$QNn$%K_kKlYMK;6ck%grro@XV;PFGGd{bjawy22|H9ytT<>gvhV0#2N8j>c z#9=>VvUUwOXV%L{-0jw{EWY~tQ`vkm;i?!UG(f7SyO~B#SXHQC>jr*MD%T$OYLd5r zz_DgN!u}m)^tC4-%)ex$FvHcjZ96+xeoh#&ZT|CqOUEzdtxfV)?l98Jqxvb=Vn%sx zvFylZD<8<}3?4sRcScUVGZOU=9_vz+PwUorAZRiLUM;SEPp z!xZ6dxgGK7WOc6Jcis|Jc7;F*jl|uK6C`S!dpVXU;o(Z9Qw$jd{8n8Te$6a zRLpmkWl{@1@$V?(rgXD=!62Riy6M1w<4S*vNkK~F_dU0lh99=^0^JIBj^4s;|5F?8 z^Gvnao6{gB{$Vy3dNSs>ftJ{k8}YXn+6dJ)mj;4vwC}3ee^*v&e(WRsU0M05NAkC2 z<;PaLAHMG2D0Ax{+X#PKR(@;%{RS;V>9c<$D?c^2{G zeV?C%?OShj-KICdi|~3TIY&en&V~5ZE~G`W%GTh}#3`jC^X&u8|57La)b;r_EusYK zXhFF#=oz@1IaqWbTb_#ZoiT=rDuR7|iN(I8xh3^eXgqc(jp{u-p~%4cE62CH0F<$K zD%P43i)?-4L7Dz{uK7R8vU+C`QK30MnTj0zOcE>fG&=w_D~xn5FsR(`0Len%o2!eQ zs_WX|^Np$h+HU_S8sF^}g?Tkrg}*qpC! z(?DF>R5;mSr`#kcspnL{yz&}oRww&D3AqHNHy(@5Q8?#rl;tm`ISBJT5vl*ufdACF zzSw2p$z~nnuIKQ=Kd7jUPTfhKo0OMGNs(m~oJ${}-v0t$56V)z}QT5RTsQ(``z zetX$9_%0HFA!LTr=ekDv*n2-L1n;yE<^;CyER)V8cSXuCDp|4}_Oc}E& zs_Ia@(vvJ04ozNYX6VEk&c)9(OYY{AgzW{r4EQh8y}et$-2_JOTI51EP_K zzjQKSGW27sQoa0X!`9@`CI~y>W!jeVaBxoLuggetsSV;~Zy_)z`Zp*7!WK-;NN3xI zS<;A3(06?eZKytGnVkdLmi^kH4Mz_7;k}FipI24dqbwv|oT#B;$JJ~aK<`YLN-#cz%JsD@zDtS!q$TBuR0OuG3 zu9Nu(dtPbbS!i&upTL7R=gv}=)BN1 zF6R!&3|KjgnrXSz1J0BVz}4{184dUhzI9eW!pC+7GJ5~(n8G#QKj8N6Oi!B=gXsidB#sV`SDk3mw}ZoidMs@ zre(%?0taRKpDHR^rh-FiDs#bm_ovM&CQWzMde4B?veL0w?jb<;;%?ER=;FpRZ^wV@ zdlp+B1X(Q)BF$Tf`6y;qAgCCDC{-q7W4oi4xk79(^l;yaJ_a=qmP?whlL@E978fwx zvpD7K%7V=9PzH})VS*g-MDl%c179SRW&G6jDKl z9`c9@CCJ)vIw&-B@7IUeYFOXe5BNd;EfL0I{O6}c6-iU~9U*d9V;u|_vAk2pz1!Cf zNmGg$9|aYtQ*Ae7%dkEzcHd=DuB+H)mj9gl_{q*E$knrw{vZS>vCH6{F8x@If7Trj zGOQps-)7iN8o3q}9hYxiS_;b@+2(~}ESRvhgJ}o(e-2B2@~gJB2z+CBStx_iIJ;Kr zzi07~e3|v`@h?&6PuA>vikEpadyHSQ)#AS=XLwSxO4ID;+kSFue(lCx7TRPI@^dci zKhs>?I4XQT@aNlp^1Z(ne=K4D%1^T8(#0F9zs&xRj{d(O4Eeo9TcqXrvuOXCo8-@; zeIrx)v(xsh|Nq=hLz8_Oktie7rdHZ@J9Yq|d{0z$Fn_rg-U_{7kg?}VItBNX0HQ0s z!*}OtKx20NK!l}s$sw+z!u1g#@tjx4YT^+)a~bTdfLP2>CuWNCLgNXjJV2M<@B0q> zh%|PSg@-g-gx}b7iVaYzSltU-Pc%&e5C|~8 zp8bJVLLlGI`p@uxCI{k!`y)AjwiVD2fKKp_QuseZV}f91h=b4y>iFzy1JNK`=yH9j zfbjZO)RRZs?O($}4A-e`26cGD+UBS9)-2kWZ(w9h1v^MdU#U5zQwYF0Mm4dh7zy>7 zKm~w1<=uwg=ze8S0VSB8?xQ%Omo}Ba!XtYuq(_If=RLrvVJF9@XRZPEP;I@#AJ&h% zvGNTcS1hvNb%0i#?a#Ga2R1i9e5P!@!L?}Ut`1@Sx}j(QLzWCb#8WJmvE|RZ^Ixe_ z@8WIK{=U20){~XxO5L~q&N`^F5J)H}7V#!0s?C+;#m2Sgc{xzK-+M{P(LmgsM`rd- zp=&R)Dzq7(j^;c3k<)l~7KC+K9O`aMYY_{vRJkaJ;2o9?4n3v0X14o3AMd>0_B1ho1puqCEuzXtS*V&=;<{Z&cU<%S>}*VSUrUEbQm7rjkfem*OR`|| zvCHBd>08!sKJf{vdRfB0eed^BhIcn6eo}kTno5&8=utMOfF~WDpk=J1w-Clt8J)in zrAX@el_2J$x5f3`E?i-DI|?c(x>h2z@_R6_G0^oul6fo*ikwAufxM88~@f#!ySgQSS{yfL2%0sppepk4Lxx zo>yja4Nr7DjzFG$tB#a+QTxx6zKAt~VsxVX4)&JJ`eam_Ifm3&OGhIdtV@m~TRIpG zsdS!<0!pqanQ=o|;3~<3J~{yiQ;x-(t7Nes&7XQlG2Hb2h9=+o6$J%$OiO780yUoxuYQlXpAA$-Bh~5aN@^e>({Vqr1Ucu*qO57ua74?-?O`sJpey4 z1f&2SW1`=5nW`F1%nm9-VWk|PAApslMsKak;Cr6ff++eh#4CiP!Ha1bMa7`0j(T%O z&2);6=hfPAUvX|Vl2Llw^rkNv)R4}0LlqcZ(*QtKA01@47n2dUj=p-^7hepfA|2vd zUcUnHB~Ri}NZW&gH^B=G^~!UU7RL(AKfR3qn@oZNbHG_d0CjF^eN%Pj>YVX~UWwXF zRTR_>0ys)q(aaJeeZtzy6uXw-?mJe&GaKjV*y6oNk|Nvo>=XbBn*!HL$-6J?fm*yR zBR|%#VsKcS769v&&@I>r%|9rO`u5=U11s$D45y6eqD7zm4?Td&H0gwqq`SXDhb^Fr zV~3k+?z`8&Y_vTUEZq}!_q$U3y_uvBI-dNXC(CY4Pdalp-j`gBCgRA2UZtfzwGbQh z4x;?^Z>%WI5m;@&_Qiq=7rk>W_*CHAzLTuA3R%A*^fqheO7^RDw!Si_i*3qJvM==Q z3{vWDa3FN7PKDa+$VXkSzEEV8#?Op{jE;Xdbp%JG@BT2-nT{M7mJ-M({p!<8o=x7e zwDv4ZPo!*E%zoBw*jD6>m6vCP8hUvO#OBS8Wk^lh3e$oY-j!}bzn z0r95a@k-0J!4>nd^MKi+&OfVy+ICg#4y5xnf|UL~zd-r*QpMyo%;#4zKo#6s6oZ%g z@3!rj*CR?MuW^7C_gL(f#PnEMm*D@RPV{o-Hbj0-J~-o#39 zo1MfIZXhZ5(D&^3Ox?8oa9=82n>w7~HfgINpl z@!~|<_G+z>5`^kc*GJq`!fyQ7Ij`8*!R3@+O=8sZraON9&so=CSKNGhVnHFN0LK<< zjh=^t7bg;1k-E)Z?IyHL2Uq%~@ZWnoU+A&|T>c+7(uz|73yMx_<$1T%+FvYaN~q4E z)|eI0GMQ{-(>k~9#(ZJRdT^u(?q9eek1h%?j|*X~<)yugE>FtFi2uCnQo;@{pD$$L z17~{t#|^}{dFKN4(k1?bZ779b{I3*kqYoy|dsxeKcEu$T(>3!v{z`lYe@EcIa@_q9 zc*Gxp2maC@f&Vueo}q|CQR&9u=nE6{qUQU_gnYN7Ffh6f#bLrWuA~{Bp~kflJCf*q z6C6$;;&$#htIbGP^apLzlX^Ye4qpap!5HVENUdi+NbBA6y^hh)gOt-5 zqTWHeQ}^%>YO%v_@v6J&@3tbh%=6xHeQ$-X&9NGc$5^pdo-O8svF24stKAj&-uPUT zg$#ws{8jZ@t)Da4SlZ^t*K$;Z3g!;PL4Jmajw*WEZWVO8lSw`M_ZrWU1JX_lS7BDc zXj&}iH`Cw;12fVOw7cI2Fw3o|-jpv}k*Zyg@i`FngIyUZS-k3$j_KXvRSV9a(l_SL zmntQ6R^!Z779wjPiT|9jA39yj@6@L6t#`>z$kJxcUo{|PKc=$;vZ^Ic8@{(4Z{i`v zy%ijIV1^D$O@z@TZ$WLvFd^ zaTLmJZdLu>FfVb3jOfBuPg65L7%yWP%*s>Wn}tqah?h-QZV5P%K|ehTG1jsfI{K;P z>B{e|LFYQiRav;oWlQdKDrBmaO!9s(z8$rTV)IA17DVv>1>y250gwwPz!#3H*U34K z)~%#q{!!Qj|5h4i`B}Q!Y{tcX%@Csvy5kCSrGkldHpH{aXk_}-6KSNm{1!lU!sss= zFGS&t$ojJ5TEbB?9B1Z z$1UzWTujg#F5-5Jg`oUZQV?6+LsXD_?GE zMX7s_3>78}7F~C(MJkTxm&Fx*_Cim|<8h@9oEgQWbl(;)1P={^5PjqnXBG6`JiVwBpVT8iv%L+Kdd8+jXL(nq}XmWDv|zCO&_kr@&wOpBrT zIp;GLYSv}}*26MW3E8?v)h zaCVS>G4-_rGm|XiGh0X)uK_M!Zc+b-j1D(k*~bJCCMi`+1*mT-e?!2=Qe!a_6e$@BhCS& zg6gHNNF`$8Mm!9Rh3@r zM5Qjpu+Ru_YU0;2KyaqoQVz~S&|job-f~LE0C_#Q@mx~3uRFv<1z?GDdfgi!DrR4@ z2^u3<gQHRh|7khccCA^ z=VlH$OuinlV9bHjl<4dsUzCre;|B>?dG#V$2#xx1^(M@h5zg^Jv2bR_m)vGNJ;8f= zm>{kI9hO87Ob4hB3j!;c|G=vr;ba6|b5(whGcn+)r5)D(G4^FOmTQ5KPI^=7M zuWr!Sr3Np0-#$ameKg2VpS<%5sK zm}3;5PeaE5q6Uu!1R$o!n4XmA*(GB1zG`|)Aprcx5}ZXzvPcgm*@`1WH(j)aZS7{Z z6_;4BLf9HejQo1{d@EVkHDlv4pzszV0Pndw*#}O^au-cyo^GD*Y*W0}T5Q=rQb?Zt zG*kL8%K>VPU!y)S$eI4nqgKw-@j|0|_eLF43X-M_<9HS3K(}YSt2Q2n0RW?z*;kbn^)m;fv1;ZXa$q`Rru*-{pVTp4YH? zwEM<2_J^i?yZzR$fSH-Cm@ASQ_BsgL;kMM2ni=ue@+|H(5g$H!7Dbj$oRfETFebX? zH@HnH+vcRG#~#(1$}@DWnZau&tys@@@IlEnJobuK-IEpTw`nN3oO3xBdhFU?OV|Lk z{c_@|E*m>^k(Nox$lx2H%Npz}*8I(f;m5qF;8VKxm*16@=SiMt_JLoQuq|D=rqyt# z&a$<4{_?Ham`Vu$mW>G)CqhfdXSr=(8TRxnAKlS?ZQ`btau|0)7g{7>49%X|I6Nn> zFHO&w)@&L-^UfDJ;ZFQi+h62qa#0HI>pUoM_Ph;~Qo0GouuzzOiKQw`zPIRGlAqe0 z^5obCzJpJ$4TKGZ3Ecpm3HwKo`yf9!&T?zEUcJ(2C$fAh)j2)FGts?c;>_L4s`SDU zzcNpl&ui!YTD3e!+deyAcXzRgfAWk5T#wSuLZg{)x!O~1EmmX&|7eVLOfx)=3;sPIs3h$!i>H2 zKR=9eFFL;r8gRBK~xfBgq(v^~jYN8w=O5`F0oHwSkt7h~qZ-PK^r;lJ6~mv3H=--y3x35K~=@`gPn z-_#G9bnW{kBd5?(Mbm>l{{88BdHf3W;k)uBRT4yP`N?UC9NT|-r%UdoY~cPCX*>MN z`LJ^RaWXmW{(3KIWz4?UVQ;!a)P-J&$jvr6!?CEL=9ZLyT5=8i+SQQ%nd!vtwih!s zMj^p{QTDi4k;QTvL?SL6s@33KyL98g#2coQ{RRb<7%aJDaSM0sr@t=TkJ9k zHS1UPs3?OW-eR9=WnKqz7_Iuo{j)al^ad&>5biO-0~2@#3u$`}rn@uaKxQwAdJ0Wp zywQ6KgQ0zBIt*f_EX$2%`P=Nvw_GLDIrTFy#}Vgv$11rw8dV}DVgtF1vvPaYO-NH{ z!pIh{I&~(^?0v1bX|a(fBTa9hw)k_H{@fTvod$`9$1;NVIhUcKxsxt-m0mNaPoY== z0=t{YwMXJuMO7)(w3 z2f?vx(Ri30N6Z;(15J)=tcjmMkXEZ(S`9Z}V=ny~6ezh$A7F`9#fAt$OpbGZ&8FHn z1--P-=yhITS84jF6%Sy-`g5dnC&fFQT9(4Gg`A3dsV-X3y3<(kMfYH%2vhPy2oTB2 z#TN!L!Huur*~ls1*BHLrxBJ>Nq7M>x{0KT7MpVfkyFcgYAx_l+r?(F|V1+~+!GsBH4*9}yzV(AOP4TF_KS7=K&M-W65%5rtV(g(tK1<8B1&|DnC169T+%7Gg3OJFxbl3%F8Xv0g{o(e-Ut7M|!hX^he zXNjRMpXtl0b3|YLp20VbqNv9sfyn;M5PkoG-D4wD!Ne>^V0pXkdJ@cZ?nkSECVGVa*i9p}8UN@~|yxEhY z_T8&Zvv0)-Ka6L6?}1Y$|LX1&fA0P>Ymh8mEBPZWK+pZ}?h>#>tc?t<)&I&beqHR0 z>7J}&1?Hfp*c+?c%y5gK! zrFZSDpj)JeL*+pjq=RQ}Ar*Rtm>x|8x7Pas3v-!CU2z-X)3VpDa;GY2l-_vk%|wz^BFGiOZY8V&STCBh*$5?Yq-t&lso zor-*ug=+ygAZ1FuZY)E|ukBUT%(0W`DC~t)(P=bq+|^IDYSHm(YLMoJHlNBS=stZL z=0uG*eQjrjrim?Qo-(CK)R93?8pY$Ie7{bv>78k)yqr2t}bs>$+=Ws5scg&LxUQIfF66 zB888rgaW9GKStrIKPa%;P$%bImpcI6%2jn{8zv(=h?_`!YJ@_G@TX3d$MH8hUJYt z8RNsk=>=b?8O1X;kz$48o)lbM+%zSj%sS84%{=9SJHe+IzUw2W0&M`8>|hG@{rNOi*)3R8Px1q&2;3{fz&Z$RB8N1<0GQ-|mi;wo-A<`LdNjP^G=hNc(uz`f& z^NJ1Y646*WUITZrFr6n#RL`m}#lR;~l$)Loa_BkneaLip4;!v4h8W zBv;KWarHjwppIMP?RRfIg^>gtD?D_1g=A?rv!DnE6A%)wLv@joV_rlUM81Q(;YvTa z54o|8;&ioz;7P4d6|L%Z`y6Tay4*r$BI(VRDhK}lzn5Jk#rcj+p%AL_twPTbw?gfD zYP@*QYF!;3ysIhMZ^mrf&z0y#pu7!`e=yRDq7s;V(oZ+HrhM??9aK-3G$){DaBB*e zMvV3Q_Zw9mO1iG_`KGheDw{!C-%~p-+dI!=4*NFLoGpx>(?T4}xCssOOKiR|QE$8n0qG55VUV+k6H# zkYzk;WM|=qL;{}>SFi12SH0Ff_riI+z0DJfnow4T;7e?EV;EJohii+ZZM65q6LWzq z{$6Ke`Ai<8bA9*F>Yi5TRZEi4zYg-$wlF4{xR6~nA?I0Zyl0H<-=zLRd zfA(yQ$g;l2N$IMek6*|cF`W!c-4HiI=?7fgM&&l)MR}HXn6ARf7}r{n4+3c|m0^mF zWyr4H>YT=#Q~GhzxdobmIisQEU6DBn>AIh3yarp$Of6Ss4;^Z8AjpQjbf61c$?#1W zx7;m6Kc9=7b|$5x>!P(3j^&=u?5GS;%xavCci=UajWtmCqD&nZJoJ`187}DH^X2LY zC5fz^iF1+K5uj8QKWJ!2s%^SQVxOpPYFd-GaY9RtD=O(~T5ggH11YUCwcS zl(aVN@_zi8OPF{F8xWC)qwKv#qN0nPThEH{S0|<04lNTbdGtW7D6IP6b14y9@gx~) zmol$TU-O9Vt?V2bf7`OYYx!$Gc-QL6G^SVTJeV1Obzdmpu%3Ohl~Q}Hjbvre zix-bCkIb&Jxu5%fWItM~*4{f0RnhWB#PR~K0oCLH(1L`iRz~=EJ`X;sA7j*1$X}Cp zEXSvpDK}T)cpG7l;=!wwp+-3Ktke~T(0PTIR8EJuDdrHqWT$3`w`fHg_FpFvX2+$l z2$>17{DloBu3aGd!uy8i7Q0jr=L!)_XsTFvzq*=&Sc~s?6RNL`iy^+kdEBS-!Mq%^r6+EiLKa;vxCD%wm(qc#lUk`N{I`cRntrF&{JLQtZI2U$NXU6^qhiIsTP-3vc zlmY4J!>5N2G^W_^$1YX1vnKKGN-^aOH%2PkQC#xx*qjDo#unXWRtc-}s9l1>KKP}< zstSK!GM8wGNsYmdsLY8F9dakLa~c%v^DA`|D?0oYd!KunqMIp|9=*p>EC{rZVY%>K zh!l9%D5aS?j(MU?Ej#yr(3U=^W8i;9fUQF+uO|wp--S1F4wb6C4tp!7GJX%n*P@?)KT$y; zKKksgoS}93cTSIpz(XWNXDXkJVWOO3jjl8ry2c6=VncyodlHv=nkj$?w*?G-G@1sGxzu?;WNEu*Q4?w35&P%kd!61=%=_U0s-Z&wttez#wQ z-*^K>lbJ@9dhc&wCdeC^35r>`2y>8qS3c(xpQao z#Vb$ZF0iQ<#uO^zL@6dNsVx!eOJ9@roXGUdSD3nP*M6*-rZ~ffesR8rrl~I3{O0wV z>Zqz1Z3NEn)KbbPjuu%bpB zaK%2J4+~>lkpo6GB$x3tgxHFhHV1u~$o5p2nty2S~0;OV+Jt>AMsD@erSB{s;Bq7UixPN>1MlNyuW!aPHg>&s70rO!r#>_*CtqMLrTl?5V!Z!=eqR->L#j4ruyE<8_bqTOyXRV5k~ph1 zr+MnMyoN=G#|D~j1XGfpBc7ccCjoLUy>wGU$pr18Zsp`~31r`6+{(n{j%MvMy9+{@ z&8|bRT-#CdM-H7Adb)mW66s}$hx%RRnT7lxa?8S)-Nov0?Br8u@yl8Cfc`DpLLzZF zVVW!I>f0FCe9+6!Ue@jZ}HQO9sYvO>8bu-Fjm#D|-{Rd^W8`WgC7#I1fR0(p~ zh)#HFh~9{)wD^dcV1&s7BZ!Bz+(iHuI5ym@)cJ12bfYLSf!j6di_N16WJJ=C!6 z67i*W=%|rR;UQkhjgi|qW9}hx)@xe{#~w)e=%91JE&*pkuxq?8lJKtF2?E7fp#f#1 zpVXmK4(l4q&7JiToOQ{U?I z9%M4LYK|vq)=r&2jcyOJyFCyFJLV(0^`i)wuaH%#r}v`mis!s)2DCpO$U&tvWaz&J zZm_My0m`OwJ6_>1tUM#v0HB1QT&d2 zd#sZcqXDs!1@b~O;}xpJ!!OBw;mgjRd%G^*4Y}l!TC}v<`MQTGu_@m6@{5OhsG@sI z&aIZ{emsKgNiH~+FZrVH9zrWC6RiDe4V?EN0cKWsW&g8!aaHA=r*Q|1ooVg^Omo|eb9%xdz+ zR#(GXq(k{;XA*IGxDpWq37GAB^XgrV_~${sY4ve>Idxww9L;fGEL>98{>8Hg)2m%a z&pZ&UYjQeGp!-(4g=gMhjT+@j&+ffZlM~W$$#3nyhrphwkdz&;aIw1p_dn&cBl1`( zUTIu5A*o8}L9VjErqszh2yEpO>u|*r2Y4t?VUhZoBsxtvu>da_2ZvYK%NhPNOaO3L&LDJh+}4Wl$*K7$EBMm+--14VOtqJODr}% zKOL^T*$y5jdl`Q-_w0;?KdB>rAu7S<-82Ma?4PW@&0XSK14&Z#^1YCO75UyevwYcJ3pRn@jCQVycnt0Ve1&2=@4i-E|uv94$ zN2o7<@!$?KyIlCbk!zQzbbPF7@JaN2xtW3;u0yk|Kw26>L6zxyLJ+Gt1r%`TF7{5p@86>@}18NYw&u> zTniJT!Tf70<&@tYtcB1g!k8dm$b z=^JtHEL?=mG5URSTKLKiy0gFT>#3)(vo^-|*nwHZ1$f1E5C2T7R5$ylFhfA?KOe3V z1T<=&sru%G*I223DgcgY^ic(P!bpgZ>t_#_^rAF-Qu^Wa24dP8y)*2IU=IZ%uq&A7 zR})ty3z9D~ENFrr~8bPF{$V`r> zW}qLhp;pK~7Pf|cV!sA=OXD^xm*K`A1+kj`t3vD4iT1XzxNSNlNL!0%S3QMUS}xec z*44`zZrf@;PWm!Ff#pK?Y3?~bvnS^T+T7?8XLj656|ZrSP$Q1lQHWpWB5741w>$~G@%+BCoFwopiJ7nYD?6ev_fp} z>mh_gi|bR}nd3sWYZ4zmkfG``(xSHGD^mS76;!xBjL%-5qE-MR-BZ#a&ygYny!}rx zt6j4rS4xbfwh%pKLzXvP=sh5W31u6iAMu!|k>D{_n>fIi91g?NL1dpBE4nW%C!`*= zs^ioVYAwa{y#{)Bhs?F8T8U^e7oMsVir#HRPH>6Cf_}`{@@ex3_Ak4&5hG-`*1Lm# zRw0M|Ft;YdfU3zVql!1hgR%6nhM&fgmbGqCi_Xkx#I#{5@dMf~&|SP!*6soiIC$yV zFhjen2Vu7ENfQUi4+pf}9;^9KHHUV2sL8FJE5A|hLU$d-C;CeF#{g(!Q>Cz`$!W#Q z7h0yw$Rd*7sf@_{)nGt{aKuTpSCB=>WO)A9iF8_pScb2yA6F36Fus7j74yltW)JbK z7JH($D_7!aG=|$&=IztND^;v)UF>S4PHYkHKYm@`b(ehRw zGvG7!HG41HFIDZ2s7#QyKmdVWWfQOuBiY|C$}=AWW!_`s&b?IHlBzcqwDf+>kpQ<# z9(hLR;@3oH_i6OK9oUK7{=nvOSo38?Tc*giRPM_ zx30nO$5(CsR4G3ZeAxA9_~k03p%{hmNbR!wRqOk^yQMaHBg|FvHEnV@`S&V$hQoK! zz8I>M=K;HX*d~A0Gvv5+NHZs?+PKB-XsrYKy2s-l?!uA)ULS9O@8GnWeOu-X#M53@ zR~Xr43Eg;wYfZXDzon_8dE6*8PbB7QUlii9aJ2nZ#*5q(uFo|ohPm9f!Oo)3+pDi; z5q9^k3(LA3IP)$Qc4^&Ihom$Wp=a~)xmAXsu=VYnV}0Bl1QCf!8;8l`w`?fq)haXV z;0O7$pH)xJ6+WV~^79Z5E4yst76?DRH(FkISB{ESUMH@aH-QKlJ17X%0wr~&$v5QQR+EsOqKac!x~0EDZQ5~ zYKe=pJCJu(6KB;-y=iuFrp7#U^=^?n?~`|V&CU=ixAwQmdGy&xROwx+48y5KNy|LH zR~&VeYrw*0X5@gR*J(GAN&fcZW+A7vR8B`H?SAZ5bKH1^wi+ur&hnOTta5nwSHP|Cuzv0{HRg zeZB@@-_jZXyT4RzogRG_Y;Bzx_NzFR81ZLz<#BN;GSV`pnPoZRjziHLJDuy)b*$IxfI6Hty@PS} z0IKY0fD#yp*(a5D%ux;87m)oIAGp8y*S(UdzJfOW+*$aJYnv7V<0KKE^K;&|j1W3uU{KQ0`(bpLrdKzV%o;2>r&dnX3ccR&FE1 zyJkeg-Mz=lMJGP}{0RW@7-p-b+i0Fb6Nr?zF=ZjB`}(fOM+vcdB|@vLY+Zk zCHH-}k%#>Lz~^}8CrxW3&r*;}pkZZn3SRZb?jwLSkH^P@{N7`*06Iz0TaY7!Xw0DU z@{fH`&2SAC+>ra2lA(Acedj2V8PD6iE6Z_kS&NH=wM=6tbC#A0!NO4S%#c%Q2EZc>0$k%`&8+(+7>)GxpA#?SXf}LZEE?gQuQPGq0X&WtaEdq%tJKU z`^l*wA*MM`oOqE<>F7j@gMu!4{R>zf4l=4Yt6NOKAdrv6?mcgGI`5o?b&<`5hlb`|&9Q+QN!{ zi6J!x&O?|fyB3tX0QdX;(xTDTt|AO z_0=;e5AV{CLe*dK&c)>{Scht-?Sm1Wcb?K*edaJs} zmkuD_R1RocP1;%?lG&tFQGVDMPUl6y7s zVb~46z4^*+jUvBp@iqG%}K9 zG?bqor-%vF>&@o@C-z?Tm`HI>Pvg5tO5aNGVv315$Lz#cWZlfca^6>f52{ycoOo9Q z3dh14V&4{d-E=jSp%8OH%|T1{;a;^PNiU4OhVZVo_*)?D#Lc5^T5?a? zE}Ay{cs0xhWN$IB+m;Is#NtQ#S#J2WPP1Faslwzl}vGAk<-x1yrVOhKPs$RP1**(Arxp$lb%R+POj6V`3e(Gale?BP`{#gb!XwG_qMuj||v@6Yw~B#WwEfz4C$PkKsmeT%UWhkuQBG zsrH1gTYJ;feH(wV7YFVtt-W{@ln}c9wFQsqP3I7Lm48qc6Y8ja%RjeZ0^weoYhd~! z*&K~gZUCGrAkQf*rM};-kxM`Qp$!M^Dz-_^bsLCpdTI|_!rl7~d^M{j;=8Oh?>;)S zxJee~G}C(7xZ69(GzRQKTAh9sKim;1C*t228#DNLBHcDH+|YflsoGi@y^EOn3LbYw zTUKGl;`Pl{TV0>QsEXs4aDz|c)8jh!?Ppc+`pY>Tkvws(YEwA8tK8b?^323suZ}Sp z{-|Eh!{W7N1Qgfqvzy2r1?96BGS(x1{q{BcG&1;Tgbl^BjfvGEUNgY3OPtbL=7?GP zG`+~u@LcWmi-I&qCtO=S3Ppyenr*TeLNMBSU>gfkazM<;rXeDK=oP{f&H#k)P5vIO zj^cTWOqO1C4YuA}Hn}(1CF7y|*E?-btSF_hQ(0!-Z zAb&rd(zr6sN*V2RbgIsn^5~(7G{Kjs7fyI^1ST6Xiw`ohtkPPWSYdA>^JxbbSdnO- zQ1xB_KuYUMXJfU(JjEYHz*(!`SD#7h@(CGUPw1-%j5i@~~x1eEi&? zpX;T_dI+qGuWD2U>h5(Hs5W`|L{A!K)E#l#_+0tpshqnb?_drNC{=M~ANSCIu_+Ul zZCnjHu)Uzt}xQ`3-pHo@WT9h_QPE6c-X-ZMr!yCXG*kWxj5t-EqO5_j4?Ol7YSdWC*)M7Oe$ zhqJk|PyH7awuB97=~vZ;-J`=@BIVi=sa3RgL?xH|L{lO{_~D|a`|6vNG%OR(Xp!bT zDiBg?y+Y3@qIFf(jXRKaTn+Da{}`x>uWtt_pSW`6y-9uHzix0PliF21HWhcwEEA-k z>0GoGcvVhkG%^%za7L~ZnDU&9KS=uggsl;&yNht$YpAEdyaN;WXlXLPI+@(B-^c!5 z{6x#YbXiuc5qgl9HGchrb4y1|dCvIArwnHQ1*lLN)C9<7XvEOhy+2E!5OZ|Y*n=i=mQxk~JWgS~^3rlYC3C7*;0c*4c`ix6N`4NE6;OGg)1Q+qzK z<2EkN;NK@4;EoOmOYpy7`duwyw+AqJi zB#X?qmtuG=vr2S*v{IN7-vfTPm1p_b$H_y)6T1|@jC_%$))Wp#${G)b9cgr)o&2Is zJx}%Mi)k#TqnP`jTw`1H_qQKa&q_?0nkIwG`o==OC`VC3kUda&w<6X@xTsuc*K4 z#6}s6rB`xC$z}204e@R6TNWib!l1KLIl!%W3c(=Zm~VS5_21oDRdC_H&aOA^1e{mr z4Nj1by({8fOYl)^3+>{VCbMP?KfV~Q6-u|}bN>o-m za)qOx>?^uD8LZ=ZH%u|GBwd=AT$cKfQTnWCI*)neN;Q0lgPec7aXgqos|*_aaL!yZ zB<8R5d;>NQCs8Tw6VyxtYJu<^TQHKQV_Y4RLASD4%8cYPs<78dD-?7e)lruVuMCzY zeKzoYzmZOqY6{v(BSePR>mhnmPEwP~qzX%j=Q2hN@=ynK$J5^1PLK7r!$vX$jpB|+ zPDdkUyB-aZyyB&8Zc!RF7-1qg!iJh{=B3B+R-KP3_P+=#9-f! z4F{{srllPU@JEbd#a6Z(c;k029r+X9mHNt+QD zV2qzDTUJwy?60ys;P&cN^~p5%x5`tFM&4A9p5*E&@4eMuCb^j22Yf7pXW!Kap+EQ5X5^u+7(nl7nU;9P#XEUH z$2;?n-f&L0C%(JlF0Hd7DS9*jyw{FqZ;8U;Xe{ZWMLvA;SHQgSIn|!f7_Ey8NGpDOVihbXyPi#e0 zR%WPbX`#-qYHDsw?l%svlo;!J8yxXkfU}qHAv&bC@TgEpT~b=a%4LZve2RO|-NwpI zw@T#As*4pTI~TV@>W-@>X6gS;eA_axe1SgxNBF)i#SvVVefT&;8E0m zz4z|ENDe_ysW^{%u}=%r6n+VxQLH$yKCP(*`zhjI~k*{{vD@zxS&W@lXUOCcyx)Q?~Lia%FY%WK{+H1y` zGUM==dzU*scF>~Ay@MZ@GDK~MNbsOW&(GQglyq*%+R@i7B6jDf*N%iUzQB@t-Z9t} zn2?H$0R)7hyE{aYl8|l?P;!U?0coUT=F2@B8_^-{X7MI)9zD&RU;;-3w>$=ehTDU-xxi*S+UHfW7-|mp9AKz)F{_eo^Ud zVy}~3J(+5Gorqh-+?_u^RGrfqY2mX*>lZD4BNzPPM^R#>b;M5pbdu6pPtoY)0`pfz z-G?r|wUyEr3a8*I?Z(VEL=3mPOW0mgDCypMk6Kl8+B=Qeu;tke6PFNyPFo<=F z4&_UE@sR!}4eH?W)lSEoB8(IPx;r(t8`VxC$Go>i0*s1!&nq-vB7G6@x#0GKYD^yk zs@pr;SOL@aPA!oTEERN`v%FGemITXe!{vgV=1HlpQp|dyCfV}1FWTqS?y>6<$r6UR zO2A%Rg$>;{M`~uvdupl};#~DZwz4iyh+y3(p*a@TFY9vTwb8y(bkODd2+k=R?h2PR zCU+4oTULcisPu9Ntve5^3l^b{&N?|o8R@3`=g@}t%kaEyAGLFhNRz*T%-gnGCDhoD z{Ju5CTRhY_-56K2bWWT6S&J#mx;oKe)sEiK=AXdf5PilIb96#e<2AIHlqWZ~tNsj_ z%M0lg0u_t!ADJeb{?r^eNuWQ#^ zy&o@+yRX~?zZ^#6PdU)u6Mfaz)M=xMBK9~C=)MD^DCR_^)?N-@1t{3%6#7JDdcgTo z5SguYl6+ozpoI$RM8ov=(uuP+vIFOk;MbMvgo9@5m>Z)6-8E^t($GW)Okwk*olG4X z%O33*k69auMkc*a2Rgz_kKcG`R^ET0x$p{~G&}Bb6rFIJdofXJMm9}rdIpCMD?vT1 z(a3aybG2?r>2egJo&p>cU$Ux)$5L6EpGuxw?QZm+Xa{oXxLPzMB7I%C=e*sOUJo8q zKkI>)+34+gL}71CK-%A2wPrL2&exIw88K0Ac!?N;0MdT{zIT@$^U$1TT0<1m&JR z-D>LAdd*-tOzQ`Og|IMGsg(5NcEp|T=+iN$?j_MZVj)I^`AlC8>F7s>+Og*F^RnU& zhSbY0Igx|enD~m?jeWg>W2vRq(zRdse}xPD;MVuET~_}u3hP@KM%vMszwY!&exZ#e zS-IEWg)3)#!|=@Ct*g13N%`5~M47U1ZqIls)Y$^E?M9;Dxmi=h88%}H9-3p#-+`Uc z#+{7jqoSN;=HDOMxBQUPPB!RfqV*39D8zXlsZ-py5SaEuFDA&k*_EV(c`x!xKUw63|Dx zzM=LYS%P45&sPpxZI_!nR(fsfe`&#B%6AKy!FuFGw`qT9Q{zqgE>UHy-fSd zAH+^D#6W$}G4vMYK6KPInoaiXhca7Wj;*X6$;O@X|Jf$%Mxd8|hjYu&`*~%S4tJCG&8zS^fY^-rfbHAS%1gpo5^kj{3m)6UL z*t+Q=WDX~DTC#ed>ee1x#1Le7q;XOexFQA>V6n|2k}j#4uUShl@*9zF{JetC^$l zrcQ|BO8pD$>`{Lf(*NPqUQT_i#hLJA0tb>tJF{&+W^QU@Hhe-rG`jL2=}670wvtCR zZh_M3!E-;3OLLCtZ)y!TnOccV-0>nMgP&cbdrlE7o@~@(Vk7jj^M^ras-7DLGctKJ zZsI?lJ9!V9Fd5vXdZC{leO1h4nV&>*T)mapVTr~cd4)I_J5DPZS$VeKzE)|b9N`2DWKW3`*Kfg?VZ)HY|XVUo=3mB z?crc+WTG}i!ajDpvl%H*IASboeGgwm|D~EDmi`LQ>qkys+Zvdu!u(zkqmMQAzWY7F z-B^hHqE&YzS8~CdAcOl3ubdqZb??;Ud-|x)@Q1L%I?b{vhLo3Y3rLRPi}W$*#BM%~ z%w|*56avMsZ$91{-6S&GYUAW93g!>p3vZ_04T_qfu_9EIk0qe)usS-8o$&G0Q5VK= z1>qj~n-V0`qF3Rb4wD->{{ z!yW8iM9@9?6`dO~(|j zEGf}RkJL=heu-+N^`BIYmNz2%G8;j1Jji?JIHvHmTg9XLyAD%IPT_Z-S!ZYSD$U6-OtDMR%-Dm7G z&GD$SQ(_FJ=QwUgRztzDy94pK7iW(In8Xat9XKaIGqvIJ?AS-gGReV`8I6!NI1cw( z`WOQuaaI>7!^J|9aJqM{qF=t54zv&EW`E=;(C}Vvl|5_!D<;8x{}h%7OAC>2gd~E~ zJ6D6@*weG(rBdXJv|c>BLWu&Lt7d`ijc**o>;`0BIu$VI2>-CCXA;)@z0c17XP`KjkQ$_IAQ(CxYVVZJmOz6ia7;UX}aUO zwD*(D7V9w!s)f|7&T}-6zJYt zY*1lxdVEHFf_U~Y+o7rpmAMJnlDaK2<4`y!<;c8k>A@>uUsO3LV)hdQLe`zCNH6XQ z7zSQ#%t#dM5nnAD*&#@;u{b^k$1n^1*llQcIQq~&*;G`rgzyDJz(TydLfxYCLoVri;HNr|Z2!@|k3S3V847SG7J-dJM0`)gGC z74M6$(7nXs0Gsb^(MG(BdnL-Xn#4#WYO!vo`B+r^`Gr5Ya5>C{?;hXT^y>(Wg5yZ* zJ0a#`=$O9>#KMZZwoAmDkH%R__>Ux(*=$_88$2}5ILP=E?r3Iz1cMm1NXx2=>>{nJ zg>sKJN(OsQR>q-sZKvhl`elcgj~XT`c{Uh~HJej$2!G3m`_TlM@6Abse|~wqi?ECSC{Jjxs~R)jV+f$ce2?eN8bY2#063I zu4trgesaLNLyz$>a}MX|15hNz$+gppK^t) ze$H=h6X~ki=0N8W__xMKw0auj2Cpuu>_uegMtv(u8B+!uHRR#-Azhl~_auJW={j4F ztMW|AWkusEdqTH$O$a$tWpMb@7n1L1(AU4e{~cQGE^|MC`D=5^US!AAWBbQ#i6>kr z{upKixOhZ9h$NT9K~Gtc+~kMPJ%@|Zwo@lM-V6TBfG&@=J4q|8GNf_GL^`rFMw!&I zmMNcI@DCeJ>CSCCDh_Cx`RLWFH|3HfV>@td!oQmBPvmL|foq197ePeR8QgVH-SNOIN9v8!1E6 zRNj_6>`~*}ns7F^bmPG=*1y-cfyMQM^EOW# zXV6WYA4i0zuz_rX!`C{H4dDog_(@-i?lY+Kh0hQU{-}!47L^hCVc)2AvLLL1`l}s} zN$c<=1-;f0ZHEaxZ{x-nk97B%Pe0=IKbLArGplPL4eNmdNL4^5#7?nDZ-cfk_FYyN z)8I%amh1;nuJqzt^K3Md;tW9_!YO+sVNb!QC%%)p? zd@`vlWaFce_Wq{{R|^R9lU&NZ_tifUcERu$`Kn&79sK%wD#(nkmGP;hE?O?b;t?DC z!PH_=Vq0a`;nNn}iDlYv~a*yaaaeI}`=UFP0aLLx#xTmx< zkiMM;vx7d{(yUu#@W=zSxm?KLE0qnYpN(V8Z4nWM2+L36%>>5cExYHjJxy6l==}v$ z{9eK7g>@mYOxDLB<#NLd@Qaw7bAMVlqcpt6FFrPD_X#}94TRkAUEtY=SsbsBT_w+t zayd#=gyIiQUn4RvjLek|B&(a6;!_*35*N-=4`YL6OA&?h#>FgMvp@`ZLgX$j$>?Fq zh|=e^Z>fx=6Se~>)<2MqLZv1a|2oRpD{oEY8%5atJd11X87;29e3S49JeU6*GgG(k zRgUtjkn&&r$S=(drwGV*%pwqqQoGMmkJvziHRy@n>j`sSEf1bVkq#9yex^?ELp_0BqG>LcIoVO9q9Rv!n_;%xkc4oTzmX=s(^vfr%H3Q|`9 zN-FFUA7%lKQvU_VPRX`P+CMAzn(ygn)}y2#I8`is97Nf!tVaUeL4DDP05Ap1e!F8Q(e5titEQY4`Fqwj|Bs@IV%&VF~sKxXfC~4@E}S*roU+SND=t zxO}I@hrZPR$`B#aKzV;JGamz^&_IqXYBYnAXXL_cs52;h)MEWiy%E8%Fc+y zd7J^e!JUViFZ1gB^vwu3LOwm~TlK=W&2w~T*jpJEQx^n;z>_D0AUE~W!Kqn(8Qe)< zHAg==BgJi|_ww&oLhaps;}92c#ON5oNYRBq!TPEu;*xHAlrJFvt^aATKr|Gk&P zofpB-!c?f=I~kA}^?S*iN_A~G-Q_TD8d4yWc{mQRO+xFl;0lL)%fl6Sk61asuSG|# z%d7ZxiS?HgW6~qXV-=!CT)mLKIBG7A2RsobDTa!4N3B|#Dh4oqm@<=?g-K3X%ZGsz z`WOya!!m=1Gr!~MK7H&x#^E%*`NS+lmrular}JG>DypCQOLuJdCZ%7^W;O3No34%y zT7^Hjpw~?w3ywM9dt*<&Fex|H>IQ{&+FEWJ6{k)J3T_9`wNC3Jq;}&?1KaYbGox{ps?gaxQI^ z#Ao)~oMd6mTZjT?k38?(3Ken1a&rBJ2|=>gk@qGX3M} z&-9|f82Ts@EK1S{!a)k&mF>7u7#EaYmg(o2D#&mae!NYMvMRH@O+h;_WIYPxisDWB%NLyRgeX^cKsCP$o&y}pM7bxw7I_v|H%v&S zqDr$C2X&#qU952%D$^bs{Ddo9K#DVspo-BR`KO4&Q?d(0ay>>h4S95Dm=gh97RONQE;Op9V9jCy$2A|4Pln>stfiKD>G4vJ=p zEN?Ps+q$K@O~8vN5RD6t)}}y!-PK=e{W73MATVJ}U`C-OCq++# zosxca74mI~XH2BW^Io0;pUC%$Db{Rbce5ad+#RR;#>&#kZ9q`com&DK<#fqmlNYl* zE@1K`X_h`EsC}s1y`IUF#qMK>`J~U^3kh$!#WQj8b}E(S2}^cf$Ke8)VJFw-Q1aP6 zG!w_u>&ly(x|VWjNZn>YscnM@ArlPUZ!}#k7~DsZsEz?IJ+`RFMx~Kc{^en%+n!Cs z#ORRV0fsuTm}XtHnYj&VdJuvk3v`C;x>~6isc`u)UpHgsolxesMF_Ogi%ar8085z2 zbK8n5G98pf6gqhCJ!I9mP`?T4A}XX$(s}`R0{Trtd@IHs6=*{a!cf*(m7WHX~Migav2vR*eEE`)X1=Hzr{35|7pv%c>1QCZ;6YOia>=3 ztf7Tbc1f->`b|HO_y*G?zwM1cEq+PW07D(Bwbn2_bo|DE+dR}t)bemw{#Wg(h>S(CFiCBhlhVl z5Haf;eUql+ip>ORo_Y0cENJoZo`wu=Y;JK8mmc0ko`L>5)9v$5&`g3Pnd27`o3!bi zK^ofR#6-Dqg_iSNszqIx&8EgLmUVAY8o8qJf5;WgA8ej15}XhRNT||PjYAD7EwwB9YmC)-lq5SUWM8=ysye=(w8))K}_?G_bi=ZthvRznRgfTNBz#7wFiA ziZ!Lfq~Ma%!d~X8WyOH;Uh^+uDV1!#&lf}UxVnLUb(0;}uF=j|P98^KGF%}YB7T(m zptO)kcAoOpD3bu=g#V!R%Gw9PR|z#%WtgCo2q^ifDsru{$3$UW6#{Z#Di1Q!}{JRuk{HrUZ~*xI&%>p$+M8$HY|iAd>iBWzR~Bh+IH=r! zCAm|D+VFg=OK@S-+N|tLdLr~HgKzM1vio9dD>N~&`p9ym^=9WJW$z`Sym9^J@I!W! zd&N~npShW*6$O(6ScV?T1IT2!NFlx{BtEzt#?0x|Ws3g>jF+35bN0yn^L*FH^9lt{ z99Bo~IF~*jkM7KJn<5+TA(UKLo<~NnGL_uSE5l3$s^v9`(Mb9YS+AWTyKw2dI`a1qn2w&H|RxDR+`1WjNSakQPKji2L%~G zx2tFia^Cc=eIlJ_+LP^RC9$yJPTs@qXSbKMl=xX0uzoJ-e@dYuh+~#T>rE$TxYk6){Z){Rh2x1pr;+LpuA_#?0pwd21 zUgt}0HOx@^`O@IQfYtAE#syF0_>an_zDRP9`Pvh-d#kByR7Qbhg|1+JP0gkZj=#z6 zu9PUVq?Uj|t~ArwnTEg(aO$Nzg{C@?f*q<}UYM@d`SBKge_)&Lf&@dmO&yKU9⋘ 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 t>jYZlh{1s^4(#+~2P{qj@n@B {agent_name}\t\t" - f"Games won: {(total_games_won / (total_games_won + total_games_lost)) * 100:.1f}%\t\t" - f"Average performance: {total_performance / len(stats):.2f}\t\t" - f"Average time taken: {total_time_taken / len(stats):.6f} seconds") - - print("AGENT RESULTS") + print(f"{agent_name:<22}|" + f"{-total_performance / len(stats):^8.2f}|" + f"{(total_games_won / (total_games_won + total_games_lost)):^14.1%}|" + f"{total_time_taken / len(stats):^11.6f}") + run_agent_comparison() def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True): solution_stats = [] - solution_totals = {'path_cost': 0, 'goal_tests': 0, 'states': 0, 'succs': 0} + solution_totals = {'path_cost': 0, 'goal_tests': 0, 'states': 0, 'succs': 0, 'time_taken': 0.0} for i in range(runs): obstacle_pos, winning_pos, penalty_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) - # Create appropriate problem type based on whether we need a heuristic + # Create appropriate problem type based on whether or not we need a heuristic if use_heuristic: problem = GridSearchProblemWithHeuristic( initial=agent_pos, goal=winning_pos, width=args.width, height=args.height, - obstacles=[obstacle_pos, penalty_pos] + obstacles=[obstacle_pos], + penalty_location=penalty_pos ) else: problem = GridSearchProblem( @@ -510,7 +489,8 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) goal=winning_pos, width=args.width, height=args.height, - obstacles=[obstacle_pos, penalty_pos] + obstacles=[obstacle_pos], + penalty_location=penalty_pos ) run_stat = {} @@ -518,6 +498,7 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) # Call the appropriate search function solution = None + start_time = time.time() try: if search_type == "astar": solution = astar_search(instrumented_problem, h=instrumented_problem.h) @@ -533,6 +514,8 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) solution = depth_first_graph_search(instrumented_problem) elif search_type == "ucs": solution = uniform_cost_search(instrumented_problem) + end_time = time.time() + elapsed_time = end_time - start_time except RecursionError as e: verbose_message(f"{algorithm_name} failed with: {e}") continue @@ -543,11 +526,13 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) run_stat['goal_tests'] = instrumented_problem.goal_tests run_stat['states'] = instrumented_problem.states run_stat['succs'] = instrumented_problem.succs - + run_stat['time_taken'] = elapsed_time + solution_totals['path_cost'] += solution.path_cost solution_totals['goal_tests'] += instrumented_problem.goal_tests solution_totals['states'] += instrumented_problem.states solution_totals['succs'] += instrumented_problem.succs + solution_totals['time_taken'] += elapsed_time verbose_message(f" {algorithm_name} {run_stat}") solution_stats.append(run_stat) @@ -570,42 +555,48 @@ def searching_your_world(): # Print results for uninformed searches print("") - print(" UNINFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS ") - print("--------------------------------------------------------------") + print(" UNINFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS | AVG TIME") + print("-------------------------------------------------------------------------") print(f"Breadth First Search | " - f"{solution_bfs_totals['path_cost'] / args.runs:^5.2f}|" + f"{solution_bfs_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_bfs_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_bfs_totals['states'] / args.runs:^8.2f}|" - f"{solution_bfs_totals['succs'] / args.runs:^9.2f}") + f"{solution_bfs_totals['succs'] / args.runs:^9.2f}|" + f"{solution_bfs_totals['time_taken'] / args.runs:^11.6f}") print(f"Depth First Search | " - f"{solution_dfs_totals['path_cost'] / args.runs:^5.2f}|" + f"{solution_dfs_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_dfs_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_dfs_totals['states'] / args.runs:^8.2f}|" - f"{solution_dfs_totals['succs'] / args.runs:^9.2f}") + f"{solution_dfs_totals['succs'] / args.runs:^9.2f}|" + f"{solution_dfs_totals['time_taken'] / args.runs:^11.6f}") print(f"Uniform Cost Search | " - f"{solution_ucs_totals['path_cost'] / args.runs:^5.2f}|" + f"{solution_ucs_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_ucs_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_ucs_totals['states'] / args.runs:^8.2f}|" - f"{solution_ucs_totals['succs'] / args.runs:^9.2f}") + f"{solution_ucs_totals['succs'] / args.runs:^9.2f}|" + f"{solution_ucs_totals['time_taken'] / args.runs:^11.6f}") - # Informaed searches + # Informed searches # A* Search _, solution_astar_totals = run_search_experiment("A*", args.runs, "astar", use_heuristic=True) # Depth Limited Search _, solution_dls_totals = run_search_experiment("DLS", args.runs, "dls", use_heuristic=True) + # Print results print("") - print( " INFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS ") - print("----------------------------------------------------------------") + print( " INFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS | AVG TIME") + print("-------------------------------------------------------------------------") print(f"A* Search | " f"{solution_astar_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_astar_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_astar_totals['states'] / args.runs:^8.2f}|" - f"{solution_astar_totals['succs'] / args.runs:^9.2f}") + f"{solution_astar_totals['succs'] / args.runs:^9.2f}|" + f"{solution_astar_totals['time_taken'] / args.runs:^11.6f}") print(f"Depth Limited Search | " f"{solution_dls_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_dls_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_dls_totals['states'] / args.runs:^8.2f}|" - f"{solution_dls_totals['succs'] / args.runs:^9.2f}") + f"{solution_dls_totals['succs'] / args.runs:^9.2f}|" + f"{solution_dls_totals['time_taken'] / args.runs:^11.6f}") # Recursive Best First Search try: @@ -614,7 +605,8 @@ def searching_your_world(): f"{solution_rbfs_totals['path_cost']:^7.2f}|" f"{solution_rbfs_totals['goal_tests']:^12}|" f"{solution_rbfs_totals['states']:^8}|" - f"{solution_rbfs_totals['succs']:^9}") + f"{solution_rbfs_totals['succs']:^9}|" + f"{solution_rbfs_totals['time_taken']:^11.6f}") except Exception as e: print(f"Recurs Best 1st Srch | {e}!") @@ -625,7 +617,8 @@ def searching_your_world(): f"{solution_greedy_totals['path_cost']:^7.2f}|" f"{solution_greedy_totals['goal_tests']:^12}|" f"{solution_greedy_totals['states']:^8}|" - f"{solution_greedy_totals['succs']:^9}") + f"{solution_greedy_totals['succs']:^9}|" + f"{solution_greedy_totals['time_taken']:^11.6f}") else: print("=> Greedy: No solution found") diff --git a/assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx b/assignment1/~$_COMP9016_Nagle_JohnPaul_R00065426.docx new file mode 100644 index 0000000000000000000000000000000000000000..1215360c558324f168a348f977b46d5a160ee437 GIT binary patch literal 162 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6VjuuS8GIQs8Il=_81fm4fjEt!gh7G9A4sQx Q#Z!U2P@qgIPz9v`0A Date: Fri, 10 Oct 2025 12:01:56 +0100 Subject: [PATCH 44/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 99fe1e35b..80bd41423 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -23,7 +23,7 @@ # Now you can import a module from the parent directory from agents import Thing, XYEnvironment, Agent, Obstacle -from search import Problem, InstrumentedProblem, depth_limited_search, name, print_table, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search +from search import Problem, InstrumentedProblem, depth_limited_search, breadth_first_graph_search, depth_first_graph_search, uniform_cost_search, greedy_best_first_graph_search, astar_search, recursive_best_first_search GAME_WON=False @@ -53,6 +53,14 @@ def __init__(self, width, height): super().__init__(width, height) self.width = width self.height = height + + # Generate random positions for obstacle, winning destination, penalty destination, and agent + obstacle_pos, winning_pos, penalty_pos, _, _ = generate_random_starting_positions(width, height) + + # Add things to the environment + self.add_thing(Obstacle(), obstacle_pos) + self.add_thing(WinningDestination(), winning_pos) + self.add_thing(PenaltyDestination(), penalty_pos) def percept(self, agent): # A list of available movements from the agent's current location and the associated cost @@ -286,15 +294,6 @@ def generate_random_starting_positions(width, height): return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions -# Create and set up the environment -def create_gridworld_environment(width, height, obstacle_pos, winning_pos, penalty_pos): - # Create the 2D grid world with the set width and height, and Things located at the specified positions - env = GridWorldEnvironment(width, height) - env.add_thing(Obstacle(), obstacle_pos) - env.add_thing(WinningDestination(), winning_pos) - env.add_thing(PenaltyDestination(), penalty_pos) - - return env # Search class GridSearchProblem(Problem): @@ -333,8 +332,8 @@ def goal_test(self, state): return state == self.goal def path_cost(self, c, state1, action, state2): - """Cost is the sum of x and y coordinates of the destination.""" - # print(f"Calculating cost c:{c} + state2[0]:{state2[0]} + state2[1]:{state2[1]}") + """Cost is the sum of x and y coordinates of the destination, plus 50 for a penalty + position, and minus 100 for winning the game.""" cost = c + (state2[0] + state2[1]) # Apply 100 point bonus for reaching the goal (subtract from cost) @@ -414,6 +413,7 @@ def table_agent_factory(): return agent def goal_agent_factory(): + # Generate positions for the agent and get positions of other objects obstacle_pos, winning_pos, penalty_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) agent = GoalBasedAgent(agent_pos, winning_pos, penalty_pos, obstacle_pos) agent.__name__ = "GoalBasedAgent" @@ -421,10 +421,8 @@ def goal_agent_factory(): # Define the environment factory def env_factory_gridworld(): - # Generate random positions for obstacle, positive destination, and negative destination as well as an initial position for the agent - obstacle_pos, winning_pos, penalty_pos, _, _ = generate_random_starting_positions(args.width, args.height) - # draw_grid(agent_pos, obstacle_pos, winning_pos, penalty_pos) - return create_gridworld_environment(args.width, args.height, obstacle_pos, winning_pos, penalty_pos) + # Create a new GridWorldEnvironment with the specified width and height + return GridWorldEnvironment(args.width, args.height) # List of agent factories for comparison agent_factories = [ @@ -471,6 +469,7 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) solution_totals = {'path_cost': 0, 'goal_tests': 0, 'states': 0, 'succs': 0, 'time_taken': 0.0} for i in range(runs): + # Generate random positions for obstacle, winning destination, penalty destination, and agent obstacle_pos, winning_pos, penalty_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) # Create appropriate problem type based on whether or not we need a heuristic @@ -624,13 +623,10 @@ def searching_your_world(): def print_args(args): - print("\n*** Pass the -h parameter to see details on how to configure the arguments ***") - print("\nCURRENT ARGUMENTS:" - f" STEPS=> {args.steps}" - f" RUNS=> {args.runs}" - f" WIDTH=> {args.width}" - f" HEIGHT=> {args.height}\n" - ) + print("\n*** Pass the -h parameter to see details on how to configure the parameters ***\n") + print(" PARAMETER | STEPS | RUNS | WIDTH | HEIGHT") + print("-----------|---------|--------|--------|-------") + print(f" VALUE | {args.steps:^7} | {args.runs:^6} | {args.width:^6} | {args.height:^6}\n") if __name__ == "__main__": # command line arguments From bc6abb5ed7933612036906ce0fde3ffde501d443 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Fri, 10 Oct 2025 13:22:49 +0100 Subject: [PATCH 45/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 244 +++++++++--------- 1 file changed, 121 insertions(+), 123 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 80bd41423..0079b37ee 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -39,6 +39,49 @@ def verbose_message(message): if args.verbose: print(message) +def generate_random_starting_positions(width, height): + # Generate random positions for obstacle, winning destination, penalty destination, and the agent. + occupied_positions = [] + + obstacle_x = random.randint(0, width - 1) + obstacle_y = random.randint(0, height - 1) + occupied_positions.append((obstacle_x, obstacle_y)) + + while True: + win_x = random.randint(0, width - 1) + win_y = random.randint(0, height - 1) + if (win_x, win_y) not in occupied_positions: + occupied_positions.append((win_x, win_y)) + break + + while True: + penalty_x = random.randint(0, width - 1) + penalty_y = random.randint(0, height - 1) + if (penalty_x, penalty_y) not in occupied_positions: + occupied_positions.append((penalty_x, penalty_y)) + break + # for x in range(width -1): + # for y in range(height -1): + # if random.random() < penalty_prob: + # if (neg_x, neg_y) not in occupied_positions: + # occupied_positions.append((neg_x, neg_y)) + + while True: + agent_x = random.randint(0, width - 1) + agent_y = random.randint(0, height - 1) + if (agent_x, agent_y) not in occupied_positions: + occupied_positions.append((agent_x, agent_y)) + break + + verbose_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") + verbose_message(f"Winning location is ({win_x}, {win_y})") + verbose_message(f"Penalty location is ({penalty_x}, {penalty_y})") + verbose_message(f"Agent location is ({agent_x}, {agent_y})") + verbose_message(f"Occupied positions are [{occupied_positions}]") + + return (obstacle_x, obstacle_y), (win_x, win_y), (penalty_x, penalty_y), (agent_x, agent_y), occupied_positions + +# Env class WinningDestination(Thing): """ A destination that awards 100 points and wins the game when an agent reaches it """ pass @@ -161,6 +204,7 @@ def is_done(self): global GAME_WON return GAME_WON or super().is_done() +# Agents class RandomAgent(Agent): # A simple agent program that moves randomly. def __init__(self): @@ -180,7 +224,7 @@ def cheapest_move(self, percept): return cheapest[0] class TableDrivenAgent(Agent): - # A table driven agent that uses a pre-calculated table to determine the best action to take. + # A table driven agent that uses a pre-calculated table to determine the action to take. def __init__(self): super().__init__(self.table_action) @@ -227,7 +271,6 @@ def __init__(self, agent_pos, winning_pos, penalty_pos, obstacle_pos): self.obstacle_location = obstacle_pos super().__init__(self.goalbased_action) - def goalbased_action(self, percept): # A goal based search, where the goal is the Winning position i.e. winning_pos # We will use the astar search to find the next move towards the goal @@ -251,121 +294,14 @@ def goalbased_action(self, percept): return star_search_result.action - -def generate_random_starting_positions(width, height): - # Generate random positions for obstacle, winning destination, penalty destination, and the agent. - occupied_positions = [] - - obstacle_x = random.randint(0, width - 1) - obstacle_y = random.randint(0, height - 1) - occupied_positions.append((obstacle_x, obstacle_y)) - - while True: - pos_x = random.randint(0, width - 1) - pos_y = random.randint(0, height - 1) - if (pos_x, pos_y) not in occupied_positions: - occupied_positions.append((pos_x, pos_y)) - break - - while True: - neg_x = random.randint(0, width - 1) - neg_y = random.randint(0, height - 1) - if (neg_x, neg_y) not in occupied_positions: - occupied_positions.append((neg_x, neg_y)) - break - # for x in range(width -1): - # for y in range(height -1): - # if random.random() < penalty_prob: - # if (neg_x, neg_y) not in occupied_positions: - # occupied_positions.append((neg_x, neg_y)) - - while True: - agent_x = random.randint(0, width - 1) - agent_y = random.randint(0, height - 1) - if (agent_x, agent_y) not in occupied_positions: - occupied_positions.append((agent_x, agent_y)) - break - - verbose_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") - verbose_message(f"Winning location is ({pos_x}, {pos_y})") - verbose_message(f"Penalty location is ({neg_x}, {neg_y})") - verbose_message(f"Agent location is ({agent_x}, {agent_y})") - verbose_message(f"Occupied positions are [{occupied_positions}]") - - return (obstacle_x, obstacle_y), (pos_x, pos_y), (neg_x, neg_y), (agent_x, agent_y), occupied_positions - - -# Search -class GridSearchProblem(Problem): - def __init__(self, initial, goal, width, height, obstacles, penalty_location): - super().__init__(initial, goal) - self.width = width - self.height = height - self.obstacles = set(obstacles) - self.penalty_location = penalty_location - - def actions(self, state): - """Return valid directions from the current state.""" - x, y = state - directions = [] - if y + 1 < self.height and (x, y + 1) not in self.obstacles: - directions.append('up') - if y > 0 and (x, y - 1) not in self.obstacles: - directions.append('down') - if x > 0 and (x - 1, y) not in self.obstacles: - directions.append('left') - if x + 1 < self.width and (x + 1, y) not in self.obstacles: - directions.append('right') - return directions - - def result(self, state, action): - """Return the new state after applying the action.""" - x, y = state - if action in direction_to_coords: - dx, dy = direction_to_coords[action] - return (x + dx, y + dy) - else: - raise ValueError(f"Unknown action: {action}") - - def goal_test(self, state): - """Check if the current state is the goal.""" - return state == self.goal - - def path_cost(self, c, state1, action, state2): - """Cost is the sum of x and y coordinates of the destination, plus 50 for a penalty - position, and minus 100 for winning the game.""" - cost = c + (state2[0] + state2[1]) - - # Apply 100 point bonus for reaching the goal (subtract from cost) - if state2 == self.goal: - cost -= 100 - - # Apply 50 point penalty for landing on penalty square - if state2 == self.penalty_location: - cost += 50 - - return cost - -class GridSearchProblemWithHeuristic(GridSearchProblem): - def __init__(self, initial, goal, width, height, obstacles, penalty_location): - super().__init__(initial, goal, width, height, obstacles, penalty_location) - - - def h(self, node): - """Manhattan distance heuristic from current node to goal.""" - x1, y1 = node.state - x2, y2 = self.goal - return abs(x2 - x1) + abs(y2 - y1) - -def compare_agents(EnvFactory, AgentFactories, n, steps): +def compare_agents(EnvFactory, AgentFactories, numEnvs, steps): """See how well each of several agents do in n instances of an environment.""" - envs = [EnvFactory() for i in range(n)] + envs = [EnvFactory() for i in range(numEnvs)] results = [(agent, test_agent(agent, steps, copy.deepcopy(envs))) for agent in AgentFactories] return results def test_agent(AgentFactory, steps, envs): - """Return the mean score of running an agent in each of the envs, for steps - """ + """Return the stats of running an agent in each of the envs, for steps """ def score(env): global GAME_WON run_stat = {} @@ -464,6 +400,67 @@ def run_agent_comparison(): run_agent_comparison() +# Search +class GridSearchProblem(Problem): + def __init__(self, initial, goal, width, height, obstacles, penalty_location): + super().__init__(initial, goal) + self.width = width + self.height = height + self.obstacles = set(obstacles) + self.penalty_location = penalty_location + + def actions(self, state): + """Return valid directions from the current state.""" + x, y = state + directions = [] + if y + 1 < self.height and (x, y + 1) not in self.obstacles: + directions.append('up') + if y > 0 and (x, y - 1) not in self.obstacles: + directions.append('down') + if x > 0 and (x - 1, y) not in self.obstacles: + directions.append('left') + if x + 1 < self.width and (x + 1, y) not in self.obstacles: + directions.append('right') + return directions + + def result(self, state, action): + """Return the new state after applying the action.""" + x, y = state + if action in direction_to_coords: + dx, dy = direction_to_coords[action] + return (x + dx, y + dy) + else: + raise ValueError(f"Unknown action: {action}") + + def goal_test(self, state): + """Check if the current state is the goal.""" + return state == self.goal + + def path_cost(self, c, state1, action, state2): + """Cost is the sum of x and y coordinates of the destination, plus 50 for a penalty + position, and minus 100 for winning the game.""" + cost = c + (state2[0] + state2[1]) + + # Apply 100 point bonus for reaching the goal (subtract from cost) + if state2 == self.goal: + cost -= 100 + + # Apply 50 point penalty for landing on penalty square + if state2 == self.penalty_location: + cost += 50 + + return cost + +class GridSearchProblemWithHeuristic(GridSearchProblem): + def __init__(self, initial, goal, width, height, obstacles, penalty_location): + super().__init__(initial, goal, width, height, obstacles, penalty_location) + + def h(self, node): + """Manhattan distance heuristic from current node to goal.""" + x1, y1 = node.state + x2, y2 = self.goal + return abs(x2 - x1) + abs(y2 - y1) + def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True): solution_stats = [] solution_totals = {'path_cost': 0, 'goal_tests': 0, 'states': 0, 'succs': 0, 'time_taken': 0.0} @@ -551,6 +548,8 @@ def searching_your_world(): _, solution_dfs_totals = run_search_experiment("DFS", args.runs, "dfs", use_heuristic=False) # Uniform Cost Search _, solution_ucs_totals = run_search_experiment("UCS", args.runs, "ucs", use_heuristic=False) + # Depth Limited Search + _, solution_dls_totals = run_search_experiment("DLS", args.runs, "dls", use_heuristic=False) # Print results for uninformed searches print("") @@ -574,12 +573,18 @@ def searching_your_world(): f"{solution_ucs_totals['states'] / args.runs:^8.2f}|" f"{solution_ucs_totals['succs'] / args.runs:^9.2f}|" f"{solution_ucs_totals['time_taken'] / args.runs:^11.6f}") - + print(f"Depth Limited Search | " + f"{solution_dls_totals['path_cost'] / args.runs:^7.2f}|" + f"{solution_dls_totals['goal_tests'] / args.runs:^12.2f}|" + f"{solution_dls_totals['states'] / args.runs:^8.2f}|" + f"{solution_dls_totals['succs'] / args.runs:^9.2f}|" + f"{solution_dls_totals['time_taken'] / args.runs:^11.6f}") + + # Informed searches # A* Search _, solution_astar_totals = run_search_experiment("A*", args.runs, "astar", use_heuristic=True) - # Depth Limited Search - _, solution_dls_totals = run_search_experiment("DLS", args.runs, "dls", use_heuristic=True) + # Print results print("") print( " INFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS | AVG TIME") @@ -590,12 +595,6 @@ def searching_your_world(): f"{solution_astar_totals['states'] / args.runs:^8.2f}|" f"{solution_astar_totals['succs'] / args.runs:^9.2f}|" f"{solution_astar_totals['time_taken'] / args.runs:^11.6f}") - print(f"Depth Limited Search | " - f"{solution_dls_totals['path_cost'] / args.runs:^7.2f}|" - f"{solution_dls_totals['goal_tests'] / args.runs:^12.2f}|" - f"{solution_dls_totals['states'] / args.runs:^8.2f}|" - f"{solution_dls_totals['succs'] / args.runs:^9.2f}|" - f"{solution_dls_totals['time_taken'] / args.runs:^11.6f}") # Recursive Best First Search try: @@ -621,7 +620,6 @@ def searching_your_world(): else: print("=> Greedy: No solution found") - def print_args(args): print("\n*** Pass the -h parameter to see details on how to configure the parameters ***\n") print(" PARAMETER | STEPS | RUNS | WIDTH | HEIGHT") @@ -633,7 +631,7 @@ def print_args(args): parser = argparse.ArgumentParser(description='A1_COMP9016_Nagle_JohnPaul_R00065426') parser.add_argument('-v', '--verbose', action='http://github.com/store_true', help='Print detailed movement and agent information') parser.add_argument('-s', '--steps', type=int, nargs='?', const=1, default=40, help='Number of Agent steps per run to attempt to win the game (agent only) (DEFAULT: 40)') - parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=100, help='Number of times to run each Agent (agent only) (DEFAULT: 10)') + parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only) (DEFAULT: 10)') parser.add_argument('-x', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') parser.add_argument('-y', '--height', type=int, nargs='?', const=1, default=6, help='height of the grid world (DEFAULT: 6)') args = parser.parse_args() From 2ac492c4c4ff8034961d9eccf02b37ddbf210b68 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Fri, 10 Oct 2025 13:43:26 +0100 Subject: [PATCH 46/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 59 ++++++++++++++----- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 0079b37ee..231e11006 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -111,8 +111,10 @@ def percept(self, agent): obstacle_positions = [] for thing in self.things: if isinstance(thing, Obstacle): - if hasattr(thing, 'location') and thing.location is not None: - obstacle_positions.append(thing.location) + # In XYEnvironment, all things get a location attribute when added + loc = getattr(thing, 'location', None) + if loc is not None: + obstacle_positions.append(loc) available_moves_with_costs = self.get_available_moves_with_costs(x, y, self.width, self.height, obstacle_positions) return available_moves_with_costs @@ -146,9 +148,10 @@ def execute_action(self, agent, action): obstacle_positions = [] for thing in self.things: if isinstance(thing, Obstacle): - # Safely get location if it exists - if hasattr(thing, 'location') and thing.location is not None: - obstacle_positions.append(thing.location) + # In XYEnvironment, all things get a location attribute when added + loc = getattr(thing, 'location', None) + if loc is not None: + obstacle_positions.append(loc) # Check if move is valid if not action: @@ -315,7 +318,7 @@ def score(env): end_time = time.time() elapsed_time = end_time - start_time - run_stat['agent'] = agent.__name__ + run_stat['agent'] = agent.__class__.__name__ run_stat['time_taken'] = elapsed_time run_stat['performance'] = agent.performance run_stat['game_won'] = GAME_WON @@ -335,24 +338,43 @@ def building_your_world(): # Define factories for the agents def random_agent_factory(): agent = RandomAgent() - agent.__name__ = "RandomAgent" return agent def reflex_agent_factory(): agent = ReflexAgent() - agent.__name__ = "ReflexAgent" return agent def table_agent_factory(): - agent = TableDrivenAgent() - agent.__name__ = "TableDrivenAgent" + agent = TableDrivenAgent() return agent + def extract_locations_from_env(env): + penalty_pos = winning_pos = obstacle_pos = None + occupied_positions = [] + for thing in env.things: + loc = getattr(thing, 'location', None) + occupied_positions.append(loc) + if isinstance(thing, PenaltyDestination): + penalty_pos = loc + elif isinstance(thing, WinningDestination): + winning_pos = loc + elif isinstance(thing, Obstacle): + obstacle_pos = loc + + return penalty_pos, winning_pos, obstacle_pos, occupied_positions + def goal_agent_factory(): - # Generate positions for the agent and get positions of other objects - obstacle_pos, winning_pos, penalty_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) + # Create a GridWorldEnvironment and extract positions from it + env = GridWorldEnvironment(args.width, args.height) + penalty_pos, winning_pos, obstacle_pos, occupied_positions = extract_locations_from_env(env) + + while True: + agent_x = random.randint(0, args.width - 1) + agent_y = random.randint(0, args.height - 1) + agent_pos = (agent_x, agent_y) + if agent_pos not in occupied_positions: + break agent = GoalBasedAgent(agent_pos, winning_pos, penalty_pos, obstacle_pos) - agent.__name__ = "GoalBasedAgent" return agent # Define the environment factory @@ -370,14 +392,14 @@ def env_factory_gridworld(): def run_agent_comparison(): # Run the comparison between the agents - results = compare_agents(env_factory_gridworld, agent_factories, n=args.runs, steps=args.steps) + results = compare_agents(env_factory_gridworld, agent_factories, numEnvs=args.runs, steps=args.steps) agent_name = '' print(" AGENTS | COST | % GAMES WON | AVG TIME ") print("---------------------------------------------------------") # Loop through the results and print each agent's name and average score for agent, stats in results: - agent_name = stats[0]['agent'] + agent_name = stats[0]['agent'] if stats and len(stats) > 0 else "Unknown" verbose_message("Result:\t\tTime:\t\tPerformance:") total_games_won = total_games_lost = total_time_taken = total_performance = 0 @@ -458,6 +480,9 @@ def __init__(self, initial, goal, width, height, obstacles, penalty_location): def h(self, node): """Manhattan distance heuristic from current node to goal.""" x1, y1 = node.state + # Ensure goal is not None before unpacking + if self.goal is None: + return 0 x2, y2 = self.goal return abs(x2 - x1) + abs(y2 - y1) @@ -524,7 +549,9 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) run_stat['succs'] = instrumented_problem.succs run_stat['time_taken'] = elapsed_time - solution_totals['path_cost'] += solution.path_cost + # Handle the case where solution might be 'cutoff' from depth_limited_search + if solution != 'cutoff' and hasattr(solution, 'path_cost'): + solution_totals['path_cost'] += solution.path_cost solution_totals['goal_tests'] += instrumented_problem.goal_tests solution_totals['states'] += instrumented_problem.states solution_totals['succs'] += instrumented_problem.succs From 3a430d29ef8bac8e250addcec24e74d8449b422e Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Fri, 10 Oct 2025 13:48:37 +0100 Subject: [PATCH 47/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 231e11006..a95f639d6 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -363,17 +363,20 @@ def extract_locations_from_env(env): return penalty_pos, winning_pos, obstacle_pos, occupied_positions + def find_position_for_agent(env, occupied_positions): + while True: + x = random.randint(0, env.width - 1) + y = random.randint(0, env.height - 1) + pos = (x, y) + if pos not in occupied_positions: + break + return pos + def goal_agent_factory(): # Create a GridWorldEnvironment and extract positions from it env = GridWorldEnvironment(args.width, args.height) penalty_pos, winning_pos, obstacle_pos, occupied_positions = extract_locations_from_env(env) - - while True: - agent_x = random.randint(0, args.width - 1) - agent_y = random.randint(0, args.height - 1) - agent_pos = (agent_x, agent_y) - if agent_pos not in occupied_positions: - break + agent_pos = find_position_for_agent(env, occupied_positions) agent = GoalBasedAgent(agent_pos, winning_pos, penalty_pos, obstacle_pos) return agent From a637f9a6c2cd5786bed070eba4d88773efaf4c17 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Fri, 10 Oct 2025 14:36:32 +0100 Subject: [PATCH 48/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.docx | Bin 314062 -> 285169 bytes .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 112 ++++++++++-------- 2 files changed, 60 insertions(+), 52 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx index 9ddea98cb06a5e234b53a10ff34a7c94a28538b5..013adb848dac1e12f773f7b8b222d791f4182e11 100644 GIT binary patch delta 13467 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 delta 41656 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

K#o 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 diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index a95f639d6..0c12dfb44 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -40,7 +40,7 @@ def verbose_message(message): print(message) def generate_random_starting_positions(width, height): - # Generate random positions for obstacle, winning destination, penalty destination, and the agent. + # Generate random positions for obstacle, winning destination, penalty destinations, and the agent. occupied_positions = [] obstacle_x = random.randint(0, width - 1) @@ -54,17 +54,14 @@ def generate_random_starting_positions(width, height): occupied_positions.append((win_x, win_y)) break - while True: - penalty_x = random.randint(0, width - 1) - penalty_y = random.randint(0, height - 1) - if (penalty_x, penalty_y) not in occupied_positions: - occupied_positions.append((penalty_x, penalty_y)) - break - # for x in range(width -1): - # for y in range(height -1): - # if random.random() < penalty_prob: - # if (neg_x, neg_y) not in occupied_positions: - # occupied_positions.append((neg_x, neg_y)) + # Place penalty blocks randomly + penalty_positions = [] + for x in range(width): + for y in range(height): + pos = (x, y) + if pos not in occupied_positions and random.random() < args.penalty_prob: + penalty_positions.append(pos) + occupied_positions.append(pos) while True: agent_x = random.randint(0, width - 1) @@ -75,11 +72,11 @@ def generate_random_starting_positions(width, height): verbose_message(f"Obstacle location is ({obstacle_x}, {obstacle_y})") verbose_message(f"Winning location is ({win_x}, {win_y})") - verbose_message(f"Penalty location is ({penalty_x}, {penalty_y})") + verbose_message(f"Penalty locations are {penalty_positions}") verbose_message(f"Agent location is ({agent_x}, {agent_y})") - verbose_message(f"Occupied positions are [{occupied_positions}]") + verbose_message(f"Occupied positions are {occupied_positions}") - return (obstacle_x, obstacle_y), (win_x, win_y), (penalty_x, penalty_y), (agent_x, agent_y), occupied_positions + return (obstacle_x, obstacle_y), (win_x, win_y), penalty_positions, (agent_x, agent_y), occupied_positions # Env class WinningDestination(Thing): @@ -97,13 +94,16 @@ def __init__(self, width, height): self.width = width self.height = height - # Generate random positions for obstacle, winning destination, penalty destination, and agent - obstacle_pos, winning_pos, penalty_pos, _, _ = generate_random_starting_positions(width, height) + # Generate random positions for obstacle, winning destination, penalty destinations, and agent + obstacle_pos, winning_pos, penalty_positions, _, _ = generate_random_starting_positions(width, height) # Add things to the environment self.add_thing(Obstacle(), obstacle_pos) self.add_thing(WinningDestination(), winning_pos) - self.add_thing(PenaltyDestination(), penalty_pos) + + # Add multiple penalty destinations + for penalty_pos in penalty_positions: + self.add_thing(PenaltyDestination(), penalty_pos) def percept(self, agent): # A list of available movements from the agent's current location and the associated cost @@ -266,11 +266,11 @@ def table_action(self, percept): class GoalBasedAgent(Agent): # GOAL is self.location == goal_location - def __init__(self, agent_pos, winning_pos, penalty_pos, obstacle_pos): + def __init__(self, agent_pos, winning_pos, penalty_positions, obstacle_pos): # Maintain some state info for the agent self.location = agent_pos self.goal_location = winning_pos - self.penalty_location = penalty_pos + self.penalty_positions = penalty_positions self.obstacle_location = obstacle_pos super().__init__(self.goalbased_action) @@ -285,7 +285,7 @@ def goalbased_action(self, percept): width=args.width, height=args.height, obstacles=[self.obstacle_location], - penalty_location=self.penalty_location + penalty_location=self.penalty_positions[0] if self.penalty_positions else None ) star_search_result = astar_search(problem) @@ -331,6 +331,36 @@ def score(env): return agent_stats +def extract_locations_from_env(env): + penalty_positions = [] + winning_pos = obstacle_pos = None + occupied_positions = [] + for thing in env.things: + loc = getattr(thing, 'location', None) + occupied_positions.append(loc) + if isinstance(thing, PenaltyDestination): + penalty_positions.append(loc) + elif isinstance(thing, WinningDestination): + winning_pos = loc + elif isinstance(thing, Obstacle): + obstacle_pos = loc + + # For backward compatibility, if there's only one penalty position, return it directly + # Otherwise, return the list of penalty positions + penalty_pos = penalty_positions[0] if penalty_positions else None + + return penalty_positions, winning_pos, obstacle_pos, occupied_positions + +def find_position_for_agent(env, occupied_positions): + while True: + x = random.randint(0, env.width - 1) + y = random.randint(0, env.height - 1) + pos = (x, y) + if pos not in occupied_positions: + break + return pos + + def building_your_world(): """ This function is used to build the world for the agent to explore.""" global GAME_WON @@ -348,36 +378,12 @@ def table_agent_factory(): agent = TableDrivenAgent() return agent - def extract_locations_from_env(env): - penalty_pos = winning_pos = obstacle_pos = None - occupied_positions = [] - for thing in env.things: - loc = getattr(thing, 'location', None) - occupied_positions.append(loc) - if isinstance(thing, PenaltyDestination): - penalty_pos = loc - elif isinstance(thing, WinningDestination): - winning_pos = loc - elif isinstance(thing, Obstacle): - obstacle_pos = loc - - return penalty_pos, winning_pos, obstacle_pos, occupied_positions - - def find_position_for_agent(env, occupied_positions): - while True: - x = random.randint(0, env.width - 1) - y = random.randint(0, env.height - 1) - pos = (x, y) - if pos not in occupied_positions: - break - return pos - def goal_agent_factory(): # Create a GridWorldEnvironment and extract positions from it env = GridWorldEnvironment(args.width, args.height) - penalty_pos, winning_pos, obstacle_pos, occupied_positions = extract_locations_from_env(env) + penalty_positions, winning_pos, obstacle_pos, occupied_positions = extract_locations_from_env(env) agent_pos = find_position_for_agent(env, occupied_positions) - agent = GoalBasedAgent(agent_pos, winning_pos, penalty_pos, obstacle_pos) + agent = GoalBasedAgent(agent_pos, winning_pos, penalty_positions, obstacle_pos) return agent # Define the environment factory @@ -494,9 +500,10 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) solution_totals = {'path_cost': 0, 'goal_tests': 0, 'states': 0, 'succs': 0, 'time_taken': 0.0} for i in range(runs): - # Generate random positions for obstacle, winning destination, penalty destination, and agent - obstacle_pos, winning_pos, penalty_pos, agent_pos, _ = generate_random_starting_positions(args.width, args.height) - + # Create a GridWorldEnvironment and extract positions from it + env = GridWorldEnvironment(args.width, args.height) + penalty_positions, winning_pos, obstacle_pos, occupied_positions = extract_locations_from_env(env) + agent_pos = find_position_for_agent(env, occupied_positions) # Create appropriate problem type based on whether or not we need a heuristic if use_heuristic: problem = GridSearchProblemWithHeuristic( @@ -505,7 +512,7 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) width=args.width, height=args.height, obstacles=[obstacle_pos], - penalty_location=penalty_pos + penalty_location=penalty_positions[0] if penalty_positions else None ) else: problem = GridSearchProblem( @@ -514,7 +521,7 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) width=args.width, height=args.height, obstacles=[obstacle_pos], - penalty_location=penalty_pos + penalty_location=penalty_positions[0] if penalty_positions else None ) run_stat = {} @@ -664,6 +671,7 @@ def print_args(args): parser.add_argument('-r', '--runs', type=int, nargs='?', const=1, default=500, help='Number of times to run each Agent (agent only) (DEFAULT: 10)') parser.add_argument('-x', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') parser.add_argument('-y', '--height', type=int, nargs='?', const=1, default=6, help='height of the grid world (DEFAULT: 6)') + parser.add_argument('-p', '--penalty-prob', type=float, default=0.1, help='Probability of placing a penalty block at a position (DEFAULT: 0.1)') args = parser.parse_args() print_args(args) From 1f510d75561efacdd0c0a7acbb6f32d86a4c8c9f Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Fri, 10 Oct 2025 16:22:03 +0100 Subject: [PATCH 49/56] checkpoint --- .../A1_COMP9016_Nagle_JohnPaul_R00065426.docx | Bin 285169 -> 226229 bytes .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 19 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.docx index 013adb848dac1e12f773f7b8b222d791f4182e11..8f5ae2aa3863423fe23ae18643053b1df55dfb5c 100644 GIT binary patch literal 226229 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 literal 285169 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

jI%D*A`h4Jb{aWh=1 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

4W-CcXa;S3_fkOueZNf@ zxn1SnTJ^p@WV4%{VdH~%$*51z#ZC|9SluhY0UB*oP-2%fC~Guf@)Lm3mxtc*_U&WO zT4pU=F(tMgT7@%-u;mdIwA*hJ7hT1pRr!r{%;~D2W@(W>bV6u)J6aVwovr%hu8^}R z%JvEB=9DI|H|3LwG z9eg|?%lFS1As*UWqTA!LRHOWJEeCDK(Ef})2D$BwLMbU)<7-r-kBxL1Zj^2W#}#5= z>rs}FHh&UVaXfy#rAORhj25oJy;~VRT&|faeO*rrp?y7dW1&ZznqJkcEsIy6P`tB@ z?ehJ`v<(9Wjbq)`17}*3ZxO0&rl_!)0&orcKuul#=|A&`=xWL9JmF~u0T09{TvO}Q zIwWCm$!in6u-qCJ;=8#vo?+sl^qqrLM1I z!(M9vvOnuXs2>?E6wNmo&8*CK$1;NkQ)tbXaQrqA=|Xr$t!dcn~%?n-re6h|A- zAxik2H&rQ(G){Qi3Nu`$F^YTg-m>eH<&~j8r;vpn)R5OJ#XbXL^duLZn9~mXaS7a1 z(8m!GSAR7{YEF7|WWHW_BOb_6zW$Efu^fJJKW@r=FgPM$fyxZ8e-H@W*DsKFLX-LF zS{*P)ThuLcbex=NZP_?=ResC7EshFlWQlMg7P`Jb!TF85=qAW4X?PZ#|D4Ba*ImM2 zr!?#6=o9AbBO^3>)Dve_~4X#X_k|3Wkq(y zt(IOh<$vqAmDj4)`DcLq>j&R&mv0-}rGK-~B$RxTi;B2o*_i)w5?S0Ibud+%N>TQMUT1Se?SKor&w0+CCWhNvtt2EhX7Y*U8thkGq_Ip(= z*J9$m^x_7gAbJ#FsMv*$r^WBlu>uSWWN16qX4jS*Z zebVL$!Z%Tkh&^A&%2F^oZA}FoC%7N*>&ZF{!q2oxxY>j=8 z(PwaMcy_)KQcf%wpMTRd8u88NND=j%!k1yNjeKOKEorEr_vQhcTI>TtlwR0Ssb?Rq zrH7V(XXs~YgN!qcP|gANd{{>g_LisZ-Wc|@)b1IdI`&hJX?$%frPIH!_IiV!c}eCT^SOwSy{&IFBaq^T%7#skJa_;6|Cx& zZ)VL$oN=J_mP~0ma4^|g=yAvoUpVTtxI!Wg4|2+TK?q9YQCX|8OYUR$BmG{vsO3D-?c2j(Gbw zupK61Y6pw0a))!(D%mt!sC(e9n0`Th3J&D8Lq~<=&9RfiiLw9Rf&}owpD;fEK?(nk zsHqANNY&U6xFd7_e>CR#XE^^SBhvr9v-3oJjOGJDnDYrjTS-HC`VhqO#e<`%`9Pwz zhf>x0$EP&`p&6^?ZulcZLTeny-~TVjm;qFD#!kCT!%MdWP@;3QgKAlNtfW?1fq&on zKX@HG=D%*6b0jgo+~`hR`YQ|+M|Szkw+#R?^P;i-`-c*<9tVAZ0cR^7pZxRK|MUMe zgSTfJt3O)&^-Uy>YnSWk{lkg>Z@%jQ*EXZ_kCq2-&Jv-1b&%?jx{D+j(oe)cL;AmW zmJ$-R_*_RT;|k3*Dn-EEui0+TnUBPqJLeN|q;(293cZGD81q``5-%CE>9ZB&L{gA- zmM{C7j}lflP!JqLv(s|7T^koWeR*FALWiHzF%snYu=x{w{BJzU%=Vd&aJtMZR(!*D5wS9TEBDv(wl}vPwy-Ja?Ka0c{%hu zfI3SQDdOF8$(C0r@h_M%u0|#-tdE@gLg~U%s!P8^4Zp!*5OMQ~Apkn^$cLwWcs4hX zZ@nc<`Xjmbg^YB9Bvyqr#^P#AaGRKXTO@QrpE16^11v4Cgk7{?_k=yugdB}Du@ z9k|gaim9YnJtlN-xl*m7w+*uA(0|dD^S0Nzln~0gCkM3hwS0c|@H&*dbrxivRijIL zx(DE%(qe{&guC;5KFBH>X4HJ~Xqx#Am14Q5$F2s(J?SAd$==hnWYnI{U;Kt_tM8Y? zJ?TB~blN|hK*S^ufAFb#j4ab`DAq72>v%r<2=~JWc^;akei+qC`ksx|_L+CKK!)^6 z{CuYu+4m_7Hzj{Of&`!y`71+ml&)jB=96!?821|s4`i{IUwx}S3_pYMft&lvmAu~d ztwohbA^JN2(WCXD+k-FKQnyzkD=EFZv8Q~lpIqocjO6RJv_`09tIn5wjSt@dS(;Hb z!lb7m#XE_qcYg3r;fv2gx)t&fd~S38Ick*uWjsU$?ccMTn95W~sSTN58j)igEHiHU zyv~F5iXeC8WeEsn-)EqtjDr_JlXBwur~R0I9tPe(4D|<#(4d@nr6(J$JJJ~i*FY&n z2wOIHGx0okkadG=_biR(=w!G&H6udL&S-}}x7$B{@O^OkZn0PU)&zccqaoPfu7`Em zoA8`gwqC?DcCEyF(|$nc`AFn?Ra9$Jlol^Qo-tRG?^@ok4F zCfL1YuJKZZ8wtR52o>?YipaX5H-AA9KColqp>=nYB^-O(A&{UvhM~u(0UBU0Cf!SoL7kB^Snd<<0l*I zlM1sQoHM>B^F}h_&ml!8|3Z+it6rj=m1P^%v^?oAi|P2PO(Js6MJopZT+GQ5m9pIx z%uDaO)3q64ev=Em+FJ+UVr|K@3`J$^JC^i}H;aApd>L(t3F*w>!FdWN%sSZJ@741P zm%mciHSA5?C0MB@$`d)LtA&zP+C70~yMs!4Z>sE0P|L8ybJU~4_LyUwA!@Ltax1sveo8C=vSF+LibWwW5ZfW zPhD){xIXWC`jV0ZfB?zG%?yWA{ttJ51u4BN?qS$xZRN@xGqZgOT6~*EjkHv|gs5%! z475NW6$@vlq<1elsN6kBXrJ-R>Pq&omz=`>3-(PDr{eGY`5Pv%rEYpSg6r~l9;&a) zg^C!@EafCJq2)7N;4YeX`SvMLVw;;SP^q{w$JtAGqd78j-KeYm_RsO`lmG)JKdQi? z#a9<#5{Vafs0AIC00Sas-`ssWuVFiZS!Y-A2pc8l%eKK+zjsxC!y#L0*1)lEU%6Ua zKWfxxV&!6t0hb=l*PK^M)f^-`mP+yWusi$MA$PbF&lU0v{EHn+jZ0vEZ&IMEjQ#97 z?2szoaZju&l80ADiDUA5knD3bnBBbhCuUlA=bNg#47}a%(6&EkV}9aVLAzj6VVovd z{HtUB)g(!HeR?!^xl*4Yi7>O_X7AIbP&PG6`#d(ZZiV#hr7*%IJ~wI5)ULDi`95GL z1=&j|PEPy>FrH(*pZ_1gXlBFi2>r_<{nwU2a`~jBsF)UP-@6)3r-o8|BEp7HXlyk4!UXTt1-h1ROb(K6#9H&bNZ5uw@bC&z?X zDJ>eTD31iyJrGoZsVT)rnz20j08YV^gZc4CH1fAEfwXU8&Kz+hU%i?Mke{zhj@gm& zL*PS@$lk+gu^-vOPqKlE#Rpor*5A`*FyIM5$gqX_^d7yl!WYz2DE=AFKeO{su>G@k z{@DutcW>0}q&RoL`a90HBiy7iIug~^zR4Z&f~;$Q@X+s*fU(0SN5as%qZyty=z-iJ z8|`umvR04%5oLqD6~E&UdfakjewR-?ndxAWMR}74oW5*Ki8CJY#3QnCerRPYW^`v9 zK?(_4S8+?SOL7@2nZ;Qn)Xkp99XSrZf#X2?)c!rA%^guX53ZL_$a2{>R-x5GbB%n+ zc5MN#%^d)l1oU0?-L=D$pja0Qx&GC;lU9H!yZujJ=t)=uDV&K@o`M*mSZBa3i0a?d)b2i%W!E<@JSRm zZ|B5HM5($KzDfOJWdCg{VpY93d!R}SrL_DRU)%Ie$Gz(Zo7|x+l_UE11ahh%Yc0y^ zrJ2(a!X<>FvCue28|G9LHFx4`iNZi)?U0gHAwFWJFEg3;q`ZbK$gBL108ys_*&vnD~ z5I#xNQ6qzY5t&3s{DN^#Q(|JR|AuiC^nBHdC*=uN`KMESwm#7iXzSFiswN-=7o#=< z=>lpYtIP0or38HsNLNOT*j@Ww+*W6C;cTmX7m+#8WFgr|^otJIo1k~XR00IYA(6ld z;tR-sFl2Y?_4~|7%7}R4T9rzLOPeTC4DphNe^+=x_3O8w+uJJ*`rtY@&rgy-EwECJ z+w82c1^7)w&@mK^nx$?==|8-m^FZzk0oH-d0o1S zpH;y0edNsEvyHe?uTn$o<+|!GcHtifQ;Xix()~GmS#yTX@(3C8oG1gbfYb+T&l-4R z89TPZaJHq}RxtG3&h$d`zW3w363z%gue%nFz2bc>HXRkmPqPLAO+ZI$3^0g*J{_vI zdE=v2f9oK#69RT?G})@_03Lv|Q1O+wC<(mS_GpG{Sdfx1zjZaDHPsH_I1gv*hPHq( zv7v)MBo|X;8u^hK`Zq2!d)nnmZ?J@bA`cyB#-V?>a@Sm%Hh8Y0WuR)-7 zF4k*-$xE&pzvDOG0cy`(!i5ZvqGnQ@>y~A0*pnkm7X=f5>FJ%5TD)elal+dcZmJ-% z-9hsVPCL)>0Roh?5|=_sU#hcGDrMi_m`|ne+EIJwS?U+MA!xK6Gf*1%CSJ~bx^-aX z5ooRC^hWMK=<@b&zHB^SpB>|8_qL+Yxs#y56Cw(D#=Q0V~e_ zqyi_p)To*KW}eB(Y_5TkfuT<)C`Sb~&EnXuTf0oE zb(;M1{tDl$$wZ3+4Qv!@M_9-T2=p1y~6qWU#|K@uGi1?a+wyOw`NZlHrsr@u(7IG9wWdk7faXZK5 zD3E#pfYj}BEyg22>J1S{Ws1Y~{t^Vgro;CW5l98v^*%ll;U9@W%BsWaNWZraw~4s$ zQ-Z)zT$l+0_|0J9;89$74vhJq;ruf@|67AiZKfl|Ak(&s>u~V?=KGQgFe2j>n#Yf> z1rD$l8mr*8N7lkiVsUJTt5@>y<0Nl^N*;y7iWSXYR`jnw|1b_JVCSlX1ddd|fDaz5 zh2e_9BWC^EZoUgA#~xf{%F`rC@#5KR!=6?{Je^+kEGv{LoH|AI=H*{cdn%b2cw+`q6PF29?X6x-b8U((}BcJN!KBI`_YG+ zCrTv7H}yS}b~^Tw@A&sx{E_);){~5d+@OJJPHt_>7;sExPc{9d;@oa?H3o%+g)VM% zTV!wMFLMkBvu`u(RndF4xx0Uz#~m%hROgB!yB|gO_shk8Ww(;)V88tPW?aVpV&=!* zjNSAf8s+FDa2ysCx=xugt#)l*U-1&#S%k`5qLnCDd4&UKwgC*$zEe!Y1jJMA1&3DRg+?^{#LIC4BYj80^!g!{6SsPJpwUaTgb=#-@gH#=}WbqVh^=l^4}Z>f`~(C$9fGEsO_?ri0(U$)EzU|fcJ+h(by(axMb z6t=Sq5+Ew_#rn^KNunhqHm^W&0vSy?cd-4%;)g>^&&cP!1xvH|9fvvpcVTr1K`kLi zc%YMRIeEau)kZJK+b^WgGA>f{F8R@CAi6#3fP5%xXHR6*DTVYpC23B-N8uKmkKOLX z;>sv)yioZxOs7~os+V1G#4EM9dGXB@(`ECIUkym1{f1>d>UK1R8%5AA2Dq1*<6AFL z-cfaW7{U1!ZfnA(D|K&SYmqb7o;w=|ep2c!%{O-fKy!+vG9OfNg-i3GavfFDIX1gA zll$jtQ$}1Nbcy_&qwNsF&a()m1H(GcsmYG&z=~xSC7jR1dwQe6ton;FVGu{)0!Kcp zPE#a4AIlfo)~4YX8ktjB31sqsRXi=i`NB>T6fMy`os!) zd*~Vn=zY8&=B&ZJ@sw$s4+!S4kX_yq+$@3}GYj8yTPv@GFPhCTrl z>3Cb1=Fi+6@u|y-TPp@KUd*%*M6*ne*)cp&#?j!^C6A9tDy7SeWxyKs9>p#2qAp zs%Tt-Ou5eNwnmDh(@=C<1m0qh4_Qe&e=Ka|GW~^ub1R@!OYbGZlxa|k4P=VdTnlX( zjH)vte>@sS3v0aafwe6F)$!IEvE6YxSrL0Vpb_8KV_r$Xu-el# zifko04ijL*rtsEp6w0C$s>5e(G8te|PVZN|E4x{dYh3A3pK!C0Da(C`tJiOi_XUBstpfuzf->qhT>(1K}HLSv9GC}#O zO>fsK%t8#hIoptrCkBV;6$9&>r@Ad6%+E_F4{+E#MTrNj7ZpSp;=P8BcO=_yO3Wuu zJ{6b<&cCJ>h%87Dw7Zu2<)x5^$!txB`!oSg&4t#@8L{?ji(KvH<3>jb3J){^HKCLZ zd*|MAf!ew-`U-8#QuE3u3V&?fjAxRn{sudtI#gVBYWPYW7kc_@1)Yz?l{KXSLqt2f zpsko0zLvi5!e~b=@dN|w%Pojfg3snLZ{8Lekx_{zVa|=s zE5Zp&K3>%QfkI2~vmh*WT$O}m1k49(x@?|LnRJdaNdD(bvbmzCaDQ4>Xxh%X4EHW+ z*)DB<>%@V2w+v{hON@FOjRrzppq{@@m~}Lm%-C6;M|?X(ramK+)_?Kvr*-UPw#Ec{M7$#Ip6&YmQI8{e4(aQpKX zZ)I7^RIlKm1A?FB$|XEQwMQ`Y8w>2f_+(utElWToSEX<@b+FS-?4SjrlrHGjls#uR zYK(^GUezWaWvWbsl2*QD>NO+5sf2KQampE3*~GTbK{?01)!oJ0zoZ5?V~EnHGS_Zf z*>knbEoB-b*FA%8HvxIY4W4w96?;85KnjdGjCE<94r)o-P!_vw_gI01Axxt0Ag2Wy z#!DtH3t_L%{KNz<24H5bdx0<^B{Pr@fv8u$}mtnAB4<) zwnshO9-jFeWEZ+3h^(6Yk>m-j1VZge7A0A(J%X2H%H*X{0rBtHXBi_~FVF*pvyYU9 zd#RAlB@o_A`3>7u6Y}Fl{ZNHO*f(F5pHoI_0~%uzYcCUw{OsRfJ6Mk~CdBgJ#q17F z&Ygcb@zGpgzD8&5&VKw5eZV*SllZV8Wd#}Mx{ye+n?d5k_!ZVj;d{M0aL3ozCI&Z0 z8w^6Z{1*p{+UH}w@QgDz>E?vWV;S!o0zx&c!boGe-)tslVC~#Hxk@CvgI&PTsmT6b zZ9S3E7hmnkGL%*sBZ^zdW=%uh1e2D_+AIR2K>1LKcx1$yAcWZR=0&Zu>-LCkMRHrh zd#_JQqC6ze=da&!*=v|Qpfm^f)Yh3V6^88_r$9C{)os7Fp-IK}2ZbRi!jmTo=EBz%lUB@NsqTxn;&;WF2nITx)P1@q}j$lUld zuCQ8bsJE&}CB;gYW7rt1fm29sG=nGG`hc8EmcUYPFvL`-&~Z+m?|s=a1Mj5Vol~X_ z^b@T=y4D0nQ`*Z#CYEY|dBNM}$_$CLeTE#0(c1_85yjyKQNgLLT5P{N3YIfPe&`D z$mRjb))r_hH6!6IS8ck#kPzNfGQU!~KvXAb<`lTM39^q|HZ66?oc<+Wkz% z>vWT>h5F2;J2Fmz+s=!11ff?}rem+OKBB~W($&maU7dGKS~k@SP>?0B3%G(sia zx>CKcsfQZi-*-#&*-@x>GsBqJcPX6=Vo&!9KU3SpL^5Ex$!h7GsAF{X>1Sh->ds3C zJ3|4Y*ik0$6qn_q&L4X#SL=*^>puO8fTg-?T@z@)XJV@vUbj<`czq~P(drLLKFd(( zH8lsaE8(Tre$vI+qa8gw0_t|2vTd*8#baEx%Jd4FjP{l6ibLT+g@j525jBgQM6aFX zrmcPm#+%LB?>SxMtxXWdkV}6&s5EfWftJY5M z;lf>2F}*;TAUD36xz*y%Fu`yq*LQ*rwMLFs77QC0W4ug0KfTZsFdtXAeLXT;n%}m+ zF+x+bK(IP7cwByo3B!0z=()r2#yya8o2a#_CKdbf)4iW*xLRm$Jq46{I}1Y*n*Hyf zRIhUmqu-0jL>(C@~&12Xw%4D~#^Ugq1ZEn907 zwp=A-%Pl)-J?gS|vK}=s)8O=4N$in!?#j`cIaudw1Y$T`z&U*7?68LzCQ!Cfwn;cF zy%Y_aH1D&OtG8tiTJwy$gqT#CazoZ>=JE5%c4z7FIleYFk#6PEirT6VPDqcm4+oa? zL|lQ3+L~0x%RrqwTCV{rrpC@xq|_T!mBL;O*ET(?KHzyv_U56&y(ij?Ge#ZF!FS4Y zOQ%0J-Vk>&>dkh_pXj?V&k_{nPjg`GvWu126DeNXeL{8uU|i;a zeV0*i(?wSRl^jyrsr|#(u}8kNCH;4I2^^d^Zk6bvman61>%IN$bKAvMq?%gm`adhe zBQ}n~@6 zS`u@K_)2`mB!wd;rx4d%VN)eLf0{H31!s;j$WTJ?x<*Mbu;t#5BzcIYp$*8inqNOF zHAPCVb!9YgC1g@51Yi>Au#z)Q#gp|`i(iU6=fFekn+_%I;ZSyO3*i$_eVNy*+eJ{d zGPP5Weyq*r)6C~LE7T_P%KF49?*%GblZ^(>&o&PW@)g=G$HxW5&9~l(i3_Tsl{2bSc(B=#t2}{}Zo-yoi<&_ojezEb*`dz2g6p^5nR3d7~ zov@k1SFZZA2GxxkJyA=;YE=z#+s!29z2JB_EEVfMraME>(Ax2@DP=TVG3HiyOIBxl zKOqO@F-&V-=l)eF^W*zyS@L45p2wYC>D<>I#^9IA zjFD%cQn)tcxv8(o`YOUpLjas9rk=! z!mqEr`V2=tgmbskaEn9RSBbqiRQQfG=Z*Q*AzE!jsbM{KCqTv?T27#rEw3Ewz`}&i zvgvuZs|-Q&pS#!j2tXzTR9JF+qKV-W+kKaFY&Xr7qNdj@J4(+UB&7 z{VS8!8tUS}I~vMmb2HT_{dZ+e_yhLqkf^w_%`P50c1-&y}5I@a-g#U+_*Uo|V2xDRzP1r}JQ{$tVupm2l43 z@PSBxg0{oAj$;$NGW?%S*BO4QzM~rX9D!!L3)6R5noqrNz?_db?z-aLOy+5N%A0cW ze3^Zu+>D53ZDwX&x!F!ni3z3Kc$S7SPwqnu`sY$Bxk~*reYrrCp4)Llg#s-zel|x` zI2UKM+D*y?er<`S8$usX+$vPSy}2*uF3e}}O8|LJd7LU$n%o8K_&htkFu49N^#y6H_8&z8}5uIl85@DjW*#BH)$_m(9sq}oE zY;{E%uI0vVOavB&dKIo*9O=_!RzE2(_JHTkvx=FQDk_C$oNmz*yaxeDSn4HUJ@Y~* zsl|OY;Eq+`^cgJT2;h?zsfX2762kqVm6O}KKpDW?Spgm5bHw+7FVhC&C+SWiKjp3G zG0W3s@H&qX-FhdjuoWKqSk3e6ky9ga!Tgl_tbhLu##SG&8(i9IiW3Lnf$&SzjoR|^MY6fV|r9?`ZH_hU1L@g()+f6C7yB|p(T|Nnv78y zH#hJWjSEZnM5(oi$wU@T{p9#BPlYeZKPyy*J%u$%|^1 zYcOpcJJ@nFso%*`8$`8hCvd6b<8O_8W(c^>XU0<3Y5#OyeO~QJeBofTZR92}{0gGF zHA`G2aAMcfs?X#*X~YG%eK+B#1{{pm*tyyo^N2g=J#s2M%-ny~eQ!SowX2s)>LF|o zZ_?ePO^r5^61#y5)S*+zO<`c#Z2p}TD?IZplDoVt*w%-0k(kZ~F8Ortl0r68rj$OF zGSRLQJ_OnAxUN8wDFZ%#p@wsw$*q%Vv$lir=T=R?+X3yj9+7|A%U!hw z9G&`A2WMlLIyeK%(nv*i3u=@q)`5gZKKJ8fm7;K#BjKxVm5>fM-9F`3z?~Z0wx>8tci84@*)e+WZD-lJh2T`IBK@)C zZU|;(uB$@kbEGoanxaGJO4Hz!Yn>>UBfBMu7D<$wf%)>s%DPwBVHPdtaoHGYLy_bH zYDQW+0ya_{d+%0&W*SYse;r@wC@Ur7!S}A*$C#;*9VohQRCszqhXL}^U@i7XkykQH z;<@#rNmWrYe;Eo^@-xFO2Yfsb$;yY5q*|{XjBKefWq5khTA`|kd6*dg@YYaYS;FscKs+;)e9lPYj%c&xHyMcpR`N+7Z zRJWpwYfRQM_g&?#_$4~*`n`I~M4EYa;gxc=SQBJ>T(5cf$**Dsu+NsE&SeP|o2roT z_<^kMMnNCX`59L-%)}asdCR#Vv*q{}R+XE6@dq%cmNh12w z6fLb`-pQUldU3+xq3n%k+G_9N`47H~c%X$=TVkaa;m=bqiEjn+qgx+&MktZ3 zKr-^(wJ}ze9nq0Ig!Pzs6QPCL-rv=)b5e`QbZaoRwFs9?mt-F8i%Z~UsB-C3(!nkf zybiDo!8E?}QtyM+coO*@l&`@glujnBI6s~7Wa`y-YyR4#>K!yH8;W#hYh1hZw90_u z9x%4&RxgL|v{V2T&+>+G6Au7L-TRXVJJ@GyN?||Zn+l)!IBTfftd5tfPHN_;w8!Rp z+Vt`9WjJ}{=U$hC>g%@~gbu6_*_7g@mGwa8U76)E)@s2Zx8a19i-VXCd@by{$(nJ~ zj1I0pn@*=V_9We^#PU!v|12qWczmvb%6Hj^u#nqoYf99wNq#+ZtxD~#Ue+x%*Y_;% z#Xh=Hk1>h!GiJ^Bffvg?xuPo_vPwPc^z`a!%`dU?QQ2y|s1Wz*l=A(F()8BWU?+tn z$4!E$Eo%3atj`TxJG-*{OqZ;@v{U*RnoE&Vo?b{IRl2V8Tlh{H-c-vtoS~aYP>y-6 zoo%`(7dH)5J+OBBy@rpBjzH=bD(V(fL}F%6Sfb79IZNmR@go0j!Ld!sbAdhOd}ry?(V zo*hcj4>!*3Eb*iN-T?9kB_X5l7oCHTIhiG@Sfzw>go?> zeGt38E5-ccJKfNYYOG6~Vy;GpI!C=BdM%!-eG0;c411;UWwt$*^?tastLhU*;K;U;Fiw^*dzR_h(x zCAPz~G^p47LDQ>$OIH0S|klnvz8~J;v(`jrl#U`hQUey#iX2D{@8l--)Bz za&+7?z7{EXNGLcm5vzkYxld#>)wpha%4L%^ls#K(NC0KHup4|5>Cdf-jUqwK>tI{F z;XAIB)1o^zfXCf(iO-R1!)cb!ye-szhsO?L_d#d1b?Gg02Tt}pQ$Xnkm$b2zh$;SQpwk-yV>|Lv%=^}$!!KI?c-c;*Cqv|HYf+OIwHU4`LvjY z7~^5RKO*Za+8gu9C#73XZ7tRpM*D1iH^rDVnboH)yo1Wr<4t*l?OIV$&U!lY#%iA@ z*{U3AC|^mQ9P5ip_4kZK?|AGe^O?C|zNa^R6ZLNyQcE0|DB9l2`>|HC+@IS6T1s#t zP4s6)DW;sU6z+9$jV+D{>h4q&FyR)7b8oWfk6qW~zC$4+~o^|v&3h3+D z2|l}N>(S3DuLs$AIK8EEulp2J$DN!AG;I`OoRAf;F9>9ly2kEk8#lj`AYn6Ay3ms? z4R7&!YT|BWis5Vu)?q~BT&61BH#GFK)PfhZAIbi@mgbkc>Rir4fsD&1cx!ZoJCkFX zO%{q$*fit(-=rziBga_+$!@-*B2hZ&{zH*Xb{uuaE#ZJte2BPazwlnYi|ysDb+sUI zXIw?0$M#y;p&EJR_7z`GcW}gZ4U!%sImt4v`oxenTlj?BdAEcZ!SG+5aovGeFp8K0 zpNP(vRA4BP^An`Vd9)laz^3^W+|<4<|0U}t8YgdiR`tP`p~@>3f<$MoukPg+jz(OY zFGVizy!iqYm-HRy4GLSD*CcBUa`OJ}oH=pkJ!lBSCdKgTuyRQ9ChSD^jIvtK`y;>k zU9tp}s!RM$59<$p10Wj+gHqd{svZ564aiPx$Xfnd1^>gw;||nzQ8Gzs*++jh0JI4M z4ADol5hvCk1M6^@h`id-UljntyFiNLh;jc6xQKaGoz6Kr`-l$sj0r%mra_wjMN4Ex z@YZ4r9BROcb?AF&Bx;~2^N$!+ZoZQNZ|&Z#m3>%{dHLo$PB2tXqoW=1Z-xP_(t2j0 zYSf`m0ZU&83{|K0NLxbUWz+z3gS3A@cph<{)RwgQYdKJDv6nG19xUW3YfMtVTase|bMY`Reoil@Df`*tmTNNmtWj$h)l zKfc~4p^{NRkQq}bC-}!d3aLaGE|A=8WwiiI|o{^6TQWiG>WJPzj7URIZ`e$KDcXz9N4fH+t z7=gnWIY$@upRRXLHbG2F9T@!f>!BQ+zVm$M`+NB@5vl*?6K2BUs#yg_T@*w|GD2vP zFz1Lwi;UN_7Q4Ss7J~Wou&J@>|18^>QG+jN2~nJW_NOZEZvnoObOMlzu^9J_kY2ei ztpLzKWTk3yW=(D#eO&_Qo1yPLnWP+12gHnRScoFHA7~3?cDme@dsW-*ektA*0mogI zX`gk=+_wEb4wbl$Z|h%+T;$d;2W2^n;TOAoqqvdDa8 zL_o8lC~aiF`?MhF0Zr>?OOo13hYZA+TXjNVj)Z1SXzN_L@#0GiJyi5){{%|6bn8`yc=KIZdFN z{9RO|>sLO2I$_m&yNr}4d#kRmhLKk-9CwjkfRO8#qAV}%zi=>7ylM`rQnGH=U-n+n zdEts1F;$k>j<**?R~AGWZHn@`K?fxZgukqmS#5G>>*GgpZr+;%eFv2Xam4%{XuOnr z>+SeRsl!}@HOilhP4VzmZh<~&NlsrCymZBgI7*NkAoBL zO>=7u)7>iM=S!yD1tN=ys2RNbfrPBvVuNK@Wc;I?<&>D@M9RnHL?h&=fGcYdY!KS; z7ytSPH=<@U16lm*)QQgj64<8x*m@OcJ?47Lyf1XiIX268Bc55;rH6Fpsa|l(Hb5$A z-+QTUDI$Br6SEZ;o}N?OWE7mMo#ni7s-+JI&cZBX?*J78D2tnDY5`7g;sbE^hJATf zAj^?n0j{#qiuaih!5#qHGx6^NeGOZa!K9T1X*ftq6RsOO#IQ(#$vDs*8cRxL7OW-)8v|Qen z4kSbUrJg7XY6ABKe&d-OM`ZOz0M)5SzJAF*0%xH;S!#Tja0@U9u1l-$kx%eKAh87% zE)Gb-K#4fcMBlzQT-2^u#e;n!WqWLGJd!)?Zf_70O-MS6U2-PG$~|c(&L?*PUt7(_Hpu+sCf*vCi>$LgC7;A zYLgT#^Aj5c@!ZIXT0xtIIBU&S-P3ejndd>A+baM7J#;7`< z8|9<=#`IPto38DZOxG{IM|f-pjZ(h7oblkV1=j+b6=U)HF%M;GRdqqt zTU%rnXZpX`dkeoPoAnPEL_|;oMLtLF8<`HZXPfW&JWOx$Yb6wuDufNLgC*rCLwE?sRltv4P zHnC_d2QxFuSlP)m>UF0_={kM%(7SbABL12B*TC}D`g7&i>V!iY(r6NLHG-4)=M5Rk zLckK-H9D#L*S4~m4ev|Q2qhY31p2jB=uF(7FEU|f!#vyXfH1xHM2lJB4C#vf8 z2uMrT+*mVUS0V1h;Y|N8tMD#5Wt4k~|`STDAaaPyPjN=ypR>b@{Y8C6Ai#m_ z0~A}IT|)(_SZiO#@w@NNJ*&3q!6tb5AT&6FGC?G=b9fUqR zTq56##66{@B+%GS%2D?s0u0@M?-9EIH@F&iTgxJU#l#TZxG#FXF#6Q{@+^?(>ih(7 z2bWkeI-pa_-n>805MQPX862`sO`&C$5kXwHdYBof8Fq-L1A2aOoFg`$y|XMFK!7Y+ z?b=Q50qeJcXcqy@i++e-%p7it#zOCpKw;*A+Rb2Y$?+Q~?H*!>o1x z@U(0z?15H|I)lo^U(Ki*xS8p_li|@-w+r~=BfOuL(z%7EF2pD2Tx$aykmgAP+KKA5 zfEf~#+v{e7xLp91RAX;5A3cU?lK>f_DaNZO~>v`BY}L>qn`*@7hw={`$uIRMoUhII;*x_cc&MSL{|q(**xHu@h>;S2Cvwv`iY3K5@P>k>9Z80&CC zeAno#p>C2_yMTSxn%tig7~o+gQFZ{KGVmI3vGVH}lJx$i{8JIY8L(-OQk3Pr?s6a2 zvs=8?A{STt0tz4b>5WrrcqIYO?&~&RB z)F8}4LVHC_+cI)7&8O-G}5!VKoB7nJzUZ41@lmYvf zeO;I8g9+h_0slCSQa39Di_}L_Zh#6VT`3CiEyC5``^Nx_;oq4hu;|M_ac~kswIKNn z{39bLHXmS3B$evXmpmZQ_Bq|0toXGJDhDJW4Fl)L{>Wv3QT3EGt-mQ}qwHs)jsNSs z2lPSqZ2(pYuNnpYja{&C|B@oMoXux@JO?p=OD`9_AzJes)w5JAkD9VX)tItNUEbz=XfRY5FgBN~JV3NgyrX)YZSB?!StD z7!80n`$zRje}Ogu=In&rOFdW=fC{^b5A@bWouZea?r_#f|Z(!UQhJ~307;J=HK1@5PDW039- z7y1)urU8H=W^fMGpO`;^M8FcRHP*3|7qyo#J$A8daS>Rd;I5#{s|NTHk+EyzuWzW zTmIY(SQD9VTob6&=pZN5<^(Z-OGZLbyh79{P+1P^Cf=_I;ChO2JEBWXLKPF^*M}I0 zafdjWvD=%QSsSxk+Z$V&bFn!(ScWMpO5x*?{i4E`krr3Qz`$O?z_=-T`vwrBU}f%s zfq_?PEheTcBPRAl*$HA{ZD)>wAsv>OjH9l$`QYuf_o$fY+n4!7UPSq~Z^k_E+Gq`v zmA(=Dz~ssMsn{-JeHC%>mpb1I-UpVdnw4u;Ro&)QAH%O+G3Ifst(#Ow^S6(Ir^v$$1*>LvzfxHZL!rr8U8$ zb3s+Pw;2hI`*`RF4`!_uQ;d21=;(yTD2-h)em>*XOSp;AcYA-dmS0AiDvsa_$qhEc zw~qI|3~g>c)(;jWVV1FoDu_MXIb|E$$sbROtGx|?pQB3a~u5RVmfj+)LrBkL@_uj%p^a7%HqCpmB&s>DyqG{&3d^N4zNv+Bm( z1zfwg;3|wK5y|l&c(8YfWBvQAgpU%IG<=a#mbfq0?rdt3X!2snBW9<2mhkP@ghlIY z58KA*F{T7>V6>;6bkX`YbYs5c%{WO_r`3uh_>7Gw#qurlIOmf;$J^TsFYgyU*~2z4 z3T}B^_LkN0W`%TO+mqYDL652^9A9!tA0G4v}0??gG3g%WP! zKH;n*nYl~+>bWwuIu=M&M2tS?@ViD4HIxAVmFaie4WbW$GF3EXnB<=$jBX7CUoJR$ zJpOpIGT3?1$3sy6-sG3iMcz{(AIdf?xdqan&+xL%lz9?(zuoP6*_;=sTwNrdaJ!yL z<2{qucy5|XMv=o9Yr;)X)cO1F++r(%nY%mhQLm)3`8N_bjyLQ#@LaH<_`dgj?|_3d zU;1~&aBe+P`+yblF0A{Rv8FK|hk1&CJoDOvwR;vf5AQ{EjZ}qb3ziY^-bxQN2!e;e zL+v{g2^5<`9*KB^=GvQrZ9nF zh)A$VPSlVVeN6F*g+_X#Y{ zv`=ScXGQV=`@r-7N2jE$nME#%8TP6{wLt+@xGjelkgH^@nxy8$Xr8c~K%Vf1Kk#F~ zM;L{kL#uwloJ=!jvy5j+OMy>}5A=ffOzc2wRf^aV?-pJrp8h+ZcUX9&4?~I>O4!CT zzU4R+QsuwSjbbn%#wXSZXAGAJmwM<;OrP*DfrMFtX_Y~PDMK^vyD|?JSwxZ~b0K9O zyuepCyZUYO+eRZ~;2Jg`X^WPonw!QNBPmlO14890UsP*fT}ETNc%)O8ceEbba0we{B(#@IStjF1^f`)k&os%77ZGpGq$Ex<2Kq<+ZxQo3bu+;Kz(u-8h=q0&Rl7({FGe#UGz+xFg&7IC$Q3O__Xm;IJvO>*X2%*>U+; ziSs&f>RPMYy39VZ9pF#|&0Ee{-bkNHd6ur8HplT!!Cv945G{`;H6fW{f5=j1@WM!v z%QVeA9h8cnIy!JUcsMXSXvj9A_Yh{ap1Uhy$ZE$j!g5ddt}c`Ix$c^dn{HbJSM`#% zhAzB;PS0BhQng#N&bLB_3;7E7?+E^mHQ)*oy1g5 zmHVQ@V%K8OeaZVv?<=Hb&GgMoSI`X6MR5!=N4XoWKPFApO;0%~tDB~Jr=U}P1(|a0 z?37`(Va)GgumMM%p_o#B z#{XdFAtt%~oS9N{_cj011EO(r(bRq}!J3D$n8i|d&#n}O z5_Ucsq+S|ptduPC9{@8jbDXZUvBED2nTQ@GJ0crOtEiu`JYr4$Gz2AFxdOuseTBY}= z!a4rAC5bb-Q@85N9n!6o9Fko+U5>Jjz|-TKQ`6@WXY9wH>XbAxH3bZOLOkfM2O4Xe zE$N4Gha-kNo1NUdIltLX{^n%<<=op9 zs+0MR%Q|!=m6=Ei+1x4NVb#yrxxAX5t!P_+?yGVM6J~z!3g_72v+ceG4$IT7z0`Jp zsy=^NKV6hOQfIkne507Nvbt?uE-Si)uq}m*{Z#BKx+GbWUFl-;+;Uj_sI!;(M=7MT zu~o$rfK>KpEBY4tdiF*T3a#uH*#|j`w9BR^pNf=*3pIVaec7%}E(#7y5tE^ak#=9A z8j0;x6^wTbA5(6BMtYe!yvKYygM;yAb6X!w`+d9d^WA{!&f40O4^uakk$5j3=Du1d zlpM37#dz4M7%jF~fzi;Av^95Eh`UlLqWv+~4V5VIGW6OyfCq`# zZpWz8#3?=D{ow`dV3W+XWh@jFFqnYwZ47M82N+mD2ow0jz$C-K{ws`uA&W`=C#;Ie z@H-E%0}i#uxcNJeF7W;9iUB?V_3v-2xDX5+;MW7-6P$hHpWN6h*;xOCZ;AqG7_ZdC zWMqJEHB%>Za|dTDh)ZFDP#q9~>nN?`jDbP&{MQFlM)lcG42&CaYjtfGZ3TG&Q;0pA zu^Gg~oXx}D@z;GYgggX*puM?^@e>bwI|pY04=~MNIRt?4uV{9fCx2yeu?5p;D=0q^ zgE*N#;br4s#Tw%9cfV1^v1H zuBW+&^}kATaQ@vapn>eaQrJ1!IN1LenTxf>{|ni#l)uUTYS-Vz3H`d6fQGZVlNiL_ z-rT`O_+L+4=&zFgPvXDo`8T1mwTHQ#wzxGw=?t_v z(tk_(H_~5?5KuLDhS<6OdWaeh)-J+aLhS!5`ah|(|3xOu$-~3W`J3$D(rDO&~D~%TGMb6MrBfTkuRql|ko$L~!_sMJdbl zi7%qD=Bi!jL^yM3fD-Uc*J^OQ>1yb;#y{*i#J}gfHt-Q4Bo`P#%Ko~?|Mru&7&rd) z?;4DmiF56}ela7sbQAZ1zPBLdGFb6*I(K)7`v1vzTmS0~A>!9x>Gu$A$m>Dr$RVbV zG=Fr#;QrJ9lke3X!Y16b@W5)CpIMPZ9z3`c9xpw@{=LZCPZkW{Do6Q~It39uAtd@Z zTA+H7I;-1p8{U2f(K?=2a?iT$!lBN4 zfTgi&p>!szbI1)(=X~j;qcnaDwai+V!E$1s4U2p_E-iuLKHBkDH1g1zKHu zUaM(Ui+U10U(rha`C0YOKeL4}`35fA>y}5!vk{98Lm$EJD^s|7G9?fD)C%Ms4CCI1 z-ar#j?YDl3d#0Emq%-ocFTN{_QrPWc<+HnRDi=~}m<@c~>q`KFZ1k->zww4exo!f> zA|krZZtOV6I|u<46$*`(oZ}uXR4hI*P)BY}l#rL{q=D4Vi^2_>JoZ25`M@~T|3g@+Ctp5RxNmcMpyJ_YBiByS5zl~sC{`Y zzrPP7fvzc-OWxhK0a^*U;Y~nM@dlDygpv(th?6)#=v2<^)I%;T^(yUV>nqQQ*eQgZ zgh~vaQv*I17kaw!t70Nk0!5oq6Hgm&p(43FVzG^HsH7p`E>rf+o{}zaM<-v6dZkBY+wSr9W0T3 zgpX|xZog>YDlr-y0^`i#tQl&RMKEdCnw{zD8K*8y&K`+m-u7wyvAc=Uqj;w4Pb^3J zc)ne3hNt*T+i>e^U&B|-8s2)5;gDnGL)7`T0x{dEuSRshUb9vPA`iV2eSA*-6V>E* z?VatpJmZk+QQ*6EWXLLT%m@N4M`htL4&N4p|%-k3?#^I@{?+$m_B$hZ|%~t{IAj zJ@20cpB|M`x185O-x!F&E+I4H68#fG-$A*QN&IXEif7K|YB&t8Av0C3$$K4{=ZEYF zd8dCCmH_|iw^@*#eUw%E#TqHXH~nDTClJ)evdrF}7^o5*`f|s7iX_is) z9h1-IOYEls0|QjztVXeSv4yXcU&?pDx}pXw)o?dGUs( zHtCk`2*X}_f)a!CAGwqWFw0{C)Pt~xyt z*;s+7sdc>4zg~(z+Ivwq#;7*saA9#eLf#M0uJ#r@@=yTh3~>5!ys?ket26Ov-QV3dPVL~m6hz`mhBq5zC}NC&JZIEMdgT>nyzp_kT+5hs+Zl{~uC{msc&dX|(G0u~1jqkR@p3YW*>!q1ZK~hna0zUEzA6@#a!>JWCDzN(EX(JxA9peoB zcu&7o;BnE(h+k4t&YVQn)M8NbMv{kZyU-qXeU6l`*w#5%8F(;2VVnlFU2ZTSZ`>W> zZmt;dX|BOeS?P5^mf(V+dz0Qjd*8I;M^g#rSkM-$eHut)jhEhmTxpeelH8saKS@nQ zHf&G3GsqRX@Yk4+(3Z~AHOvq`Se1KNV|#gk{3fM0Z)}(ryu@X(LCD>l**scengFTl zrmQMd-OSDO%0;U}Q1#@Em53HvG3eOjdjI1z=Q`e*HqRhKKfPlyGgwZ2x|=v?>L<`C z1QY_fVRiQ?`3tk~xC)ixImKqmpo~)MQDiG^UGsy3aLm@8#@(qrSm)UxX*g-$r^b?5 zj&H1wXRYyhE%|!ns^~A1*~{_on>t z8l2*liS|*0Wcsdc&%gmk{zzIx#gzh5Yt*#G8mgM39vjQZ|=DCE@lF*Zzcr5ramJQFXyKtw6k+&D@22hPCvsmE}0g$8+E8e4?^0^z~c5?8_W2 zk@HO|&TnLYqb@)cwoKyA- z>C=VlDWvd1HZ~X=OtYsS+rx*NR@_f2(uy}`Bh4dH(?16yw2+J6iDu7tqVWsk(!UWa zWiXwQIPf_6p2zgb5);sY8T7FH*cT>|9b(=ym0``xpR zm<=N*PDF>5wGk@=Rpkn7vY;XMb;^a-Mc zl)l=*WIHg!7S3y!H108(hs|f0itih0ZqK2)EI1jrx}JR^rSOq|Gh_XD%Hq&oREZSwA+0P_JAIiB7?VHR z)XDME8*mTbPn`^M^7bfLiJ)7Ay-+6+#99aF{4J7u{2BD?iTByucEDCapr?E3A-Q!| z{+ayTyN8gY@#!@ykwi_}hnE(+7HK{w3}bU&+s3ezPB8bFCM=xoL=&xyum@u=G~1)d z2FBOY#bX3b@u-C;s^x4DV+Dw+$~L`~Vg+_ru*it>&nZ6dis>o^CCyArZ?)Ix=_-Ta z;rSh;pnui9&U=DOdd*H_2xWhOJLwImeFl?sDY@#L!=V)d28W|k_&?D^)iY{$A0JPL zW(^&vJG^Gv%Ex(hsX#uC=o)hn0XvGT?>_|lO*;G-+!IE_0TZw35`2~MvN(ZuG2xH7 z?d&3tvP0A}UB8;-8ZFgUM%7>$z|y}@NJV8Wt_8=mHJixHPAg+_4LdL7_HqW5Ca`BR zNr+cK7|-7Z6lh~OZJ-{~TUs#0XO+B_YG^dxz= zZ$9!&D~<8F%+d~)>)L=$JKDniCBf9W+6yP6=zF|sxNw7=#dM!xIr9=Hm~1Z}pPpDu zmd9-kK>ZjcM)fDXcWr%y$V^5px` zt;a{Z;zXiOhYGre#JaA2G9uW=9(BzSB>cPZ{_@(uIn|v%JAa~pCR;6v_|^;5r}uqc z>R}mq`Nlis_8FsX%_Ff6jIK^gWr4{#@S$b>yuR%kJqz(#Bn`?~*nTzcsg7 ztTvp?Yp$;y@H*sL%7HnMXQOK6zWk0;^gB=jCt8qOEJ7SO!pIUcXCo%&3X(;6D?g|U zy77(Xd$*ql(5vQ=@esa+iy<`TJ|@potxMX}ZF-Z9#e5wkuB>DDk$gZJ>bFusJYPpn z^rq(szrU>>$tw+b)@c(+zf?-uV4Cy~48D(jq=Ak?4MSte4DQyKCTYOv<#N>KntUOn zY~2=K4=~-j)l>?J|rTT)I)Pl)@@_d?Ie+Qr|zSHsxD0ev>o2Ysw?sP2<#y zp2-DSQRI7%@Z@NWdZ9r6NRlvOUEye|7P1v9^f~-#`W<9cZlS7&-svhTQs%Zl^B$ zv*-O2Q*|;$i2*VR>>5p?n>2Lg+)cKKSB)!a{c5tQ6z^Q;BsxC18skKTSjAZk$J_r* z#8GqV$;4{V-rb%r9b&7&HTVd9G}kX5@i6L0=;!PK<^uH{D*_qG2K1~6_s@pVr@b17c%%eo1Ads@7j2O;U(V(N1>=Ga9 zg>&mo#JG*ZS8_|E)=zWP_1!-+=nYlL1Vh@GOV82~s*DkaGtr3n@ zygnpJWcY|EzfeWL>&IeEA8?@DwfB=^o&EUAetWz_R-_+|uVF9>>%Lug`INx#%X9Ims&3nCI&bYCJ8 z`Rt~PRSbl^^40+$X3SWYAZ7+SG}Hq@xez?lD3P;oI?D13YzPUry}LQ7vTU0o;Z?Q0 zKjPhB+Li52FFrmgzlyc}p?L7HGINT$tzD&ns|z?zN`18)Fs#$xzpd7-eH}I8d^&fo(Kp5D{Ls3lepBlb3SvrguULArm2|M% zGipapsJFekxNNU0Rv|P4t@f=gHJ|I;JREZxeE6OFXG+KL)R$Lu4--d6JucG{L2u#! zmBxeBQa)i3j}Kv(n@5b>-s5i6KR~Ict3r*RX62L`D-G&DhUqd1!+eelA%5CiPJvmy zS}{_eOrA%qG`=Iwbc1Nx7+X{pm|!1nT;(x;o2&QJs}{D*U~X0SbA^U&dest##C#{7 z%8~f`%{-i#J3oT}mP7smOvaRw$WP+ulB+TW&PZ+@b0GkWRSN(I+Fl zU!z$03niEQ-ccWS8}-GNnVRaQhuecU@G=-lMs zka>>P(z1>sb1g}nWav-(X0Qy7yk45!AEn7cCSjKYS^0U%xZ&Xq6uC{Jyo3&9t zDA#QLu(O4S^iIn=PdZsqXHy%C@+iOUF&c{AVAHCV)fsO6Qk#V4(w*52N8Kx9R?fIO zSp8PA>n&iuHWus#QO|>Sjn4nj3e+8hrP^<9)pN4Pn~F>vJAFCwL{Sx0dt`do)OSs) zwt}-f&%lRCKF6(L_%?`*n$8s>k$XdB{MuI%e`CV|j=1_*9b{n4nb0#BQmc{Hm&qZw zT0JBx(}sn|NjykbYi5Q)?FZqdZUMby!SSP?UzbFV2v-Btme(IUlco*O9hcZVl+k<1 zJQErkJ-@vf7FWca^o0*N%=4mAYdC5%^X@R;?%Kqu&e3Sz$rMsQseR>ZI&>r=NlUaI z?j~2jQ><2E9My-Y^85rNKYvv-jHI5?sEhYHt!7XBKHL#qZ&UU(lz8I}uwo4du!{>X zF>Qm4wW)`9tv@U-Uc#(4sEIy#cpr@sQU&=oBKuUH4K-;0P|Mx4BcAtFt7mty{S-yc z`_kg%RXg9z550Ig1-q<5JIv=iG3A$>n#T16hTb!j2Vw*ww6Aw(cDfb|pMF>pCZo*O z?TT~2cM$kI)YO$QF+O|N0o&O~k5h5S!e2sOJ*b#?uGC;(fvAnOtjjjhI2jid3f`bo6kJ zKyDJh8)?{xeR?^Zo+msi*Gdh#_b$ZJsb3#d9?Fa@;2Tlwv~wL=DPqvLsj)FYHJqm~&ae(!<0KGA!Y8++*~N~9y$6QV_CHNy&%)d@# zkS)zr*ghC-JL_7jb0FIhwmsJoB~9P?P%OPViiJ>nXVa-(=+TjjePH#O1z*)PWVMFe ziKxRCW}8~KyVxpN56y8DM$}Rqw5qJn;P-4Wg>P-!3JD&6by#shI8&ua?CxwsX=Hf5 zv$5h9k|i{%6tR?gNJ9fE`J|Jl+rSHUY!h^VdY+lVU~`0Fta;+eDEHaqtzzR*2hnnV zo>LRFMWeUq(}oXwT9Uwt02I@}K4~{+F)GXQx^3c0v4~m`981=ik2q3_&`Mc+TCa{z zaj~1(_GShWPPX+00)A?_6{d3OGUn1d@qM|PgpRV?*Y-y~>f@VAn-7)<=}5T4LZ_5k zdjmEP)hF^|&NHw4y$d5XJxQXN**g0B7eiLccflsp(vjs-(L}uE(vg9*ysD;$@a&b{ zR)1ul$+y$UF<})HsPNlDo2?5d`?^wwAE^0rl=(uYRYOYp?F*_gHK@HB$*BQhV3;oUjHI5; z!h)pD9QcDLRJVW`vy-@#Zw8N43Kb5m-o~d>%OQ&Y&LQ8Bk`_7j;~nS)bTHaMl(d27 zlNJpq7Kt>e@_h+lPxn(PL#|8vf^H>@6UwEz4xv7ez$6vCFD9r?O_aTPU`e^_yp%pP zANU%Lc+VxXdf?KL1`?4vcDl3)vp`dX)OQ@_BxISVcm$k2GfL3g2D@+`A!ig-o+%A( z$&?V~w*`|yi)O$XkmkyMTUxq`*@r_Bul84?LyuJNIsBHhk^yCt!b3~bo15j_Kd1a1 z9;0hmsuXUmQl_E>^2uIrd;!MTkc)ndqare7tEfM0Mv>)nRbH&zzPX9Rr+2nS>1}t8 zO7pj^GCfRWP+j;2SrByFIh3b0mn|s>N-Juz#g;~fS*_0pd3~PPgQSUSw?j)~8`{QG zE8PK6jq4=5&NbQh%(0&t(PD405Im!wa-+l$Zk)^HBbL)*5sP{iz3ULaU8K36-fpr} zC>MQ`v{KM*DSyUeZ{FW=e*}cmawyN`2&Rl-_<%+^Mub?1+q8QV%NKSp@N|u-v6SQp zjL~&9=sUK*_TD1!vwVO~&(f>k6s>nH!AVts;WlaoeuPW3S$91jN9-IVjQ8+(w&?Db zy&;RX(w{0C@`&pU^RZQn5`^?S3}@5F5>VM_I=ctG%nP6CgOBz14L#293(NINP!+oc z-b#;4%bMDY!pNoUci>LNBfje;SUwYyta*@q65 z0fY^?%CN`=bVWtKQsm8A%f1a*Z+u>de&gOuZ{$fY_E%c*_hWo$OQ^%zd_ zykS6t===#4-^%p;EcwaP9u)MTtbkHEi0cyYB4-+EITSOb_5{lAs*IP6)2`Wj(v6X> zP3cKcW>BDiURRvQRD7CtHeX{s>!3#mFtHMPU<&}(d+?8l$2s7Xs!YY(Ly)Hu!AQRg z^ts#h#3@U8`owWI4@7@fQJ3>F-Eizn7s;vVj)kDQIB?E|4hNh+pCIw>dd&XS;+*cN z6Pf>#go{->T~s+VqU#8EHV zcpi+ENJG@JBl9+bYYSRgoV>&Me%Tk0jq&yPwYKFb3&TPkFykj;I1AImGJV9igy&BI zs6t9GJ8f`z5CBRqCQPZJbvz|pTW}8NUD0FAx;^%GjdwAr0!66*3a#xN_~oH zUh%rjEbII2DWwz_kIv!2>moOUeZ=&}k$Rf`7>vsx;))34s=)njR~Zlfrg zJrLIjY0usx0&F%*ug>2_)IDvYrBGy>$tDW=sba|-`7Qr!dC*a$jk!cga~UT~ zLkhm&kNR2u?DXRljL(L8LLzDee3Fa+6&tF1*V8yTx~DQQK!n{*PQxngy9QGux3YVs zelJ=Zc%3IkkzbfmF-%E}C5Bf!a`9CnH;}7iIwGgHY{zWi!gDt2T{wHCkgUc}Lsvg0 z3a!oUba78SmF(T-BvcBH553hRZmc6ci=7dT_R;yD-@yw|rS?_^^mAF;Cg?|SI4b`b zqnK_VZ=&gJ-waVFM;1FK47I&$;7$*=J_+@zZ@;~h@3D1+=JFhQ=9YXxqFmUzc1iNx zV|G~TUgl2YOL?vxBZf@bqg&PZ#eu2sddk{d*AuIX=M#6yN7dSWi*cvz1$u+Yl&v1n zAgHKcRrrmYsH7G>&+sLkm0B&GAkoEypKKfPgtu577~xOl@B7NzZwajP#ujN7C!AYa z#|p@#8b$746`;&HAHbiG9^xOO@=kyfD>RZ^c)|ZiiBRyDYA=ZTu;J)y8Nottj~HqgSxNU%YyC-hiceGL zbSge(md5X+@@HDY${-LKfz!x`y=^L668m&i`geE1OBcfzP6AKWBoWxhv^f@sKjbb$ zTFklxxG#d+c&Cjb3kQyTHt)_&ckE3N(aA6Hi8vNg-KE;vPeX5)_u%g2_=yfAJs0bC zu^ugyDOL%-6y|66X38`i!}e`r46}hs6cQ``lrnD`hcfvxJXJs=+@)BJ5tTD>Q$U;b zVB3;nFWnNk+m97mapd)rGHQ%9mBv#Q&9%~-QT{aPftS*;-wu}dYI=DQdyb#!nCmBVGO3^5aZQ;iyijmQI zRF+$q37lfO2BqQpQ@HIujgOq7&L^i_;g5~&EIf!bz9mV*F z0z|VM9b}_2vKeta_>np*QE3n7;c_ug?Ch<1LMFvn$x`5g-YB0>0FKO&wOdE&)l#AI z(RYu(u!`;!iC%kj(lmCd>8t8wIb3$X4Kx;I@>;2t=L;(#+yxi{%?dwa72@$OElQgb0-@506Bcuw!CliwV!26q?Of6lhvZH)(f(t zugP#uy21W?BxEZUGg-;Nw1n`UM1P!q5}jc3n+q@8e?JMF!>F26?haR=ea}`K@A$0y zXbk%RGC-!ZqS>3aW4kk&6`pBA^_#`xYb+NgDH$BS0P79ho>;6XiX{UP)xzs-USzV=Ni?tH=*%A7I$JWqs$c2g+J~ zzf5LFpB^Q=;7Y-jzos4 zCE@XCpMu#8%1rLi?C)YHm|qcqDroL zkncfx2sfQ}9#>ktbO#yeCHdhrMQ!+eSXymg1r<4NMu+vjoviydWn=J-pzJM$M(y& zT>F-Yv6XLEx7(3>&g7mb1mzsPdlXA%!Tw4Coou6bE`Kj52(rNTw83$Jh)iKr)&W7e zjiGdQsQ*}52MdDZoFmC>SCTc_qm*tLr3mA*-DciN=ldycW8$~1GQPmOaffwdR za9p|fp7P~roXEp>)mRf#&5Z-${IwRU+f(`D8sAV!s!@W3FhqIhS9y@S55!0dW@?ki z`7>i5RiH5N5%#$d#GQQWDN5XCd!&?ZNP;snLG#y|*AB1ok?hd&rV$iLrn4ULm^Bn^ zcdToM&1>8@dHpg-9?+agD_>tQhKN|zGQ4dtI4KF^m?vkq>U{2hZQaS|O)%GB3*m6* zK6(A{SD#4jFAmIP{OJ?Sn@hl87co-2Mv>Mc@ysq>cuKz&5e#ii3kQTS6DM!e`Ry$& z{2HaPjIET#)XK&U8qbs5{oC|fjY}Z`RV!1B7V5LKtb2~+1vqN$k+(NUP2Eq2jV3f6 zlgEr~aXzNx?;VsV)oz*LoAs8{5>+SS*xcBD(RnVgE4b=bcTWU`H!Bl6{;|a7-Gl1J zr|qER4|e%gE~~fjCzl#O(2u@e`8Fv{l3Bp%-#omzR(KWnh6GyU?NG^fEL@vfo!qoq zI8x{YyfaDIiHEJL1~gM@nderr2PlMCZJ5`pCo8nHHh|H4p2f`-Jb5vLV=q|FYuOb{ zW`~$LJ44f?j&ctYa1RPX48uyy0CqJkrx?J`$6$2QqA<#QKXush+A4kA>cZL`&sk5n zS3G9VS1sMUU!!GmkM4#Qnstwl`@=~$w<5FLa04KwGIC;rWBK}NA3Q|0)bV`<1OxCH zlg$BW`jg1t`_Dp#XkL)8ytHZZy;VWGkUs$SE$tai_MBsZpajBhJpkj(!^}1-d>Jx;`~qB#1=y z#~#j|?dV&e;5o(S_uL$~>~#(`^82>j^C$|KlbB)}PZ*4$ zx9-+W&gYBmZ_~49$vXI1?Kr&HUD&?*)WfK2&xsN~+pT-(PCgM9euwCgr_??cJ^e@O6@2Q;sMcS&#{sqV zbT0`Y6}^q0Wn$>{AnlD#Q2UUhK&=PfX`9P>fo_#cJp|L>Vk`Qrj}&pvh9{>eMz4J_ zBxP8nm-I=uOApl9M9;mFygS8XahFs>quPZNfj9oJ%WSK7B&nr(8`1p~Wx$-dZZ*Z? zzSJz0M5<@U*r<6+&aauktuud`KIFMWHX!KS!Dz-7g%btHt%z^(1S<&ZE58 z?E*TS)P$Aq_?y9~EUK+r!MkSrB-&`-FQ0)gD+p;^;jReHT(1&Xi-#zD;xKP>d3$o5?M= z@|t8cyi{&K9_6htlbZ?lo4qhZ!*=>PzKQpl6amjKD(^5=9MO!G_DS8)U(1*Co6y84M3qB(6-a4j7NIyPV5)H$Ig}hMOAr} zQj9C*;`O-#KNy5;l9+CO&$d?rk2l@#Cbs2e~^^R3^tyPCD}C_9p<9G*Wqujs%qmCbY6mKN7Fe zI{o{$x?7K(#b!I7ebw2dtf*=B-L12#Sg3+ynH{l64oFS0XbW6KFahm?v-k6^t2cYPTgAEn8$J1M-HA!4|km3t|e~U_R&op z065MTz;Q0-wK*W2mF(vMX1$?m+xM+sFwMp)XDmQpWX&j0|3B<~WmubA)9$X)LZO1S zcnc*s#a${mA-G#{f*0468pVsd6nA$^@!}o`7K*z=@SLaJdw;v_`(Ee#IzP_2_Mcvq zhdgU#)~s1G_srbOOBd`sMXPfnsz9SdtkrW`bIS|1`z=*X)4g>YAGkWi-4s#!Q1{WF z#rL9LFZ({%a_5DgtlylRKtTs91bOP59z zh00t$j5w$bpa(9dD9=zhThX$f=g?8lPlG2Zg;;fW+CJJb@|X+Zab>Higi!76u6S>) zK;XUCFlE}6;$oH8J%ZBrLuAwz%78`34 z5iQtaK>_c8UwK?lZC_$Gkk%|UN4;}WA26MGDSd4+@^_Q)=4Sa!vxd8qRE> zQf>AWu{M<*Ve^7sa)Zj5ei7XU6e3kTeA4qRON2Z`Sjv%C+CyYzuwD*h&YQ*xKW?pX z85wpz8FEylgB9qw-@e{J*bb=5`s-t!ioU#B=E1*#rdUxyD~-LCfa67%eZo@Bbj3z8 zt?JPC8(Exg*i*3Wk6W5OTUiSx)09ZI&K`#$TBM2BdFeep^$F4hvpLyO(QTigd9bnjy7s1L zgxd3mC`s_{r|Wh_q}UJd!VbYN%UMM{vgPMLG4c}~FY`D7L60k$NSX83q4sw(_)QGh z%|hsTQ~{BYqzlFE94vGY&dW7TF=l~`AeX0?E;~E6;zcs)ExA6k$HG;B`S4NV?yg5W zX*IudM<|v{g}StNI#w>ksV3o_Qn1OWlxpSo=1mYaSAMv^2pkk`Kx+GHR*O@|EqU4_ zvBbMjYd<#zYe21DAs5B;oLr9gT09Uo__o1PI0z1kHMPf z4mFNdqdlYVjUI7XXAIhT*mF2Lma74#UrjxPqc(wyPQPt8G*5U0dL%bk0w05PL_Sz1& zbHPMiGxz3p-lp}yW{&C5rc7mB&*<`0>UE)Xg~;!DR@919HU$+|-dpj?0sQhF*0lZhcUexl{kT-!;6U%)1*98 zmcu+oD-?!iv?Lp|9Zq1J#U7;Tw$Em1*`apG>=J)vfogFY-Xs&YN5pmeqI8?8Y39WV z{YDl?tSSYQh1XXQRW?qeEyE_pmvzQ^1C(#x8>_#;{cZELXYh;iSJ?*F90vu^q$b#O z4I&1UQ9xy$VvTxZOe)qPfcNm=S#&NdXz#hMab}xGckI*&$SyXcc{-yQwctGMM-6ao zBJY;zz|pBsZzNVbS4pqQZ)FnKR_wWVv11uvgkG&zfhD+V0-5i~&K|Q^xjEKhqV&`} z52l)sd(t%0f4Udhiaa*ZTKGGQhO#QG1!j|S+P4rt7rIpTT+yj1) zecOI@scCQc!~7GWYXwgOsW^MT0=UKDhDiKF9q55XSIA?-C&3Bcxg%fil8mSe*dMMR zcRv`+(JT*p_52TSwcuk#9Ziy(GIP#!EMXuu1S$4HPq?sEcW(NJW$fh_mXjqi_IwsC zpXNJ4je5dAyM%aC5pR_lkjey*2`Tn*${Gham9N>z*aqVWd3WY)PT`} z?X6vBk`Qq41*#Q?cra5Yfw9)v%*YvwChw`0vdihFXGa+A zh?Rs$rQUbkG_<2#0fQ$|n9Y7B%<6&+OZ$6r~&ye}W}1x6H`>nt_lnq~ZNkkXRx)To%gzkfTC0Q&p~oKF>b z73dwjXQ{20Yc9M`Jfh0QRkCHzb_ARu3 zV$2__|7eVjCT&BL@B{rj`lSGSEIS}r$ujn$azOn|9BNFhO@{fFbtIHxRjY;{&HJ?ZVP>gb0_a+Oc3FJX|de?{^;LN{gpWSR~ml`;?IrsuQdLZ#{XA# z<618D{@+{xe_PIfZR5Wu#lI)u|1{nHYxDmv+k6^4SFq}>+AqCtGn;imgg<+0qE9YY zv!~z4xNi(Bhd1w?WMeQHRq5XqbUzU{P^klMV577G-hc99e7piYvU}bAm-qYAhyL)^ z|IW|BD8~0!N#0M-sPMk~*q7Mje)`?ta(F`skZ|M?Ec~q^|BMMt5qO04)$;N`zx(^A z8>#>aN0DOqpFaHG@A~nMSyAB8|HEI5%C6`dz0c29^9I!&(B*bWLN&|NH$|2V=Cdz4 zLbs_s)tR!ddRO5CGIB;(-uzoKKSX>(d}jEYVf#`KZidkedk3R(rzWr73_Fw9AKor> zK%7UBNZ|C#Coa}5o2upuRvO#iA|%N3eTkbF^v7k)ME&nbQk3{_#2P5kTJz*LRz_de$z zLGnk?fdc^f0|J4w&^MLeT#p&H)@Ga#a^IW`>$~lU=61{pN3y5)g)k3UaWNS8M)&Fv zwC$%DTh#1(p3a2KRrH2sVrbM2xn@<~=!5I{$=7fF61dm~-n1O6u|F$wHOXAMs4Ls3 zuQZlUIwTSJP&GAWzr=c@bBkN={_emP^zhn_y8nxt&4Nt(EAZYiNpK>WhBcFObHiJS z!Az+QXP&QT?SOWl&1JqO|5b+zUV6va6W6$loSwF#d9vpgKLtrAD;Hm`oK#>7);m;BL0L-s_j;S%(0+d97Ur=1MCgIVtIPDDsVRKfUB z`*=?-kEPK0lHU8>1qO{W(Lhp}iSlq>r`h2?nG5;ZjNR6uOmKctNJXvd>1LW#DA2jV zY3w)e=b5JocWh5Q$HF5Qa6NJO;9y>2B&$~btYcO|*0jMCNF)>Gs{@UvO^*Q-r$D~O zEHPe#+j2UFNn=n`rL!ikq3mD|1k>Ja9}k=;Z_SJ0An1%zdiu#ShQq~AY|R*Gug5xc zS?*XuAvF1&c+^X+MjKkY5CGqVXJ5nf<5#A{j`bvjVIY}R1m@s2JW&MJAlWE*9R?K0 zj0PO)5^dZnwx>KB-d{`jcK+G~J#Mz{XeiXdMpgL-Nd$0Ca@X@H0DQu~9bTIq8^$E+<| z?mjr1=3UCb6veH`kG^e?czz+E8!^mO7g{uTp|+R7ekBoV(~g>IaMxS%YF5^t{G8~0Yyw=T5?~%SAt*&9{E=#*1(TU_A3}_P&X&5qXWF> zXd)#Erh}}<*gB`_Mv!qD7yu1xoCR7Vd4%Ke$Jk3ej11xW_pn(!1Q*sW*#z$?^IEPG z7oxqC*_h%`#eG`R&YsJOoyPt`d%LGvPU~#`HD&PA9)+ZsvO{F@O1c5v+z0JPis7p( zQQ}P6HErR=7-69QG&jQ$pFbo#WX{yp_>a-Cw zb-!0)$g*7e7RF_K`$C74GdQl=5PhNhb{Z|D_}+4wa+nzsl*d3OSfyn@HUzAaob>zO zR_U3jAwuqCSAZNkrSDuO2IpX(nJbjKJR7Ja*?wO-e6* z8FO;U`c*=ph%#OE;VLLyy}KDmj2~2u5@6X?vd@OGV!=g_JyP*>pPLvhxGgz+Qp+@; znwwbzNnAn0ef$*#K7PUPh28oa;d=NxrI>T2hZcv0-LnBv14U%!Xi&PWompKln z_d3t8axcr}e~K1Fj3#CP3_c)m=vcr2$69SGc$Fo8gCjuh38>dnIk0*^(*bCx9kzsi zXXbF;8m&n5bR5nrE*x9b1V~M?>|xHOehjSk%?A>}3EFiYfw3RVZ{MaAdijQH;2IC% zhjYC*TrWZC&wlZNW<(xtpR?XoBH_wYY9-sA!i9csQ%dw28EV-NSMW+NX&tr|@9Ucr z##A^C)mX#u%d4L-j$fxw>OGo%0R?E1a;khaa?0DhxFw3OT$AR+l({WOd+Zfbbg95j zO>m`&S+kM@o`IlrpZohhEhY75OjQU1Wf1OVqx!8R!EIJ; zy-nRTeQTxsCUHMpSCS(-;e)16#SF4g3|Nots!yMDgIg3~p2?G?^Q`jpK)=RKj|10_M@?s;UQzTeG{4%VY(1~Dne zuZ#se_Fcw@=>^KnIQ5s?4KqEMvu^8pj!&_T*gWE56`BI>bO3rZAr%(m*?n42Z}$0S zdj3qWTIX^zZJAVR;(FmeJ=5ORzI-LEyEYNKtv%J7=*2Ne!x3U#-G>O5(#p}tZfJnZ z8l}a^pbpd(Hzx5q`}0IHA6jOr(w?Q^+12Zja~UIoYv#SQs;70Cq3edK4~F-?0r@oU z6@XO_D!J~x^@0ie(&SX&lZ zX+X@6!3aBJF22bCTvV!*DeD^SIaVLdEmIQgsJR#l5oF9H65Yz>0Hcgj^S%v?&F-C- z&IHg+MD$oXoX-A(gA*g|&T$@P&wU|Qk)cMQpPNo6RvFut?(-i$L0zS)PguFG_5q{~ zih^SA2`vYySf%Us28d78dPFBBdlur~fLC=^ZHy&S6vodod%=4mo=SJguF(@1DfEL( zE4o8)>M^4?*lj#{RjQ%ZhSXec+083c^alJn0IP>X&?Ls;5pDfY<`!lg8cm^6@IjKc z%%}^u$p%GqTk|0~GC~v}s6J)~u?7r*jwTweylIuuL8@9(-2X5+9o#DFGPW~4?5kh;R#?yBq=&N6L$%PeR z5I`}Q&GY+OU%=~=?q7g(g-8lGP$#EK#kc8rxYNA8kCxM*_~Z^UwBaUh$GXX4m0(%X zD*`6_y@=j8#yApw^L{dj7hu2&QpVzOZ^d*AR-VMK=jyKh)rI%Bzj;KAlePDeuV#=(yU^EXJw%nko?bmQy6fy(7w155 zhZ;_lz^bwWDUsve%8t7IP{r)f1C)8TW{7ftWwfD|`q(8qt8(t*t(li`c=1Os2VUW3 zSfq$tk}jC=Ft3{c*z#N`j?N1V9ucqV4P~r#dEwCQ&3rR_dfkE`nePZ4tvt0#_`T`Y zw<60XggXtJE64xh%vz2sYczO+Vxdy@b$5dMqc>b$AUVaa&l^b~vJ9eD3e3_WXEw#8 zmFhVJFjCugChXmo>I0WSZWrergO+>Xabrb*RcVKyf_3hX$?v2_Z@APRr~DdQy?(7W zQ~DJdO92!oIU^TFW3P5zw+OdGk#iB|DH!ykWn!mwbpo|zo5`FBNXrpyD%q|<2?rg( zM&{xw2bfYk*p@Ogu^LRV&5~yafox1)n2^#32WYdwUe6%41cdJ8>EhKaCI8_=2}};X zPi9nPt?CDd?5U_rgR3RVwbFcqU&Gn*-5BYEK5;3zY3VliM3;TALi9i3MuBN$lU2cY zdtxWgsD?;n#=@1AXi+MPw2+MMInX1`TgOB<*xR}5cA2+o_W;X>8oxYG_r@ghq++w! zqV-bM6ha06szrhHi@(?R&&Y*J?%F+VUdqe~|BE(m%PI2@m+*>m4A`)O$x2h(=yX%W zIY}xO!^}|(>V{b5)pLlCjlL=>1?zY7DL8NCFJ8Vaf2=|bjuwU(6R128DXS#!dBN8Z z5?EJV0==Gljuot3E=MSTg{<6(KANX}W{Ki$vCkrk9G9j=SS0RD z%A)p@U>C;hxAit>=ZUs;bi!=oF29xV%0Y(6YI5*f>{4;$1l76$!9`D(cXM0yF>U@I z?Ri^7$BRDkO6kw+@^in0orE8&ro0|Fd*9``_qMMCNR-D4WS?Q-!%u*e{-z(t5;LbE zg&Gr~-Pg@Qb!myU7BLG-Yr62!a7uo+92Wh)8vn=w?$0%2*U^?dUu52JU9wew_v==h zAv|(y<=?vxGp&bC8%OC`SSNfaw^3ANmY@7)&Xo`rW2>3)xlFl7oO7il^TQ>GL|JF` zQgOp~Kj>D@D}bBrdqefz%714{h>Fr+Pv;p(G1tSK0c3g38$!tgwgjUtX-hN2 zA3Wyi3olencrtn~iaVaypVspo#zaXVtd5o2g>7P*9lA!VtLq-*iw|iEO}l@Ly+PlQ zib2>+fBvfcwxXUht@yIgCIg!k(0kzk4p{@ZJ#YB0W+9=z~)zMPkGu ziG*P%Ba>1?=DF9&%}+D+xUPuBeNsYSq7E;Vmm4}6F)Z;l%O}mpC(e&0gm|PGQ|G6A zRr8@JTq#lhDlWm$k%<*#b`Fo~2~aM^r8pDjFad9?hX2MoTV;L11Hb=XD>ow8FBKq= z;o1p{?2WFS0cupNicd)pX9m4}iwoyb?qWzW+Rs%|XrC=5{b!}T-#dxUU9qno?;?Yk z-Em3Mn-)=DEb33zQ^}LuWkQH?byG!@)D=Rz9}F>a94}~;S>g6!w!E3AuG3HNZ$RKH zeT(hlkE~*q3lF?xUs9U~kcm8py+la^{1=2zhom%0JaqC+bR37RKd!cJZrlUO5gZ0y z&w8Q>Vi6T;@TahtdJ!Ug?GBfQ%i9VePaHZB-j{RhQJ%0!t_IrqU%8BL91+VKUTxJY z%X1njfzr>x`yEHkd0!6Eys*-mWG9p+WIMMGH`hc}$$&LeaUeiJ)1u#FLH`odj%}B< zwpBypU3_g~Hk{C{=thR*L#q13DwNXm33nUPgH@%wxu80BU&ZNo4G^CDCQu#|izv+S z%>vpBM*u!cBqcnj411||QsJv=1cyZis|eZleriw8rE!nPM(jt`?H;DQue#{0csxcz z8MMov`P#JAJE2gg{`7iapYZP-jESB2wELLoq$eR5k9^^*C2Alx>@O2535f;b4A@>r zF3DwNzQ{LYPVmzOlW_;-xQc5Y!J|ANKup^gX0@9ylw`m&Le?dHnz@L8c<_UK{_7(t)SWLKX@58pU_>6vvE@t0~7RY*Kuv}z1S#I@S!ScZs zs$3Y{E?_%mowGkLA?l6dEXGKzMGuqltT8-E3*xIiB$Ex}H!fI@nfmKS$aB%!89h|_fnd?(&dkZqD;w)b3 zU^7+CYM1h^rXah5dW70@d$J+l!)~+9QNw=h0Fv6`na-LB+&_=FaQ87MJ0dy zOgT)kb=MK=Vy7tBWYgTX3wHCZVIcA4s}{4Z=K7#tg9XM0HE3uM@i(D6XA}KHz$26Pnq;SG_x%D zbz8XARM{qg!*Rm)02ahjBU!yF(SpHN?24K-L^yruDFNt;w>q)@>u>5HJg+Oao{-fM zKK`i?<3^!q9f>|~osYQH4JzB7o7%alZ}jZ@*Pr|{=noj^P5=P+>W9<4{ncoHf7TKL zJmP(0!to0r@#F7+tOCFRu8{I8^!n!uCB6&kMr_Y-oBjKL8*c!GA>zJ&SEBs*`#=8? zCA)bi&zIVa`@hWNDm8#8-+$csUtVZO13U^!M*g>X{O`V)=q&FzUfge<@C~_{qil}R z$C7unk-6d0vAhZ;G-r}9!pB6^cYwQL5iOM*O&32;;tNb?rn@6dYLwNtx+$sJMlzDa zw0rII^{aP28h+21-0EHYMNzzSacCwg=~uq#sId|ky#o%*s8WCqeKs4Avx}R-81qkC z{LWDywzi~bdpc&lW9dsXeGvehBKKIi6uS~1HzyqA9IJXRu2-i?J-ZDUXjiw%B~+HC z%I=q`gL{vq=WBiYUp+%*_E)rP{}CWA*Wg8U~lSh04WZv8DXT`X-q2=j^oqw z4JmZ!ieWC*;{C7!aA6A_pUGE-rb&ev$wqP8x0Q`BMzQGRCD+o`tN=GOCJLUbv8w5iY>hTaPVdZF2i?l))`uT9@lkR5CxXCz50swTYjDa}H zx@*EPgH|g3C{Q@~6t^W!Dq^-j#L$qoPvP5lEC^YUo%!LD-o5`;U{Ejt_)S1j)~%Mw zq^OE|bcO87(CobkQAGEHw6ye-Gr+kiw zw`mnQJVc{ZP##ZC4k)17)W^k1I#4P@jMmX9R1CVm`;92jGQ;N4%QsigYbsQ5HTNei zDB}g3rz>S|0EjdIY!d#g@j!l3<}&ma0N_Qr%`Ur+2^Pu$84phHYdINO7%>1 zgP3#GN0&2SFCXAp-U^Bes*kFm~@!^Vv+g5A7Op{9}(QK7@iroiWK?nqM2p9rOT`Uapq%klJ~KmI4Z!ha1&l3*tM z4j2*Ea!K4O18-cn^7MLC&9EiVsIqLO!wtZU1s{(1!3)P{67R0)2p`mbXK6lK-r>wv zH0k|R@gn5%2t!oKX$JMlMO69(i%%9n;K;sKE9QjN8Nsx^y3$X?s+IbwKhe`?ccHgH zCRaDmuY;OvT~pyP(0foj!){XPvn3Np8<9D7m~a{%CIWGaO9H8>rjObn&Fvesie%N2 zQ=V*WR`-}(moy`I*g8POqQf!Y+!s5XyXyQp?vLD4mPh|BtdqZ-LGGPs&b4U?9v_ zAj!WD5R7x%kNufW2^X=JEVL3pAHYrxCw$C0KYH;H^o}k!nof;S4}}pJ+#fFtTk6om z+8vgO`mj}w35F5xgW$Ry+x9gI zVb$9tl?h!Nwvx#A;^(xng}f!nNR8AysXIbQShMjcrhbyIbzjT1dq=-c#Ia%nI{`Nm zh(VP_J&gb&{ZXc zLB(aw|JAIug%!>bLXtpWC9^}TQexbm_&G{zKbrZ&;TC{J_W1cV9U+ptCoEJEfAEmd zi^r*6I=JO_6w_#O!^m-_rrO|UDTiiS*?Cv|!<5{CU@B@HgkZuae$0e(aOv zDwI>Yjtnb=si%-#>s_yyyj)$P7t1GOm1>zm`$~}?w)wGw8@ihs;#+RrC9pQet_B`k zR1;xo7))5ru@F;v9m%E8@hSLMpYo2RsE%g$><7o3=$60IAtc0RM}z_xIUpMXfapGl zc1f^_8gm`TiQ)*kg!5FXi68k8uZ5HRPBONlTwgP~{Bq8t+{AB$bQ)!rflUu8u0P)Y zqwr*c$3niw`Z)|S??amB`X&-|P?p)iQmzO%29DqX)QXBL&bA)+U3DZ@%GwyM8`-yS}I=qHX zi7}Imt_~Mu^LdaP=CWKF$u-+m+e^Zru2`qubB@T(!1PTge9=%rV6K>sJr%XRD#m^3 zEPj;a889P9K7rB@9k}P3SWmvZ-BY`#Au4x1 zI4)wydu{6{A8cytFSozUidinbJmRzU%z;Td1S2-hF5qP>2bMz6?(RDgJd=Bj^ zvFZHnK|777)JENACCoP}M1pb-vD37ruC=tt*yk(BI9UAEASFI0h9E_=?lxm*CWZZs zc{^qNEqP0dvQZ3~TPNoFsLj@y`&FX{rpA_SZ_U~66x*X%5&0kE6+XjIi94T$4g1cP z1VEG_WYR8J`}w#Q2JdH*CLK%(9x?d&tb_{fs3Smo!W$D7Z}$t8URkd?D+d+YIc$XN zu%`7f$*8F3zlq_>ZB1wY<=Wxlo0EGpVG4dyk0xJf=}1s;b$h>mV~&gNamRpR3_INnqa)YlhFR@NjoqGaQxbf8OCJ|;9=c68StXWx;*q(M#S z&rtd3mVvK!gJH1??$=wiGwB4+n;13ZAb6fd2AhzRCaD!ua#zs}<-!{u@c33zCN6gS zi%};>h%t;u&xEo)t@eV25!raxzQbc-qAc~VTx!`B+n)^;#pOQVJbZt z^+^)mDoa)BLW%=72xF!wBHDx8AC<>Tlz#;65722AMu{WsymeyN$T#ggf(igWi z%wj_()n6chr`JF|Q79FL3T$Qz0a48OLEJ_ls)DNcx3SY%N#k`vDnZv?Q!DuOiu2r_ zuo;!ienuTcTdcNwU)l0vsl0{6U}#&_W;H`li^H_+<}wG{HV zECde;Gc!>Rj$KW$BZNvxKVSac!`NSvQR8aUPoRc5_2bg^vEjCbjvEEuATW@YJgYw$ z8)Dt4H|Uv(p1o@$9mK~}+y*{Ni0_s<-a8K#e?A+MzM(4HEj5i#AOJgAt1-1&t=ylB zDTh?e@9rIOu(sc;kU9xVzgV+@6HCkuMDH(^s;Y>%zLf8-<2{^+%FpTTM%t5tpFf%& zw`xIL+TB)SebIK8wLp5D&tb^R4yitozL_A;3ic~nL=szore5eianavkcw%vgp9um1 zr972u(Qna~PqKZHJehh9RYDl8*Y*^%)a=phv`v6X|;@b_FAwq%b)U;iUr?+@2D zHFqj9Y&^C=xQLHYqUlYsS++-)QXj>AY!bOR(5|~oPg_lcZ$GG3?2F{@NH=hkTg`_& zAP(lEf8b6sS+_(9N!*(w4SilLzq8$VWmcspVhRzc=9+m3l34QCH76KMGKX%z>FA9< z#eaW8m_2b&S|ojctOH-&re1(cw}^bifINOUl+%tg@snSsmw|8OJTi%O z{Rxx1WN{AZvkBU`oZJ-E(uZyABe{O*nyN3l50J4ExZ1|YbB@JuaGdyTkc%Y4 z9ACBzF0#-10qK(0Y0GoNSy|aG=|o}wYdK-rTF-f=cxi=N>prWYJSrQDGB*5>oY{`4 zq?Rv%3sucMS)$~9{t+l}5_C$>^w3k%bp2tv;%LOSLnRAEhJTeYXnH0{yXWJMdGHbp zRfxNCct4~@vJiJo_X&YaN=xk*rPI-5+jh_L+gmSkUY(W`rxg|`Vpz``>fKs$VT!lc zjo@msUwnNDcO)*jh!bP$O;RN)QBYe&5RqY!vx|gld;Xg4F!_R!>tb{&fz8(-2dcvt z9$~|MOIvsw6SQmy+H)s@SKkwI;^jDag&q<=^?*ClRUq)6)Y4-!!@ey(&<&Z zQD%T%JqPp+0hSx{jIwI*oPC+={7Q4<0I_jTtGG-))!uecE{A#AZB!(M_&L_WguT&* zOp9rEfqOjk{GcWSYJLAUfBi1PXNXi64WhV^hPK&zWGf-^^u51v+1nHSd{%a<&0P3^ zXcFLiC;pVxbE^S;!EkqjSDXh~%9d^KKF*7MWz%{{5m|jc?PIv~IaQ)<-aqZt*(NIU z&{1$FtOZ}n71yiXudai%an5mSMGE{jYPD1$c#IOMBztIH^z5W}erkT;eRUFo*)`0| zp}dprfJU`AP-#}>MaLVion@s}>}GD#=x~_*5-P0eu-QV5{DKT-Ae7M6cj`9y8o#fa zeQ`XEWUugMInMrdITk5!XcV(e3+T^E%$l-T7G@H;k}b z-n|!L3D$h1eV^Oti#Tas(vB}7ER0Zb7Ribg{P zbdEiNTNsD8H>Wol*&ssS{+45o!ZYLILS^H4wpXkDvwG6wm`HYqp^NO;ok_4D4pAJ> zv={6wh)`WoN;OCB0taiOT!yKI6dm|pM~)vI>tao3-dqQn08sLR($U6JqkK=rEC&Mlp`&tn0v*Nbnm{+Q{xbvcK{EXb2S-3Stif?v#`X3Yef z32h*doP(^qxRo%96WJt{(=^?_O-G9%Bkd>C@r3RM=PLo{7De=V8do?oe?HEWJ+93b zCmd-BolwGRc(U%`)Y5V=8C;h>VGNsflScDQyoz5K9UL1}Mn{ya&#UBZXB%-Q~ zS|?zNOKp3qQXI1hJ%)01Gcedmtvze4U0-US@J31!Xi9b@;8`A59MkB%!gBtDH%Vf% zcaG)GTCf{KWH;Q;&<0X-lcS6eiosUgA!lcOPS59hW*IA>82cCF_K@1mGUHT>^0cH0 zj|CgA4VjM1%>!r~on4p|KZi%@CA;>Sla9hIw~c&fLlY$rDX%jajCb3Dc-Tg2Ye6Z- z0LFv@fUL8Rmb2+BEXgduJ7^Up^Mpx7h?Ra>9O9pB8E2J2KvVIRP@Dkp+=W;4fNm}W@Q&d75` zLOhhsun^{clBL&i@|4o4()+LA2K&KpJ3el*+|@HVadTn(Wt#8zAOa`uYG?d%QeLJa z=*~U3-S~Tv;Qfb0g}x9)KE=1{c{ENHdc{!763na(Il5Ov?ZxzdA1Empa>!^Z5_@4Z z6r|-@p$~qgT4D)Sq$uuLD$)nP4GezoSIE1SR_L*x>SD{ZTPRalzcFh=;XbHvD#k)| zK)oxe7<|1C?6fHW^v_7@)2u&E(eRZO%H&!6C2mU9^Td239s2`s8a6EmgLsl8FbLK&bl^N&*6?KfiQ_Ajp$T|X6?%{AABiSUUNfK-n`ix8G|{WoDjTC>_oDxk zY>4E=2Z)NlBg7!)n~}ZBT3pL&6Z-tbhi!<)QC0CHp{|_J;un`T24tR@0$MeB|FM{2 zCRs@zaRVCD5I-)9-A-A7E-VzR-Q15%s#nh15*NBS^2ece_=vt}X_k;6KWg>w6$V_aVpzGhNikYLC+F^~O#?df`e1C`^> z{(_~Vz+8`{RCR-BS7Z!qJyWGuFuX=T=TnM#5i7Ys83s=2#j$chxp{0V`PK7!1mbFVu@$J2$TA`6h%k(MW*W+6FZQmdWC4RExVy!IjZJjaE!+N&Sed`sn+7V~X zB%X8>X0zIkL&V}2{|LcmzHM_9pd{^LKQQ}vXIM+nfrwsr!+)?AkxxFPA4To|@jy@b z%*CYraKoS{b-uWKKUU%4^gBWeQnCKhf$I@$Z#rt=D~_rvK@z!#f+qqYMJ*(pmFH(? zlMu`8H*7toyR}Lp#|}^7xjd69E6F-eFjoHub7gAPlIm-#BG_K_#Y^XaBZpGzU3e0JcFlwj3iyk6BUcoVT*A3I_=E- zyPwIVN|p~{z>NUp9?Z*q zNyMPzGo`Mx7SlXgm~(95inH)G5NXtrj0PY0j&7-<@v_V7655jy_loEt==;h_(3*c- z8}E_3bXo1mi_GeiDHrTCxkCvxHC$X9;}tB^z$cR1Eu5tDj7eokMn!lcjjK1YOxsd9 z4{jrsjxJ|Qgc*3oPZZWusosDFakmR(&N3U?EhJP-uP^5Ib{GrIX~#ay>ky-dIKJa@ zed9!W`F|GU;3_slUiK)zK&+bn?Alg~d+pq{K}v8EVPV2%gYM|lb9Y=y_8CU3t-Jm! z+*|cJ^?cV1*w*z>JED^hr{8)xDKR|`8yHhBTV6xeLpws#t;Wk5HbXfO>!0%jENJ7J zVy|lmCnYq+_O(yx{Ie;_%pT_LFjI*p+g|l^RM~F2JACh-Dg8M&QGDzh7O{7R(tlo_ zABN3>kt$C^>**5yPj>D{bP_8ssy_5CnnmoVSmlSOq^@=8WzRS^|1S~Z_hI_qU2ck{ zZE>Lgee^Hmz~~6o{^S1<)L%b%(-Pc4a6ZhCx%>O*2vt$_(uy~|pnt6IpY!1S{JJRP zCYz4mFAhI2dQk;1dO4wk@GtHhuuGC}UVFy{{Sa=?^KlL8VxeQ{!hOuEmI63eR8@c?iMY)wSQAd6 zoXbvm76(8l$jpP9w~z?foGNvHn;AfkK6(xj#O&h~cIy=tLHaf)Zjm}HFNX+NmTSC? z*r54M=$#tLDH$0V@ux`xXtYSY*NiXmi?mm5YPT<7?G)j5oXB_qn+tQ|b3tG8K}Kb# z4Ueu76uDqB>1c1N#KxFw0>GGeG!6uf z0`|RisdDiBj^a@#vr%rx_X3-qyi(ALagUh+tc?KxhAFHQUKmFWs|v3TuALsNvRQt8 zt!#YlH<`W$bn8&y$)Qc~l-Cw@wFjw5_lePDYM*$Ir??diSq&=B%lf$M)Qsg^xbD`d z!XweY_w|VQ@O(BXTV~1${ahhPBFVaHJ?96E7V1#~W8U;M^HBU&Hist{8f&!I?j}Ial<0nZ zkX0ntet6~7DqOcTCB74KK=NO#DsPnN;9=KJ#i z!0HW9A@S3x1t^*K9bf}akLsUv^VvOHk|SSBs*r218JRQfiHRahV5?=xGaq3esy6gF zluC#xeb05kyz%f?-CSSuf=%5+Wm6kMF{Jhr4elfoK%E@8CEA~=a zjV{`HlW>8u!dyW^RjZS*v%HDo9={aKe`vZgV0K8Z=;`Pr3|o&d*k{PD7m9eAbPT3{ zM=Gv=BCUItiHAF^9e9{6{hJ9OfWLOo=V~ib$yF^bv#m?2ZB*lB&dPBwREi?JEv4e5 z#Zw?`5wA@W>qI#)VcpuUldtU0gUgHumxG?Wh(0${NKV=V$9<+Z3X(%Z80 z^9wJ4B|GME25N6qANPNm6U@zl!fsgh*K3^t(W}G(*YxT3oY9h7(tEBS;h;t&FFgog zRE`TFKxk1cr%@`>{wn&bof?3!+)_n~Y&K-7P_CHNljAP@zB3Ts!3wh8aZR;D?37i{ zgtxN~;z5lJJ2_wP3JZM&*CkDJV)#`J0GkPD6PldYwl5(Jf75llW1j;fu(H9EDH|vx zL0+W=#js4=_UE!T*z3ij$Sug0+DHN{j_2*5;GPfxJe2$hlHz>7= zLr6L8jlGL1tlsJCFp8(Als!GXU690Qstfd!!F9q)&wiK24Vue@T;?3YokR<#BF8-& zXyKBaO-R)eu}-anGNTq7I+b~GjEO^+2z@#_k^uWF#_NXn~$aI%I zJI&+ECN+xydM(>D!(a)EgVe=FSrKXTlbMQDNmeuVF{y9x2dpQRGhiqqwN#Xi9_Fea zFK<7*vU#$A_Q6|?@{%?l?FC{aH*rNE-C+!=yx4a?4Hy^Bj(;I|7a8xi9?jS*!Y7n1 z1&{qTb#jMFzT&b8BJa3gV)tI*P9i)Ry8Wd=h@sX5-XEGSgNkK8Xg24-+MmjT6jCs& z;k^#E@5$@1UZ(q>gU@>r|4C`av87JTAKoM1PuK!=4g@iRle$3WAA|pufhw<~bB^lL zWmm%O`^vi2Qvtu3MygLbqUvE&?Fv7A`5#LxstYKx>w*)`vkwuuv^#D5&;uD~qj zBPM$OLqm|jn~h#OO|L?~B=a>f!$-ma=Z?o~ks{U(Ye~yL!e?RQJ5y;yDf4S20bp6JI_z57P z5W|J0JZ{h7oBp-?blv}py|<34a*NtW6+ux1RO)~N7D$6q(kKE_(jA*dHYMF7X9?(Xi+O~YNBqvv?Q?>Fwf=VFoElRka^&Ky{mu!UuzG5 zA8x=RY!Di7oy7#6yu1q1sP7Uy{^iO*uDXYgZqT5Yv3(X3P@sSqc=Ng+`L7J}>FZ5D zxcmS7BgnI~R1034s;$oIo_&FwtNC<=mkD(2fjHtY_ED7c{s(z*{%&8g-j0zQCcDK} z9dY461_eia``J6qPe~!^B7U!5()5yMd(v0Ft)L*_yp5K;RB`Ys_2}A}8~@DPm{xno ze8AuOg~3=zZML4-Z!MO8rOpzEBU!cdT0*UR5_@+RyS4g0Uu+&kkw44hcnSk{sjS*^ za2WeL=0tn)Z8{DEpo)26+t_^BxcoagsO2y;SbN*6fWNvlwt&iQ;u_Q#l%Jx8v@Ozv ztwP#!ODqQq5S|z}D2QD>@w*e-LPIVL<;qf8ydeDxCDvaBA7}a!0!V~#>7*LWSAQkV z#w^&Omb8@8nDsx$CFVUqkB~3d%(ji(uo{Y+Un!fA zXoxLEFzp@LJg1sW0r|7AP>gK%BiL*+%?JrCXqvIPoi+W>xOz%frk94Bb^*fSA$-5m zn-x4H>B#<(y>4@8xM>~v*=5=SFgnxZTx*CbK~Fw3l+e?1sf`=H-qa7$w@8jZe01+% z1(UDA(P?%q)@RK|$r1Ye7$+{!0E_hwDTQwdadB~4rE)MOIi`V8v&$r)I@{rcYj=&1FGy%-=a-0$`_8_sTx1lvck&qbS>tBkx5UOYg5Vbsc$bzd25b)} zivO}{1x&ytLe*i$-DD!cHIzmJOfGj$vZfc*#2itk$rP^b$agWVMtlkJf1-tat0@nalx)}RycuoG9yiC)(L@}=zU+@rwstwLkeG*aY)Ll> zifpttL~;~g{A&!e-B2*6&<$+JlDlzImI{rR!dWZQM!w+7%6j=lss>fGmO7!?qu+Qf zsmgdlZ%ym4u^yMCuzC=T1RF~iI27hcW*qOv_sgsG0O=X`h{kF=7Z!WA`9WOt1HxEo z^OL5Mxw5dd%g57wLpw%ki$y9X<=ZXXCe@gw%-v|JKV=G^?}7B^f__8ucB!RDV>6_! z(tLR{eZfl33I_8(bWoDr@<*4m`0jk`HHs@)BUI14i-vB683Ii+NW-T!=+Cv)OJcgX zGi&FelY{zFtlihrOQ$i2CN*lbil_ee!ISPTIg0%gXm5T9z^T&qAn#5CELQQ@E~Hgrn93{#gTjp{Gt6V}hzHC~ELIIMr`r?7grJh}n3Mm$T*)Guw1!)u>j9{7CWK{N!GF1wXuRbpA6$Rlt_7lKJvB7N4#;!!6qBGH` zPY1ZEhH0CeAh`S&IeFH-KVfhmY$Rxl0|r3*POi{dPn`!mHKCw$@UlCsGY5$`49I?k zL&%#{j^;?#6U3F;+L=0HcavFPkCzGIhb>32+$@U@N8ayyBe z=SBc_lHS>UNIh=Ez9**&8)aQ(ap@8a1TFqIgA7Ys#|!AgFJ>U`Zz7nDN{cHy$pL{U7h^ z7o>>`jaGFS@Y@VVFzYP1cj{uzl}bjdaVg2kFdcXgpBbVX6sII})Mc31Vh`VCq_=p~ z$}G!2F61w_XL`-%dfL-kvGlXAdJ9Z?z+C0RKP8gC>_H*|M7)VRtgy3$hA`m5q~k87 zE1&-fbOTTGq5QBjSulkpcs&oS4CAwG{&z|c@mfqfp=ZPP3*b4)*t1K{));V;!D9ID zBYv`E|INg|EaAW9^eZjp`k!I{D`7GPp!PrS^wTxR{O4l-;o(4f_g}F4HJbnLkJyUo zrpj`v<*(QMhUg_h0=*L0eXiyw5o1Y+WU~*>I#`B8IjmFwl(=~Bz(GTn`9TbP-sj*^ z+1kQ;0*Dv;snphNQw(ACZEl3Cl+~u8&(xP^>)WPy#ahE58pgra5~4Z#89137UM&~S ztkD1JEZ&JglY5Y%m}@Z)M2w>cZ}ua^xmB|aW+RJ;!z!D@Aq9s0xfIrF$$aT@Fi)k; zBkbhS!{iG7gxp4?az@$%^Vw#eQ%&PzF)6)?+tL%8JI-9@KTGW%-OSAL#~VK3Croq& zj29-&TX|}J*4v>KC};9V-n*z~*9>Nwj+kb`huD!{ar;@6uM2-*2HOP=oYsQf>DU%` zA0SUO(_Y=gJ70%ab{c0cdMMN!Qf@`U1+D#<5@owy5Iy|FY9_)~Fw$w>Un^_5Ez@Y> zn)T4Z8^12Yg1yRk?16a5DyEvPV?#kjD$L;@dLXsoES$gKT2mb+KN7MLXmU&;^4@eL z6*6-2e)HYN$dy_GeFet<+x2<(jt7&Fz8x=)B)U_kfuD`Uv1B|quV=aJRY1{@;aHEd z;ggwf81W9h#kC)pDXGuu0q&v_DXQCy$9>m3Sqm1D$^&(C!6hE5nJ(>0%!Sbd3{aGe zY%M>u(#BW}7LcwKl)SBSrke zrrJKcI%>(i3NWdd9Z&nPgu#CG?v)kq0q z;MHIkEbst%K-$ftv}-T0oIg!j`$>qqU-`DHjLgR&sCtEWhk=}o%%>sK#y%YJ_utu> z>tln}Y^f;?8JQTz2lN-4{rUXKE244FS2W-AKG0}(Rf~gTnUKz$=2jNkePhS-olw6_OhSdC{5KiA5lceNj6{D50PYL}0YE~_|0Do- zO_LGI#71SrVc40e%B}-iIg|CwKzE3Ft_-y+UuUp&wmBcXo1K{BA#nt=o|;t14-NVgdOw-DBP|2mTr%Wa~zc0o}Iw6uLvtV>h5OVGzd1J-;ZX2DHrMohPDtm zW`&hp!U&=h-FPK2km~e`783r&o|*LGezw^zI5W6x4o;Mh_S`>Ta70aEUYxY!@qPI2*H#n9)#~{i^JEySvdP|JdMEW%@({vt zP&t$RQLTOVD!X?C5~)Zf-G}D<_79p?uM0ov77CD-e)V=-XZ@Fxv1&Ga~HPT20^_ByIzX)Uy#* zL(lw2?C3LZEiQ4hj8C&BJFE?IoJ7$~-r}HV-|X9Gt!s_4LDdJ%eKX@~w=GujHJYca zZ`<(g*^@d&FsYZfR)r0OGOy#P49lxE>n-G$^ycMJ4(J0VAA@5j@8K)kV8uHLQ zE8TRhP3zQkZ2gNQ5-j*j4`Q6U|C^wq*YjSICc}QpwRE|B5&8H#IeB2&(TX7HtLXk@ zJ>L*voYj;O+frKgd;{gKfE6_JO%xRcm7qM z=lIR|L19br+jCN`CNv`F>uEGDR8+YZd79Jl)$Z4e7lTJh*;63X`5h#oY>~Ry6Xi$u!=-(R&A;zGN|r0Cf7*DCr7lECf1H=}-Wze!JUQWS zf8}6jo(<_Ha^KctHg<+Sg@`lTq~?9tmIy!7W}cV0ve|J*QIhD4J@c zmtwZ|8^H4X)xGnwVKCk5DMR*@`f?vht?)uf^6Y`?**pu<#r)tyzpmFaHmlg59GTCy z>{%5@gEa6GGl}w}`}JbhGp`u!y0E5kdZt?9&b~kIUBQb6JyYn3L}zA-_bw@lcT+~c z?O-fu*%C&&9j*9M)Ghm4TG5y72Yv9u*Mo=hof!@g?fTKe?q+!0Udm}K zT<5S2v_u}Tot3BExciwuM!zbImSy-UycX1H>dhG4|2?j!Ib$vclbFJ0ee$ONVA)Cg z*3ypo@89b^vq%tK`Q(VZKPZUwb2T>qyQ%Td@v5V1s~e0-Y7XI=hwTuReal@~P)Hz8 z>KNJ?+Xd1tu?0hB3;)a1gJ-E=@Ty*?$Rl37!lu2uqJH|hdZA02wauF51 zivT#UROhNRWW<|YZas(X&$7e?=hVr(cL`hts=`7j%_qJbWG+0%qgBf2g^8?24Hx|} zw{G+# zP~e^$<>(5R?3qo{OF*-I=AHypIiHogx zE~?x$gONyfBOp=D^lk(mT2vvA#iiwJ?Xp3oQcFVT7_H6m%=^b=qsoOT0t4_FyiT0Y zg1J;azHeY&Vt$4@zKEhjmo25xnJ8Vm8vy^fa@LWfatmJcedg%1YkV%O)B%CFwrAg2 zZW-Od2ZfsJa$q?z5I0vGe9cd64AMzu(dLZ?MJb)sv48jEomxLHzH3BPn5i%KraxqK zyXAmX2QFbYM_N%42Z9R`Ea_Z^7t|?ApggfTgzsVC3+#=RThEvI1Pd`QUx1%=2NG(hi{w1$ikyRre>M<4mqOJ_xU(yZxV7Co0LRea9;4st8R%# zbkzVD9kKjUXP&)pL#CucQ6qajCU+FuBg^C}hxtHMRSbR6^Fy4&9-QX9f|^|6ajA{y|}WYMR@nu-m)sh@ow1Y zr<0v;wwviSpfsKaIeOd=pLgLl=p>pwTa-s_P>J~>Z;h>Z6T!(co~T+lct0Dodylm} zJ0eFsCgX-2wcyP=+_qXR1ghxdRmpP;`i26ntAK9L^-;qyV-6F%Xa%LGaAVxe(yb=# z(D6?ks#YsPm@BO*y8h?qT=q1U%=c@RFFNnSKKX;q4{SmA@z742w6BqXB9;?-4PG}_NluI2tC8X!5+lF`fqC(~NQ?d>`oGvVId<9U;zcQa`KJE7mt5DZ4gUy~C z2spGKM`Z(I@DtD3ZB&D2>R&8$-{LMVJ!RC+S zyG@|i|7&ej>A|Xa*=~b!eY--}3~0vq)M{1D%B2n3>EVrqs_a?*?2_lS`n;#cf7L)r zK4WQMy6%#-S1V`-a~k_{6*ON>MDFki`*81UEUxd3;8pnW8`13{*YAhphMn_!zyZkZ zv82eVQjAO;dB9WqkGfByY^D$Z%_T!?JX!K)ox%oW&PAUapu4Uc%Rq|tkCOQs zu-?91swk%+@A{oy8$H9DH`Di-&X5++#*1^au4iF$S&s5VH$2t;%?kHMlcUc_%}lkO z4`e;rZ%x)p9JisBsZq5av`s(F`j_(0kLu@A-b{_=+p7+1MS|o*+eNk9VcZ;(3xI<= z=s-N!8L>P7{^B>%2ws;;=vCm=MZ+K4gSdEl=OZyE`pFVtyvW4%2RnmC$*xB%zkktY zR3a>c8K;u5@%7f)19-I4c=vuUm&1wVm8Hj;gBsz5Q25LuPH#m9*I6HQ5hYZk`5Ws9 zd>wnIR-|~b^P3-&7VBcM6wg~pl-H|W0WeC)o|AM04U zPj|Cz$fEWLN6p5v$}8)8d+fV?Be4HFghSH;Bt?tzK3rP0T*qxVtvp~~s7(SI04EPv zsxK3>+f8998}+E`aGXJZu4ec*dh&O>jdq4@4vq*RZ^2GVUacm_oGbLKssr)42K(*s z&6#Mc_E!H8@_wKQqFmoQsEC43FRThQ_^YucEvW1@au^?X7I(Gma7U0t+aEtZUch+e z!AbEOqH91kUc9Q4y_#cxO^L-wco3^?))!qc2<%dsB`HOqx#bMD7*ox+U3 z-ei@7@PP(BRXaz}m+gj0`1w@#cE+E9&+gNn^mejn=|zq@z9=m;@}vI-3M5!+Z@Qb;13G_}ED#Ds z!$%SUlm91iq<^l|&zb*8kvy+NsiwsmFbJmiCJ7aW`epHl_rOlKt4cWBA6!jFQ15Uv zaZ^TH4Sf}o@;4+YS*;5R$N94|k+uQ4pq$Jby81ZRQ;z%+$k~{HRx%_IXL@kewis+w zA>()sNr86Qz)@Eg*g_I^wXe;=934JczwiBnj2SrJ|w|SSi-Q1%36J8PfiD z?B)ZD{Hj>^u8@7`S_LiDoRs2Whl;lX*wfAqYQSl$Z6M#t>PgSclXd@NpJZRX79Xza z%RA!Ha(QKPUjMJU4Vey^ZBD9BJINL9cztlSH!5~Y>(~l4j~jwZ*LFq8XnkeoGCp^q|lduup>cLQ@27hS1G(jcX&9yW6bQPb)+!4n}5EplwrFHZ?WXL;l5g z-DEtt=z;_;yVdJp!C6>2jfrI-1T$^NfJm@jm)dR-h_%K(?$-2{_?U=(&pH%jC1a5xt6TvD}qp$#>F5 z;hM=TOMp)gQ+fQz!RFEC8#m`Il?tGEA{YRR z-FEoU`8KU&huu%vpX&C{MD4W{QI650Sq|@$K!a#A9)PUL`clQ{wh+MR! zbX}oOH@;P$G0$+%@!`1_ditWm}gQL+>x|DQqyeD&KU=w3d&GMM_ zeq?=0kA3wDD5dqjQOKJh8yfC`Il5aPW{kp+t4-+EK_;**11H(xmWIseBU*N?%wC(U z1nqYhTsLkitP_<_tgOG~Z=8@Ga;)Q96w%CnpuT0Y%;}&w^p-aY%}%xl_AGSvpoADu z7z-EyFBNcn?=F`ux9tx%I<~$|`v6wo@MP=pqgQM|?k&>7j&PE~ac7wup{)w5Uu9wN znk~oXd1YKQqNgFY+!VI!q2p01Zza}Hzna>q`|!hd&=vN1_ki>6oS`$zYKtd|ZI)W^ zm_i7OaGF8{M>#%!CnVN&r>_V}Hnd(RyP=da;4gp3xh`td)(JG{J+Q@@$t?(?>CKXZ z)5L9RX!p@<9=*7*@R6O-=ie%stHSUfOV7mM(7%+!MSw&M0VZB?WY7#yDUTq*_9PBZ zj_fzVwn`OjI?$!lT@R%Wtoxl5GE8y8*YVf3w*Q!E33ncSH>q{h7x_5v%Y!PHr29(G5wEUE2%zo}ec z(o6m}$|S;C%&h0%{C=etjvC@O1pki?QN|UWvxyLeIgrQdL0m??9T~WzjgkY&hc>-H z`a{MsaW8eUwS+SW^Rzp?Gp!3>OY_zLz~t)@XCHhV7BGx7MGHTZgYbr8*j%Sdrsr)8 zQO%ps+x>je`e@?-BuvUV@kk!(QY!?~uhSPao^C}p?pVXOlSc>jx{&q9Q_T|pw1gIv zh}9^voLvgJctGd+Jwec^w4{2pLcBGHRpnN_2q!kP^RwT!*z1}!(94EQ#>t+W7LWurSd3YorTZvE zK@z0l<0W^N($)dZvHyL<&lz<6Upo_+#TWH|?genVX#QJTKj-{Urv5+s_*cQ=KTq|q ztm}V?yZv)#9R_7NH`uq@TO$_q}vc_x3ivtoqMi^8UOBy=U$E z-ShXb+`6kU>A<)$>^!%(>tVjk!Chgqw^84zx7s%sH?UbRO;8|n@BD2hs3;YbyQ3%E zj!1_|WclsFWwx!^ey!w|+aD$Fy(4H0PZa2XOX>e@Qz-sI^Eb9e>m{~atyM`QvA~CF z0|6e3vXuB70=UuMvUzW&X9|>$`w+8h)q=j0-#+@?v-I=)zM(A?T&1H$^~(`fe|*REeGV=396xk40Xpqx%jbSb9T3H;JWzMD$~zJ+<6C!J{b+Og zrAbsEIB+d%wR zDKMSFX}`XYEv{=w9CZF;cQwE{S*vAmLGcL2K|iv6YRu-$Bj+?J^Q2qfz2=Mc050Fq z7E2FnccJc8XyG?Et(=0uNwSc)1&rmTdPRnbNb#+cFr0pItwHRAh zcmQkB%Fqs0&kz!;2ld(<=UYnck7K%7;YC+_cJmW1|GE%Qj|n@W1~U({uP|;jhIMME z--gM?*%hW55LGzrb>O0)ncb9KXLFe8-<*Y#KKzKG9W3~fsDzE!sgc5+_|7n1sN|Gjkck$Y6q$a->e_wKgch;C=z?8w)< zwLt;D&PpW#>L0T!7N4}iBjycnYt`3idB=0Vo`VUZroJKyk-vU z5Owc{oOnSttA(;f^=7SAb+Pwv)C_DEsml4Q-`=!b&fK{< zBC`hh^`NRXGFOE!$HFdSBFR%sVC_|MpdP-=7LfjIrY*YdV{ljp#f+0IAxzAcw5VZ! zkxy}RYrTt&Al{}0g3t})KcrTeWX=_U2#eeyld_R!;h|S8*SK~Qa>e2ftE9kB2mbfL zaVIom_jf# z4ATfad1^7#rNCpo!lT;&oJ}4T<=?B|A7eo^I4;tx_5sKDCIp7UU&Cy<5if%(?IeT= z8Z;WbdJPMxWS`nBZF%Gc%cLO57rh(cPm+7q?%?5P^lfc)Q{y%DmLFgTXZ9zVMP=y6 z@%yYLg`J#R4;N5QFs8=G$6E>0m=@V=j~i;mqxC-|sXu!+2R!Z-~$RGVpriE14T9!O~HiwD7MF3lgXS4T2lMm71MANWS?112}P)ZxSkMx=wm z&eHRI408Z%zHpe4DwAC^kR#)|bi~e-JtLa>^?Nwo<=v+w-cNq@>kjuX-n#C5UjYl4 zB0TnX@znjP2k5Qhxv<7)uGE1=?AEj(X$& zTio{Fr~Ef7f1%>PW5j<8>^D*EG{^bRR{pb<|7_)-a0kNL|HudYXDk0pY~?ULe0^fN z@sW76m5m=Dp|rgeUIaI4Ku<%P_t$YZ`2~W+)26Z?mQ9*xSr}SLlg8! zqy(4lwzS9Jpy(%lJ660~nJ%AoxVc?ghD5~ciG@}OhsOzetSy$szA^$VRNr6pO);g^ zE`$G-BJm&wAFb&|`K-%6k(-lcfj)sroW&yk0QZ98eA)c`?w5bz>fJEjjFzaZbhqL`RrOSwl z=9$UWGE!3gALSECpYbNA|3&X9+rDl%kW+Ecrf(u!el!lw(57Zxkx^|g3q7!W{Rac@ zg+RtcA$&5aUAlKpT{Ov(Sx-rC9VRljw`%0DotUj9T`D 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 Date: Fri, 10 Oct 2025 18:57:50 +0100 Subject: [PATCH 50/56] checkpoint2 --- assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index ad414d8cd..43cbd4b9f 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -203,7 +203,7 @@ def _check_destinations(self, agent): penalty_destination = self.list_things_at(agent.location, PenaltyDestination) if penalty_destination: agent.performance -= 50 - verbose_message(f"😭 You have reached the penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") + verbose_message(f"😭 You have reached a penalty destination! : Performance penalty: 50 Performance Total: {agent.performance:4}") def is_done(self): """ The environment is done if the agent has won the game""" @@ -348,10 +348,6 @@ def extract_locations_from_env(env): elif isinstance(thing, Obstacle): obstacle_pos = loc - # For backward compatibility, if there's only one penalty position, return it directly - # Otherwise, return the list of penalty positions - penalty_pos = penalty_positions[0] if penalty_positions else None - return penalty_positions, winning_pos, obstacle_pos, occupied_positions def find_position_for_agent(env, occupied_positions): From 2571933e4d57be1560f602753856cbecb2235cb1 Mon Sep 17 00:00:00 2001 From: PAUL NAGLE Date: Sat, 11 Oct 2025 08:59:20 +0100 Subject: [PATCH 51/56] checkpoint --- .vscode/launch.json | 2 +- .../R00065426-astar-20251011083123284113.csv | 501 ++++++++++++++++++ .../R00065426-bfs-20251011083117101876.csv | 501 ++++++++++++++++++ .../R00065426-dfs-20251011083117391494.csv | 501 ++++++++++++++++++ .../R00065426-dls-20251011083123005034.csv | 501 ++++++++++++++++++ .../R00065426-greedy-20251011083123290468.csv | 2 + .../R00065426-rbfs-20251011083123289858.csv | 2 + .../R00065426-ucs-20251011083117688160.csv | 501 ++++++++++++++++++ .../A1_COMP9016_Nagle_JohnPaul_R00065426.py | 59 ++- 9 files changed, 2548 insertions(+), 22 deletions(-) create mode 100644 R00065426/R00065426-astar-20251011083123284113.csv create mode 100644 R00065426/R00065426-bfs-20251011083117101876.csv create mode 100644 R00065426/R00065426-dfs-20251011083117391494.csv create mode 100644 R00065426/R00065426-dls-20251011083123005034.csv create mode 100644 R00065426/R00065426-greedy-20251011083123290468.csv create mode 100644 R00065426/R00065426-rbfs-20251011083123289858.csv create mode 100644 R00065426/R00065426-ucs-20251011083117688160.csv diff --git a/.vscode/launch.json b/.vscode/launch.json index 7e6484ce2..51027cffd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "program": "${file}", "console": "integratedTerminal", - "args": "-v" + "args": "-c" } ] } \ No newline at end of file diff --git a/R00065426/R00065426-astar-20251011083123284113.csv b/R00065426/R00065426-astar-20251011083123284113.csv new file mode 100644 index 000000000..9e652355d --- /dev/null +++ b/R00065426/R00065426-astar-20251011083123284113.csv @@ -0,0 +1,501 @@ +run_id,path_cost,goal_tests,states,succs,time_taken +0,-87,4,8,3,0.00013208389282226562 +1,-85,9,29,8,0.0003848075866699219 +2,-72,17,53,16,0.0006659030914306641 +3,-65,30,96,29,0.0012249946594238281 +4,-88,5,15,4,0.00017189979553222656 +5,-82,14,44,13,0.0005519390106201172 +6,-97,3,6,2,7.390975952148438e-05 +7,-77,6,16,5,0.00018525123596191406 +8,-67,23,76,22,0.0009598731994628906 +9,-88,9,27,8,0.000308990478515625 +10,-86,12,36,11,0.0004031658172607422 +11,-82,14,44,13,0.0005528926849365234 +12,-64,27,87,26,0.0011179447174072266 +13,-79,18,61,17,0.0009038448333740234 +14,-73,24,80,23,0.0009837150573730469 +15,-53,30,95,29,0.0011248588562011719 +16,-89,4,8,3,9.512901306152344e-05 +17,-74,10,30,9,0.0004901885986328125 +18,-88,8,20,7,0.00023293495178222656 +19,-85,7,20,6,0.0002338886260986328 +20,-89,4,10,3,0.00011801719665527344 +21,-81,8,26,7,0.00031685829162597656 +22,-72,21,67,20,0.000762939453125 +23,-75,13,42,12,0.0005180835723876953 +24,-74,21,68,20,0.0008528232574462891 +25,-64,27,90,26,0.0011477470397949219 +26,-74,19,57,18,0.0006861686706542969 +27,-85,9,31,8,0.0004200935363769531 +28,-82,9,31,8,0.00041174888610839844 +29,-70,27,87,26,0.001157999038696289 +30,-90,8,25,7,0.0002999305725097656 +31,-75,13,43,12,0.0005040168762207031 +32,-80,9,31,8,0.0003941059112548828 +33,-79,6,16,5,0.0001857280731201172 +34,-65,28,87,27,0.0010821819305419922 +35,-90,6,14,5,0.00015401840209960938 +36,-73,18,58,17,0.0006802082061767578 +37,-91,3,5,2,6.914138793945312e-05 +38,-97,2,3,1,4.291534423828125e-05 +39,-89,3,8,2,9.512901306152344e-05 +40,-85,11,32,10,0.00034308433532714844 +41,-85,10,27,9,0.0003101825714111328 +42,-88,5,16,4,0.0001919269561767578 +43,-98,2,3,1,4.8160552978515625e-05 +44,-73,21,70,20,0.0009200572967529297 +45,-78,8,24,7,0.0002868175506591797 +46,-85,12,38,11,0.0004570484161376953 +47,-86,8,27,7,0.0003571510314941406 +48,-85,5,14,4,0.0001761913299560547 +49,-65,12,36,11,0.0003910064697265625 +50,-70,24,78,23,0.0012078285217285156 +51,-82,9,27,8,0.00033283233642578125 +52,-59,26,83,25,0.0010290145874023438 +53,-79,5,13,4,0.0001480579376220703 +54,-66,24,76,23,0.0009741783142089844 +55,-92,5,12,4,0.0001361370086669922 +56,-82,13,42,12,0.0005059242248535156 +57,-74,21,70,20,0.0009369850158691406 +58,-79,8,25,7,0.00030517578125 +59,-66,25,79,24,0.0009129047393798828 +60,-79,15,47,14,0.0005209445953369141 +61,-78,19,59,18,0.0007491111755371094 +62,-73,17,58,16,0.0007753372192382812 +63,-97,2,3,1,4.506111145019531e-05 +64,-74,19,58,18,0.0006780624389648438 +65,-83,5,15,4,0.00021076202392578125 +66,-97,2,3,1,4.601478576660156e-05 +67,-86,12,38,11,0.0004992485046386719 +68,-82,9,31,8,0.00039386749267578125 +69,-99,2,2,1,3.719329833984375e-05 +70,-74,22,74,21,0.0009610652923583984 +71,-75,20,61,19,0.0007171630859375 +72,-85,9,23,8,0.0002608299255371094 +73,-82,10,35,9,0.000476837158203125 +74,-89,3,7,2,8.392333984375e-05 +75,-94,4,12,3,0.0001399517059326172 +76,-66,23,74,22,0.0008461475372314453 +77,-87,5,15,4,0.00018215179443359375 +78,-79,15,47,14,0.0005729198455810547 +79,-85,10,28,9,0.0003368854522705078 +80,-88,8,24,7,0.0003058910369873047 +81,-91,3,8,2,0.00010085105895996094 +82,-89,3,7,2,8.225440979003906e-05 +83,-79,15,51,14,0.0006971359252929688 +84,-80,6,17,5,0.0001926422119140625 +85,-97,3,6,2,7.414817810058594e-05 +86,-67,25,81,24,0.001024007797241211 +87,-82,14,43,13,0.00048279762268066406 +88,-83,13,41,12,0.0005240440368652344 +89,-87,3,7,2,8.392333984375e-05 +90,-90,7,20,6,0.00023293495178222656 +91,-87,9,20,8,0.00021600723266601562 +92,-89,4,10,3,0.00011801719665527344 +93,-83,5,13,4,0.0001590251922607422 +94,-79,20,68,19,0.001004934310913086 +95,-83,5,16,4,0.00020694732666015625 +96,-83,13,40,12,0.0005121231079101562 +97,-82,15,45,14,0.00049591064453125 +98,-88,5,15,4,0.00017905235290527344 +99,-85,12,40,11,0.0005638599395751953 +100,-91,2,2,1,3.719329833984375e-05 +101,-55,33,107,32,0.001405954360961914 +102,-83,9,25,8,0.0002589225769042969 +103,-93,2,4,1,5.507469177246094e-05 +104,-85,8,24,7,0.00026702880859375 +105,-88,7,18,6,0.0003139972686767578 +106,-90,8,23,7,0.00026488304138183594 +107,-94,2,4,1,5.459785461425781e-05 +108,-95,4,8,3,9.393692016601562e-05 +109,-97,3,6,2,7.319450378417969e-05 +110,-65,30,96,29,0.0012350082397460938 +111,-55,31,96,30,0.0011372566223144531 +112,-80,12,37,11,0.0005428791046142578 +113,-79,14,45,13,0.0005738735198974609 +114,-72,23,76,22,0.0010521411895751953 +115,-87,11,32,10,0.000408172607421875 +116,-81,17,54,16,0.0007197856903076172 +117,-85,14,46,13,0.0006241798400878906 +118,-88,5,13,4,0.0001552104949951172 +119,-78,9,28,8,0.0003352165222167969 +120,-65,30,97,29,0.0013091564178466797 +121,-80,13,41,12,0.0005061626434326172 +122,-66,24,81,23,0.0010340213775634766 +123,-73,18,58,17,0.000797271728515625 +124,-84,14,43,13,0.0005650520324707031 +125,-76,10,33,9,0.000431060791015625 +126,-85,12,36,11,0.0004398822784423828 +127,-65,15,44,14,0.0005366802215576172 +128,-85,14,46,13,0.0006389617919921875 +129,-77,23,73,22,0.001007080078125 +130,-82,5,13,4,0.0001537799835205078 +131,-72,27,90,26,0.0012753009796142578 +132,-82,12,39,11,0.0005261898040771484 +133,-80,14,39,13,0.0005180835723876953 +134,-65,30,99,29,0.0013680458068847656 +135,-94,2,4,1,5.698204040527344e-05 +136,-89,3,6,2,7.295608520507812e-05 +137,-95,4,8,3,0.00011277198791503906 +138,-80,11,34,10,0.00042891502380371094 +139,-74,19,60,18,0.0007419586181640625 +140,-90,5,11,4,0.0001862049102783203 +141,-67,26,84,25,0.0009410381317138672 +142,-82,6,17,5,0.0001990795135498047 +143,-64,29,93,28,0.001154184341430664 +144,-73,18,59,17,0.0006499290466308594 +145,-91,3,6,2,7.200241088867188e-05 +146,-88,9,24,8,0.0002841949462890625 +147,-93,6,14,5,0.00015211105346679688 +148,-89,5,15,4,0.0001952648162841797 +149,-80,11,37,10,0.0005350112915039062 +150,-95,2,4,1,5.7220458984375e-05 +151,-65,27,88,26,0.0011670589447021484 +152,-70,23,75,22,0.0008902549743652344 +153,-82,15,50,14,0.0006809234619140625 +154,-86,10,30,9,0.00035881996154785156 +155,-86,13,41,12,0.0004968643188476562 +156,-87,9,22,8,0.00024890899658203125 +157,-91,3,8,2,9.512901306152344e-05 +158,-70,23,73,22,0.0009071826934814453 +159,-78,14,42,13,0.0005507469177246094 +160,-69,24,74,23,0.000885009765625 +161,-76,13,47,12,0.0006461143493652344 +162,-78,8,24,7,0.000286102294921875 +163,-93,3,8,2,0.00011277198791503906 +164,-85,13,44,12,0.0006208419799804688 +165,-73,27,89,26,0.0012431144714355469 +166,-86,9,27,8,0.0002949237823486328 +167,-56,26,82,25,0.0009410381317138672 +168,-72,20,67,19,0.0008990764617919922 +169,-70,8,21,7,0.00023293495178222656 +170,-67,17,56,16,0.0006580352783203125 +171,-91,4,8,3,9.131431579589844e-05 +172,-85,10,30,9,0.0003268718719482422 +173,-85,13,35,12,0.00039196014404296875 +174,-80,12,40,11,0.0005459785461425781 +175,-73,19,63,18,0.0008971691131591797 +176,-73,15,49,14,0.0006797313690185547 +177,-76,12,39,11,0.0005979537963867188 +178,-79,8,26,7,0.0003409385681152344 +179,-82,7,22,6,0.0002770423889160156 +180,-90,8,26,7,0.0003399848937988281 +181,-82,12,38,11,0.00043272972106933594 +182,-72,24,79,23,0.0010538101196289062 +183,-86,7,21,6,0.0002551078796386719 +184,-80,15,46,14,0.0004930496215820312 +185,-73,19,62,18,0.0007531642913818359 +186,-73,25,84,24,0.0011861324310302734 +187,-79,11,37,10,0.0004870891571044922 +188,-82,6,14,5,0.00015997886657714844 +189,-85,5,15,4,0.00022912025451660156 +190,-89,3,8,2,0.00010895729064941406 +191,-73,19,65,18,0.0008590221405029297 +192,-72,21,67,20,0.0009059906005859375 +193,-88,4,8,3,9.608268737792969e-05 +194,-84,12,40,11,0.0005590915679931641 +195,-93,6,14,5,0.00016188621520996094 +196,-75,20,64,19,0.0007390975952148438 +197,-85,11,32,10,0.0004496574401855469 +198,-86,10,35,9,0.0004737377166748047 +199,-73,18,56,17,0.0006718635559082031 +200,-86,11,32,10,0.00034689903259277344 +201,-80,7,22,6,0.0002808570861816406 +202,-91,5,15,4,0.00017189979553222656 +203,-85,11,32,10,0.0004317760467529297 +204,-95,2,4,1,5.602836608886719e-05 +205,-79,6,15,5,0.0001761913299560547 +206,-88,5,16,4,0.00019884109497070312 +207,-87,3,6,2,0.00010919570922851562 +208,-67,18,55,17,0.0006339550018310547 +209,-87,3,6,2,9.179115295410156e-05 +210,-85,3,7,2,9.012222290039062e-05 +211,-74,18,56,17,0.0006241798400878906 +212,-85,3,6,2,7.295608520507812e-05 +213,-73,18,57,17,0.0007238388061523438 +214,-95,3,8,2,9.632110595703125e-05 +215,-89,5,16,4,0.00019097328186035156 +216,-76,13,47,12,0.0006618499755859375 +217,-93,3,7,2,8.320808410644531e-05 +218,-83,10,32,9,0.00040411949157714844 +219,-93,3,6,2,7.510185241699219e-05 +220,-71,19,62,18,0.0007750988006591797 +221,-93,3,7,2,8.130073547363281e-05 +222,-74,24,76,23,0.0010828971862792969 +223,-61,25,80,24,0.0009648799896240234 +224,-97,3,8,2,0.00010800361633300781 +225,-80,14,42,13,0.0005319118499755859 +226,-91,5,15,4,0.00018596649169921875 +227,-78,11,35,10,0.0004470348358154297 +228,-86,6,20,5,0.0002491474151611328 +229,-74,15,47,14,0.0005280971527099609 +230,-61,31,99,30,0.00115203857421875 +231,-70,24,77,23,0.0009667873382568359 +232,-96,2,4,1,5.793571472167969e-05 +233,-86,7,20,6,0.00022602081298828125 +234,-55,33,104,32,0.0011472702026367188 +235,-91,4,12,3,0.00014209747314453125 +236,-78,11,36,10,0.00047898292541503906 +237,-96,2,4,1,5.698204040527344e-05 +238,-65,11,32,10,0.0003509521484375 +239,-89,5,13,4,0.00016021728515625 +240,-79,6,16,5,0.00018215179443359375 +241,-76,12,44,11,0.0006299018859863281 +242,-62,17,55,16,0.0006728172302246094 +243,-74,18,57,17,0.0006418228149414062 +244,-83,6,19,5,0.00023293495178222656 +245,-75,18,60,17,0.0007367134094238281 +246,-88,11,33,10,0.0003769397735595703 +247,-73,20,63,19,0.0008299350738525391 +248,-96,2,4,1,5.3882598876953125e-05 +249,-91,2,4,1,5.507469177246094e-05 +250,-86,9,23,8,0.00026607513427734375 +251,-96,2,4,1,5.507469177246094e-05 +252,-78,21,72,20,0.0009958744049072266 +253,-99,3,6,2,7.390975952148438e-05 +254,-75,12,40,11,0.0006079673767089844 +255,-84,8,23,7,0.0002570152282714844 +256,-79,9,29,8,0.0003688335418701172 +257,-58,21,68,20,0.0007779598236083984 +258,-93,4,10,3,0.00011897087097167969 +259,-82,15,48,14,0.0005488395690917969 +260,-64,25,84,24,0.0010950565338134766 +261,-89,9,25,8,0.0002770423889160156 +262,-84,8,28,7,0.00035190582275390625 +263,-80,10,28,9,0.00032520294189453125 +264,-79,14,46,13,0.0005660057067871094 +265,-91,5,15,4,0.0002770423889160156 +266,-81,14,38,13,0.00043487548828125 +267,-83,5,15,4,0.0001938343048095703 +268,-76,5,9,4,9.894371032714844e-05 +269,-78,10,33,9,0.0004220008850097656 +270,-70,23,73,22,0.0009150505065917969 +271,-83,6,18,5,0.00022912025451660156 +272,-73,10,30,9,0.0003750324249267578 +273,-86,7,17,6,0.00020194053649902344 +274,-61,30,94,29,0.0011980533599853516 +275,-91,4,11,3,0.00012803077697753906 +276,-87,3,8,2,9.489059448242188e-05 +277,-90,7,18,6,0.0002071857452392578 +278,-85,13,44,12,0.0005991458892822266 +279,-82,10,35,9,0.0004839897155761719 +280,-79,12,30,11,0.0003190040588378906 +281,-85,4,11,3,0.0001289844512939453 +282,-70,14,46,13,0.0005431175231933594 +283,-85,11,35,10,0.00043082237243652344 +284,-92,4,11,3,0.00013327598571777344 +285,-96,2,4,1,5.2928924560546875e-05 +286,-61,30,98,29,0.0012431144714355469 +287,-85,9,25,8,0.00027108192443847656 +288,-82,9,31,8,0.00040602684020996094 +289,-85,10,26,9,0.0003008842468261719 +290,-88,11,33,10,0.00041794776916503906 +291,-73,16,52,15,0.0006740093231201172 +292,-96,5,11,4,0.0001232624053955078 +293,-87,3,7,2,8.702278137207031e-05 +294,-80,13,42,12,0.0005161762237548828 +295,-61,17,54,16,0.000629425048828125 +296,-84,8,24,7,0.0002918243408203125 +297,-70,25,84,24,0.0010309219360351562 +298,-70,23,74,22,0.0008730888366699219 +299,-89,8,19,7,0.00020599365234375 +300,-90,7,18,6,0.00021195411682128906 +301,-97,2,3,1,4.506111145019531e-05 +302,-56,30,95,29,0.001107931137084961 +303,-95,2,4,1,5.507469177246094e-05 +304,-85,9,27,8,0.0003249645233154297 +305,-76,18,55,17,0.0006299018859863281 +306,-80,15,54,14,0.0007801055908203125 +307,-70,24,73,23,0.0008709430694580078 +308,-80,12,33,11,0.00035834312438964844 +309,-94,7,19,6,0.00021910667419433594 +310,-79,12,42,11,0.0005960464477539062 +311,-64,27,87,26,0.0010318756103515625 +312,-69,24,74,23,0.0008921623229980469 +313,-87,13,37,12,0.0004508495330810547 +314,-70,26,84,25,0.0010557174682617188 +315,-70,28,92,27,0.0013251304626464844 +316,-82,6,17,5,0.00020313262939453125 +317,-58,30,93,29,0.0010881423950195312 +318,-90,7,23,6,0.0002880096435546875 +319,-74,20,64,19,0.0007319450378417969 +320,-73,22,76,21,0.0010259151458740234 +321,-82,14,40,13,0.00043392181396484375 +322,-91,5,15,4,0.0001850128173828125 +323,-79,14,43,13,0.0005002021789550781 +324,-83,6,17,5,0.00019407272338867188 +325,-80,12,41,11,0.0005381107330322266 +326,-85,8,27,7,0.0003609657287597656 +327,-73,18,59,17,0.0008118152618408203 +328,-82,14,41,13,0.00045228004455566406 +329,-90,7,22,6,0.0002758502960205078 +330,-96,2,4,1,5.2928924560546875e-05 +331,-82,8,23,7,0.0002570152282714844 +332,-89,3,8,2,9.512901306152344e-05 +333,-97,3,6,2,7.605552673339844e-05 +334,-85,11,32,10,0.0003502368927001953 +335,-82,14,45,13,0.0005390644073486328 +336,-69,23,74,22,0.0008480548858642578 +337,-95,2,3,1,4.506111145019531e-05 +338,-95,3,6,2,7.295608520507812e-05 +339,-94,6,15,5,0.00016307830810546875 +340,-70,23,76,22,0.000949859619140625 +341,-86,8,23,7,0.0002727508544921875 +342,-89,4,12,3,0.00014495849609375 +343,-85,11,31,10,0.000347137451171875 +344,-79,12,41,11,0.0005559921264648438 +345,-75,12,40,11,0.0005409717559814453 +346,-65,28,87,27,0.0011169910430908203 +347,-85,13,41,12,0.0004990100860595703 +348,-82,10,34,9,0.0004589557647705078 +349,-75,19,58,18,0.0006830692291259766 +350,-86,6,16,5,0.000186920166015625 +351,-83,13,38,12,0.00045418739318847656 +352,-81,11,32,10,0.0004067420959472656 +353,-86,9,23,8,0.0002512931823730469 +354,-78,12,35,11,0.0004050731658935547 +355,-91,6,18,5,0.00023317337036132812 +356,-94,2,4,1,5.3882598876953125e-05 +357,-94,4,11,3,0.0001289844512939453 +358,-78,11,33,10,0.0003719329833984375 +359,-80,16,51,15,0.0005691051483154297 +360,-85,10,28,9,0.00030112266540527344 +361,-82,9,31,8,0.0004131793975830078 +362,-74,22,75,21,0.000988006591796875 +363,-77,14,45,13,0.0005497932434082031 +364,-93,2,4,1,5.507469177246094e-05 +365,-91,4,10,3,0.00011801719665527344 +366,-85,16,55,15,0.0007960796356201172 +367,-60,33,105,32,0.0013470649719238281 +368,-85,5,16,4,0.0002090930938720703 +369,-64,30,97,29,0.0012199878692626953 +370,-88,11,33,10,0.0003859996795654297 +371,-96,5,11,4,0.0001289844512939453 +372,-76,10,33,9,0.0004258155822753906 +373,-75,22,67,21,0.0008320808410644531 +374,-76,9,27,8,0.00031495094299316406 +375,-67,25,80,24,0.0009770393371582031 +376,-94,5,15,4,0.0001838207244873047 +377,-46,33,107,32,0.001293182373046875 +378,-88,5,14,4,0.0001609325408935547 +379,-56,30,97,29,0.0011301040649414062 +380,-99,3,6,2,7.510185241699219e-05 +381,-97,3,7,2,8.702278137207031e-05 +382,-83,14,45,13,0.0005819797515869141 +383,-93,4,10,3,0.00012087821960449219 +384,-87,5,14,4,0.00017213821411132812 +385,-69,17,58,16,0.0007281303405761719 +386,-79,15,44,14,0.0004742145538330078 +387,-88,6,18,5,0.0002129077911376953 +388,-98,2,3,1,4.38690185546875e-05 +389,-58,29,96,28,0.001094818115234375 +390,-82,13,43,12,0.0005621910095214844 +391,-79,14,45,13,0.0005359649658203125 +392,-82,8,27,7,0.0003452301025390625 +393,-91,8,22,7,0.00023484230041503906 +394,-73,13,44,12,0.0005710124969482422 +395,-82,14,41,13,0.0005052089691162109 +396,-92,2,4,1,5.507469177246094e-05 +397,-88,8,25,7,0.0003287792205810547 +398,-92,4,11,3,0.0001270771026611328 +399,-74,20,61,19,0.0007538795471191406 +400,-73,25,84,24,0.0012049674987792969 +401,-92,2,3,1,4.6253204345703125e-05 +402,-92,2,3,1,4.410743713378906e-05 +403,-86,10,30,9,0.0003230571746826172 +404,-77,5,12,4,0.0001342296600341797 +405,-81,8,21,7,0.00024008750915527344 +406,-79,17,55,16,0.0006630420684814453 +407,-87,3,7,2,8.296966552734375e-05 +408,-79,7,21,6,0.0002319812774658203 +409,-88,9,25,8,0.0002968311309814453 +410,-55,30,96,29,0.0011630058288574219 +411,-89,4,10,3,0.00011801719665527344 +412,-65,23,77,22,0.0009038448333740234 +413,-82,6,14,5,0.0001480579376220703 +414,-74,10,30,9,0.00035309791564941406 +415,-58,18,56,17,0.0006499290466308594 +416,-86,8,26,7,0.0003180503845214844 +417,-83,12,38,11,0.0004906654357910156 +418,-79,13,40,12,0.00047278404235839844 +419,-87,3,6,2,7.200241088867188e-05 +420,-96,5,11,4,0.0001239776611328125 +421,-95,2,4,1,5.316734313964844e-05 +422,-84,11,37,10,0.0004780292510986328 +423,-62,30,96,29,0.0012040138244628906 +424,-85,12,38,11,0.0005161762237548828 +425,-86,9,25,8,0.0002849102020263672 +426,-68,25,82,24,0.0009210109710693359 +427,-80,12,39,11,0.00047469139099121094 +428,-95,2,3,1,4.363059997558594e-05 +429,-96,2,4,1,5.2928924560546875e-05 +430,-94,2,4,1,5.3882598876953125e-05 +431,-73,19,61,18,0.000701904296875 +432,-79,10,33,9,0.0004222393035888672 +433,-94,5,11,4,0.00012183189392089844 +434,-96,2,4,1,5.412101745605469e-05 +435,-65,10,30,9,0.0003261566162109375 +436,-95,3,7,2,9.083747863769531e-05 +437,-90,6,16,5,0.00017595291137695312 +438,-79,8,23,7,0.00026488304138183594 +439,-93,2,3,1,4.506111145019531e-05 +440,-94,5,11,4,0.0001220703125 +441,-85,11,33,10,0.0003750324249267578 +442,-80,14,45,13,0.0005011558532714844 +443,-74,16,52,15,0.0006830692291259766 +444,-78,16,47,15,0.0005691051483154297 +445,-73,20,66,19,0.0009050369262695312 +446,-79,18,59,17,0.0008630752563476562 +447,-88,6,14,5,0.00015592575073242188 +448,-94,2,4,1,5.602836608886719e-05 +449,-82,7,21,6,0.0002627372741699219 +450,-93,3,7,2,8.487701416015625e-05 +451,-62,29,92,28,0.0011301040649414062 +452,-79,11,36,10,0.0004799365997314453 +453,-89,5,15,4,0.000186920166015625 +454,-84,12,34,11,0.00038909912109375 +455,-90,7,20,6,0.00022292137145996094 +456,-88,7,18,6,0.0002067089080810547 +457,-67,20,64,19,0.0007739067077636719 +458,-65,25,81,24,0.0009119510650634766 +459,-80,14,44,13,0.0005600452423095703 +460,-85,10,29,9,0.00033211708068847656 +461,-91,4,12,3,0.0001418590545654297 +462,-63,19,62,18,0.0007228851318359375 +463,-88,9,25,8,0.0002810955047607422 +464,-65,26,81,25,0.0009670257568359375 +465,-89,9,27,8,0.0003108978271484375 +466,-77,20,63,19,0.0007081031799316406 +467,-95,3,6,2,7.295608520507812e-05 +468,-94,6,17,5,0.00020575523376464844 +469,-46,33,104,32,0.0011839866638183594 +470,-79,14,41,13,0.00047206878662109375 +471,-88,5,15,4,0.00017786026000976562 +472,-70,24,80,23,0.0009849071502685547 +473,-85,12,35,11,0.00037407875061035156 +474,-89,4,10,3,0.00011801719665527344 +475,-93,3,5,2,6.198883056640625e-05 +476,-89,5,15,4,0.0001957416534423828 +477,-76,5,11,4,0.0001251697540283203 +478,-90,2,3,1,4.482269287109375e-05 +479,-95,3,8,2,9.799003601074219e-05 +480,-91,5,16,4,0.00019097328186035156 +481,-66,30,98,29,0.001344919204711914 +482,-94,5,13,4,0.00014495849609375 +483,-74,16,54,15,0.0006959438323974609 +484,-79,14,46,13,0.0005791187286376953 +485,-95,4,11,3,0.00012922286987304688 +486,-85,5,16,4,0.0002028942108154297 +487,-56,30,98,29,0.0011169910430908203 +488,-91,3,5,2,6.222724914550781e-05 +489,-94,2,4,1,5.3882598876953125e-05 +490,-93,3,8,2,9.512901306152344e-05 +491,-85,13,41,12,0.000492095947265625 +492,-81,18,58,17,0.0007619857788085938 +493,-78,18,60,17,0.0007588863372802734 +494,-88,5,16,4,0.0001938343048095703 +495,-61,30,100,29,0.0011990070343017578 +496,-79,17,56,16,0.0007669925689697266 +497,-96,2,4,1,5.459785461425781e-05 +498,-88,5,15,4,0.00017690658569335938 +499,-85,13,41,12,0.0004987716674804688 diff --git a/R00065426/R00065426-bfs-20251011083117101876.csv b/R00065426/R00065426-bfs-20251011083117101876.csv new file mode 100644 index 000000000..131e721af --- /dev/null +++ b/R00065426/R00065426-bfs-20251011083117101876.csv @@ -0,0 +1,501 @@ +run_id,path_cost,goal_tests,states,succs,time_taken +0,-77,34,102,30,0.0006699562072753906 +1,-87,6,6,2,4.792213439941406e-05 +2,-58,27,72,22,0.0004169940948486328 +3,-74,20,43,13,0.00028061866760253906 +4,-76,17,31,8,0.0002090930938720703 +5,-96,5,4,1,3.4809112548828125e-05 +6,-82,13,26,8,0.0001590251922607422 +7,-91,12,23,7,0.00014495849609375 +8,-91,6,6,2,4.8160552978515625e-05 +9,-97,10,11,3,8.392333984375e-05 +10,-91,12,19,5,0.0001227855682373047 +11,-91,6,7,2,5.078315734863281e-05 +12,-87,14,28,9,0.00017213821411132812 +13,-91,17,29,8,0.00020241737365722656 +14,-88,11,20,6,0.0001857280731201172 +15,-55,35,109,33,0.0006306171417236328 +16,-82,20,47,14,0.0002949237823486328 +17,-44,10,18,6,0.00011396408081054688 +18,-80,15,27,8,0.00017404556274414062 +19,-70,25,60,17,0.00037217140197753906 +20,-93,6,7,2,5.4836273193359375e-05 +21,-93,8,11,4,7.605552673339844e-05 +22,-67,29,76,23,0.0004527568817138672 +23,-91,5,6,2,4.506111145019531e-05 +24,-74,16,30,9,0.00019407272338867188 +25,-86,11,16,5,0.00011205673217773438 +26,-87,19,38,10,0.0002448558807373047 +27,-62,25,63,18,0.0005230903625488281 +28,-88,21,39,10,0.0003101825714111328 +29,-70,27,61,16,0.0004470348358154297 +30,-81,7,7,2,6.031990051269531e-05 +31,-75,35,109,33,0.0006928443908691406 +32,-85,19,38,11,0.0002460479736328125 +33,-81,5,6,2,4.57763671875e-05 +34,-70,32,91,28,0.0005218982696533203 +35,-67,29,79,24,0.00045418739318847656 +36,-55,35,107,33,0.0006017684936523438 +37,-55,33,98,29,0.0006129741668701172 +38,-72,18,41,13,0.00024175643920898438 +39,-78,14,23,6,0.00017309188842773438 +40,-82,15,28,9,0.00017499923706054688 +41,-60,29,74,23,0.0004496574401855469 +42,-51,32,89,27,0.0005230903625488281 +43,-95,10,11,3,8.797645568847656e-05 +44,-46,34,103,31,0.0005860328674316406 +45,-65,30,85,26,0.0005040168762207031 +46,-49,26,68,20,0.0004019737243652344 +47,-97,3,4,1,3.123283386230469e-05 +48,-82,13,22,6,0.00014495849609375 +49,-97,2,4,1,2.9802322387695312e-05 +50,-27,34,99,30,0.0005731582641601562 +51,-67,21,48,14,0.0002918243408203125 +52,-65,18,39,12,0.00023293495178222656 +53,-75,22,50,16,0.0003101825714111328 +54,-79,35,105,32,0.0006170272827148438 +55,-29,23,56,17,0.0003399848937988281 +56,-61,33,99,29,0.0006070137023925781 +57,-70,19,46,14,0.00040984153747558594 +58,-88,12,20,6,0.0001308917999267578 +59,-79,31,83,25,0.0004889965057373047 +60,-91,9,11,3,7.796287536621094e-05 +61,-97,4,4,1,3.2901763916015625e-05 +62,-97,5,4,1,3.600120544433594e-05 +63,-92,3,3,1,2.7894973754882812e-05 +64,-65,31,85,26,0.0004971027374267578 +65,-88,23,59,18,0.000347137451171875 +66,-94,15,32,10,0.00019025802612304688 +67,-65,32,91,27,0.0005440711975097656 +68,-94,3,2,1,2.47955322265625e-05 +69,-95,11,12,3,8.869171142578125e-05 +70,-94,25,61,17,0.00038313865661621094 +71,-58,34,101,30,0.0006008148193359375 +72,-73,31,86,25,0.0004968643188476562 +73,-91,6,7,3,5.5789947509765625e-05 +74,-86,24,57,17,0.0003540515899658203 +75,-52,34,104,31,0.0005979537963867188 +76,-55,26,68,20,0.0003960132598876953 +77,-90,13,25,8,0.00015282630920410156 +78,-91,16,32,9,0.00020623207092285156 +79,-85,6,8,3,5.5789947509765625e-05 +80,-78,30,77,21,0.0004978179931640625 +81,-80,23,53,17,0.00032210350036621094 +82,-76,14,27,9,0.0001678466796875 +83,-58,27,75,23,0.0004298686981201172 +84,-78,22,49,14,0.0003237724304199219 +85,-56,26,63,19,0.0003781318664550781 +86,-78,20,45,13,0.00028014183044433594 +87,-74,31,83,25,0.0005130767822265625 +88,-82,16,27,7,0.0001850128173828125 +89,-74,12,18,7,0.00011706352233886719 +90,-85,19,39,11,0.00025200843811035156 +91,-93,7,8,2,5.793571472167969e-05 +92,-89,10,11,3,8.082389831542969e-05 +93,-72,27,74,22,0.00042510032653808594 +94,-15,22,48,14,0.0002989768981933594 +95,-97,9,12,3,8.106231689453125e-05 +96,-86,26,67,19,0.00042319297790527344 +97,-80,19,46,14,0.00026702880859375 +98,-84,12,18,7,0.00011801719665527344 +99,-55,25,62,19,0.0003631114959716797 +100,-87,8,11,3,7.295608520507812e-05 +101,-79,31,85,25,0.0004968643188476562 +102,-89,7,7,2,8.177757263183594e-05 +103,-1,33,97,28,0.0006189346313476562 +104,-18,22,48,14,0.00031185150146484375 +105,-88,17,33,9,0.0002219676971435547 +106,-85,5,6,2,4.696846008300781e-05 +107,-68,17,36,11,0.00023293495178222656 +108,-92,2,3,1,3.0040740966796875e-05 +109,-84,14,23,6,0.00015592575073242188 +110,-79,34,99,30,0.000576019287109375 +111,-82,15,22,6,0.00015282630920410156 +112,-94,3,2,1,2.4080276489257812e-05 +113,-78,22,49,14,0.00030684471130371094 +114,-65,20,47,14,0.0002779960632324219 +115,-53,32,90,27,0.0005259513854980469 +116,-97,7,9,4,6.508827209472656e-05 +117,-95,6,7,2,5.1021575927734375e-05 +118,-61,27,66,20,0.00040078163146972656 +119,-70,26,59,16,0.00040602684020996094 +120,-41,8,8,2,6.222724914550781e-05 +121,-100,3,3,1,2.7894973754882812e-05 +122,-73,33,99,29,0.0005922317504882812 +123,-89,10,11,3,8.130073547363281e-05 +124,-23,26,68,20,0.0004191398620605469 +125,-94,14,26,9,0.00016117095947265625 +126,-79,30,81,24,0.00048279762268066406 +127,-97,6,8,3,6.508827209472656e-05 +128,-78,20,45,13,0.0002758502960205078 +129,-84,9,17,6,0.00010609626770019531 +130,-90,9,13,4,8.797645568847656e-05 +131,-85,6,6,2,4.792213439941406e-05 +132,-85,8,8,2,6.198883056640625e-05 +133,-85,5,6,2,4.696846008300781e-05 +134,-93,2,3,1,3.0994415283203125e-05 +135,-94,5,4,1,3.814697265625e-05 +136,-92,12,19,6,0.00012803077697753906 +137,-82,10,16,5,0.00010800361633300781 +138,-89,9,12,3,0.00010013580322265625 +139,-61,27,70,21,0.0004248619079589844 +140,-78,24,54,15,0.0003657341003417969 +141,-75,12,20,6,0.00013780593872070312 +142,-88,13,20,6,0.00013589859008789062 +143,-95,18,33,9,0.00022482872009277344 +144,-88,31,87,25,0.0005421638488769531 +145,-65,31,84,26,0.0004949569702148438 +146,1,35,107,33,0.000621795654296875 +147,-92,5,4,1,3.5762786865234375e-05 +148,-55,22,48,16,0.0002930164337158203 +149,-24,14,29,9,0.00017404556274414062 +150,-80,20,48,15,0.0002849102020263672 +151,-87,3,4,2,3.409385681152344e-05 +152,-78,8,10,4,7.104873657226562e-05 +153,-83,30,81,24,0.00047898292541503906 +154,-70,30,75,22,0.0005061626434326172 +155,-89,7,7,2,5.793571472167969e-05 +156,-83,8,8,2,8.0108642578125e-05 +157,-85,20,47,14,0.0003452301025390625 +158,-86,23,53,15,0.00034689903259277344 +159,-80,22,48,14,0.0003032684326171875 +160,-78,19,41,12,0.000263214111328125 +161,-88,19,38,11,0.00025177001953125 +162,-78,22,49,14,0.00030303001403808594 +163,-73,26,64,20,0.0003781318664550781 +164,-86,18,41,12,0.0002498626708984375 +165,-91,27,71,21,0.00041794776916503906 +166,-86,22,47,14,0.0002930164337158203 +167,-91,13,26,8,0.0001590251922607422 +168,-15,22,53,16,0.00033211708068847656 +169,-92,4,3,1,2.8848648071289062e-05 +170,-83,8,8,2,6.008148193359375e-05 +171,-93,9,11,3,7.700920104980469e-05 +172,-89,20,35,9,0.00024008750915527344 +173,-44,30,83,25,0.0004889965057373047 +174,-40,29,75,22,0.0004658699035644531 +175,-85,22,43,11,0.00031280517578125 +176,-95,9,10,3,7.700920104980469e-05 +177,-79,16,36,11,0.00022673606872558594 +178,-25,26,68,20,0.00045013427734375 +179,-84,30,85,26,0.0005192756652832031 +180,-44,24,61,18,0.0003840923309326172 +181,-97,15,28,8,0.00017786026000976562 +182,-80,20,44,14,0.0002868175506591797 +183,-86,15,29,9,0.00018262863159179688 +184,-82,16,31,9,0.00019621849060058594 +185,-79,34,101,30,0.0006041526794433594 +186,-93,11,15,4,0.0001068115234375 +187,-15,28,79,24,0.00045800209045410156 +188,-74,15,28,9,0.00017499923706054688 +189,-96,3,4,1,3.0994415283203125e-05 +190,-87,6,6,2,4.7206878662109375e-05 +191,-73,25,61,19,0.00036025047302246094 +192,-76,9,15,5,9.703636169433594e-05 +193,-86,14,30,9,0.00018095970153808594 +194,-61,33,95,28,0.0005950927734375 +195,-30,31,88,27,0.0005030632019042969 +196,-64,32,95,28,0.0005779266357421875 +197,-5,33,99,30,0.0005540847778320312 +198,-37,33,92,28,0.00061798095703125 +199,-93,4,4,2,3.5762786865234375e-05 +200,-95,2,3,1,2.574920654296875e-05 +201,-70,30,74,22,0.0004830360412597656 +202,-44,32,95,28,0.0005738735198974609 +203,-89,6,7,2,5.3882598876953125e-05 +204,-47,26,72,22,0.0004227161407470703 +205,-58,28,73,22,0.00042700767517089844 +206,-75,26,69,21,0.00040602684020996094 +207,-85,27,74,22,0.00045490264892578125 +208,-90,25,60,18,0.0003561973571777344 +209,-73,33,99,29,0.0006022453308105469 +210,-99,7,8,3,5.888938903808594e-05 +211,-72,16,33,10,0.0002002716064453125 +212,-84,28,66,18,0.0004429817199707031 +213,-73,27,68,20,0.0004150867462158203 +214,-79,35,105,32,0.0006368160247802734 +215,-98,3,3,1,3.075599670410156e-05 +216,-86,16,33,10,0.00021386146545410156 +217,-79,24,61,18,0.0003681182861328125 +218,-91,3,2,1,3.3855438232421875e-05 +219,-72,23,51,14,0.0003609657287597656 +220,-82,18,40,12,0.0002613067626953125 +221,-66,33,94,28,0.0005910396575927734 +222,-35,12,21,6,0.0001380443572998047 +223,-74,29,67,19,0.00044608116149902344 +224,-87,8,11,3,7.414817810058594e-05 +225,-86,13,26,8,0.0001609325408935547 +226,-73,29,72,21,0.00045418739318847656 +227,-82,15,30,9,0.0001862049102783203 +228,-70,14,29,9,0.00017380714416503906 +229,-73,27,66,19,0.0004050731658935547 +230,-72,28,75,22,0.00043392181396484375 +231,-65,31,90,27,0.0005319118499755859 +232,-5,25,60,19,0.00035309791564941406 +233,-57,19,39,13,0.00023865699768066406 +234,-64,16,32,10,0.000202178955078125 +235,-90,15,32,10,0.00018978118896484375 +236,-75,23,48,14,0.0003120899200439453 +237,-36,11,16,5,0.00010800361633300781 +238,-76,14,22,6,0.00015306472778320312 +239,-78,10,15,5,9.989738464355469e-05 +240,-66,33,92,28,0.0005559921264648438 +241,-91,5,5,2,4.100799560546875e-05 +242,-96,3,4,1,3.0994415283203125e-05 +243,-8,35,109,32,0.0006477832794189453 +244,-78,26,69,20,0.0004820823669433594 +245,-77,23,55,16,0.0003578662872314453 +246,-86,26,65,19,0.0004229545593261719 +247,-64,32,97,29,0.0005590915679931641 +248,-82,19,35,10,0.00023889541625976562 +249,-80,26,57,15,0.000392913818359375 +250,-78,29,75,21,0.0004858970642089844 +251,-86,26,63,19,0.0004010200500488281 +252,-89,30,83,24,0.0005218982696533203 +253,-76,21,42,12,0.0003230571746826172 +254,-90,20,48,15,0.000286102294921875 +255,-85,9,15,5,9.703636169433594e-05 +256,-26,33,104,31,0.0006158351898193359 +257,-94,17,29,8,0.0002071857452392578 +258,-67,30,82,24,0.0005412101745605469 +259,-79,16,24,6,0.00018310546875 +260,-74,18,41,12,0.0002682209014892578 +261,-82,9,16,5,0.00010204315185546875 +262,-92,3,3,1,2.9325485229492188e-05 +263,-75,28,71,21,0.0004448890686035156 +264,-95,4,4,1,3.2901763916015625e-05 +265,-44,24,61,18,0.00036978721618652344 +266,-70,17,37,11,0.0002281665802001953 +267,-82,16,34,10,0.00021195411682128906 +268,-55,33,99,30,0.0005619525909423828 +269,-74,28,68,18,0.0004649162292480469 +270,-92,19,34,9,0.0002319812774658203 +271,-71,29,76,22,0.00046896934509277344 +272,-82,16,34,10,0.0002110004425048828 +273,-73,29,79,23,0.00047397613525390625 +274,-65,20,47,14,0.0002789497375488281 +275,-88,17,35,11,0.00021004676818847656 +276,-42,18,33,9,0.0002200603485107422 +277,-79,23,50,13,0.00034308433532714844 +278,-89,11,15,4,0.00010585784912109375 +279,-88,11,16,6,0.00011181831359863281 +280,-38,18,31,10,0.000209808349609375 +281,-70,15,32,10,0.0002079010009765625 +282,-78,34,97,29,0.0006349086761474609 +283,-84,29,70,19,0.0004661083221435547 +284,-80,30,79,24,0.0004940032958984375 +285,-79,19,42,13,0.0002570152282714844 +286,-65,32,89,27,0.0005209445953369141 +287,-88,16,29,8,0.0001919269561767578 +288,-71,23,52,15,0.00032329559326171875 +289,-85,12,20,6,0.00013208389282226562 +290,-25,24,59,18,0.0003619194030761719 +291,-70,20,48,15,0.00028324127197265625 +292,-93,3,3,1,2.8133392333984375e-05 +293,-91,9,13,4,8.893013000488281e-05 +294,-85,10,17,5,0.00011014938354492188 +295,-88,18,34,10,0.00022864341735839844 +296,-70,19,36,11,0.00023508071899414062 +297,-85,24,57,18,0.0003421306610107422 +298,-88,17,35,11,0.00021314620971679688 +299,-73,34,103,31,0.0005979537963867188 +300,-56,21,47,15,0.00028705596923828125 +301,-74,17,36,11,0.00021505355834960938 +302,-5,33,97,30,0.0005571842193603516 +303,-95,4,3,1,2.9802322387695312e-05 +304,-75,26,63,18,0.00041794776916503906 +305,-85,5,6,2,4.6253204345703125e-05 +306,-81,9,13,4,8.821487426757812e-05 +307,-22,27,64,19,0.0005118846893310547 +308,-67,31,85,25,0.0005238056182861328 +309,-94,2,4,1,2.9802322387695312e-05 +310,-66,12,18,7,0.00011968612670898438 +311,-93,11,15,4,0.00010776519775390625 +312,-70,11,21,7,0.00013017654418945312 +313,-94,4,3,1,3.0994415283203125e-05 +314,-96,2,3,1,2.6226043701171875e-05 +315,-85,15,30,9,0.00018787384033203125 +316,-86,17,37,11,0.0002300739288330078 +317,-77,27,71,21,0.00041103363037109375 +318,-74,24,49,13,0.0003352165222167969 +319,-79,35,107,32,0.0006558895111083984 +320,-64,13,21,8,0.00013899803161621094 +321,-79,24,58,17,0.00034308433532714844 +322,-72,34,103,30,0.0005962848663330078 +323,-80,24,63,19,0.00037407875061035156 +324,-80,31,85,25,0.0005559921264648438 +325,-85,6,7,2,5.3882598876953125e-05 +326,-83,34,100,30,0.0006239414215087891 +327,-87,11,17,5,0.00011587142944335938 +328,-75,22,55,16,0.0003509521484375 +329,-70,25,56,16,0.0003781318664550781 +330,-80,25,68,20,0.00045180320739746094 +331,-78,16,31,10,0.00020813941955566406 +332,-80,25,67,20,0.0004189014434814453 +333,-91,9,11,3,7.700920104980469e-05 +334,-85,22,43,11,0.00029468536376953125 +335,-89,14,22,7,0.0001480579376220703 +336,-98,3,2,1,2.4080276489257812e-05 +337,-85,8,12,4,8.606910705566406e-05 +338,-81,13,19,5,0.00012803077697753906 +339,-88,12,20,6,0.00012993812561035156 +340,-89,10,14,4,9.512901306152344e-05 +341,-79,25,65,19,0.0003781318664550781 +342,-86,25,61,17,0.00039076805114746094 +343,-67,28,74,22,0.00043702125549316406 +344,-81,25,59,17,0.000370025634765625 +345,-82,19,38,11,0.00024390220642089844 +346,-55,25,60,19,0.0003669261932373047 +347,-93,9,12,3,8.487701416015625e-05 +348,-79,32,91,27,0.0005650520324707031 +349,-73,29,77,23,0.00048279762268066406 +350,-65,24,57,17,0.0003581047058105469 +351,-72,23,49,13,0.0003459453582763672 +352,-29,34,102,30,0.0006401538848876953 +353,-76,21,46,13,0.0002970695495605469 +354,-65,32,93,27,0.0005400180816650391 +355,-91,9,11,3,7.724761962890625e-05 +356,-82,16,32,10,0.0002009868621826172 +357,-56,30,83,26,0.0004799365997314453 +358,-80,25,65,19,0.00038886070251464844 +359,-91,13,27,8,0.0001659393310546875 +360,-93,12,16,4,0.00011420249938964844 +361,-85,27,70,21,0.00043320655822753906 +362,-82,20,38,10,0.00025010108947753906 +363,-86,15,29,9,0.00018095970153808594 +364,-65,28,70,20,0.00044608116149902344 +365,-79,16,24,6,0.00016880035400390625 +366,-83,8,8,2,5.984306335449219e-05 +367,-81,13,22,6,0.0001437664031982422 +368,-61,28,71,21,0.0004899501800537109 +369,-83,12,17,5,0.00011801719665527344 +370,-74,17,34,11,0.00021219253540039062 +371,-70,20,44,14,0.00026702880859375 +372,-78,16,34,10,0.00021195411682128906 +373,-13,34,98,29,0.0006039142608642578 +374,-80,17,33,10,0.00024509429931640625 +375,-78,20,43,13,0.0002658367156982422 +376,-90,34,101,29,0.0006520748138427734 +377,-79,23,55,16,0.0003352165222167969 +378,-22,35,109,32,0.0006349086761474609 +379,-88,27,61,17,0.0004191398620605469 +380,-85,20,44,12,0.0002849102020263672 +381,-70,17,39,12,0.0002651214599609375 +382,-55,34,103,31,0.0005960464477539062 +383,-74,19,44,13,0.00026106834411621094 +384,-85,19,37,10,0.00024700164794921875 +385,-74,22,53,15,0.00034928321838378906 +386,-93,11,12,3,8.869171142578125e-05 +387,-80,22,47,14,0.0002989768981933594 +388,-99,7,9,3,6.318092346191406e-05 +389,-65,30,82,24,0.0004849433898925781 +390,-61,28,76,22,0.00044727325439453125 +391,-91,18,38,11,0.00024890899658203125 +392,-23,31,84,24,0.0005059242248535156 +393,-75,25,60,18,0.00037598609924316406 +394,-87,14,23,6,0.00021219253540039062 +395,-95,10,11,3,8.606910705566406e-05 +396,-82,20,43,14,0.00026988983154296875 +397,-98,3,2,1,2.5033950805664062e-05 +398,-91,7,8,2,5.793571472167969e-05 +399,-82,10,17,6,0.00011110305786132812 +400,-91,9,11,3,7.677078247070312e-05 +401,-45,35,109,33,0.0006127357482910156 +402,-86,18,33,9,0.00022673606872558594 +403,-86,25,57,16,0.0003638267517089844 +404,-82,14,23,8,0.00014781951904296875 +405,-85,30,83,24,0.00048422813415527344 +406,-40,34,101,31,0.0005710124969482422 +407,-87,6,7,2,5.0067901611328125e-05 +408,-65,22,48,14,0.0003020763397216797 +409,-98,2,3,1,2.6226043701171875e-05 +410,-86,17,29,8,0.00019097328186035156 +411,-30,22,54,16,0.0004570484161376953 +412,-99,8,10,3,7.081031799316406e-05 +413,-89,6,7,2,5.078315734863281e-05 +414,-79,21,50,16,0.0002970695495605469 +415,-91,10,11,3,8.082389831542969e-05 +416,-91,10,11,3,8.511543273925781e-05 +417,-82,16,32,10,0.00020313262939453125 +418,-84,17,34,10,0.00021600723266601562 +419,-96,5,4,1,3.62396240234375e-05 +420,-67,28,71,22,0.0004360675811767578 +421,-38,35,109,32,0.0006279945373535156 +422,-91,7,8,2,5.698204040527344e-05 +423,-73,34,103,31,0.0005939006805419922 +424,-91,13,27,8,0.00016617774963378906 +425,-53,33,93,28,0.000598907470703125 +426,-84,14,23,6,0.0001609325408935547 +427,-75,25,64,19,0.0003731250762939453 +428,-74,18,41,12,0.0002961158752441406 +429,-50,29,77,23,0.00045108795166015625 +430,-74,18,39,12,0.0002338886260986328 +431,-72,35,105,32,0.0006270408630371094 +432,-75,26,69,20,0.00040602684020996094 +433,-80,28,66,20,0.0004088878631591797 +434,-81,33,99,30,0.0005748271942138672 +435,-40,26,60,17,0.000392913818359375 +436,-97,4,4,1,3.314018249511719e-05 +437,-84,29,68,19,0.0004508495330810547 +438,-82,15,26,7,0.0001819133758544922 +439,-91,6,9,3,6.079673767089844e-05 +440,-67,30,76,23,0.0004680156707763672 +441,-96,18,39,12,0.00023889541625976562 +442,-79,13,26,8,0.00015616416931152344 +443,-73,29,72,22,0.0004458427429199219 +444,-79,26,68,20,0.0003991127014160156 +445,-30,19,38,13,0.00023698806762695312 +446,-79,35,107,32,0.0006327629089355469 +447,-75,28,71,21,0.00043392181396484375 +448,-93,9,13,4,8.916854858398438e-05 +449,-70,26,69,21,0.0004241466522216797 +450,-82,11,19,6,0.0001239776611328125 +451,-95,3,4,1,3.0994415283203125e-05 +452,-89,12,16,4,0.00011396408081054688 +453,-87,7,9,3,6.604194641113281e-05 +454,-82,18,40,12,0.0002377033233642578 +455,-97,12,22,7,0.00016832351684570312 +456,-23,29,78,23,0.0004951953887939453 +457,-88,12,20,6,0.00013685226440429688 +458,-95,8,12,4,8.487701416015625e-05 +459,-86,30,77,21,0.0005059242248535156 +460,-47,12,22,7,0.00013780593872070312 +461,-45,13,22,7,0.00014519691467285156 +462,-82,14,27,8,0.0001678466796875 +463,-33,34,98,28,0.0006260871887207031 +464,-79,15,23,6,0.00015997886657714844 +465,-93,5,4,1,3.504753112792969e-05 +466,-80,17,40,12,0.00023293495178222656 +467,-80,19,39,13,0.00023794174194335938 +468,-67,28,78,23,0.0004429817199707031 +469,-85,11,17,6,0.00011110305786132812 +470,-80,20,45,13,0.0002880096435546875 +471,-85,11,18,5,0.0001201629638671875 +472,-82,18,36,10,0.0002281665802001953 +473,-72,34,103,30,0.0006148815155029297 +474,-89,7,7,2,5.3882598876953125e-05 +475,-89,8,12,4,7.987022399902344e-05 +476,-31,26,67,20,0.0003819465637207031 +477,-35,23,56,17,0.00033211708068847656 +478,-65,16,35,11,0.0002071857452392578 +479,-78,20,44,13,0.0002758502960205078 +480,-81,5,6,2,4.506111145019531e-05 +481,-81,5,5,2,4.100799560546875e-05 +482,-88,18,35,10,0.00022983551025390625 +483,-63,25,65,20,0.00039696693420410156 +484,-94,16,32,9,0.00020623207092285156 +485,-76,25,57,16,0.0003662109375 +486,-82,9,16,5,0.00010085105895996094 +487,-89,5,7,2,4.887580871582031e-05 +488,-97,4,3,1,2.9802322387695312e-05 +489,-85,20,41,11,0.00026297569274902344 +490,-92,2,3,1,2.5033950805664062e-05 +491,-98,3,3,1,2.7179718017578125e-05 +492,-95,2,4,1,2.8848648071289062e-05 +493,0,31,87,27,0.0004990100860595703 +494,-82,17,36,11,0.00022602081298828125 +495,-82,14,24,6,0.0001671314239501953 +496,-26,33,97,30,0.0005681514739990234 +497,-88,12,20,6,0.00012969970703125 +498,-67,21,48,14,0.00029087066650390625 +499,-63,35,113,34,0.0006499290466308594 diff --git a/R00065426/R00065426-dfs-20251011083117391494.csv b/R00065426/R00065426-dfs-20251011083117391494.csv new file mode 100644 index 000000000..7b1f797a0 --- /dev/null +++ b/R00065426/R00065426-dfs-20251011083117391494.csv @@ -0,0 +1,501 @@ +run_id,path_cost,goal_tests,states,succs,time_taken +0,-43,17,48,16,0.0004711151123046875 +1,-11,20,61,19,0.0005221366882324219 +2,-39,18,51,17,0.00043511390686035156 +3,-48,23,71,22,0.0006229877471923828 +4,-57,11,32,10,0.0002627372741699219 +5,-25,18,54,17,0.0004990100860595703 +6,-95,2,3,1,3.5762786865234375e-05 +7,-79,8,25,7,0.0002200603485107422 +8,-70,30,91,29,0.000720977783203125 +9,-72,7,20,6,0.00017523765563964844 +10,-70,32,97,31,0.0007729530334472656 +11,-29,19,57,18,0.0004951953887939453 +12,-4,12,37,11,0.00032711029052734375 +13,-55,11,35,10,0.00031185150146484375 +14,-27,24,72,23,0.0006048679351806641 +15,0,14,43,13,0.0004038810729980469 +16,-28,14,44,13,0.0004200935363769531 +17,-97,34,104,33,0.0008270740509033203 +18,-82,4,11,3,9.584426879882812e-05 +19,-21,14,42,13,0.00035309791564941406 +20,-67,6,17,5,0.00014519691467285156 +21,17,19,59,18,0.0005168914794921875 +22,-43,25,75,24,0.0006508827209472656 +23,-64,31,94,30,0.00074005126953125 +24,9,16,51,15,0.0004489421844482422 +25,-91,33,102,32,0.0008161067962646484 +26,-73,4,9,3,8.20159912109375e-05 +27,-50,23,69,22,0.0006129741668701172 +28,-80,29,87,28,0.0007009506225585938 +29,-72,4,8,3,7.510185241699219e-05 +30,-65,27,85,26,0.0007219314575195312 +31,-65,31,97,30,0.0008780956268310547 +32,20,17,55,16,0.0004942417144775391 +33,-74,5,14,4,0.00012087821960449219 +34,-87,3,7,2,6.4849853515625e-05 +35,19,16,52,15,0.00047206878662109375 +36,-57,9,23,8,0.00018405914306640625 +37,-82,26,81,25,0.0007021427154541016 +38,1,23,65,22,0.0005490779876708984 +39,-32,22,67,21,0.0006163120269775391 +40,-64,10,31,9,0.0002651214599609375 +41,-52,9,28,8,0.000247955322265625 +42,-46,22,68,21,0.0006048679351806641 +43,-89,29,93,28,0.0008020401000976562 +44,-52,11,33,10,0.0002789497375488281 +45,-85,3,8,2,7.510185241699219e-05 +46,37,19,60,18,0.0005371570587158203 +47,-76,10,30,9,0.00026607513427734375 +48,-89,3,7,2,7.104873657226562e-05 +49,-68,25,74,24,0.0006437301635742188 +50,-95,33,104,32,0.0008177757263183594 +51,-65,6,14,5,0.00011897087097167969 +52,-82,29,87,28,0.0007290840148925781 +53,-33,24,72,23,0.0006151199340820312 +54,-65,11,30,10,0.00025081634521484375 +55,-79,29,89,28,0.0007109642028808594 +56,-8,13,37,12,0.0003120899200439453 +57,-22,16,51,15,0.0004730224609375 +58,-65,29,89,28,0.0007061958312988281 +59,-34,20,60,19,0.000514984130859375 +60,-74,5,15,4,0.00012993812561035156 +61,-82,29,90,28,0.0007450580596923828 +62,-85,33,101,32,0.0007758140563964844 +63,-88,4,12,3,0.00010609626770019531 +64,-88,33,103,32,0.0007941722869873047 +65,-5,11,34,10,0.0002999305725097656 +66,-71,10,26,9,0.00021195411682128906 +67,-18,23,68,22,0.0005991458892822266 +68,-78,27,84,26,0.0007112026214599609 +69,-62,6,17,5,0.00014519691467285156 +70,-59,11,32,10,0.00026917457580566406 +71,-78,5,14,4,0.000125885009765625 +72,-63,7,21,6,0.0001819133758544922 +73,33,22,64,21,0.0005712509155273438 +74,-68,32,100,31,0.0007889270782470703 +75,-87,3,5,2,5.078315734863281e-05 +76,-15,20,61,19,0.0005140304565429688 +77,-7,14,39,13,0.00030994415283203125 +78,-22,19,58,18,0.0005087852478027344 +79,-55,32,99,31,0.0007669925689697266 +80,-81,4,11,3,9.703636169433594e-05 +81,4,14,42,13,0.0003650188446044922 +82,-65,30,93,29,0.0007500648498535156 +83,-80,4,9,3,7.796287536621094e-05 +84,-49,24,76,23,0.0006690025329589844 +85,-42,22,66,21,0.0005800724029541016 +86,-67,7,22,6,0.00019598007202148438 +87,16,16,50,15,0.00045490264892578125 +88,-65,27,85,26,0.0007541179656982422 +89,45,21,60,20,0.0005130767822265625 +90,-43,30,95,29,0.0008208751678466797 +91,-94,2,4,1,4.506111145019531e-05 +92,-97,2,3,1,3.504753112792969e-05 +93,-59,25,72,24,0.0006227493286132812 +94,-93,35,110,34,0.0008280277252197266 +95,-84,30,96,29,0.0007910728454589844 +96,-35,24,70,23,0.000598907470703125 +97,-65,27,85,26,0.0007090568542480469 +98,35,15,44,14,0.0003581047058105469 +99,-41,16,48,15,0.0003972053527832031 +100,-12,17,52,16,0.00043487548828125 +101,-12,17,48,16,0.0004191398620605469 +102,-95,35,109,34,0.0008308887481689453 +103,6,16,47,15,0.00037789344787597656 +104,-82,28,88,27,0.0007371902465820312 +105,-97,2,3,1,3.504753112792969e-05 +106,-81,29,93,28,0.0007669925689697266 +107,-55,25,76,24,0.0006539821624755859 +108,-19,12,31,11,0.00025391578674316406 +109,-93,3,5,2,5.078315734863281e-05 +110,-85,6,19,5,0.00016617774963378906 +111,-60,9,27,8,0.00024127960205078125 +112,-65,31,96,30,0.0007460117340087891 +113,-82,30,93,29,0.0007617473602294922 +114,-67,31,96,30,0.0007641315460205078 +115,-23,12,33,11,0.00026416778564453125 +116,-70,5,10,4,9.298324584960938e-05 +117,-68,16,46,15,0.00039505958557128906 +118,-40,13,39,12,0.0003731250762939453 +119,9,23,69,22,0.0005910396575927734 +120,-7,19,58,18,0.0005121231079101562 +121,-30,25,75,24,0.0006368160247802734 +122,-56,31,96,30,0.0007600784301757812 +123,-100,34,107,33,0.0008461475372314453 +124,-93,32,100,31,0.0008020401000976562 +125,-97,33,101,32,0.0008058547973632812 +126,-96,35,108,34,0.0008089542388916016 +127,-58,13,42,12,0.00037670135498046875 +128,-76,5,13,4,0.00011086463928222656 +129,-55,12,37,11,0.00032401084899902344 +130,-48,21,63,20,0.0005402565002441406 +131,-91,32,99,31,0.000762939453125 +132,-93,35,108,34,0.0008308887481689453 +133,0,27,80,26,0.0006628036499023438 +134,-51,19,60,18,0.0005121231079101562 +135,-83,3,8,2,7.176399230957031e-05 +136,-61,7,22,6,0.00019979476928710938 +137,-8,9,23,8,0.00018787384033203125 +138,-44,25,76,24,0.0006411075592041016 +139,-68,28,89,27,0.0007519721984863281 +140,-40,22,67,21,0.0005922317504882812 +141,-27,16,50,15,0.0004496574401855469 +142,-46,15,42,14,0.0003409385681152344 +143,-35,16,46,15,0.0004038810729980469 +144,-39,15,43,14,0.00035691261291503906 +145,-12,13,38,12,0.0003268718719482422 +146,-65,6,14,5,0.00011897087097167969 +147,-44,23,69,22,0.0006091594696044922 +148,-87,31,97,30,0.0008471012115478516 +149,-3,24,72,23,0.0006330013275146484 +150,-16,21,64,20,0.0005600452423095703 +151,-91,33,103,32,0.0007832050323486328 +152,-40,18,55,17,0.00048089027404785156 +153,23,18,55,17,0.0004699230194091797 +154,-91,2,2,1,3.0994415283203125e-05 +155,-47,18,56,17,0.0005309581756591797 +156,-75,6,12,5,0.00011897087097167969 +157,-88,4,11,3,9.489059448242188e-05 +158,32,26,75,25,0.0006432533264160156 +159,-93,35,110,34,0.0008339881896972656 +160,-30,10,25,9,0.0002129077911376953 +161,-85,32,100,31,0.0007958412170410156 +162,-54,12,33,11,0.00026702880859375 +163,-78,28,86,27,0.0007269382476806641 +164,-86,30,95,29,0.0007889270782470703 +165,-21,15,46,14,0.0003933906555175781 +166,-65,6,17,5,0.00013780593872070312 +167,-73,28,84,27,0.0007038116455078125 +168,-78,25,78,24,0.0006651878356933594 +169,-26,28,86,27,0.000820159912109375 +170,-94,4,8,3,7.200241088867188e-05 +171,-100,34,109,33,0.0008721351623535156 +172,-67,16,47,15,0.00040221214294433594 +173,-31,14,40,13,0.0003571510314941406 +174,-8,13,39,12,0.00034308433532714844 +175,-20,29,88,28,0.0006961822509765625 +176,-11,18,57,17,0.0004949569702148438 +177,-67,8,20,7,0.00016880035400390625 +178,-78,5,11,4,9.608268737792969e-05 +179,-57,29,89,28,0.0007359981536865234 +180,18,22,66,21,0.0005550384521484375 +181,-79,28,86,27,0.0007212162017822266 +182,-37,29,89,28,0.0007259845733642578 +183,-83,31,94,30,0.0007700920104980469 +184,-75,6,14,5,0.00011897087097167969 +185,-58,28,83,27,0.0006778240203857422 +186,-87,32,98,31,0.0007388591766357422 +187,-74,6,15,5,0.00012803077697753906 +188,-50,14,42,13,0.0003428459167480469 +189,-89,7,16,6,0.00013637542724609375 +190,-24,20,60,19,0.0005230903625488281 +191,-80,29,88,28,0.0007131099700927734 +192,-60,28,84,27,0.0006783008575439453 +193,23,18,53,17,0.0004322528839111328 +194,-28,20,61,19,0.0005481243133544922 +195,-30,27,85,26,0.0007193088531494141 +196,-41,24,74,23,0.0006320476531982422 +197,-55,28,86,27,0.0007059574127197266 +198,-25,28,84,27,0.0007002353668212891 +199,-12,31,93,30,0.0007519721984863281 +200,40,17,50,16,0.0005130767822265625 +201,-43,12,33,11,0.0002989768981933594 +202,-82,30,91,29,0.0007410049438476562 +203,-30,18,55,17,0.0004868507385253906 +204,-13,24,71,23,0.0006048679351806641 +205,15,25,74,24,0.0006279945373535156 +206,-23,19,53,18,0.0004448890686035156 +207,-44,19,59,18,0.0005180835723876953 +208,-52,19,61,18,0.0005407333374023438 +209,-28,21,59,20,0.0005340576171875 +210,53,22,67,21,0.0006380081176757812 +211,-52,11,34,10,0.0003409385681152344 +212,-67,8,20,7,0.0001690387725830078 +213,-78,5,11,4,9.512901306152344e-05 +214,-42,15,47,14,0.0004150867462158203 +215,-18,27,80,26,0.0006608963012695312 +216,-51,7,18,6,0.00014495849609375 +217,-3,20,62,19,0.00055694580078125 +218,-81,29,85,28,0.0006997585296630859 +219,-49,19,57,18,0.00048804283142089844 +220,-48,11,34,10,0.0002849102020263672 +221,30,22,66,21,0.000560760498046875 +222,-74,33,106,32,0.000820159912109375 +223,0,26,78,25,0.0006530284881591797 +224,-32,21,63,20,0.0005929470062255859 +225,-82,4,12,3,0.00010776519775390625 +226,-97,34,106,33,0.0008029937744140625 +227,-56,31,96,30,0.0007479190826416016 +228,44,21,65,20,0.0005848407745361328 +229,-83,3,5,2,5.2928924560546875e-05 +230,-57,10,32,9,0.00028014183044433594 +231,-49,10,31,9,0.0002779960632324219 +232,-90,28,87,27,0.0007228851318359375 +233,-67,10,32,9,0.00029015541076660156 +234,-40,29,86,28,0.0007112026214599609 +235,-73,4,7,3,6.604194641113281e-05 +236,13,11,34,10,0.000308990478515625 +237,-19,21,61,20,0.0005381107330322266 +238,0,20,61,19,0.0005209445953369141 +239,59,23,64,22,0.0005450248718261719 +240,-29,26,76,25,0.0006361007690429688 +241,-85,32,99,31,0.0007929801940917969 +242,-57,9,26,8,0.0002110004425048828 +243,-29,29,90,28,0.0007500648498535156 +244,-94,34,105,33,0.0008039474487304688 +245,-52,27,86,26,0.0007219314575195312 +246,-33,23,66,22,0.0005879402160644531 +247,-61,7,21,6,0.0001838207244873047 +248,-79,4,8,3,7.295608520507812e-05 +249,-2,10,28,9,0.00022101402282714844 +250,-35,19,54,18,0.00045108795166015625 +251,39,20,59,19,0.0005280971527099609 +252,-61,19,56,18,0.0004949569702148438 +253,-96,32,104,31,0.0008382797241210938 +254,-80,31,94,30,0.0007448196411132812 +255,-44,13,39,12,0.000331878662109375 +256,-46,27,78,26,0.0006470680236816406 +257,-23,20,59,19,0.0005400180816650391 +258,-57,33,103,32,0.0007982254028320312 +259,-94,2,2,1,2.9087066650390625e-05 +260,-91,2,1,1,2.6226043701171875e-05 +261,-83,3,6,2,5.793571472167969e-05 +262,10,22,66,21,0.0006821155548095703 +263,-35,23,73,22,0.0006730556488037109 +264,-12,25,75,24,0.0006411075592041016 +265,-63,19,55,18,0.00045490264892578125 +266,-55,21,66,20,0.0005691051483154297 +267,-87,3,5,2,5.125999450683594e-05 +268,47,20,61,19,0.0005412101745605469 +269,-61,10,26,9,0.00021195411682128906 +270,-2,25,74,24,0.0006411075592041016 +271,-98,35,112,34,0.0008819103240966797 +272,-78,9,27,8,0.00024127960205078125 +273,-57,24,73,23,0.0006127357482910156 +274,-56,8,23,7,0.000202178955078125 +275,-89,6,15,5,0.00012302398681640625 +276,13,15,49,14,0.00044608116149902344 +277,-91,3,8,2,7.295608520507812e-05 +278,-30,24,73,23,0.00063323974609375 +279,-82,7,18,6,0.0001399517059326172 +280,-66,12,32,11,0.00026297569274902344 +281,-34,28,83,27,0.0006852149963378906 +282,-45,12,39,11,0.000347137451171875 +283,-92,2,4,1,4.100799560546875e-05 +284,-96,34,106,33,0.0007970333099365234 +285,-70,29,87,28,0.0007410049438476562 +286,-57,8,25,7,0.0002200603485107422 +287,-29,24,72,23,0.0006260871887207031 +288,-91,35,109,34,0.0008251667022705078 +289,-16,10,28,9,0.00023102760314941406 +290,-79,30,95,29,0.0008060932159423828 +291,-78,5,16,4,0.00014090538024902344 +292,-85,7,15,6,0.00012803077697753906 +293,-91,32,104,31,0.0008487701416015625 +294,-92,35,108,34,0.00084686279296875 +295,-39,17,48,16,0.0004322528839111328 +296,-53,31,94,30,0.0008089542388916016 +297,-36,29,92,28,0.0007758140563964844 +298,-85,3,7,2,6.508827209472656e-05 +299,-63,11,36,10,0.00033092498779296875 +300,-49,11,34,10,0.0002949237823486328 +301,32,17,50,16,0.0004360675811767578 +302,-51,31,94,30,0.0007500648498535156 +303,-91,32,98,31,0.0007669925689697266 +304,-32,22,66,21,0.0005621910095214844 +305,-34,10,26,9,0.0002181529998779297 +306,-81,32,103,31,0.0008158683776855469 +307,-19,19,59,18,0.0005550384521484375 +308,19,20,62,19,0.0005609989166259766 +309,-37,23,71,22,0.00061798095703125 +310,-92,2,4,1,4.1961669921875e-05 +311,-94,35,109,34,0.0008492469787597656 +312,-82,28,88,27,0.0007200241088867188 +313,-84,30,90,29,0.0008060932159423828 +314,-65,30,93,29,0.000743865966796875 +315,-56,8,23,7,0.0002040863037109375 +316,-40,13,44,12,0.000431060791015625 +317,-80,6,19,5,0.00017404556274414062 +318,-37,16,51,15,0.0004951953887939453 +319,-46,22,69,21,0.0005929470062255859 +320,-55,11,31,10,0.00025391578674316406 +321,28,18,56,17,0.0004968643188476562 +322,-89,32,98,31,0.0008018016815185547 +323,-46,25,75,24,0.0006539821624755859 +324,-84,8,23,7,0.0002009868621826172 +325,-52,10,31,9,0.00026607513427734375 +326,-85,30,92,29,0.0007488727569580078 +327,-82,5,15,4,0.00012803077697753906 +328,-52,25,79,24,0.0006847381591796875 +329,-95,34,105,33,0.0007917881011962891 +330,-13,19,61,18,0.0005428791046142578 +331,0,12,35,11,0.0002949237823486328 +332,-26,26,79,25,0.0006709098815917969 +333,-91,32,99,31,0.0007848739624023438 +334,-90,30,91,29,0.0007431507110595703 +335,-95,34,108,33,0.0008597373962402344 +336,-93,3,8,2,7.200241088867188e-05 +337,-18,16,47,15,0.00041604042053222656 +338,-96,35,109,34,0.0008637905120849609 +339,-74,25,77,24,0.0006542205810546875 +340,-54,12,34,11,0.0002770423889160156 +341,31,19,53,18,0.00044798851013183594 +342,17,24,70,23,0.0006120204925537109 +343,-46,9,26,8,0.00022912025451660156 +344,-13,7,22,6,0.0001990795135498047 +345,-71,31,97,30,0.0007522106170654297 +346,53,22,66,21,0.0005648136138916016 +347,-20,19,58,18,0.0005507469177246094 +348,-72,5,14,4,0.00012230873107910156 +349,-16,20,60,19,0.0005171298980712891 +350,-49,11,34,10,0.0002880096435546875 +351,-25,11,30,10,0.0002460479736328125 +352,-62,25,75,24,0.0006432533264160156 +353,-89,3,6,2,5.793571472167969e-05 +354,-65,31,95,30,0.0007359981536865234 +355,-49,7,16,6,0.0001342296600341797 +356,-49,17,52,16,0.0004570484161376953 +357,-96,34,105,33,0.00080108642578125 +358,-88,7,18,6,0.00015091896057128906 +359,-28,19,58,18,0.0005199909210205078 +360,-25,18,55,17,0.0005030632019042969 +361,-80,5,14,4,0.00012302398681640625 +362,-35,17,54,16,0.0004532337188720703 +363,-55,30,93,29,0.0007631778717041016 +364,-23,18,56,17,0.0005125999450683594 +365,-90,35,112,34,0.0009119510650634766 +366,-95,35,110,34,0.0008299350738525391 +367,-75,10,30,9,0.0002486705780029297 +368,28,19,58,18,0.0005159378051757812 +369,-37,19,61,18,0.0005440711975097656 +370,-55,7,20,6,0.00017213821411132812 +371,-81,32,99,31,0.0007801055908203125 +372,-20,20,61,19,0.0005218982696533203 +373,-62,13,38,12,0.0003120899200439453 +374,10,21,60,20,0.0005309581756591797 +375,-24,26,78,25,0.0006351470947265625 +376,-76,4,11,3,9.703636169433594e-05 +377,-46,9,29,8,0.00025391578674316406 +378,-96,34,105,33,0.0007989406585693359 +379,-79,4,11,3,9.989738464355469e-05 +380,-21,22,67,21,0.000701904296875 +381,-46,20,61,19,0.0005481243133544922 +382,4,16,46,15,0.0003898143768310547 +383,-62,26,75,25,0.0006971359252929688 +384,-43,25,74,24,0.0006442070007324219 +385,5,14,39,13,0.0003600120544433594 +386,-91,31,94,30,0.0007481575012207031 +387,-97,34,108,33,0.0008292198181152344 +388,-96,33,100,32,0.0007841587066650391 +389,-73,4,9,3,8.082389831542969e-05 +390,-68,5,13,4,0.00011014938354492188 +391,-49,7,17,6,0.0001430511474609375 +392,-55,21,66,20,0.0005710124969482422 +393,-58,10,30,9,0.00026702880859375 +394,-62,13,33,12,0.00027298927307128906 +395,-41,26,78,25,0.0006692409515380859 +396,-43,20,63,19,0.0005450248718261719 +397,31,19,58,18,0.0005433559417724609 +398,-19,20,61,19,0.0005140304565429688 +399,-2,13,37,12,0.0003008842468261719 +400,15,23,69,22,0.0006010532379150391 +401,-57,21,68,20,0.0006051063537597656 +402,-40,25,77,24,0.0006432533264160156 +403,-12,19,58,18,0.0005340576171875 +404,-93,33,104,32,0.0008502006530761719 +405,-12,13,36,12,0.0003018379211425781 +406,-99,34,105,33,0.0007998943328857422 +407,-67,8,24,7,0.00021195411682128906 +408,-61,6,18,5,0.00015735626220703125 +409,-61,11,31,10,0.00026488304138183594 +410,-84,31,99,30,0.0008172988891601562 +411,24,16,49,15,0.00042891502380371094 +412,-83,8,24,7,0.00021219253540039062 +413,-95,30,95,29,0.0007691383361816406 +414,-94,34,108,33,0.0008440017700195312 +415,-68,31,96,30,0.0007641315460205078 +416,-93,2,4,1,4.291534423828125e-05 +417,-84,29,89,28,0.0007262229919433594 +418,-96,33,101,32,0.0007891654968261719 +419,-61,29,91,28,0.0007410049438476562 +420,-62,14,39,13,0.0003190040588378906 +421,-30,22,68,21,0.0005970001220703125 +422,6,22,62,21,0.0005450248718261719 +423,-83,33,106,32,0.0008530616760253906 +424,-31,26,76,25,0.0006499290466308594 +425,-24,18,54,17,0.00045180320739746094 +426,-55,11,31,10,0.00025272369384765625 +427,1,29,90,28,0.0007269382476806641 +428,-66,10,28,9,0.0002319812774658203 +429,-35,11,35,10,0.0003159046173095703 +430,-28,18,56,17,0.00047707557678222656 +431,-2,13,38,12,0.0003139972686767578 +432,-11,14,43,13,0.0003497600555419922 +433,-35,26,79,25,0.000659942626953125 +434,44,20,56,19,0.0004558563232421875 +435,-96,2,3,1,3.5762786865234375e-05 +436,-91,2,2,1,2.9087066650390625e-05 +437,-33,21,64,20,0.0005729198455810547 +438,-89,31,95,30,0.0007550716400146484 +439,-61,9,25,8,0.00021505355834960938 +440,-91,35,111,34,0.0008640289306640625 +441,-74,29,91,28,0.0007936954498291016 +442,-75,32,99,31,0.0008149147033691406 +443,-45,12,38,11,0.0003399848937988281 +444,1,14,40,13,0.00032901763916015625 +445,-69,7,17,6,0.0001437664031982422 +446,-31,25,75,24,0.0006649494171142578 +447,-43,25,74,24,0.0006489753723144531 +448,-57,6,13,5,0.00011396408081054688 +449,44,20,58,19,0.0005121231079101562 +450,-49,7,16,6,0.00013589859008789062 +451,-100,34,107,33,0.0008611679077148438 +452,-67,7,18,6,0.00016188621520996094 +453,-48,19,57,18,0.0005350112915039062 +454,-18,19,59,18,0.0005600452423095703 +455,-47,23,70,22,0.0006427764892578125 +456,-61,10,29,9,0.0002467632293701172 +457,-43,21,62,20,0.0005269050598144531 +458,-87,3,8,2,7.486343383789062e-05 +459,20,18,54,17,0.00046825408935546875 +460,-30,17,48,16,0.0004048347473144531 +461,-22,19,57,18,0.0005102157592773438 +462,-24,26,77,25,0.0006687641143798828 +463,58,22,64,21,0.0005621910095214844 +464,-95,3,6,2,5.888938903808594e-05 +465,-60,27,79,26,0.0007109642028808594 +466,-76,4,9,3,8.082389831542969e-05 +467,-70,6,19,5,0.00016999244689941406 +468,-60,12,33,11,0.0002830028533935547 +469,-85,30,92,29,0.0007519721984863281 +470,-28,13,37,12,0.0003020763397216797 +471,33,23,66,22,0.0005922317504882812 +472,-95,35,110,34,0.000865936279296875 +473,-93,33,106,32,0.0008420944213867188 +474,-45,11,34,10,0.0003151893615722656 +475,-58,25,76,24,0.0006780624389648438 +476,-94,35,111,34,0.0008692741394042969 +477,30,19,60,18,0.0005338191986083984 +478,26,26,77,25,0.0006558895111083984 +479,-44,13,37,12,0.0003120899200439453 +480,-87,4,8,3,7.295608520507812e-05 +481,-94,35,109,34,0.0008521080017089844 +482,-78,29,91,28,0.0007710456848144531 +483,-33,24,73,23,0.0006351470947265625 +484,-61,10,26,9,0.00021910667419433594 +485,-79,4,12,3,0.00010704994201660156 +486,-95,33,100,32,0.0007731914520263672 +487,-80,5,14,4,0.0001239776611328125 +488,-90,32,99,31,0.0007867813110351562 +489,-91,31,98,30,0.00080108642578125 +490,29,25,76,24,0.000640869140625 +491,-10,24,71,23,0.0007171630859375 +492,-61,7,21,6,0.00018310546875 +493,8,15,45,14,0.00036597251892089844 +494,-5,11,34,10,0.0002980232238769531 +495,-19,16,48,15,0.00040984153747558594 +496,-92,2,3,1,3.504753112792969e-05 +497,-82,4,8,3,7.104873657226562e-05 +498,-85,4,12,3,0.0001049041748046875 +499,-91,3,7,2,6.413459777832031e-05 diff --git a/R00065426/R00065426-dls-20251011083123005034.csv b/R00065426/R00065426-dls-20251011083123005034.csv new file mode 100644 index 000000000..d439194c7 --- /dev/null +++ b/R00065426/R00065426-dls-20251011083123005034.csv @@ -0,0 +1,501 @@ +run_id,path_cost,goal_tests,states,succs,time_taken +0,198,43,141,40,0.0007140636444091797 +1,-91,2,2,1,2.09808349609375e-05 +2,185,113,208,59,0.0010559558868408203 +3,272,109,165,59,0.0009789466857910156 +4,227,58,154,44,0.0007758140563964844 +5,185,200,292,82,0.001661062240600586 +6,182,254,328,97,0.0017578601837158203 +7,188,67,163,46,0.0007910728454589844 +8,158,43,140,40,0.0006630420684814453 +9,176,980,1073,311,0.006166934967041016 +10,128,273,362,103,0.0020008087158203125 +11,178,254,332,97,0.0018310546875 +12,74,6323,6372,1837,0.036787986755371094 +13,192,10416,10507,2956,0.06055593490600586 +14,102,3259,3347,963,0.01921820640563965 +15,251,452,507,165,0.0028429031372070312 +16,141,355,447,129,0.0024788379669189453 +17,213,47707,47760,14370,0.27394628524780273 +18,-90,5,11,4,7.033348083496094e-05 +19,155,49,143,41,0.0006902217864990234 +20,88,315,367,120,0.0020520687103271484 +21,200,9069,9157,2657,0.18395233154296875 +22,214,566,640,201,0.022638797760009766 +23,83,402,481,151,0.010186195373535156 +24,231,6831,6885,1986,0.06068992614746094 +25,-65,6,19,5,0.00011491775512695312 +26,175,988,1081,303,0.006640911102294922 +27,182,317,409,115,0.002446889877319336 +28,970,45,86,41,0.0005371570587158203 +29,154,52,149,42,0.0007631778717041016 +30,193,49,124,41,0.0006690025329589844 +31,188,116,212,60,0.0012178421020507812 +32,192,10356,10445,2936,0.06013607978820801 +33,103,1753,1807,537,0.010395288467407227 +34,122,447,535,154,0.002904176712036133 +35,238,48,144,41,0.0006971359252929688 +36,1078,107,203,58,0.0010230541229248047 +37,126,12104,12190,3473,0.07010602951049805 +38,204,2984,3077,888,0.017402172088623047 +39,187,122,215,61,0.0011129379272460938 +40,-96,2,3,1,2.5033950805664062e-05 +41,-90,2,3,1,2.47955322265625e-05 +42,266,87,144,54,0.0007910728454589844 +43,188,64,159,45,0.0007860660552978516 +44,232,42,141,40,0.0006778240203857422 +45,86,1689,1740,515,0.009870052337646484 +46,188,140,232,65,0.0011889934539794922 +47,-65,6,19,5,9.703636169433594e-05 +48,287,6309,6363,1931,0.036562204360961914 +49,150,62,156,45,0.0007717609405517578 +50,-89,3,8,2,4.673004150390625e-05 +51,185,54,149,42,0.0007660388946533203 +52,108,2792,2864,924,0.016615867614746094 +53,272,42,101,40,0.0005438327789306641 +54,108,318,409,118,0.0022389888763427734 +55,156,56,132,44,0.0006740093231201172 +56,251,1504,1559,457,0.008923053741455078 +57,188,94,169,55,0.0008902549743652344 +58,102,270,364,107,0.0019676685333251953 +59,74,632,685,214,0.003935813903808594 +60,198,6796,6885,2178,0.03964710235595703 +61,266,53,110,43,0.0005829334259033203 +62,189,164,256,71,0.0013289451599121094 +63,112,60,157,45,0.0007722377777099609 +64,950,752,845,257,0.004792928695678711 +65,244,1762,1817,538,0.010371923446655273 +66,-85,4,12,3,6.508827209472656e-05 +67,144,113,209,59,0.0010709762573242188 +68,88,319,371,121,0.002095937728881836 +69,1004,355,447,122,0.002561807632446289 +70,246,1842,1896,586,0.010799884796142578 +71,186,69,164,46,0.0008270740509033203 +72,154,47,145,41,0.0006930828094482422 +73,112,61,158,45,0.0007617473602294922 +74,-65,6,19,5,9.894371032714844e-05 +75,150,116,211,60,0.0010619163513183594 +76,65,191,246,85,0.0013611316680908203 +77,64,533,586,193,0.0033011436462402344 +78,183,110,206,58,0.0010340213775634766 +79,162,58,152,43,0.0007281303405761719 +80,102,5765,5817,1725,0.03385806083679199 +81,1060,56,150,43,0.0008502006530761719 +82,234,321,415,116,0.0022249221801757812 +83,-73,4,9,3,5.507469177246094e-05 +84,-91,3,8,2,4.601478576660156e-05 +85,215,275,371,107,0.0019788742065429688 +86,68,105,179,59,0.0009398460388183594 +87,887,36460,36548,10266,0.21085619926452637 +88,56,1749,1803,538,0.07002806663513184 +89,978,61,117,45,0.001584768295288086 +90,253,726,781,252,0.02199697494506836 +91,148,52,149,42,0.004408121109008789 +92,125,520,607,176,0.028194665908813477 +93,177,139,233,65,0.011992216110229492 +94,202,57,151,43,0.0028378963470458984 +95,135,3218,3308,963,0.08977603912353516 +96,197,66,140,46,0.004258155822753906 +97,251,610,665,208,0.005323886871337891 +98,262,205,260,90,0.0017161369323730469 +99,152,112,188,59,0.0010619163513183594 +100,3,3017,3067,882,0.019097089767456055 +101,124,104,195,56,0.0010650157928466797 +102,276,57,114,45,0.0006480216979980469 +103,182,359,451,130,0.0026810169219970703 +104,188,64,159,45,0.0008261203765869141 +105,92,9905,9993,2864,0.05870485305786133 +106,185,116,208,61,0.0010859966278076172 +107,232,61,156,45,0.0007679462432861328 +108,219,299,392,113,0.002123117446899414 +109,139,3627,3715,1059,0.021283864974975586 +110,230,12714,12768,3834,0.07427620887756348 +111,158,274,363,105,0.002065896987915039 +112,222,187,279,80,0.0015177726745605469 +113,152,62,158,45,0.0007910728454589844 +114,254,187,243,84,0.0013408660888671875 +115,219,274,367,108,0.002167940139770508 +116,141,3637,3725,1044,0.022270917892456055 +117,1045,60,139,44,0.0007159709930419922 +118,219,275,368,107,0.001950979232788086 +119,223,63,157,45,0.0007586479187011719 +120,124,615,668,211,0.004044055938720703 +121,116,50,145,41,0.0007531642913818359 +122,230,20214,20266,5977,0.12121105194091797 +123,112,47,125,41,0.0006279945373535156 +124,-90,5,11,4,6.508827209472656e-05 +125,102,277,372,108,0.0019829273223876953 +126,118,48,144,41,0.0006852149963378906 +127,234,46,104,41,0.0005400180816650391 +128,136,849,940,283,0.0054399967193603516 +129,274,50,108,42,0.0005900859832763672 +130,256,503,558,183,0.0032269954681396484 +131,261,47,103,41,0.0005550384521484375 +132,258,190,247,85,0.0014300346374511719 +133,150,63,159,45,0.00080108642578125 +134,215,541,633,188,0.0036211013793945312 +135,-88,4,9,3,5.507469177246094e-05 +136,926,15647,15701,4655,0.09229493141174316 +137,204,52,146,42,0.0008141994476318359 +138,-4,43,100,40,0.0005578994750976562 +139,143,317,410,115,0.0022690296173095703 +140,164,3195,3286,958,0.02155590057373047 +141,225,962,1053,299,0.006075143814086914 +142,194,62,157,45,0.0007879734039306641 +143,208,873,966,276,0.005506753921508789 +144,220,110,207,59,0.0010759830474853516 +145,160,43,141,40,0.0006918907165527344 +146,-88,4,9,3,5.602836608886719e-05 +147,62,87,144,54,0.0007979869842529297 +148,146,121,217,61,0.0011248588562011719 +149,98,10258,10346,2947,0.06471395492553711 +150,219,219,294,98,0.001672983169555664 +151,116,47,144,41,0.0007050037384033203 +152,107,116,210,60,0.0010957717895507812 +153,258,362,418,142,0.0024759769439697266 +154,228,292,384,113,0.002156972885131836 +155,242,1750,1805,536,0.010441303253173828 +156,206,866,960,274,0.005470991134643555 +157,174,1011,1103,309,0.006251811981201172 +158,-3,44,120,40,0.0006127357482910156 +159,255,157,213,73,0.0011892318725585938 +160,114,45,140,40,0.0006880760192871094 +161,108,908,998,286,0.005734920501708984 +162,223,78,172,49,0.0008687973022460938 +163,955,151,242,69,0.0012850761413574219 +164,148,110,205,60,0.0010619163513183594 +165,-79,4,12,3,6.580352783203125e-05 +166,104,273,365,109,0.0020110607147216797 +167,152,272,368,108,0.002104043960571289 +168,188,47,145,41,0.0006871223449707031 +169,140,322,375,122,0.0020749568939208984 +170,154,539,594,189,0.0033180713653564453 +171,312,72,129,48,0.0006840229034423828 +172,135,3280,3370,956,0.019536972045898438 +173,180,229,305,98,0.0017316341400146484 +174,150,62,156,45,0.0007810592651367188 +175,268,56,114,44,0.0006511211395263672 +176,-94,2,4,1,2.9087066650390625e-05 +177,220,103,182,57,0.0009999275207519531 +178,146,1167,1256,356,0.007506847381591797 +179,164,3550,3643,1019,0.027434825897216797 +180,232,60,157,45,0.0007638931274414062 +181,-82,5,16,4,8.273124694824219e-05 +182,78,289,383,111,0.002079010009765625 +183,173,1102,1194,334,0.006800174713134766 +184,862,5679,5730,1713,0.03327178955078125 +185,185,134,227,65,0.0011987686157226562 +186,126,414,449,155,0.0026390552520751953 +187,148,116,212,60,0.0010988712310791016 +188,254,513,569,184,0.0033071041107177734 +189,266,44,102,40,0.0005481243133544922 +190,227,77,170,49,0.0008559226989746094 +191,141,3422,3509,995,0.020082950592041016 +192,188,59,155,44,0.0007500648498535156 +193,230,53,130,42,0.0007190704345703125 +194,186,348,439,125,0.0024671554565429688 +195,-95,2,4,1,2.8848648071289062e-05 +196,234,47,144,41,0.0007081031799316406 +197,158,92,149,54,0.0008211135864257812 +198,150,82,175,50,0.0008969306945800781 +199,192,61,158,45,0.0007910728454589844 +200,266,44,102,40,0.0005471706390380859 +201,268,107,163,59,0.0009772777557373047 +202,102,5300,5352,1655,0.03804898262023926 +203,-98,2,3,1,3.1948089599609375e-05 +204,240,42,140,40,0.0006871223449707031 +205,164,101,176,57,0.0009472370147705078 +206,97,872,965,276,0.005474090576171875 +207,146,1197,1286,357,0.0074231624603271484 +208,1018,135,209,66,0.0011420249938964844 +209,234,62,158,45,0.00078582763671875 +210,-90,2,3,1,2.7179718017578125e-05 +211,194,104,195,55,0.0010039806365966797 +212,106,110,207,59,0.0010790824890136719 +213,140,311,407,114,0.002295970916748047 +214,1016,132,226,64,0.0012102127075195312 +215,101,1020,1109,317,0.0061740875244140625 +216,72,55,112,44,0.0006160736083984375 +217,124,215,268,91,0.0016369819641113281 +218,70,623,675,213,0.003909111022949219 +219,86,236,289,106,0.0016889572143554688 +220,-93,2,4,1,2.8848648071289062e-05 +221,114,127,221,61,0.0011479854583740234 +222,239,4759,4811,1455,0.028282880783081055 +223,-95,2,3,1,3.0994415283203125e-05 +224,-87,3,8,2,4.673004150390625e-05 +225,102,45,138,40,0.0006818771362304688 +226,228,190,283,81,0.0016369819641113281 +227,65,191,246,85,0.0019452571868896484 +228,272,105,162,59,0.0009140968322753906 +229,246,1798,1851,551,0.011230945587158203 +230,266,107,164,59,0.0012269020080566406 +231,226,128,221,65,0.0013430118560791016 +232,140,962,1036,297,0.006062746047973633 +233,75,45,140,40,0.0006768703460693359 +234,192,45,141,40,0.0006709098815917969 +235,169,766,844,246,0.004685163497924805 +236,198,47,123,41,0.0006997585296630859 +237,188,700,755,226,0.004416942596435547 +238,223,132,226,64,0.001149892807006836 +239,207,2932,3023,863,0.01720714569091797 +240,141,3691,3778,1052,0.021498680114746094 +241,219,265,359,107,0.0019519329071044922 +242,102,2912,3000,881,0.016881942749023438 +243,204,43,124,40,0.0006270408630371094 +244,223,128,221,64,0.001149892807006836 +245,186,115,213,60,0.0010879039764404297 +246,132,12557,12645,3519,0.07158017158508301 +247,134,968,1062,298,0.005851268768310547 +248,239,6831,6884,1986,0.03962874412536621 +249,126,273,363,103,0.0019421577453613281 +250,122,175,265,78,0.0013780593872070312 +251,-82,4,11,3,6.103515625e-05 +252,268,60,118,45,0.000621795654296875 +253,175,983,1076,305,0.0060138702392578125 +254,70,1250,1338,378,0.007555723190307617 +255,157,112,206,59,0.001068115234375 +256,180,308,401,113,0.002254962921142578 +257,234,43,141,40,0.0006799697875976562 +258,227,63,157,45,0.0007770061492919922 +259,-28,5,15,4,7.987022399902344e-05 +260,178,317,411,115,0.002192258834838867 +261,72,109,163,60,0.0008871555328369141 +262,138,118,213,60,0.001069784164428711 +263,-36,45,104,41,0.0005469322204589844 +264,-95,2,4,1,2.7179718017578125e-05 +265,-85,4,12,3,6.4849853515625e-05 +266,151,65,140,46,0.0007100105285644531 +267,230,20787,20839,5993,0.11881113052368164 +268,204,287,381,110,0.002093076705932617 +269,141,317,409,115,0.002228975296020508 +270,114,65,160,45,0.0007879734039306641 +271,912,88,144,54,0.0007898807525634766 +272,128,868,919,284,0.0053408145904541016 +273,188,326,419,119,0.0022430419921875 +274,196,46,144,41,0.0006849765777587891 +275,248,828,884,269,0.004990816116333008 +276,139,967,1019,310,0.005848884582519531 +277,246,2476,2529,745,0.01448678970336914 +278,141,298,393,113,0.002151966094970703 +279,108,3058,3146,904,0.017907142639160156 +280,262,254,311,103,0.0017507076263427734 +281,160,43,141,40,0.0006787776947021484 +282,60,486,540,178,0.003114938735961914 +283,-93,2,3,1,2.4080276489257812e-05 +284,136,976,1068,303,0.006018877029418945 +285,61,7706,7741,2412,0.0444180965423584 +286,148,52,149,42,0.0007250308990478516 +287,188,151,244,68,0.0012831687927246094 +288,158,78,172,49,0.0008699893951416016 +289,146,116,208,61,0.0010769367218017578 +290,254,866,921,274,0.005223989486694336 +291,230,44,140,40,0.0006759166717529297 +292,-98,2,3,1,2.4080276489257812e-05 +293,168,2757,2847,826,0.01626133918762207 +294,260,89,130,55,0.0007338523864746094 +295,80,45,124,41,0.0006170272827148438 +296,106,905,996,285,0.005494117736816406 +297,208,1675,1750,568,0.010087013244628906 +298,215,632,724,203,0.003955841064453125 +299,-93,2,3,1,2.5033950805664062e-05 +300,167,1100,1191,332,0.006636857986450195 +301,110,929,1019,293,0.005690097808837891 +302,154,47,126,41,0.0006260871887207031 +303,240,44,141,40,0.0006642341613769531 +304,112,119,213,61,0.0010738372802734375 +305,238,42,140,40,0.0006840229034423828 +306,222,246,322,102,0.0017390251159667969 +307,64,1785,1838,557,0.010865926742553711 +308,108,5265,5317,1583,0.03060126304626465 +309,884,2593,2645,791,0.01505422592163086 +310,214,763,855,260,0.004909038543701172 +311,256,553,608,193,0.003481149673461914 +312,214,1222,1312,371,0.007454872131347656 +313,108,109,204,59,0.001065969467163086 +314,264,783,878,252,0.0049610137939453125 +315,83,493,544,171,0.0031371116638183594 +316,-90,5,10,4,6.198883056640625e-05 +317,156,3038,3124,917,0.01808905601501465 +318,128,80,172,50,0.0008797645568847656 +319,82,290,342,111,0.0019159317016601562 +320,-96,2,3,1,2.47955322265625e-05 +321,-96,2,4,1,3.0040740966796875e-05 +322,274,50,108,42,0.0005638599395751953 +323,112,62,157,45,0.0007700920104980469 +324,194,109,200,56,0.001004934310913086 +325,219,316,408,122,0.002202272415161133 +326,244,1766,1822,552,0.010251045227050781 +327,183,139,233,65,0.0017249584197998047 +328,219,612,702,199,0.0039081573486328125 +329,173,1036,1127,319,0.0062558650970458984 +330,248,1749,1804,536,0.010352134704589844 +331,218,117,211,60,0.0010828971862792969 +332,216,906,998,291,0.005620241165161133 +333,278,42,101,40,0.0005350112915039062 +334,108,58,138,45,0.0007050037384033203 +335,254,429,483,174,0.002786874771118164 +336,89,672,750,219,0.004237174987792969 +337,193,297,389,111,0.0021719932556152344 +338,177,962,1053,299,0.005899906158447266 +339,219,71807,71860,20283,0.4171130657196045 +340,151,69,162,46,0.0008280277252197266 +341,115,54,148,42,0.0007290840148925781 +342,196,52,127,42,0.0006520748138427734 +343,194,47,144,41,0.0006999969482421875 +344,278,43,101,40,0.0005860328674316406 +345,141,312,406,114,0.0022461414337158203 +346,59,20157,20207,5836,0.11530017852783203 +347,144,118,213,60,0.001085042953491211 +348,207,2876,2966,853,0.016842126846313477 +349,46,958,1009,306,0.005805015563964844 +350,219,245,338,101,0.001825094223022461 +351,176,46,103,41,0.0005502700805664062 +352,120,51,147,42,0.0007238388061523438 +353,230,20735,20788,5978,0.1193079948425293 +354,224,111,205,59,0.0010519027709960938 +355,158,47,145,41,0.000701904296875 +356,40,46,144,41,0.000701904296875 +357,230,20285,20338,5854,0.11689591407775879 +358,149,45,142,40,0.0007061958312988281 +359,196,67,162,46,0.0007998943328857422 +360,118,43,140,40,0.0006718635559082031 +361,-96,2,3,1,2.4080276489257812e-05 +362,112,152,244,70,0.001276254653930664 +363,55,150,242,71,0.001280069351196289 +364,118,152,244,70,0.0012750625610351562 +365,227,132,225,64,0.001157999038696289 +366,194,301,396,114,0.0021491050720214844 +367,230,15649,15702,4656,0.09020400047302246 +368,231,5984,6038,1750,0.03523612022399902 +369,183,49,145,41,0.0007359981536865234 +370,198,42,141,40,0.0006949901580810547 +371,79,120,175,62,0.0009808540344238281 +372,148,884,954,280,0.0054471492767333984 +373,910,44,100,40,0.0005450248718261719 +374,245,610,665,208,0.003826141357421875 +375,255,104,160,58,0.000885009765625 +376,174,965,1056,300,0.006132841110229492 +377,129,4155,4245,1157,0.02419304847717285 +378,217,284,378,109,0.0021560192108154297 +379,160,112,205,57,0.0011539459228515625 +380,-93,2,3,1,3.0040740966796875e-05 +381,272,60,116,45,0.0006520748138427734 +382,64,190,245,85,0.0015501976013183594 +383,143,317,409,115,0.0023202896118164062 +384,149,45,142,40,0.0007169246673583984 +385,159,178,235,84,0.0013740062713623047 +386,90,60,156,45,0.0007860660552978516 +387,55,20224,20274,5893,0.12812399864196777 +388,258,210,267,90,0.0014662742614746094 +389,272,109,166,59,0.0008902549743652344 +390,112,60,157,45,0.0007691383361816406 +391,262,171,227,82,0.0012507438659667969 +392,143,355,448,122,0.0023758411407470703 +393,242,1670,1723,520,0.009872913360595703 +394,168,3437,3530,989,0.020064115524291992 +395,182,359,451,125,0.0024361610412597656 +396,80,80,136,50,0.0007317066192626953 +397,72,5885,5935,1720,0.03368186950683594 +398,195,781,872,265,0.004892826080322266 +399,-79,4,12,3,6.723403930664062e-05 +400,80,42,101,40,0.0005309581756591797 +401,748,5822,5874,1719,0.033393144607543945 +402,188,64,158,45,0.0007739067077636719 +403,48,61861,61910,18641,0.35825276374816895 +404,272,56,112,44,0.0005958080291748047 +405,177,135,229,64,0.0013420581817626953 +406,918,87,144,54,0.0007762908935546875 +407,1049,45,142,40,0.0006740093231201172 +408,184,311,405,114,0.002151966094970703 +409,15,1325,1412,413,0.007874011993408203 +410,62,83,140,53,0.0007531642913818359 +411,237,4837,4891,1431,0.027856826782226562 +412,253,490,528,174,0.0029981136322021484 +413,110,58,154,44,0.0007450580596923828 +414,228,134,228,65,0.0011661052703857422 +415,112,63,161,45,0.0007808208465576172 +416,232,85,179,51,0.0008788108825683594 +417,164,3433,3524,978,0.01984381675720215 +418,282,6939,6994,2017,0.039839982986450195 +419,219,628,718,202,0.0039861202239990234 +420,106,63,159,45,0.0007691383361816406 +421,146,1196,1286,358,0.0070819854736328125 +422,227,44,101,40,0.0005421638488769531 +423,154,47,145,41,0.0006842613220214844 +424,174,3518,3607,1009,0.020277023315429688 +425,232,61,158,45,0.0007588863372802734 +426,194,65,159,45,0.0007698535919189453 +427,128,52,93,44,0.0005278587341308594 +428,160,85,178,51,0.0008859634399414062 +429,48,74,150,49,0.0007648468017578125 +430,100,601,678,209,0.0037479400634765625 +431,200,6548,6622,1952,0.03757214546203613 +432,154,43,141,40,0.0006818771362304688 +433,878,988,1082,308,0.0060160160064697266 +434,109,115,208,60,0.0010459423065185547 +435,78,61,116,45,0.0006248950958251953 +436,208,851,946,276,0.005185604095458984 +437,203,2956,3049,869,0.01712822914123535 +438,270,44,100,40,0.0005362033843994141 +439,173,1050,1141,319,0.006398916244506836 +440,278,42,101,40,0.0006508827209472656 +441,113,53,147,42,0.0007419586181640625 +442,114,43,142,40,0.0006730556488037109 +443,151,875,966,281,0.005382061004638672 +444,234,52,149,42,0.0007200241088867188 +445,274,46,105,41,0.0005450248718261719 +446,214,836,927,280,0.005147218704223633 +447,154,62,158,45,0.0007662773132324219 +448,271,561,653,189,0.0035681724548339844 +449,224,278,372,108,0.0020029544830322266 +450,112,100,193,55,0.0009789466857910156 +451,244,1915,1971,583,0.011126995086669922 +452,88,123,178,63,0.0009720325469970703 +453,148,62,158,45,0.0007650852203369141 +454,204,52,146,42,0.0006978511810302734 +455,922,61,116,45,0.0006299018859863281 +456,72,92,148,55,0.0008111000061035156 +457,140,884,957,280,0.005405902862548828 +458,148,117,213,60,0.0011031627655029297 +459,190,63,159,45,0.0008230209350585938 +460,110,45,142,40,0.0006856918334960938 +461,144,136,230,65,0.0011887550354003906 +462,238,48,144,41,0.0006961822509765625 +463,110,3160,3245,949,0.018777132034301758 +464,77,76,130,49,0.0006952285766601562 +465,1064,104,178,55,0.0009312629699707031 +466,113,151,242,69,0.0012428760528564453 +467,127,593,685,192,0.003724813461303711 +468,188,50,130,42,0.0006480216979980469 +469,156,3044,3116,870,0.017574071884155273 +470,248,595,651,209,0.003698110580444336 +471,74,43,100,40,0.0005271434783935547 +472,272,75,131,49,0.0007078647613525391 +473,77,44,101,40,0.0005280971527099609 +474,122,43,120,40,0.000637054443359375 +475,83,902,995,282,0.005508899688720703 +476,108,123,219,62,0.0011162757873535156 +477,278,46,104,41,0.000576019287109375 +478,106,120,214,61,0.001077413558959961 +479,230,20927,20980,6036,0.11965107917785645 +480,103,10793,10878,3067,0.06179213523864746 +481,208,750,843,256,0.004764080047607422 +482,98,322,374,122,0.002076864242553711 +483,-93,2,3,1,2.5033950805664062e-05 +484,232,61,158,45,0.0007581710815429688 +485,188,140,232,65,0.0011949539184570312 +486,88,86,178,52,0.001065969467163086 +487,244,1433,1489,468,0.008533954620361328 +488,194,48,142,41,0.0006959438323974609 +489,222,64,158,45,0.0007638931274414062 +490,228,66,162,46,0.0007851123809814453 +491,276,60,117,45,0.0006191730499267578 +492,169,972,1065,299,0.005854129791259766 +493,238,43,140,40,0.0006699562072753906 +494,-58,257,302,107,0.0017020702362060547 +495,973,976,1067,303,0.005925893783569336 +496,148,1004,1091,325,0.0061109066009521484 +497,167,1071,1162,329,0.006421089172363281 +498,254,819,875,265,0.004879951477050781 +499,120,782,875,255,0.004785299301147461 diff --git a/R00065426/R00065426-greedy-20251011083123290468.csv b/R00065426/R00065426-greedy-20251011083123290468.csv new file mode 100644 index 000000000..e3fa2faf0 --- /dev/null +++ b/R00065426/R00065426-greedy-20251011083123290468.csv @@ -0,0 +1,2 @@ +run_id,path_cost,goal_tests,states,succs,time_taken +0,-67,7,22,6,0.00026297569274902344 diff --git a/R00065426/R00065426-rbfs-20251011083123289858.csv b/R00065426/R00065426-rbfs-20251011083123289858.csv new file mode 100644 index 000000000..c4cbd73be --- /dev/null +++ b/R00065426/R00065426-rbfs-20251011083123289858.csv @@ -0,0 +1,2 @@ +run_id,path_cost,goal_tests,states,succs,time_taken +0,-73,95,337,94,0.0024700164794921875 diff --git a/R00065426/R00065426-ucs-20251011083117688160.csv b/R00065426/R00065426-ucs-20251011083117688160.csv new file mode 100644 index 000000000..cd09cfc13 --- /dev/null +++ b/R00065426/R00065426-ucs-20251011083117688160.csv @@ -0,0 +1,501 @@ +run_id,path_cost,goal_tests,states,succs,time_taken +0,-82,8,24,7,0.00034499168395996094 +1,-71,25,81,24,0.0009069442749023438 +2,-88,7,18,6,0.0001919269561767578 +3,-97,3,8,2,8.869171142578125e-05 +4,-70,25,80,24,0.0008490085601806641 +5,-65,11,31,10,0.00031375885009765625 +6,-85,12,36,11,0.0003662109375 +7,-88,9,26,8,0.00027489662170410156 +8,-67,18,54,17,0.0006060600280761719 +9,-94,2,4,1,5.078315734863281e-05 +10,-82,15,45,14,0.00047087669372558594 +11,-92,2,3,1,4.363059997558594e-05 +12,-87,3,8,2,8.916854858398438e-05 +13,-85,16,50,15,0.0005288124084472656 +14,-83,18,55,17,0.0006330013275146484 +15,-88,6,13,5,0.00013184547424316406 +16,-79,20,64,19,0.0008289813995361328 +17,-82,9,30,8,0.0003619194030761719 +18,-91,8,21,7,0.00021195411682128906 +19,-86,13,39,12,0.00043010711669921875 +20,-95,6,15,5,0.00015091896057128906 +21,-88,11,30,10,0.0002980232238769531 +22,-72,14,40,13,0.00048279762268066406 +23,-83,3,5,2,6.127357482910156e-05 +24,-91,2,3,1,4.1961669921875e-05 +25,-60,30,95,29,0.001024007797241211 +26,-75,21,63,20,0.0007109642028808594 +27,-93,2,3,1,4.38690185546875e-05 +28,-80,17,56,16,0.0006148815155029297 +29,-79,24,80,23,0.0009829998016357422 +30,-93,2,3,1,4.410743713378906e-05 +31,-97,5,13,4,0.00014209747314453125 +32,-79,24,76,23,0.0009338855743408203 +33,-91,7,23,6,0.00026702880859375 +34,-86,12,31,11,0.0003142356872558594 +35,-90,15,51,14,0.0006430149078369141 +36,-89,3,4,2,5.1975250244140625e-05 +37,-79,20,62,19,0.0006880760192871094 +38,-98,2,4,1,5.1975250244140625e-05 +39,-79,13,34,12,0.00035190582275390625 +40,-92,9,29,8,0.0003457069396972656 +41,-95,2,4,1,5.1975250244140625e-05 +42,-87,3,7,2,7.796287536621094e-05 +43,-67,24,78,23,0.0008509159088134766 +44,-65,27,90,26,0.0009920597076416016 +45,-86,14,50,13,0.0006468296051025391 +46,-96,2,4,1,5.1021575927734375e-05 +47,-70,28,95,27,0.0011038780212402344 +48,-88,13,45,12,0.0005691051483154297 +49,-96,2,4,1,5.1021575927734375e-05 +50,-72,10,29,9,0.00032210350036621094 +51,-78,22,70,21,0.0007829666137695312 +52,-79,19,63,18,0.0008420944213867188 +53,-94,7,20,6,0.00023293495178222656 +54,-82,14,41,13,0.0005199909210205078 +55,-86,16,51,15,0.0005571842193603516 +56,-87,4,12,3,0.0001380443572998047 +57,-97,2,4,1,5.316734313964844e-05 +58,-74,24,82,23,0.0011131763458251953 +59,-92,2,4,1,5.507469177246094e-05 +60,-84,9,27,8,0.0002999305725097656 +61,-91,3,5,2,8.106231689453125e-05 +62,-97,5,14,4,0.00015473365783691406 +63,-95,2,4,1,5.125999450683594e-05 +64,-73,14,43,13,0.00044608116149902344 +65,-85,7,22,6,0.0002627372741699219 +66,-74,10,30,9,0.00033164024353027344 +67,-62,32,102,31,0.0010781288146972656 +68,-78,19,61,18,0.0006768703460693359 +69,-74,14,41,13,0.0004119873046875 +70,-64,29,93,28,0.0009748935699462891 +71,-73,26,86,25,0.0010149478912353516 +72,-87,5,14,4,0.00015306472778320312 +73,-91,3,5,2,8.702278137207031e-05 +74,-73,31,101,30,0.0012810230255126953 +75,-85,16,55,15,0.000705718994140625 +76,-77,24,79,23,0.001046895980834961 +77,-72,28,90,27,0.0011866092681884766 +78,-93,3,6,2,8.0108642578125e-05 +79,-75,25,80,24,0.0010957717895507812 +80,-73,26,86,25,0.0009520053863525391 +81,-95,2,3,1,4.291534423828125e-05 +82,-79,19,60,18,0.0006830692291259766 +83,-91,5,13,4,0.0001380443572998047 +84,-85,15,47,14,0.0005118846893310547 +85,-97,4,9,3,9.512901306152344e-05 +86,-68,12,37,11,0.00042510032653808594 +87,-79,26,87,25,0.0011019706726074219 +88,-65,31,97,30,0.0011060237884521484 +89,-67,23,76,22,0.0008981227874755859 +90,-94,2,2,1,3.910064697265625e-05 +91,-85,14,43,13,0.0005450248718261719 +92,-67,26,81,25,0.0008890628814697266 +93,-78,21,65,20,0.0008158683776855469 +94,-74,25,81,24,0.0009732246398925781 +95,-76,23,75,22,0.0007817745208740234 +96,-86,12,35,11,0.00035500526428222656 +97,-94,2,3,1,4.482269287109375e-05 +98,-91,4,11,3,0.00013399124145507812 +99,-82,11,37,10,0.00045228004455566406 +100,-90,13,41,12,0.0005011558532714844 +101,-94,2,4,1,5.507469177246094e-05 +102,-80,21,72,20,0.0009469985961914062 +103,-79,18,59,17,0.0007421970367431641 +104,-95,4,11,3,0.0001308917999267578 +105,-94,2,3,1,4.315376281738281e-05 +106,-88,13,38,12,0.00039696693420410156 +107,-89,4,11,3,0.00012493133544921875 +108,-73,22,69,21,0.0007390975952148438 +109,-84,18,58,17,0.0007219314575195312 +110,-92,2,3,1,4.1961669921875e-05 +111,-84,14,46,13,0.0005450248718261719 +112,-58,21,66,20,0.0007581710815429688 +113,-63,29,96,28,0.0009930133819580078 +114,-65,26,87,25,0.0010018348693847656 +115,-91,8,21,7,0.00023102760314941406 +116,-70,27,86,26,0.0009589195251464844 +117,-84,12,31,11,0.00031185150146484375 +118,-89,5,13,4,0.00014901161193847656 +119,-74,18,51,17,0.0005571842193603516 +120,-85,4,12,3,0.0001418590545654297 +121,-82,8,23,7,0.0002541542053222656 +122,-74,20,67,19,0.0007920265197753906 +123,-95,2,3,1,4.410743713378906e-05 +124,-74,26,84,25,0.0010650157928466797 +125,-72,30,99,29,0.001161336898803711 +126,-79,19,63,18,0.0007586479187011719 +127,-68,14,45,13,0.0005331039428710938 +128,-75,20,61,19,0.0006489753723144531 +129,-87,10,26,9,0.0002741813659667969 +130,-88,13,39,12,0.0004220008850097656 +131,-93,4,12,3,0.00014472007751464844 +132,-67,29,95,28,0.001069784164428711 +133,-93,4,11,3,0.00012683868408203125 +134,-79,24,77,23,0.0009150505065917969 +135,-69,26,84,25,0.0009310245513916016 +136,-79,18,52,17,0.0005719661712646484 +137,-97,2,3,1,4.410743713378906e-05 +138,-74,27,88,26,0.001110076904296875 +139,-99,3,5,2,6.222724914550781e-05 +140,-70,21,66,20,0.0006799697875976562 +141,-76,6,15,5,0.0001590251922607422 +142,-74,9,24,8,0.00025010108947753906 +143,-74,23,71,22,0.0007460117340087891 +144,-73,24,75,23,0.0007970333099365234 +145,-73,23,73,22,0.0007920265197753906 +146,-75,16,52,15,0.0006389617919921875 +147,-95,3,7,2,7.987022399902344e-05 +148,-93,7,19,6,0.00020384788513183594 +149,-76,13,42,12,0.0004949569702148438 +150,-70,25,77,24,0.0008690357208251953 +151,-78,24,78,23,0.0008568763732910156 +152,-70,29,92,28,0.0009989738464355469 +153,-65,14,43,13,0.0004601478576660156 +154,-64,31,99,30,0.0012407302856445312 +155,-88,12,36,11,0.0003829002380371094 +156,-78,10,30,9,0.0003933906555175781 +157,-88,11,32,10,0.00033593177795410156 +158,-74,24,77,23,0.0008447170257568359 +159,-71,27,91,26,0.0010480880737304688 +160,-84,19,64,18,0.000827789306640625 +161,-68,27,86,26,0.0009229183197021484 +162,-87,3,7,2,7.796287536621094e-05 +163,-91,4,11,3,0.0001270771026611328 +164,-55,33,105,32,0.0011560916900634766 +165,-94,2,3,1,4.291534423828125e-05 +166,-91,7,16,6,0.00016927719116210938 +167,-99,2,2,1,3.5762786865234375e-05 +168,-91,3,7,2,7.772445678710938e-05 +169,-88,13,41,12,0.0005040168762207031 +170,-79,17,51,16,0.0006279945373535156 +171,-94,2,4,1,5.602836608886719e-05 +172,-95,3,5,2,6.198883056640625e-05 +173,-93,2,4,1,5.2928924560546875e-05 +174,-76,8,23,7,0.0002949237823486328 +175,-51,33,105,32,0.0012238025665283203 +176,-79,19,63,18,0.0009088516235351562 +177,-80,9,28,8,0.0003418922424316406 +178,-91,7,21,6,0.00024580955505371094 +179,-94,9,29,8,0.0003757476806640625 +180,-65,27,86,26,0.0009448528289794922 +181,-82,9,30,8,0.0003628730773925781 +182,-96,2,3,1,4.410743713378906e-05 +183,-66,28,89,27,0.00098419189453125 +184,-70,23,71,22,0.0007779598236083984 +185,-91,2,3,1,4.601478576660156e-05 +186,-80,17,54,16,0.0005829334259033203 +187,-95,2,3,1,4.291534423828125e-05 +188,-92,8,21,7,0.0002129077911376953 +189,-95,3,8,2,8.869171142578125e-05 +190,-82,13,39,12,0.0004367828369140625 +191,-87,3,7,2,7.796287536621094e-05 +192,-95,3,6,2,6.771087646484375e-05 +193,-91,3,7,2,7.486343383789062e-05 +194,-73,20,65,19,0.0006992816925048828 +195,-73,22,68,21,0.0007610321044921875 +196,-85,11,34,10,0.0003440380096435547 +197,-61,28,91,27,0.0010068416595458984 +198,-73,18,59,17,0.0006670951843261719 +199,-67,20,62,19,0.0006649494171142578 +200,-80,12,36,11,0.0003688335418701172 +201,-86,12,37,11,0.000408172607421875 +202,-90,11,36,10,0.0004451274871826172 +203,-78,20,63,19,0.0007030963897705078 +204,-90,15,51,14,0.0006420612335205078 +205,-79,21,70,20,0.0009260177612304688 +206,-76,22,69,21,0.0008089542388916016 +207,-87,4,10,3,0.00010800361633300781 +208,-74,22,75,21,0.0010418891906738281 +209,-92,4,9,3,0.000102996826171875 +210,-90,10,29,9,0.00030684471130371094 +211,-67,27,89,26,0.0009679794311523438 +212,-94,8,22,7,0.0002281665802001953 +213,-72,25,81,24,0.0008540153503417969 +214,-88,12,36,11,0.0005362033843994141 +215,-65,29,96,28,0.0010900497436523438 +216,-82,17,55,16,0.0005800724029541016 +217,-89,8,26,7,0.00031113624572753906 +218,-98,4,8,3,9.179115295410156e-05 +219,-79,16,50,15,0.0005519390106201172 +220,-91,10,27,9,0.00026798248291015625 +221,-73,26,88,25,0.0011019706726074219 +222,-78,20,63,19,0.0007271766662597656 +223,-91,4,11,3,0.0001289844512939453 +224,-90,10,33,9,0.0004210472106933594 +225,-82,9,25,8,0.0002560615539550781 +226,-86,12,36,11,0.00036263465881347656 +227,-79,18,57,17,0.0006053447723388672 +228,-91,5,11,4,0.00011396408081054688 +229,-93,3,8,2,8.916854858398438e-05 +230,-74,23,76,22,0.0008337497711181641 +231,-94,7,16,6,0.0001671314239501953 +232,-86,13,39,12,0.0004889965057373047 +233,-68,29,93,28,0.001077890396118164 +234,-79,21,68,20,0.0007281303405761719 +235,-88,12,36,11,0.00038695335388183594 +236,-82,10,31,9,0.00034618377685546875 +237,-81,16,48,15,0.00048422813415527344 +238,-70,23,69,22,0.000720977783203125 +239,-61,31,98,30,0.0010371208190917969 +240,-77,20,59,19,0.0006182193756103516 +241,-83,17,53,16,0.0007088184356689453 +242,-78,12,39,11,0.0004570484161376953 +243,-94,2,2,1,3.814697265625e-05 +244,-91,8,28,7,0.00033736228942871094 +245,-78,12,38,11,0.0004258155822753906 +246,-87,4,12,3,0.0001361370086669922 +247,-84,14,42,13,0.0005230903625488281 +248,-85,3,7,2,7.772445678710938e-05 +249,-88,11,33,10,0.0003829002380371094 +250,-93,2,4,1,5.793571472167969e-05 +251,-67,26,82,25,0.0009429454803466797 +252,-72,22,68,21,0.000804901123046875 +253,-89,4,9,3,9.918212890625e-05 +254,-85,13,37,12,0.00039696693420410156 +255,-84,18,56,17,0.0006721019744873047 +256,-78,14,40,13,0.0004448890686035156 +257,-97,2,3,1,4.38690185546875e-05 +258,-92,2,3,1,4.100799560546875e-05 +259,-89,6,18,5,0.0001990795135498047 +260,-89,4,10,3,0.00011324882507324219 +261,-78,23,75,22,0.0007998943328857422 +262,-73,26,83,25,0.0009362697601318359 +263,-81,14,40,13,0.0004291534423828125 +264,-97,3,8,2,8.988380432128906e-05 +265,-82,6,16,5,0.0001850128173828125 +266,-80,16,54,15,0.0007119178771972656 +267,-78,17,56,16,0.0006802082061767578 +268,-86,13,41,12,0.00045013427734375 +269,-93,2,3,1,4.315376281738281e-05 +270,-85,18,62,17,0.0008051395416259766 +271,-85,12,34,11,0.00037288665771484375 +272,-78,11,34,10,0.0003788471221923828 +273,-96,2,4,1,5.1975250244140625e-05 +274,-89,4,12,3,0.00014090538024902344 +275,-55,32,103,31,0.001207113265991211 +276,-80,21,71,20,0.0009560585021972656 +277,-68,26,85,25,0.0009531974792480469 +278,-55,31,97,30,0.0010600090026855469 +279,-77,6,16,5,0.00018310546875 +280,-70,11,32,10,0.0003578662872314453 +281,-96,2,3,1,4.9114227294921875e-05 +282,-95,2,3,1,4.506111145019531e-05 +283,-82,10,29,9,0.0003249645233154297 +284,-85,6,19,5,0.0002949237823486328 +285,-87,4,10,3,0.00012087821960449219 +286,-73,21,65,20,0.0007259845733642578 +287,-77,16,51,15,0.0006058216094970703 +288,-79,11,37,10,0.0004961490631103516 +289,-94,5,9,4,0.00010228157043457031 +290,-91,2,2,1,3.814697265625e-05 +291,-81,5,13,4,0.00015115737915039062 +292,-72,29,94,28,0.0012469291687011719 +293,-72,30,97,29,0.001219034194946289 +294,-80,21,73,20,0.0009732246398925781 +295,-82,14,42,13,0.00046181678771972656 +296,-91,3,8,2,8.821487426757812e-05 +297,-84,19,59,18,0.00061798095703125 +298,-96,5,11,4,0.00011491775512695312 +299,-66,33,106,32,0.0013718605041503906 +300,-74,12,37,11,0.0004918575286865234 +301,-75,15,48,14,0.0005390644073486328 +302,-92,5,15,4,0.00021696090698242188 +303,-74,26,91,25,0.001291036605834961 +304,-91,6,15,5,0.0001709461212158203 +305,-95,5,11,4,0.00011610984802246094 +306,-85,3,8,2,8.893013000488281e-05 +307,-85,11,34,10,0.0003719329833984375 +308,-67,23,76,22,0.0008671283721923828 +309,-81,19,58,18,0.0006237030029296875 +310,-78,13,43,12,0.0005230903625488281 +311,-90,11,36,10,0.00046515464782714844 +312,-93,7,19,6,0.0002090930938720703 +313,-95,3,7,2,7.891654968261719e-05 +314,-70,25,83,24,0.0009150505065917969 +315,-71,19,60,18,0.0006830692291259766 +316,-89,9,28,8,0.0003299713134765625 +317,-86,12,35,11,0.0003521442413330078 +318,-74,27,86,26,0.000982046127319336 +319,-79,16,48,15,0.0004889965057373047 +320,-76,23,73,22,0.0008261203765869141 +321,-80,12,37,11,0.00041294097900390625 +322,-90,11,30,10,0.00030303001403808594 +323,-85,15,51,14,0.0006420612335205078 +324,-75,17,54,16,0.0006518363952636719 +325,-83,17,54,16,0.0006411075592041016 +326,-83,7,21,6,0.00024080276489257812 +327,-89,3,7,2,8.225440979003906e-05 +328,-79,16,49,15,0.0005471706390380859 +329,-65,10,28,9,0.0003390312194824219 +330,-88,12,36,11,0.0003921985626220703 +331,-87,9,25,8,0.0002732276916503906 +332,-88,7,24,6,0.0002880096435546875 +333,-85,16,50,15,0.0005266666412353516 +334,-81,20,63,19,0.0007181167602539062 +335,-67,26,87,25,0.0009310245513916016 +336,-80,9,28,8,0.00032210350036621094 +337,-86,12,40,11,0.0004978179931640625 +338,-65,28,90,27,0.0010409355163574219 +339,-93,3,8,2,9.202957153320312e-05 +340,-73,22,72,21,0.0008938312530517578 +341,-82,6,16,5,0.0001747608184814453 +342,-82,9,27,8,0.0002980232238769531 +343,-78,21,67,20,0.0007672309875488281 +344,-100,2,3,1,4.410743713378906e-05 +345,-73,24,77,23,0.0008130073547363281 +346,-87,6,20,5,0.00024080276489257812 +347,-72,18,53,17,0.0005981922149658203 +348,-70,26,83,25,0.0009679794311523438 +349,-74,25,83,24,0.0010161399841308594 +350,-89,7,22,6,0.0002560615539550781 +351,-81,5,13,4,0.0001468658447265625 +352,-80,21,73,20,0.0009140968322753906 +353,-97,2,3,1,4.315376281738281e-05 +354,-87,3,6,2,6.890296936035156e-05 +355,-67,25,80,24,0.0009131431579589844 +356,-84,11,37,10,0.00045299530029296875 +357,-78,15,52,14,0.0006480216979980469 +358,-70,25,81,24,0.0008959770202636719 +359,-70,26,81,25,0.0008509159088134766 +360,-84,18,56,17,0.0005822181701660156 +361,-75,22,67,21,0.0007159709930419922 +362,-94,2,2,1,3.5762786865234375e-05 +363,-76,9,27,8,0.0002980232238769531 +364,-90,13,40,12,0.0004658699035644531 +365,-67,26,81,25,0.0008640289306640625 +366,-97,4,8,3,8.869171142578125e-05 +367,-78,19,59,18,0.0006110668182373047 +368,-91,8,23,7,0.0002429485321044922 +369,-86,6,16,5,0.00017309188842773438 +370,-80,15,53,14,0.0006880760192871094 +371,-90,9,27,8,0.00031113624572753906 +372,-85,7,21,6,0.0002589225769042969 +373,-81,15,45,14,0.00043702125549316406 +374,-75,19,63,18,0.0007870197296142578 +375,-85,4,12,3,0.0001361370086669922 +376,-74,10,30,9,0.0003292560577392578 +377,-98,2,4,1,5.1021575927734375e-05 +378,-79,14,40,13,0.0004239082336425781 +379,-98,4,8,3,9.393692016601562e-05 +380,-88,9,29,8,0.00035190582275390625 +381,-55,33,105,32,0.001112222671508789 +382,-83,13,46,12,0.0006070137023925781 +383,-70,25,81,24,0.0009329319000244141 +384,-95,5,12,4,0.0001239776611328125 +385,-85,13,37,12,0.0003840923309326172 +386,-83,15,44,14,0.0004570484161376953 +387,-94,2,3,1,4.315376281738281e-05 +388,-82,18,59,17,0.0006721019744873047 +389,-70,27,87,26,0.0009789466857910156 +390,-65,30,95,29,0.0011057853698730469 +391,-80,15,45,14,0.0004837512969970703 +392,-91,9,27,8,0.0003020763397216797 +393,-73,25,80,24,0.0009911060333251953 +394,-75,25,78,24,0.0009179115295410156 +395,-72,22,67,21,0.0007240772247314453 +396,-80,17,53,16,0.0005459785461425781 +397,-84,18,57,17,0.0006968975067138672 +398,-86,12,42,11,0.0005388259887695312 +399,-91,3,8,2,8.916854858398438e-05 +400,-46,33,105,32,0.0010840892791748047 +401,-99,2,4,1,5.0067901611328125e-05 +402,-82,17,57,16,0.0006389617919921875 +403,-97,2,4,1,5.316734313964844e-05 +404,-66,29,94,28,0.0012080669403076172 +405,-91,11,35,10,0.0003998279571533203 +406,-92,7,19,6,0.0002028942108154297 +407,-85,4,11,3,0.00012183189392089844 +408,-61,20,59,19,0.0006341934204101562 +409,-81,5,13,4,0.00014281272888183594 +410,-80,15,48,14,0.0005199909210205078 +411,-91,2,3,1,4.410743713378906e-05 +412,-78,20,61,19,0.0007169246673583984 +413,-90,15,51,14,0.0006542205810546875 +414,-94,2,4,1,5.1975250244140625e-05 +415,-64,26,86,25,0.0009629726409912109 +416,-97,5,12,4,0.00014281272888183594 +417,-70,21,65,20,0.0007028579711914062 +418,-85,4,12,3,0.00012803077697753906 +419,-92,8,20,7,0.0002040863037109375 +420,-82,8,23,7,0.0002300739288330078 +421,-82,8,23,7,0.0002467632293701172 +422,-74,25,86,24,0.0011436939239501953 +423,-88,8,25,7,0.00028395652770996094 +424,-91,9,25,8,0.0002689361572265625 +425,-82,6,17,5,0.00018715858459472656 +426,-79,8,21,7,0.00022792816162109375 +427,-75,23,71,22,0.0008101463317871094 +428,-85,8,25,7,0.0002830028533935547 +429,-94,6,14,5,0.000141143798828125 +430,-82,7,21,6,0.0002307891845703125 +431,-85,15,47,14,0.0005490779876708984 +432,-61,30,96,29,0.0010807514190673828 +433,-73,24,76,23,0.0008020401000976562 +434,-79,23,77,22,0.0009388923645019531 +435,-88,10,27,9,0.00030493736267089844 +436,-74,13,41,12,0.00048422813415527344 +437,-60,33,106,32,0.0013310909271240234 +438,-75,19,62,18,0.0006680488586425781 +439,-80,17,55,16,0.0006361007690429688 +440,-83,17,52,16,0.000576019287109375 +441,-86,10,28,9,0.00027108192443847656 +442,-64,28,92,27,0.0009679794311523438 +443,-76,20,64,19,0.0008080005645751953 +444,-89,3,8,2,9.274482727050781e-05 +445,-75,16,51,15,0.0005240440368652344 +446,-71,25,79,24,0.0009472370147705078 +447,-78,22,75,21,0.0009930133819580078 +448,-80,18,56,17,0.0005769729614257812 +449,-78,13,44,12,0.0005681514739990234 +450,-74,19,59,18,0.000637054443359375 +451,-55,30,100,29,0.0010728836059570312 +452,-85,15,45,14,0.0004620552062988281 +453,-72,21,67,20,0.0007338523864746094 +454,-56,31,97,30,0.001016855239868164 +455,-92,2,4,1,5.1975250244140625e-05 +456,-95,6,17,5,0.0001857280731201172 +457,-88,7,23,6,0.00026106834411621094 +458,-94,7,17,6,0.00018978118896484375 +459,-76,18,53,17,0.0005419254302978516 +460,-73,21,67,20,0.0007407665252685547 +461,-94,7,18,6,0.00018477439880371094 +462,-70,14,42,13,0.000453948974609375 +463,-66,29,92,28,0.0011026859283447266 +464,-79,18,56,17,0.0006718635559082031 +465,-83,20,65,19,0.0007731914520263672 +466,-95,3,6,2,6.985664367675781e-05 +467,-95,4,11,3,0.00012683868408203125 +468,-95,3,7,2,7.796287536621094e-05 +469,-83,7,23,6,0.0002701282501220703 +470,-83,19,61,18,0.0007631778717041016 +471,-85,15,53,14,0.0007109642028808594 +472,-86,12,36,11,0.0003609657287597656 +473,-76,13,42,12,0.0004506111145019531 +474,-93,8,22,7,0.0002319812774658203 +475,-82,6,17,5,0.00018310546875 +476,-85,12,37,11,0.0004200935363769531 +477,-61,21,68,20,0.0007719993591308594 +478,-75,23,72,22,0.0007867813110351562 +479,-79,22,73,21,0.00092315673828125 +480,-79,6,16,5,0.00018286705017089844 +481,-97,2,3,1,4.38690185546875e-05 +482,-84,15,47,14,0.0005159378051757812 +483,-73,26,85,25,0.001065969467163086 +484,-82,6,16,5,0.0001728534698486328 +485,-79,28,94,27,0.001216888427734375 +486,-89,4,10,3,0.0001087188720703125 +487,-70,25,83,24,0.0009648799896240234 +488,-94,4,9,3,0.00010204315185546875 +489,-86,7,22,6,0.00026869773864746094 +490,-88,10,30,9,0.0003199577331542969 +491,-70,22,69,21,0.0007503032684326172 +492,-90,9,29,8,0.0003399848937988281 +493,-86,11,31,10,0.0003001689910888672 +494,-71,22,71,21,0.0008749961853027344 +495,-97,3,5,2,6.318092346191406e-05 +496,-94,2,4,1,5.2928924560546875e-05 +497,-90,6,14,5,0.00014066696166992188 +498,-79,20,65,19,0.0008077621459960938 +499,-74,27,87,26,0.0011301040649414062 diff --git a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py index 43cbd4b9f..dd24a8aee 100644 --- a/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment1/A1_COMP9016_Nagle_JohnPaul_R00065426.py @@ -7,6 +7,7 @@ Assignment: 1 """ +from datetime import datetime import sys import os import random @@ -568,90 +569,105 @@ def run_search_experiment(algorithm_name, runs, search_type, use_heuristic=True) verbose_message(f" {algorithm_name} {run_stat}") solution_stats.append(run_stat) - + # Clean up del problem, instrumented_problem if solution is not None: del solution - - return solution_stats, solution_totals + + # Write the results of each run to a file, for further analysis + if args.csvfile: + headers = list(solution_stats[0].keys()) + now = datetime.now() + timestamp = now.strftime("%Y%m%d%H%M%S%f") + file_name = f"R00065426-{search_type}-{timestamp}.csv" + folder_name = f"R00065426" + full_path = os.path.join(folder_name, file_name) + os.makedirs(folder_name, exist_ok=True) + with open(full_path, "w") as f: + f.write(",".join(headers) + "\n") + for row in solution_stats: + values = [str(row[h]) for h in headers] + f.write(",".join(values) + "\n") + + return solution_totals def searching_your_world(): # Uninformed searches # Breadth First Search - _, solution_bfs_totals = run_search_experiment("BFS", args.runs, "bfs", use_heuristic=False) + solution_bfs_totals = run_search_experiment("BFS", args.runs, "bfs", use_heuristic=False) # Depth First Search - _, solution_dfs_totals = run_search_experiment("DFS", args.runs, "dfs", use_heuristic=False) + solution_dfs_totals = run_search_experiment("DFS", args.runs, "dfs", use_heuristic=False) # Uniform Cost Search - _, solution_ucs_totals = run_search_experiment("UCS", args.runs, "ucs", use_heuristic=False) + solution_ucs_totals = run_search_experiment("UCS", args.runs, "ucs", use_heuristic=False) # Depth Limited Search - _, solution_dls_totals = run_search_experiment("DLS", args.runs, "dls", use_heuristic=False) + solution_dls_totals = run_search_experiment("DLS", args.runs, "dls", use_heuristic=False) # Print results for uninformed searches print("") - print(" UNINFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS | AVG TIME") - print("-------------------------------------------------------------------------") + print(" UNINFORMED SEARCH | COST | GOAL TESTS | STATES | SUCESSORS | AVG TIME") + print("---------------------------------------------------------------------------") print(f"Breadth First Search | " f"{solution_bfs_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_bfs_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_bfs_totals['states'] / args.runs:^8.2f}|" - f"{solution_bfs_totals['succs'] / args.runs:^9.2f}|" + f"{solution_bfs_totals['succs'] / args.runs:^11.2f}|" f"{solution_bfs_totals['time_taken'] / args.runs:^11.6f}") print(f"Depth First Search | " f"{solution_dfs_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_dfs_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_dfs_totals['states'] / args.runs:^8.2f}|" - f"{solution_dfs_totals['succs'] / args.runs:^9.2f}|" + f"{solution_dfs_totals['succs'] / args.runs:^11.2f}|" f"{solution_dfs_totals['time_taken'] / args.runs:^11.6f}") print(f"Uniform Cost Search | " f"{solution_ucs_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_ucs_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_ucs_totals['states'] / args.runs:^8.2f}|" - f"{solution_ucs_totals['succs'] / args.runs:^9.2f}|" + f"{solution_ucs_totals['succs'] / args.runs:^11.2f}|" f"{solution_ucs_totals['time_taken'] / args.runs:^11.6f}") print(f"Depth Limited Search | " f"{solution_dls_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_dls_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_dls_totals['states'] / args.runs:^8.2f}|" - f"{solution_dls_totals['succs'] / args.runs:^9.2f}|" + f"{solution_dls_totals['succs'] / args.runs:^11.2f}|" f"{solution_dls_totals['time_taken'] / args.runs:^11.6f}") # Informed searches # A* Search - _, solution_astar_totals = run_search_experiment("A*", args.runs, "astar", use_heuristic=True) + solution_astar_totals = run_search_experiment("A*", args.runs, "astar", use_heuristic=True) # Print results print("") - print( " INFORMED SEARCH | COST | GOAL TESTS | STATES | ACTIONS | AVG TIME") - print("-------------------------------------------------------------------------") + print( " INFORMED SEARCH | COST | GOAL TESTS | STATES | SUCESSORS | AVG TIME") + print("----------------------------------------------------------------------------") print(f"A* Search | " f"{solution_astar_totals['path_cost'] / args.runs:^7.2f}|" f"{solution_astar_totals['goal_tests'] / args.runs:^12.2f}|" f"{solution_astar_totals['states'] / args.runs:^8.2f}|" - f"{solution_astar_totals['succs'] / args.runs:^9.2f}|" + f"{solution_astar_totals['succs'] / args.runs:^11.2f}|" f"{solution_astar_totals['time_taken'] / args.runs:^11.6f}") # Recursive Best First Search try: - _, solution_rbfs_totals = run_search_experiment("RBFS", 1, "rbfs", use_heuristic=True) + solution_rbfs_totals = run_search_experiment("RBFS", 10, "rbfs", use_heuristic=True) print(f"Recurs Best 1st Srch | " f"{solution_rbfs_totals['path_cost']:^7.2f}|" f"{solution_rbfs_totals['goal_tests']:^12}|" f"{solution_rbfs_totals['states']:^8}|" - f"{solution_rbfs_totals['succs']:^9}|" + f"{solution_rbfs_totals['succs']:^11.2f}|" f"{solution_rbfs_totals['time_taken']:^11.6f}") except Exception as e: print(f"Recurs Best 1st Srch | {e}!") # Greedy Best First Search - _, solution_greedy_totals = run_search_experiment("Greedy", 1, "greedy", use_heuristic=True) + solution_greedy_totals = run_search_experiment("Greedy", 1, "greedy", use_heuristic=True) if solution_greedy_totals: print(f"Greedy Best 1st Srch | " f"{solution_greedy_totals['path_cost']:^7.2f}|" f"{solution_greedy_totals['goal_tests']:^12}|" f"{solution_greedy_totals['states']:^8}|" - f"{solution_greedy_totals['succs']:^9}|" + f"{solution_greedy_totals['succs']:^11.2f}|" f"{solution_greedy_totals['time_taken']:^11.6f}") else: print("=> Greedy: No solution found") @@ -671,6 +687,7 @@ def print_args(args): parser.add_argument('-x', '--width', type=int, nargs='?', const=1, default=6, help='Width of the grid world (DEFAULT: 6)') parser.add_argument('-y', '--height', type=int, nargs='?', const=1, default=6, help='height of the grid world (DEFAULT: 6)') parser.add_argument('-p', '--penalty-prob', type=float, default=0.1, help='Probability of placing a penalty block at a position (DEFAULT: 0.1)') + parser.add_argument('-c', '--csvfile', action='http://github.com/store_true', help='Store results from Searchs in csv files for analysis') args = parser.parse_args() print_args(args) From c8fb6d3099502c147c2fe7c2ff50ba619398725f Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 28 Oct 2025 18:49:10 +0000 Subject: [PATCH 52/56] checkpoint --- .../A2_COMP9016_Nagle_JohnPaul_R00065426.py | 202 +++++++++++++++ lab7/lab7_solution.py | 232 ++++++++++++++++++ 2 files changed, 434 insertions(+) create mode 100755 assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py create mode 100644 lab7/lab7_solution.py diff --git a/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py new file mode 100755 index 000000000..46ba5fe64 --- /dev/null +++ b/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python3 +""" +A2_COMP9016_Nagle_JohnPaul_R00065426.py + +Name: (John) Paul Nagle +Student ID: R00065426 +Class: Knowledge Representation +Assignment: 2 + +""" +import sys +import os +from tracemalloc import take_snapshot + + + +# Get the parent directory of the current directory +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + +# Add the parent directory to sys.path +if parent_dir not in sys.path: + sys.path.insert(0, parent_dir) + +# Now you can import a module from the parent directory + + +from logic import Expr, FolKB, fol_fc_ask +from utils import expr + +def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True): + if bool_print: + print("\n" + message) + for clause in kb.clauses: + print(clause) + print("Total Clauses: ", len(kb.clauses)) + +# 1.1.1 Define the Knowledge Base +print("1.1.1 Define the Knowledge Base" ) +# Create the First Order Logic Knowledge Base +assignment2_kb = FolKB() + +# Define the constants +Student = Expr('S') # S is a Student +Lecturer = Expr('L') # L is a Lecturer +Module = Expr('M') # M is a Module + +# Define the predicates +Takes = Expr('T') # T(s, m) s is currently taking module m +Passed = Expr('P') # P(s, m) s has already passed module m +Teaches = Expr('Teaches') # Teaches(l, m) l teaches module m +Prereq = Expr('Prereq') # Prereq(p, m) p is a prerequisite for m +Eligible = Expr('Eligible') # Eligible(s, m) s has satisfied all prerequisites for m +CanEnroll = Expr('CanEnroll') # CanEnroll(s, m) s is eligible and has not already passed m +TaughtBy = Expr('TaughtBy') # TaughtBy(s, l) s is taught by lecturer l +Classmate = Expr('Classmate') # Classmate(s, t) share a module and s =\= t +NotPassed = Expr('NotPassed') # NotPassed(s, m) s has not passed m +IndirectPrereq = Expr('IndirectPrereq') # IndirectPrereq(x, z) x is an indirect prerequisite for z + +# Define the premises +# 1. Teaching implies “taught by” when a student is enrolled +assignment2_kb.tell(expr('Takes(s, m) & Teaches(l, m) ==> TaughtBy(s, l)')) + +# 2. Two students are classmates if they take the same module and are not the same person: +assignment2_kb.tell(expr('Student(x) & Student(y) & Takes(x, m) & Takes(y, m) ==> Classmate(x, y)')) + +# 3. A student is eligible for a module if they have passed all of its prerequisites: +assignment2_kb.tell(expr('Prereq(p, m) & Passed(s, p) ==> Eligible(s, m)')) + +# 4. A student can enroll in a module if they are eligible and have not already passed it +assignment2_kb.tell(expr('NotPassed(s, m) & Eligible(s, m) ==> CanEnroll(s, m)')) + +# 5. Prerequisites are transitive +assignment2_kb.tell(expr('Prereq(x, y) & Prereq(y, z) ==> IndirectPrereq(x, z)')) + +# 1.1.2 Provide the facts +print("1.1.2 Provide the facts") +# Modules +assignment2_kb.tell(expr('Module(COMP9016)')) +assignment2_kb.tell(expr('Module(COMP9062)')) +assignment2_kb.tell(expr('Module(COMP9061)')) +assignment2_kb.tell(expr('Module(COMP9058)')) +# Students +assignment2_kb.tell(expr('Student(Alice)')) +assignment2_kb.tell(expr('Student(Bob)')) +assignment2_kb.tell(expr('Student(Eve)')) +# Lecturers +assignment2_kb.tell(expr('Lecturer(DrDan)')) +assignment2_kb.tell(expr('Lecturer(DrSophie)')) +assignment2_kb.tell(expr('Lecturer(DrLisa)')) +# Prerequisites +assignment2_kb.tell(expr('Prereq(COMP9016, COMP9062)')) +assignment2_kb.tell(expr('Prereq(COMP9062, COMP9061)')) +# Teaching +assignment2_kb.tell(expr('Teaches(DrDan, COMP9016)')) +assignment2_kb.tell(expr('Teaches(DrSophie, COMP9062)')) +assignment2_kb.tell(expr('Teaches(DrLisa, COMP9061)')) +# Student Record +assignment2_kb.tell(expr('Passed(Alice, COMP9016)')) +assignment2_kb.tell(expr('Passed(Alice, COMP9058)')) +assignment2_kb.tell(expr('Passed(Bob, COMP9016)')) +assignment2_kb.tell(expr('Passed(Bob, COMP9062)')) + +assignment2_kb.tell(expr('NotPassed(Alice, COMP9061)')) +assignment2_kb.tell(expr('NotPassed(Alice, COMP9062)')) +assignment2_kb.tell(expr('NotPassed(Eve, COMP9016)')) +assignment2_kb.tell(expr('NotPassed(Eve, COMP9058)')) +assignment2_kb.tell(expr('NotPassed(Eve, COMP9062)')) +assignment2_kb.tell(expr('NotPassed(Eve, COMP9058)')) +assignment2_kb.tell(expr('NotPassed(Bob, COMP9058)')) +assignment2_kb.tell(expr('NotPassed(Bob, COMP9061)')) + +# Current Enrolements +assignment2_kb.tell(expr('Takes(Alice, COMP9062)')) +assignment2_kb.tell(expr('Takes(Bob, COMP9061)')) +assignment2_kb.tell(expr('Takes(Eve, COMP9016)')) + + +# 1.1.3 INFERENCE AND ANALYSIS +print("1.1.3 INFERENCE AND ANALYSIS") +# print_clauses(assignment2_kb, "PRE fol_fc_ask" ) +# answer = fol_fc_ask(assignment2_kb, expr('Student(Bob)')) +# +# print_clauses(assignment2_kb, "POST fol_fc_ask" ) + +def run_forward_chaining(kb): + print("\n=== Forward Chaining Results ===") + + students = ["Alice", "Bob", "Eve"] + lecturers = ["DrDan", "DrSophie", "DrLisa"] + modules = ["COMP9016", "COMP9058", "COMP9061", "COMP9062", ] + + logical_inferences = [] + + # Check TaughtBy logical inferences + print("\nTaughtBy logical inferences:") + for student in students: + for lecturer in lecturers: + query = expr(f'TaughtBy({student}, {lecturer})') + results = list(fol_fc_ask(kb, query)) + if results: + print(f"- {query}") + logical_inferences.append(query) + + # Check Classmate logical inferences + print("\nClassmate logical inferences:") + for s1 in students: + for s2 in students: + if s1 != s2: # Don't check if someone is their own classmate + query = expr(f'Classmate({s1}, {s2})') + results = list(fol_fc_ask(kb, query)) + if results: + print(f"- {query}") + logical_inferences.append(query) + + # Check Prereq logical inferences + print("\nPrereq logical inferences:") + for m1 in modules: + for m2 in modules: + if m1 != m2: + query = expr(f'Prereq({m1}, {m2})') + results = list(fol_fc_ask(kb, query)) + if results: + print(f"- {query}") + logical_inferences.append(query) + + # Check IndirectPrereq logical inferences + print("\nIndirectPrereq logical inferences:") + for m1 in modules: + for m2 in modules: + if m1 != m2: + query = expr(f'IndirectPrereq({m1}, {m2})') + results = list(fol_fc_ask(kb, query)) + if results: + print(f"- {query}") + logical_inferences.append(query) + + # Check Eligible logical inferences + print("\nEligible logical inferences:") + for student in students: + for module in modules: + query = expr(f'Eligible({student}, {module})') + results = list(fol_fc_ask(kb, query)) + if results: + print(f"- {query}") + logical_inferences.append(query) + + # Check CanEnroll logical inferences + print("\nCanEnroll logical inferences:") + for student in students: + for module in modules: + query = expr(f'CanEnroll({student}, {module})') + results = list(fol_fc_ask(kb, query)) + if results: + print(f"- {query}") + logical_inferences.append(query) + + print(f"\nTotal logical inferences: {len(logical_inferences)}") + return logical_inferences + +# Run the forward chaining +logical_inferences = run_forward_chaining(assignment2_kb) + diff --git a/lab7/lab7_solution.py b/lab7/lab7_solution.py new file mode 100644 index 000000000..b836e3b47 --- /dev/null +++ b/lab7/lab7_solution.py @@ -0,0 +1,232 @@ +import sys +sys.path.append('./aima-python') # Ensure correct path to aima-python + +from logic import Expr, PropKB,expr + +def q1_smart_home_system(): + + #1 Propositional Logic - Smart Home System + """ + Step 1: Represent the facts as propositional variables + + We will represent the facts from the problem description using propositional variables: + + A: It's dark outside. + B: The living room lights are on. + C: It's cold outside. + D: The heater is on. + E: It's 7 pm. + F: The temperature inside is below 18°C. + + Step 2: Construct rules in propositional logic + + The rules provided in the problem can be written in propositional logic as follows: + + If it's 7 pm, it is dark outside: + E ⇒ A + If it’s dark outside, the living room lights should be turned on: + A ⇒ B + If the temperature inside is below 18°C, it’s considered cold: + F ⇒ C + If the living room lights are on and it’s cold outside, the heater should be turned on: + B ∧ C ⇒ D + + Scenario 1: Bob enters his home at 7 pm, and the temperature outside is 17°C (below 18°C). + + Given facts: E=True,F=TrueE=True,F=True + Inference steps: + E⇒A: Since E=True, A=True (It’s dark outside). + A⇒B: Since A=True, B=True (Living room lights are on). + F⇒C: Since F=True, C=True (It’s cold outside). + B∧C⇒D: Since both B=True and C=True, D=True (The heater is on). + Result: The heater is on. (Expected: True) + + Scenario 2: The temperature outside is 19°C (above 18°C). + + Given facts: E=True,F=False + Inference steps: + E⇒A: Since E=True, A=True (It’s dark outside). + A⇒B: Since A=True, B=True (Living room lights are on). + F⇒C: Since F=False, C=False (It’s not cold outside). + B∧C⇒D: Since C=False, D=False (The heater is not on). + Result: The heater is off. (Expected: False) + + """ + + # Step 1: Define the facts using propositional variables + A = Expr('A') # It's dark outside + B = Expr('B') # The living room lights are on + C = Expr('C') # It's cold outside + D = Expr('D') # The heater is on + E = Expr('E') # It's 7 pm + F = Expr('F') # The temperature inside is below 18°C + + # Step 2: Construct rules in propositional logic + kb = PropKB() # Initialize the knowledge base (KB) + + # Add the rules to the KB + kb.tell(E |'==>'| A) # E implies A (If it's 7 pm, it's dark outside) + kb.tell(A |'==>'| B) # A implies B (If it's dark outside, the living room lights are on) + kb.tell(F |'==>'| C) # F implies C (If the temperature is below 18°C, it's cold) + kb.tell(B & C |'==>'| D) # B and C imply D (If the lights are on and it's cold, the heater is on) + + # Step 3: Scenario 1 - Bob enters his home at 7 pm, and the temperature is below 18°C. + kb.tell(E) # It's 7 pm (E is True) + kb.tell(F) # The temperature is below 18°C (F is True) + + # Perform inference to check if the heater (D) is on + print("Scenario 1: Is the heater on?", kb.ask_if_true(D)) # Expected: True + + # Step 4: Scenario 2 - The temperature is above 18°C. + kb.retract(F) # Now the temperature is not below 18°C (F is False) + kb.tell(~F) # Assert that F is False (the temperature is not below 18°C) + + # Perform inference to check if the heater (D) is on + print("Scenario 2: Is the heater on?", kb.ask_if_true(D)) # Expected: False + + +def q2_smart_medical_system(): + + """ + #2 First-Order Logic - Smart Medical System + + Step 1: Define the knowledge base in FOL + + We will use predicates to define the facts: + HasFever(x): x has a fever. + HasCough(x): x has a cough. + HasFlu(x): x has the flu. + NeedsAntiviral(x): x needs antiviral medication. + HasRash(x): x has a rash. + HasItchiness(x): x has itchiness. + HasAllergicReaction(x): x has an allergic reaction. + NeedsAntihistamines(x): x needs antihistamines. + + Step 2: Rules in FOL + + We represent the rules from the problem description using FOL: + + If someone has a fever and a cough, they might have the flu: + ∀x HasFever(x) ∧ HasCough(x) ⇒ HasFlu(x) + + If someone has the flu, they need antiviral medication: + ∀x HasFlu(x) ⇒ NeedsAntiviral(x) + + If someone has a rash and itchiness, they might have an allergic reaction: + ∀x HasRash(x) ∧ HasItchiness(x) ⇒ HasAllergicReaction(x) + + If someone has an allergic reaction, they need antihistamines: + ∀x HasAllergicReaction(x) ⇒ NeedsAntihistamines(x) + + + Step 3: Given facts + + John has a fever and a cough: + HasFever(John),HasCough(John) + Alice has a rash: + HasRash(Alice) + + Step 4: Forward Chaining to Determine Treatments + + Using forward chaining, we can infer: + + For John: + Since John has a fever and a cough, + HasFever(John) ∧ HasCough(John) ⇒ HasFlu(John), so John has the flu. + Since John has the flu, + HasFlu(John) ⇒ NeedsAntiviral(John), so John needs antiviral medication. + + For Alice: + Since Alice has a rash, but no information about itchiness is provided, we cannot infer if Alice has an allergic reaction, and thus we cannot determine if she needs antihistamines. + + Step 5: Results + + John's treatment: John needs antiviral medication. + Alice's treatment: No treatment determined from the given information. + """ + + from logic import FolKB, fol_fc_ask + + # # Step 1: Define the knowledge base in FOL + kb = FolKB() + + # # Step 2: Add rules in FOL + + # If someone has a fever and a cough, they might have the flu + kb.tell(expr('(HasFever(x) & HasCough(x)) ==> HasFlu(x)')) + # If someone has the flu, they need antiviral medication + kb.tell(expr('HasFlu(x) ==> NeedsAntiviral(x)')) + # If someone has a rash and itchiness, they might have an allergic reaction + kb.tell(expr('(HasRash(x) & HasItchiness(x)) ==> HasAllergicReaction(x)')) + # If someone has an allergic reaction, they need antihistamines + kb.tell(expr('HasAllergicReaction(x) ==> NeedsAntihistamines(x)')) + + # Step 3: Add facts about John and Alice + + # John has a fever and a cough + kb.tell(expr('HasFever(John)')) + kb.tell(expr('HasCough(John)')) + + # Alice has a rash (but no information about itchiness) + kb.tell(expr('HasRash(Alice)')) + + #Sanity check - review clauses in the knowledge base + print_clauses(kb) + + # Step 4: Use forward chaining to infer treatments + infer_john_flu = fol_fc_ask(kb, expr('HasFlu(John)')) + + print('\nDoes John have the flu?', list(infer_john_flu)) + print('\n So why are you getting [{}]?\n [{}] indicates that the KB infers that John has the flu, and the empty dictionary {} represents the substitution where no variables need to be instantiated.') + + #Ok, so at this point the fol_fc_ask has added the new clauses to the kb, negating the need for the substitution which would be returned. We can try asking the KB directly if John has the flu. + + #Sanity check - review clauses in the knowledge base + print_clauses(kb, "See the new clauses in the KB after forward chaining:") + + + print("\nNow querying the kb:") + query_flu = kb.ask(expr('HasFlu(x)')) + print("Who has the flu?", query_flu) # Expected: substitutions for John + + query_flu_john = kb.ask(expr('HasFlu(John)')) + print("Does John have the flu?", query_flu_john)# Expected: John + + query_antiviral = kb.ask(expr('NeedsAntiviral(x)')) + print("Who needs antiviral medication", query_antiviral) # Expected: John substitutions + + query_antiviral_john = kb.ask(expr('NeedsAntiviral(John)')) + print("Does John needs antiviral medication?", query_antiviral_john)# + + + # Check if Alice has both a rash and itchiness before inferring allergic reaction + + print_clauses(kb, "Before", False) + + + infer_rash_alice = fol_fc_ask(kb, Expr('HasRash(Alice)')) + # fol_fc_ask function is used to infer new information based on the existing rules and facts in the KB. When you query fol_fc_ask(kb, expr('HasRash(Alice)')), it checks if it can infer that Alice has a rash. Since HasRash(Alice) is already a fact in the KB, there's no need to infer it. Therefore, fol_fc_ask returns an empty list [], indicating that no new inferences were made. + print('\nDoes Alice have a rash?', list(infer_rash_alice)) + + query_rash = kb.ask(expr('HasRash(x)')) + # Searches the KB for any facts that match the pattern HasRash(x). It finds that Alice has a rash and returns a list containing one substitution: {'x': Alice} + print('\nWho has a rash?', query_rash) + + query_rash_alice = kb.ask(expr('HasRash(Alice)')) + # Checks if the specific fact HasRash(Alice) exists in the KB. Since this fact is present, it returns an empty dictionary {}. In this context, an empty dictionary signifies that the query is true without requiring any variable substitutions. + print("Does Alice have a rash?", query_rash_alice)# + + query_antihistamines_alice = fol_fc_ask(kb, expr('NeedsAntihistamines(Alice)')) + # Returns an empty list, it means that no new inferences could be made based on the current KB. Occurs when the queried fact is already present or cannot be inferred due to missing information. + print("Does Alice need an antihistamine?", list(query_antihistamines_alice)) + + +def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True): + if bool_print: + print("\n" + message) + for clause in kb.clauses: + print(clause) + print("Total Clauses: ", len(kb.clauses)) + +q1_smart_home_system() +q2_smart_medical_system() \ No newline at end of file From b1c1e2b922293e3b2d16d78671ff92777396054d Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 28 Oct 2025 18:49:18 +0000 Subject: [PATCH 53/56] checkpoint --- lab6/L6_COMP9016_2024.pdf | Bin 0 -> 48363 bytes lab6/lab6_solution.py | 262 ++++++++++++++++++++++++++++++++++++++ lab7/L7_COMP9016_2024.pdf | Bin 0 -> 18979 bytes logic.ipynb | 48 ++++--- 4 files changed, 294 insertions(+), 16 deletions(-) create mode 100644 lab6/L6_COMP9016_2024.pdf create mode 100644 lab6/lab6_solution.py create mode 100644 lab7/L7_COMP9016_2024.pdf diff --git a/lab6/L6_COMP9016_2024.pdf b/lab6/L6_COMP9016_2024.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d77d43337f921f9c800e0b68603f437f8cd15dc1 GIT binary patch literal 48363 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ϐej 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, and BICONDITIONAL (<<). + +Expr is used to build atomic or compound logical statements that can be evaluated, parsed, and used for logical inference. The class provides operator overloading to make it easy to create complex logical formulas in a natural and readable manner. + +""" + +# Get the parent directory of the current directory +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) + +# Add the parent directory to sys.path +if parent_dir not in sys.path: + sys.path.insert(0, parent_dir) + +from logic import tt_entails, Expr + +""" +Example provided +""" + +# Define symbols for the logical expressions +H = Expr('H') # It is hot +AC = Expr('AC') # The air conditioner is on + +# Define the premises using Expr +premise1 = Expr('==>', H, AC) # Premise 1: If it is hot, then the air conditioner is on +premise2 = H # Premise 2: It is hot + +# Combine the premises using logical AND +premises = premise1 & premise2 + +# Define the conclusion +conclusion = AC # Conclusion: The air conditioner is on + +# Check if the premises entail the conclusion +result = tt_entails(premises, conclusion) + +# Output the result +print(f"Do the premises entail the conclusion? {result}") + +""" Example end """ + +# constant Exprs used as part of the logical sentences: +A, B, C, D, E, F, G = map(Expr, 'ABCDEFG') + + +#Part A: Using `tt_entails` to Check Entailment +# Example 1: A AND B entails A +expr1 = A & B +conclusion1 = A +print(f"Example 1: {expr1} entails {conclusion1}") +print("Expected: True") +print("Actual:", tt_entails(expr1, conclusion1)) + +# Example 2: A OR B entails B OR A +expr2 = A | B +conclusion2 = B | A +print(f"\nExample 2: {expr2} entails {conclusion2}") +print("Expected: True") +print("Actual:", tt_entails(expr2, conclusion2)) + +# Example 3: A IMPLIES B entails NOT A OR B +# We need to generate NOT A using ~A as it was giving me problems with the parser and wasted a lot of time. +NOT_A = Expr('~', A) +expr3 = Expr('==>', A, B) +conclusion3 = Expr('|', NOT_A, B) +print(f"\nExample 3: {expr3} entails {conclusion3}") +print("Expected: True") +print("Actual:", tt_entails(expr3, conclusion3)) + +# Example 4: A AND (B OR C) entails (A AND B) OR (A AND C) +expr4 = A & (B | C) +conclusion4 = (A & B) | (A & C) +print(f"\nExample 4: {expr4} entails {conclusion4}") +print("Expected: True") +print("Actual:", tt_entails(expr4, conclusion4)) + +# Example 5: A AND B entails B AND A +expr5 = A & B +conclusion5 = B & A +print(f"\nExample 5: {expr5} entails {conclusion5}") +print("Expected: True") +print("Actual:", tt_entails(expr5, conclusion5)) + + +# Part 2: Understanding Entailment + +""" +Exercise: Understanding Logical Entailment with tt_entails (Using Expr Constructor Input) + +Consider the following logical statements: + Premise 1: If it rains, then the ground is wet. (Symbolically: R => W) + Premise 2: It is raining. (Symbolically: R) + Conclusion: The ground is wet. (Symbolically: W) + +""" + + +# Define the symbols +R = Expr('R') # It is raining +W = Expr('W') # The ground is wet + +# Define the premises using Expr constructor (verbose form) +premise1 = Expr('==>', R, W) # Premise 1: If it rains, then the ground is wet +premise2 = R # Premise 2: It is raining + +# Combine the premises +premises = Expr('&', premise1, premise2) # Both Premise 1 and Premise 2 must hold + +# Define the conclusion +conclusion = W # The conclusion is: The ground is wet + +# Check if premises entail the conclusion +result = tt_entails(premises, conclusion) + +print(f"Do the premises entail the conclusion? {result}") + + +""" +Exercise 2: Logical Entailment with Multiple Conditions + +Consider the following logical statements: + + Premise 1: If John studies, he will pass the exam. (Symbolically: S => P) + Premise 2: If John passes the exam, he will get a certificate. (Symbolically: P => C) + Premise 3: John studies. (Symbolically: S) + Conclusion: John will get a certificate. (Symbolically: C) + +""" + +# Define the symbols +Study = Expr('Study') # You study +Pass = Expr('Pass') # You pass the exam +MSc = Expr('MSc') # You get an MSc in AI + +# Define the premises using Expr constructor (verbose form) +premise1 = Expr('==>', Study, Pass) # Premise 1: If you study, you will pass the exam +premise2 = Expr('==>', Pass, MSc) # Premise 2: If you pass the exam, you will get an MSc in AI +premise3 = Study # Premise 3: You study + +# Combine the premises +premises = Expr('&', premise1, Expr('&', premise2, premise3)) # Combine Premise 1, 2, and 3 + +# Define the conclusion +conclusion = MSc # The conclusion is: You get an MSc in AI + +# Check if the premises entail the conclusion +result = tt_entails(premises, conclusion) + +print(f"Do the premises entail the conclusion? {result}") + +""" +Exercise 3: +""" + +from logic import PropKB + + +# Initialize the knowledge base +wumpus_kb = PropKB() + +# Define the symbols for pits and breezes in the grid +P11, P12, P13 = Expr('P11'), Expr('P12'), Expr('P13') +P21, P22, P23 = Expr('P21'), Expr('P22'), Expr('P23') +P31, P32, P33 = Expr('P31'), Expr('P32'), Expr('P33') + +B11, B12, B13 = Expr('B11'), Expr('B12'), Expr('B13') +B21, B22, B23 = Expr('B21'), Expr('B22'), Expr('B23') +B31, B32, B33 = Expr('B31'), Expr('B32'), Expr('B33') + +# Add knowledge about pits and breezes to the KB + +# No pit in [1,1] +wumpus_kb.tell(~P11) + +# There is a pit in [2,2] +wumpus_kb.tell(P22) + +# Breezes in adjacent tiles: a tile is breezy if there is a pit in an adjacent tile +# B11 ⇔ (P12 ∨ P21) +wumpus_kb.tell(B11 | '<=>' | (P12 | P21)) + +# B12 ⇔ (P11 ∨ P22 ∨ P13) +wumpus_kb.tell(B12 | '<=>' | (P11 | P22 | P13)) + +# B13 ⇔ (P12 ∨ P23) +wumpus_kb.tell(B13 | '<=>' | (P12 | P23)) + +# B21 ⇔ (P11 ∨ P22 ∨ P31) +wumpus_kb.tell(B21 | '<=>' | (P11 | P22 | P31)) + +# B22 ⇔ (P12 ∨ P21 ∨ P23 ∨ P32) +wumpus_kb.tell(B22 | '<=>' | (P12 | P21 | P23 | P32)) + +# B23 ⇔ (P13 ∨ P22 ∨ P33) +wumpus_kb.tell(B23 | '<=>' | (P13 | P22 | P33)) + +# B31 ⇔ (P21 ∨ P32) +wumpus_kb.tell(B31 | '<=>' | (P21 | P32)) + +# B32 ⇔ (P22 ∨ P31 ∨ P33) +wumpus_kb.tell(B32 | '<=>' | (P22 | P31 | P33)) + +# B33 ⇔ (P23 ∨ P32) +wumpus_kb.tell(B33 | '<=>' | (P23 | P32)) + +# Add percepts: Breeze felt in [2, 1], no breeze in [1, 1] +wumpus_kb.tell(~B11) # No breeze in [1, 1] +wumpus_kb.tell(B21) # Breeze in [2, 1] + + +# Check the KB to see the clauses it contains +print("Clauses in the knowledge base:") +for clause in wumpus_kb.clauses: + print(clause) + +# Print out an ASCII representation of the world +world = [[' ' for _ in range(3)] for _ in range(3)] + +# Update each square with the correct symbol: 'P' for pit, 'B' for breeze, '.' for empty +world[0][0] = 'P' if wumpus_kb.ask_if_true(P11) else 'B' if wumpus_kb.ask_if_true(B11) else '.' +world[0][1] = 'P' if wumpus_kb.ask_if_true(P12) else 'B' if wumpus_kb.ask_if_true(B12) else '.' +world[0][2] = 'P' if wumpus_kb.ask_if_true(P13) else 'B' if wumpus_kb.ask_if_true(B13) else '.' +world[1][0] = 'P' if wumpus_kb.ask_if_true(P21) else 'B' if wumpus_kb.ask_if_true(B21) else '.' +world[1][1] = 'P' if wumpus_kb.ask_if_true(P22) else 'B' if wumpus_kb.ask_if_true(B22) else '.' +world[1][2] = 'P' if wumpus_kb.ask_if_true(P23) else 'B' if wumpus_kb.ask_if_true(B23) else '.' +world[2][0] = 'P' if wumpus_kb.ask_if_true(P31) else 'B' if wumpus_kb.ask_if_true(B31) else '.' +world[2][1] = 'P' if wumpus_kb.ask_if_true(P32) else 'B' if wumpus_kb.ask_if_true(B32) else '.' +world[2][2] = 'P' if wumpus_kb.ask_if_true(P33) else 'B' if wumpus_kb.ask_if_true(B33) else '.' + +print("\nASCII representation of the world:") +for row in world: + print(' '.join(row)) \ No newline at end of file diff --git a/lab7/L7_COMP9016_2024.pdf b/lab7/L7_COMP9016_2024.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47d1e87b8054fd572f73edcfa77e470a0d7e6e75 GIT binary patch literal 18979 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 literal 0 HcmV?d00001 diff --git a/logic.ipynb b/logic.ipynb index 062ffede2..90124b8bf 100644 --- a/logic.ipynb +++ b/logic.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -72,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -81,7 +81,7 @@ "x" ] }, - "execution_count": 2, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": { "collapsed": true }, @@ -117,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -126,7 +126,7 @@ "(P & ~Q)" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -149,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -158,7 +158,7 @@ "'&'" ] }, - "execution_count": 5, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -280,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -289,7 +289,7 @@ "(((3 * f(x, y)) + (P(y) / 2)) + 1)" ] }, - "execution_count": 11, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -3678,14 +3678,30 @@ }, { "cell_type": "code", - "execution_count": 71, "metadata": { - "collapsed": true + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-10-25T09:46:49.390812Z", + "start_time": "2025-10-25T09:46:49.291448Z" + } }, - "outputs": [], "source": [ "clauses.append(expr(\"Enemy(Nono, America)\"))" - ] + ], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'clauses' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mNameError\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[1]\u001B[39m\u001B[32m, line 1\u001B[39m\n\u001B[32m----> \u001B[39m\u001B[32m1\u001B[39m \u001B[43mclauses\u001B[49m.append(expr(\u001B[33m\"\u001B[39m\u001B[33mEnemy(Nono, America)\u001B[39m\u001B[33m\"\u001B[39m))\n", + "\u001B[31mNameError\u001B[39m: name 'clauses' is not defined" + ] + } + ], + "execution_count": 1 }, { "cell_type": "markdown", @@ -4982,7 +4998,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "3.12.11-aima-python-venv", "language": "python", "name": "python3" }, @@ -4996,7 +5012,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.12.11" } }, "nbformat": 4, From f49ab7d4c71cd6a3c0bf60868e0e7c8eea014634 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Tue, 28 Oct 2025 19:10:33 +0000 Subject: [PATCH 54/56] checkpoint --- .../A2_COMP9016_Nagle_JohnPaul_R00065426.py | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py index 46ba5fe64..d02829301 100755 --- a/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """ A2_COMP9016_Nagle_JohnPaul_R00065426.py @@ -10,8 +9,6 @@ """ import sys import os -from tracemalloc import take_snapshot - # Get the parent directory of the current directory @@ -23,7 +20,6 @@ # Now you can import a module from the parent directory - from logic import Expr, FolKB, fol_fc_ask from utils import expr @@ -37,14 +33,17 @@ def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True) # 1.1.1 Define the Knowledge Base print("1.1.1 Define the Knowledge Base" ) # Create the First Order Logic Knowledge Base +print("- Creating KB ✔️") assignment2_kb = FolKB() # Define the constants +print("- Defining constants ✔️") Student = Expr('S') # S is a Student Lecturer = Expr('L') # L is a Lecturer Module = Expr('M') # M is a Module # Define the predicates +print("- Defining predicates ✔️") Takes = Expr('T') # T(s, m) s is currently taking module m Passed = Expr('P') # P(s, m) s has already passed module m Teaches = Expr('Teaches') # Teaches(l, m) l teaches module m @@ -55,13 +54,15 @@ def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True) Classmate = Expr('Classmate') # Classmate(s, t) share a module and s =\= t NotPassed = Expr('NotPassed') # NotPassed(s, m) s has not passed m IndirectPrereq = Expr('IndirectPrereq') # IndirectPrereq(x, z) x is an indirect prerequisite for z +NotEqual = Expr('NotEqual') # Define the premises +print("- Defining premises ✔️") # 1. Teaching implies “taught by” when a student is enrolled assignment2_kb.tell(expr('Takes(s, m) & Teaches(l, m) ==> TaughtBy(s, l)')) # 2. Two students are classmates if they take the same module and are not the same person: -assignment2_kb.tell(expr('Student(x) & Student(y) & Takes(x, m) & Takes(y, m) ==> Classmate(x, y)')) +assignment2_kb.tell(expr('Student(x) & Student(y) & Takes(x, m) & Takes(y, m) & NotEqual(x, y) ==> Classmate(x, y)')) # 3. A student is eligible for a module if they have passed all of its prerequisites: assignment2_kb.tell(expr('Prereq(p, m) & Passed(s, p) ==> Eligible(s, m)')) @@ -75,26 +76,35 @@ def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True) # 1.1.2 Provide the facts print("1.1.2 Provide the facts") # Modules +print("- Modules ✔️") assignment2_kb.tell(expr('Module(COMP9016)')) assignment2_kb.tell(expr('Module(COMP9062)')) assignment2_kb.tell(expr('Module(COMP9061)')) assignment2_kb.tell(expr('Module(COMP9058)')) # Students +print("- Students ✔️") assignment2_kb.tell(expr('Student(Alice)')) assignment2_kb.tell(expr('Student(Bob)')) assignment2_kb.tell(expr('Student(Eve)')) +assignment2_kb.tell(expr('NotEqual(Alice, Bob)')) +assignment2_kb.tell(expr('NotEqual(Alice, Eve)')) +assignment2_kb.tell(expr('NotEqual(Bob, Eve)')) # Lecturers +print("- Lecturers ✔️") assignment2_kb.tell(expr('Lecturer(DrDan)')) assignment2_kb.tell(expr('Lecturer(DrSophie)')) assignment2_kb.tell(expr('Lecturer(DrLisa)')) # Prerequisites +print("- Prerequisites ✔️") assignment2_kb.tell(expr('Prereq(COMP9016, COMP9062)')) assignment2_kb.tell(expr('Prereq(COMP9062, COMP9061)')) # Teaching +print("- Teaches ✔️") assignment2_kb.tell(expr('Teaches(DrDan, COMP9016)')) assignment2_kb.tell(expr('Teaches(DrSophie, COMP9062)')) assignment2_kb.tell(expr('Teaches(DrLisa, COMP9061)')) # Student Record +print("- Student records ✔️") assignment2_kb.tell(expr('Passed(Alice, COMP9016)')) assignment2_kb.tell(expr('Passed(Alice, COMP9058)')) assignment2_kb.tell(expr('Passed(Bob, COMP9016)')) @@ -110,6 +120,7 @@ def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True) assignment2_kb.tell(expr('NotPassed(Bob, COMP9061)')) # Current Enrolements +print("- Enrolements ✔️") assignment2_kb.tell(expr('Takes(Alice, COMP9062)')) assignment2_kb.tell(expr('Takes(Bob, COMP9061)')) assignment2_kb.tell(expr('Takes(Eve, COMP9016)')) @@ -197,6 +208,8 @@ def run_forward_chaining(kb): print(f"\nTotal logical inferences: {len(logical_inferences)}") return logical_inferences +print_clauses(assignment2_kb, "BEFORE INFERENECE:") # Run the forward chaining logical_inferences = run_forward_chaining(assignment2_kb) +print_clauses(assignment2_kb, "AFTER INFERENECE:") \ No newline at end of file From abcda04aa133d043b406fa79bbce6ea1bb21d9e7 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Thu, 30 Oct 2025 15:41:47 +0000 Subject: [PATCH 55/56] checkpoint --- .../A2_COMP9016_Nagle_JohnPaul_R00065426.py | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py b/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py index d02829301..45f787da6 100755 --- a/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py +++ b/assignment2/A2_COMP9016_Nagle_JohnPaul_R00065426.py @@ -20,7 +20,7 @@ # Now you can import a module from the parent directory -from logic import Expr, FolKB, fol_fc_ask +from logic import Expr, FolKB, fol_fc_ask, fol_bc_ask from utils import expr def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True): @@ -127,11 +127,7 @@ def print_clauses(kb, message="Clauses in the Knowledge Base:", bool_print=True) # 1.1.3 INFERENCE AND ANALYSIS -print("1.1.3 INFERENCE AND ANALYSIS") -# print_clauses(assignment2_kb, "PRE fol_fc_ask" ) -# answer = fol_fc_ask(assignment2_kb, expr('Student(Bob)')) -# -# print_clauses(assignment2_kb, "POST fol_fc_ask" ) +print("1.1.3 INFERENCE AND ANALYSIS => 1 Forward Chaining") def run_forward_chaining(kb): print("\n=== Forward Chaining Results ===") @@ -156,12 +152,11 @@ def run_forward_chaining(kb): print("\nClassmate logical inferences:") for s1 in students: for s2 in students: - if s1 != s2: # Don't check if someone is their own classmate - query = expr(f'Classmate({s1}, {s2})') - results = list(fol_fc_ask(kb, query)) - if results: - print(f"- {query}") - logical_inferences.append(query) + query = expr(f'Classmate({s1}, {s2})') + results = list(fol_fc_ask(kb, query)) + if results: + print(f"- {query}") + logical_inferences.append(query) # Check Prereq logical inferences print("\nPrereq logical inferences:") @@ -208,8 +203,34 @@ def run_forward_chaining(kb): print(f"\nTotal logical inferences: {len(logical_inferences)}") return logical_inferences -print_clauses(assignment2_kb, "BEFORE INFERENECE:") + + +print_clauses(assignment2_kb, "BEFORE INFERENCE:") # Run the forward chaining logical_inferences = run_forward_chaining(assignment2_kb) -print_clauses(assignment2_kb, "AFTER INFERENECE:") \ No newline at end of file +print_clauses(assignment2_kb, "AFTER INFERENCE:") + +print("1.1.3 INFERENCE AND ANALYSIS => 2 Backward Chaining") +# Backward Chaining (BC): Demonstrate reasoning for the following queries: +# • Eligible(Alice, COMP9061) +# • Eligible(Bob, COMP9061) +# • TaughtBy(Eve, l) +# • Classmate(Alice, Eve) (before and after adding Takes(Alice, COMP9016)) + +query = assignment2_kb.ask(expr('Eligible(Alice, COMP9061)')) +print(f"Is Alice Eligible for COMP9061? {query}") + +query = assignment2_kb.ask(expr('Eligible(Bob, COMP9061)')) +print(f"Is Bob Eligible for COMP9061? {query}") + +query = assignment2_kb.ask(expr('TaughtBy(Eve, l)')) +print(f"Is Eve TaughtBy l? {query}") + +query = assignment2_kb.ask(expr('Classmate(Alice, Eve)')) +print(f"Is Alice a classmate of Eve (before adding Takes(Alice, COMP9016))? {query}") + +assignment2_kb.tell(expr('Classmate(Alice, Eve)')) + +query = assignment2_kb.ask(expr('Classmate(Alice, Eve)')) +print(f"Is Alice a classmate of Eve (After adding Takes(Alice, COMP9016))? {query}") From e6d8a8205d8ab8676118dbe8aad9eb74e501dbf9 Mon Sep 17 00:00:00 2001 From: Paul Nagle Date: Thu, 30 Oct 2025 15:42:00 +0000 Subject: [PATCH 56/56] checkpoint --- logic.ipynb | 147 +++++++--------------------------------------------- 1 file changed, 20 insertions(+), 127 deletions(-) diff --git a/logic.ipynb b/logic.ipynb index 90124b8bf..f6928a5fe 100644 --- a/logic.ipynb +++ b/logic.ipynb @@ -4851,137 +4851,30 @@ }, { "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "

\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "metadata": { + "ExecuteTime": { + "end_time": "2025-10-30T15:31:10.308236Z", + "start_time": "2025-10-30T15:31:10.282711Z" } - ], + }, "source": [ "from notebook import Canvas_fol_bc_ask\n", "canvas_bc_ask = Canvas_fol_bc_ask('canvas_bc_ask', crime_kb, expr('Criminal(x)'))" - ] + ], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'crime_kb' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[31m---------------------------------------------------------------------------\u001B[39m", + "\u001B[31mNameError\u001B[39m Traceback (most recent call last)", + "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[3]\u001B[39m\u001B[32m, line 2\u001B[39m\n\u001B[32m 1\u001B[39m \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34;01mnotebook\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mimport\u001B[39;00m Canvas_fol_bc_ask\n\u001B[32m----> \u001B[39m\u001B[32m2\u001B[39m canvas_bc_ask = Canvas_fol_bc_ask(\u001B[33m'\u001B[39m\u001B[33mcanvas_bc_ask\u001B[39m\u001B[33m'\u001B[39m, \u001B[43mcrime_kb\u001B[49m, expr(\u001B[33m'\u001B[39m\u001B[33mCriminal(x)\u001B[39m\u001B[33m'\u001B[39m))\n", + "\u001B[31mNameError\u001B[39m: name 'crime_kb' is not defined" + ] + } + ], + "execution_count": 3 }, { "cell_type": "markdown",

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