Lab 1 - Agents
Problem Description
Implement the control program for a vacuum cleaner agent.
The environment is a rectangular grid of cells which may contain dirt or an obstacle. The agent is located somewhere in this grid and facing in one of the four directions: north, south, east or west.
The agent can execute the following actions:
TURN_ON: This action initialises the robot and has to be executed first.
TURN_RIGHT, TURN_LEFT: lets the robot rotate 90° clockwise/counter-clockwise
GO: lets the agent attempt to move to the next cell in the direction it is currently facing.
SUCK: suck the dirt in the current cell
TURN_OFF: turns the robot off. Once turned off, it can only be turned on again after emptying the dust-container manually.
The robot is equipped with a dust sensor and a touch sensor. If there is dirt at current location of the robot, the agent will sense “DIRT”. If the robot is bumping into an obstacle, the agent will sense “BUMP”.
The goal is to clean all cells and return to the initial location before turning the robot off. Note, a full charge of the battery of the robot will only last for 100 actions.
Tasks
Characterise the environment (is it static or dynamic, deterministic or stochastic, …).
Develop a strategy for the agent such that it cleans every cell and outline the agent function.
Fill out the missing parts of the vacuum cleaner Java program (see below) such that it encodes your agent function.
Test your program with all three provided environments. Record the number of steps it takes to finish each environment and the resulting points.
Is your agent rational? Justify your answer.
To make this a bit easier you can use the following assumptions:
The room is rectangular. It has only 4 straight walls that meet at right angles. There are no obstacles in the room. That is, the strategy “Go until you bump into a wall then turn right and repeat” will make the agent walk straight to a wall and then around the room along the wall.
The room is fairly small, so that 100 actions are enough to visit every cell, suck all the dirt and return home given a halfway decent algorithm.
Material
The file contains code for implementing an agent in the src directory. The agent is actually a server process which listens on some port and waits for the real robot or a simulator to send a message. It will then reply with the next action the robot is supposed to execute.
The zip file also contains the description of three example environments (vacuumcleaner*.gdl) and a simulator (gamecontroller-gui.jar). To test your agent:
If there is a second role called “RANDOM” in the game, leave it as “Random”.
Run the “Main” class in the project. If you added your own agent class, make sure that it is used in the main method of Main.java. You can also execute the “ant run” on the command line, if you have
Ant installed.
The output of the agent should say “NanoHTTPD is listening on port 4001”, which indicates that your agent is ready and waiting for messages to arrive on the specified port.
Now push the “Start” button in the simulator and your agent should get some messages and reply with the actions it wants to execute. At the end, the output of the simulator tells you how many points your agent got: “Game over! results: 0”. In the given environment you will only get non-zero points if you manage to clean everything, return to the initial location, and turn off the robot within 100 steps. If the output of the simulator contains any line starting with “SEVERE”, something is wrong. The two most common problems are the network connection (e.g., due to a firewall) between the simulator and the agent or the agent sending illegal moves.
You can see here, what the example environment looks like. Of course, you shouldn't assume any fixed size, initial location or locations of the dirt in your implementation. This is just an example environment.
Hints
For implementing your agent:
Add a new class that implements the “Agent” interface. Look at RandomAgent.java to see how this is done.
You have to implement the method “nextAction” which gets a collection of percepts as input and has to return the next action the agent is supposed to execute.
Before you start programming a complicated strategy, think about it. The things your agent has to do are:
execute TURN_ON
visit every cell and suck up any dirt it finds on the way
return to the initial location
TURN_OFF
For this your agent needs an internal model of the world. Figure out, what you need to remember about the current state of the world. Ideally, you create an object “State” that contains everything you need to remember and update this object depending on which action you executed and which percepts you got. Then you can implement rules that say which action should be executed depending on what properties the current state has.
As a general hint: “Days of programming can save you minutes of thinking.” Think of a strategy, the rules to implement it and the information you need to decide on the actions before you start implementing it.
Visualization
There is a server-version of the Gamecontroller (the simulator) here: http://130.208.241.192/ggpserver/
You can register there, then go to “User Profile” and create a new player:
Put in your public IP address and the port (default 4001) that your agent is listening on. Make sure, that this port is open for connections from the outside (firewall settings). If you are behind a NAT router, you would need to setup a port-forwarding rule.
Set the status to “active”, to tell the server that the agent is online.
Deselect both “available for round robin play” and “available for manual matches by other users” and set the GDL version to “GDL-II”.
Afterwards you can use this player to play some matches. Of course your agent will only be able to play the vacuum cleaner world.
To start a match:
Go to “User Profile” and click on the edit button next to “manual_matches”.
Create a new match and select one of the vacuum cleaner worlds as game.
Select you player for the first role in the game and leave the second one (if there is a second one) as “Random”.
Click on the start button and then on one of the magnifying glasses to see what happens.