# Introduction to Artificial Intelligence

## Environment simulator and agents for the Russian traveler problem

In this first exercise you are asked to implement an environment simulator that runs a variant of the Canadian traveller problem (CTP). Then, you will implement some agents that live in the environment and evaluate their performance.

In the Canadian traveller problem, we are given a weigted graph, and the goal is to travel as cheaply as possible from a given start vertex to a given goal vertex. However, unlike standard shortest path in graph problems, which have known solutions (e.g. the Dijkstra algorithm), here the problem is that some of the edges (an edge being an abstraction of a road in the real world) may be blocked by snow or ice, this being the Canadian traveller problem.

In the open research problem version of CTP, the agent can only tell which edges are blocked when visiting an incedent vertex. This leads to a problem of shortest path under uncertainty, with which we are not ready to deal yet. Instead, we will introduce a variant, called the Russian traveller problem, with certain knowledge but also add ways to unblock paths, making this an interesting search problem.

### Russian TP Environment

The environment consists of a weighted graph. Each edge can be either blocked by ice, blocked due to a forest fire (a rather common state of affairs in Russia this last summer), or clear. Some vertices are known to contain a supply of salt, and others with water containers. The environment can contain one or more agents, each with a known starting location, and a required goal location. For each agent, there are state variables designating it current location, the amount of salt it is carrying, initially zero, and the amount of water it is carrying, also initially zero.

An agent can apply 2 types of action: move (as in the standard CTP), and load with a parameter indicating whether to load salt or water. The result of this action is that the agent now carries salt, or a water container, respectively, and the amount of the resource at the vertex is decreased by 1. The results of a move (from a current vertex V to a specific adjacent vertex U) action is as follows. If the edge E to be traversed is clear, the agent reaches U. If E is blocked by ice, and the agent carries salt, the salt is deposited on the ice as the agent traverses E, and again the agent reaches U. Side effects of this action are that E is now clear, and the agent no longer carries salt. However, if E is blocked but the agent does not have salt, the action fails, and the agent remains at V. A similar effect occurs for edges blocked by forest fire, except that now the agent needs to carry a water container in order to put out the fire and pass. The agent can carry only one unit of either salt or water.

The simulator should keep track of score, i.e. the number of actions done by each agent, and the total weight of edges traversed by the agent. An agent carrying salt is penalized by having its movement cost increased by a factor of 2, including for a traversal action that deposits salt. We will also assume that a failed action costs as much as if the action had succeeded, so as to discourage the agents from making stupid move attempts. A similar cost applies for agents carrying water containers, except the movement costs when carrying water containers is multiplied by 3.

### Implementation part I: simulator + simple agents

Initially you will implement the environment simulator, and several simple (non-AI) agents. The environment simulator should start up by reading the graph from a file, in a format of your choice. We suggest using a simple adgencency list in an ASCII file, that initially specifies the number of vertices. For example (comments beginning with a semicolon):

```#V 4    ; number of vertices n in graph (from 1 to n)

#E 1 2 W1 C   ; Edge from vertex 1 to vertex 2, weight 1, clear
#E 2 3 W1 C   ; Edge from vertex 2 to vertex 3, weight 1,clear
#E 3 4 W1 I   ; Edge from vertex 2 to vertex 3, weight 1, icy
#E 2 3 W1 F   ; Edge from vertex 2 to vertex 3, weight 1, fire
#E 2 4 W5 C   ; Edge from vertex 2 to vertex 4, weight 5, clear

#S 1 2    ; 2 units of salt at vertex 1
#W 1 1    ; 1 water container at vertex 1
```

The simulator should query the user about the number of agents and what agent program to use for each of them, from a list defined below. Initialization parameters for each agent (initial and goal position) are also to be queried from the user.

After the above initialization, the simulator should run each agent in turn, performing the actions retured by the agents, and update the world accordingly. Additionally, the simulator should be capable of displaying the state of the world after each step, with the appropriate state of the agents and their score. A simple screen display in ASCII is sufficient (no bonuses for fancy graphics - this is not the point in this course!).

Each agent program (a function) works as follows. The agent is called by the simulator, together with a set of observations. The agent returns a move to be carried out in the current world state. The agent is allowed to keep an internal state (for example, a computed optimal path, or anything else desired) if needed. In this assignment, the agents can observe the entire state of the world.

You should implement the following agents:

1. A human agent, i.e. read the next move from the user, and return it to the simulator.
2. A ice remover and fire extinguisher automaton. This agent will work as follows: find the closest salt or water, go and pick some up, then as long as it is still carrying salt or water, go to the nearest vertex with appropriate blocked edge and traverse it (thus clearing it), go and load more salt or water if needed, until no other actions are indicated, in which case it stops. Ties are broken in favor of always going for lower-numbered vertices.
3. A greedy agent, that works as follows: the agent should compute the shortest currently unblocked path to its target, and traverse the first edge in that direction.

At this stage, you should run the environment with two agents participating in each run: ice remover/fire extinguisher automaton, and one other agent that can be chosen by the user. Your program should display and record the scores. In particular, you should run the greedy agent with various initial configurations, and various initial locations of the remover/extinguisher automaton, Also, test your environment with several agents in the same run, to see that it works correctly. You would be advised to do a good job here w.r.t. program extensibility, modularity, etc. much of this code may be used for some of the following assignments as well.

### Implementation part II: search agents

Now, after chapter 4, you will be implementing intelligent agents (this is part 2 of the assignment) that need to act in this environment, assuming that it is acting alone. You will be implementing a "search" agent as defined below. All the algorithms will use a heuristic evaluation function of your choice.

1. A greedy search agent, that picks the move with best immediate heuristic value.
2. An agent using A* search, with the same heuristic.
3. An agent using a simplified version of real-time A*.

The performance measure will be composed of two parts: S, the agent's score, and T, the number of search expansion steps performed by the search algorithm. The performance of an agent will be:

```   P = f * S + T
```

Clearly, a better agent will have P as small as possible. The parameter f is a weight constant. You should compare the performance of the three agents against the completely passive opponent for the following values of f: 1, 100, 10000. Note that the higher the f parameter, the more important it is to expend computational resources in order to get a better score!

Bonus version: construct a search agent as above, but in addition allow a known ice remover / fire extinguisher automaton to also acting in the environment. Your search agent needs to take this into account. Observe that although this seems to be a multi-agent problem, the fact that the ice remover is perfectly predictable makes this in essence a single agent search problem.

## Deliverables

The program and code sent to the grader, by e-mail or otherwise as specified by the grader, a printout of the code and results. A document stating the heuristic function you used and the rationale for selecting this function. Set up a time for frontal grading checking of the delivered assignment, in which both members of each team must demonstrate at least some familiarity with their program...

Due date for part 1 (recommended): October 24, 2010.

For the complete assignment: November 7, 2010.