Warehouse Organization Project - Due 5/1

Make your repo actionName1Name2.

More and more, robots are responsible for organizing items in warehouses. We are going to use our robots to autonomously maintain an organized cereal box warehouse.

Cereal boxes will be scattered throughout the second floor, located so that they should be easily viewed from points you probably have in your graph - intersections of hallways, within nooks and crannies, etc. We'll have to describe this state using a logic. Our state will be described using LOCATED(b,(x,y)) logical statements, meaning that object b (a cereal box, or a robot) is currently located at (or is best viewed from) map coordinates (x,y).

For step one of your project, your robot should autonomously explore the second floor, visiting every vertex of your navigation graph, taking note of which boxes are visible from what coordinates of your graph, and finally print out a state. For example, your output might be:

LOCATED RaisinBran 5.2 3.8
LOCATED JoesOs -10.5 13.8
LOCATED Robot 5 8

For step two, you'll be given two files in this same format, one of which describes the current state, and one of which describes the desired state in the same format as above. Your robot's job is to autonomously carry boxes around and rearrange the second deck. Now, obviously, your robot isn't actually capable of picking up and carrying boxes. There's a long history of this in robotics, and we'll deal with it in the usual way - your robot will print out 'PICK UP RaisinBran', for example, and you'll pick it up, only putting it down when it tells you to. Your robot is capable of "carrying" two boxes at a time.

For this, we'll have to add a couple more logical statements to the logic: CARRYING(b), where b is a cereal box, and EMPTYBAYS(n), where n is a 0, 1, or 2, describing the number of empty storage bays your robot has to carry more boxes. Also, you'll need three actions, DRIVETO( (x,y) ), PICKUP(b), and PUTDOWN(b). DRIVETO encompasses all the navigation from the last project - that is, drive to location (x,y), avoiding walls.

What are the prerequisites for each of these actions? How does the state change after each is executed? How should you measure the cost of each of these actions so that you perform your overall task as quickly as possible?


The cereal boxes in the input files will be (case-sensitive):


Here's a tarball of cereal pictures.

Here's a tarball with a graph and an example start and end state.

Here's a second graph and an example start and two ending states.