Harkirat Dhillon
SPD (Specialized Delivery Robot)
Summary:
SPD is a derivative of the classical idea of the delivery agent or robot. SPD's goal is to stock and restock shelves in a warehouse, keeping them full at all times. The domain of this project is the simple layout of a small warehouse. For simplicity, there are only a few aisles and shelves. Each shelve may only hold one item at a time and is either full or empty. The bulk of the agent's task is finding paths from one location to another and then moving there with the appropriate item. Paths were found using a recursive search.
Domain:
The domain for this project was the floor layout of a warehouse. To simplify matters and traces, the warehouse was made to be as simple as possible while sill allowing for challenging queries. First, all items, things to be stocked, were kept at a central location called storage. The idea behind this was that after delivering items to their respective shelves, the robot would always return to the storage location. Hence, when new items are to be delivered again, the robot is conveniently in the right place to pick them up and deliver. A connected graph was used to model the domain, where locations can be described as grids in the warehouse.
Visual Model of Warehouse:
storage
1 2 3
4 -> shelf1 5 -> shelf3
6 -> shelf2 7 -> shelf4
Psuedo code representation of this model
connect(storage,1). connect(1,storage).
connect(1,2). connect(2,1).
connect(2,3). connect(3,2).
connect(1,4). connect(4,1).
connect(4,6). connect(6,4).
connect(4,shelf1). connect(shelf1,4).
connect(6,shelf2). connect(shelf2,6).
connect(3,5). connect(5,3).
connect(5,7). connect(7,5).
connect(5,shelf3). connect(shelf3,5).
connect(7,shelf4). connect(shelf4,7).
Illustrations:
The user inputs the query by telling the agent which shelf needs to be stocked and with what item.
stock(shelf4,item1,State).
The agent will output the actions needed to deliver item1 to shelf4.
S=do(putdown(robot,item1),do(move(robot,7,shelf4)do(move(robot,5,7)do(move(robot,3,5)do(move(robot,2,3)do(move(robot,1,2)do(move(robot,storage,1),do(pickup(robot,item1),init)))?
Hence, the robot sees if it is holding the item to be delivered and picks it up if needed. Then the robot proceeds to the destination and puts the item down.
Implementation:
The main search problem in this domain involves finding paths from one location to another. I used a depth first search which recursively goes through the search space until it finds a solution or has gone though all branches of the search space. At first, I tried to implement a STRIPS representation of the actions and state space. However, it was difficult to get the add and delete goals functions to work correctly. Hence, I decided to use situation calculus as described in the book. Using this method, I was able to use states to prove the actions can be done and hence true. Using this implementation to represent states, the domain, and possible actions lead to the ability of the agent to plan out the necessary actions to achieve the goal.
Conclusions:
It was very interesting to explore this project. However, there are many pitfalls and difficulties trying to program a domain, complete with action and planning. The more complex actions were, the longer it took to calculate solutions to fulfill the goal. Sometimes it took well over 5-10 minutes to receive solutions to certain actions. This was very surprising to me because the world my agent was running in was very simple. Furthermore, it was also difficult to get the agent to implement related actions together. For example, if the agent is to deliver items to shelves that are next to each other, I could not figure out how to implement an action that would show the agent how to achieve both goals with one solution instead of solving them independently.