Contents
General
ICFP stands for International Conference on Functional Programming. They organise an anual interational programming contest. See the
ICFP 2004 Contest WebsiteJörg, Allan and
me attended the contest. Our team name was Formicoideas and we used primary haskell. Sorry, but we used also java to implement a graphical user frontend to be able to test our solutions.
We scored place 85 and 252 with our two submissions. It was really unfortunate since we found a very simple bug in our ant program just after the final submission, which caused the ants to stop after some time (pheromone dead lock)
Why Formicoidies?
Well the contest was about ants and the biological name for the family is Formicoidea.
Teamwork
Because Allan lives in Edinburgh and we live in Leipzig we have been forced to program territorial distributed.
This worked great since we used CVS,
Teamspeak and ICQ. I would say the productivity was larger than if we all would have worked together in the labs of the university or somewhere else. The reason is that you know you computer and the enviroment and it is calm if you need it.
The Task
The task description and some maps can be downloaded from the ICFP contest webpage or from the panel beside (
task.tgz).
Here a rough decription what it was about:
The task was to write a program that controls an ant. It was basicly a finite state machine (FSM) that had to be developed. The programming language was very low level with absolute jumps and so on. Please note that there is no memory in a FSM, so cannot store anything.
There are two teams the red and the black colony. Every colony has an anthill of the same size and the world consists of hexogonal cells. There are rocky cells where you can't go on and there are cells with food. The overall goal was to bring as many food as possible to your anthill. In order to perform that the ant can mark a cell with 6 different markers and is able to sense the own cell and the ahead, left and right cell.
Our Approach
In order to simplify this task we decided to build a translator from a
slightly higher level language than that of the ant finite state machine
language. This language is called pheromone and the compiler is phec for
pheromone compiler.
We also built a Simulator as described in the task description to evaluate
our ant programs, and a Java front end to visually deploy the simulator in
order to aid debugging of the ant programs.
Here the modules we have written:
Formicoideas strategy
According to the task the ants are controlled by a final state machine described by an assembler like low level code. Alls ants work independend. The ants have no memory, their state is defined by the current line of code that is executed. Of couse it is possible to simulate something like a memory by splitting the program into special address ranges. Therefor it is necessary to have a high level language with macros, block multiplication and more, see
Phec language. Ants can leave marks on fields they run over, there are six markers that can be turned on or off. That means we can save 6 bits of information on every field.
The basic behaviours of an ant are:
- explore and search for food
- bring food back home
It is necessary that an ant easily finds the way to the hill. Our approach is an initial spreading of path information. Initially all ants start at the home base. The idea is that some ants are choosen to run nearly straigth away from the home base and on every field thay mark the direction to go back to the home base. First we thought about writing a number 0..5 in every field to the direction to the ant hill within a hexagon. The disadvantage of this approach is that we need 3 bits (we have only 6) and every ant would have to remember its direction through its whole live. Normally ant's don't know the direction they are looking, it would have been necessary to split the whole code into 6 address ranges and keep tracking of the current direction whatever the ant is doing.
We choose an different approach that overcomes this problems. The idea is to code an gradient field. It is descending the more distance the ant has from the home base. For this field only 2 bits are needed. Like described at the start of the match some ants will start running away from the home base and write gradient information 3,2,1,3,2,1,3,? and so on. The value 0 is reserved for an empty field without way mark. If an ant has found food and searches for the home base it runs straigt until it finds a field with gradient information. Then it starts turning around and searchs for a neigbour field with (gradient + 1), the field is ascending in direction towards the home base.
The same idea is reused for faster finding the food hills. If an ants finds food, it picks it up and then moves back to the home base. During walking back it marks the way to the food with the gradient information. We wanted to have someting like in nature: unused food tracks should get weaker over time. Therefor we use the last free 2 bits to give the food track a strength information. Ants that carry food will write the gradient with strength 3.
Normal ants are randomly exploring the landscape and hope to find food. If they find an food track they will follow it and decrement the strength of the track by one. If the food at a certain place is empty the tracks that lead the this place will be removed over time.
Yes that is our approach: 2 bits for home base gradient, 2 bits for food gradient and 2 bits for food path strength. The approch is tested and works. For the given sample maps the average time to collect all food and bring it to the home base is 50,000 steps.
Unfortunatelly we didn't get the algorithm to work until the contest submission stop. We would have needed 4 hours more :( We submitted two unfinished versions. One that can't follow food tracks and the other follows them but with a bug that leads to a dead lock. Nevertheless we finished the algorithm, now it works fine and we are looking for testing it against the winner ant :)
Usage
You can type
make all
in the tools directory to compile everything. The other option you have is to compile modules (Phec, Simulator and Frontend) seperatly be typeing
make inside their directories. You will need ghc (haskell compiler) version 6.2
and the java sdk installed. Note that the java sdk is just needed if you want to recompile the frontend. Because the class files are included a java runtime is sufficient.
In the tools directory is a ./run.sh shell script to run
the simulator with the graphical front end, this can be used with
./run.sh task/sample0.world --red=source2/initial.phec
--black=Simulator/test.prog
Please note that the world files have to be downloaded sperately (
task.tgz).
In the above example the file
source2/initial.phec is compiled first whereas the
Simulator/test.prog is allready compiled and is used just as it is.
There are a plenty of commandline switches of the main program. Start
run -h for a usage information.
For example there is a console front end included. The following call
makes the simulator run for 100 steps:
./run --world=task/sample0.world --red=testing/initial.phec
--black=Simulator/test.prog --console -s100
To run the simulator without any frontend use:
./run --world=task/sample0.world --red=testing/initial.phec
--black=Simulator/test.prog
In any case you will get a final result, who as won and so on.
Submission
We submitted our submission 3 minutes before the deadline and - how to say - I was really nervous. It is every year a last minute hack!
The submission can be downloaded from the panel beside (
formicoideas.tgz).
A bit Statistic
I let
sloccount run over the whole code we produced in the 3 days. Here the results:
SLOC Directory SLOC-by-Language (Sorted)
747 Simulator haskell=747
677 Phec haskell=677
440 Frontend java=438,sh=2
209 top_dir haskell=187,perl=16,sh=6
Totals grouped by language (dominant language first):
haskell: 1611 (77.71%)
java: 438 (21.13%)
perl: 16 (0.77%)
sh: 8 (0.39%)Total Physical Source Lines of Code (SLOC) = 2,073
Development Effort Estimate, Person-Years (Person-Months) = 0.43 (5.16)
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months) = 0.39 (4.66)
(Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule) = 1.11
Total Estimated Cost to Develop = $ 58,086
(average salary = $56,286/year, overhead = 2.40).