#include #include #include "antsim.hh" #include "ant.hh" #include "map.hh" #ifdef WITH_GUI #include "gui.hh" #endif void usage(char* self); int main(int argv, char* argc[]) { if (argv != 7) { usage(argc[0]); exit(1); } srandom(atoi(argc[6])); int numAnts = atoi(argc[2]); if (numAnts < 1 || numAnts > 300) { cout << "numAnts must be between 1 and 300, inclusive." << endl; exit(1); } Map* map = new Map(); if (!map->load(argc[1])) exit(1); int exploreRate = atoi(argc[3]); if (exploreRate < 1 || exploreRate > 100) { cout << "exploreRate must be between 1 and 100, inclusive." << endl; exit(1); } int nestEvapRate = atoi(argc[4]); if (nestEvapRate < 0 || nestEvapRate > 100) { cout << "nestEvapRate must be between 0 and 100, inclusive." << endl; exit(1); } int foodEvapRate = atoi(argc[5]); if (foodEvapRate < 0 || foodEvapRate > 100) { cout << "foodEvapRate must be between 0 and 100, inclusive." << endl; exit(1); } Ant* ants = new Ant[numAnts]; for (int i = 0; i < numAnts; i++) { ants[i].load(map->getW() >> 1, map->getH() >> 1); } #ifdef WITH_GUI Gui* gui = new Gui(); if (!gui->load(map->getW(), map->getH(), "Ant Stigmergy Demo v1.0")) exit(1); SDL_Event event; bool showPheromones = false; #else // char c; int avgTrailCnt = 0; #endif bool done = false; int avgTrailLen = 0; int avgTrailLenOld = 0; int avgTrailNum = 0; int frames = 0; int count = numAnts; while(!done) { frames++; if (count < numAnts) count++; avgTrailLenOld = avgTrailLen; avgTrailLen = 0; avgTrailNum = 0; for (int i = 0; i < count; i++) { ants[i].move(map, exploreRate); if (ants[i].getTrailLen() > 0) { avgTrailLen += ants[i].getTrailLen(); avgTrailNum++; } } #ifndef WITH_GUI if (avgTrailNum > 0) avgTrailLen /= avgTrailNum; cout << "Average Trail Length = " << avgTrailLen << endl; if (avgTrailLen > 0 && avgTrailLen == avgTrailLenOld) avgTrailCnt++; else avgTrailCnt = 0; if (avgTrailCnt > 1000) { cout << "Completed after " << frames << " timesteps." << endl; done = true; } #endif map->evaporate(nestEvapRate, foodEvapRate); #ifdef WITH_GUI gui->draw(map, showPheromones); while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) for (int x = -2; x <= 2; x++) for (int y = -2; y <= 2; y++) map->setWall(event.motion.x + x, event.motion.y + y, true); if (event.button.button == SDL_BUTTON_RIGHT) { for (int x = -2; x <= 2; x++) for (int y = -2; y <= 2; y++) map->setWall(event.motion.x + x, event.motion.y + y, false); } break; case SDL_QUIT: done = true; break; case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_ESCAPE) done = true; if (event.key.keysym.sym == SDLK_SPACE) showPheromones = !showPheromones; break; } } #else // map->draw(); // cin.get(c); // if (c != '\n') // done = true; #endif } return(0); } void usage(char* self) { cout << "\nusage: " << self << " world.map numAnts exploreRate " << "nestEvapRate foodEvapRate randSeed\n" << endl; }