]> ruin.nu Git - icfp05.git/commitdiff
added limit to SimpleSPGoal and ensured that two additional cops chases the smell
authorMichael Andreen <harv@ruin.nu>
Sat, 9 Jul 2005 22:48:11 +0000 (22:48 +0000)
committerMichael Andreen <harv@ruin.nu>
Sat, 9 Jul 2005 22:48:11 +0000 (22:48 +0000)
botsrc/bot.cpp
botsrc/bot.h
copsrc/cop.cpp

index a98a42bfb8fc5978a41c7ddcd14ad2b1cd6e0489..411d933ee50d7bab0ab689b320a753d464cb3f06 100644 (file)
@@ -369,10 +369,12 @@ std::list<std::string> Bot::shortestPath(const std::string& from, PlayerType typ
        return list<string>();
 }
 
-SimpleSPGoal::SimpleSPGoal(std::string to):_to(to){
+SimpleSPGoal::SimpleSPGoal(const std::string& to, int limit):_to(to), _limit(limit){
 }
 
 int SimpleSPGoal::operator()(const SPInfo* node) const{
+       if (_limit > 0 && node->cost >= _limit)
+               return -1;
        if (node->name == _to)
                return 1;
        return 0;
index 84f9de58f4d149d0859d898f7338da5fedd555c6..aab4e831ea021ccbd610ae1c7a0e558aeaafaf69 100644 (file)
@@ -112,8 +112,9 @@ class Bot {
 
 class SimpleSPGoal : public SPGoal{
        std::string _to;
+       int _limit;
        public:
-       SimpleSPGoal(std::string to);
+       SimpleSPGoal(const std::string& to, int limit = 0);
        int operator()(const SPInfo* node) const;
 };
 
index dd0b1d1a38fee9866b331f2585914d362d505f3f..2a8002293094ddca3436f249487d2c9c25a9ac68 100644 (file)
@@ -205,7 +205,7 @@ int Cop::maybeAtNeighbor(const Intersection& intersection){
 
 void Cop::sendPlan(){
        //cerr << "Planning" << endl;
-       string secondLocation = _robberLocation;
+       list<string> locations;
        if (_robberLocation.empty()){
                priority_queue<pair<int,string> > positions;
                for (hash_map<string,int>::iterator location = _maybeRobber.front().begin();
@@ -218,35 +218,41 @@ void Cop::sendPlan(){
                        _robberLocation = positions.top().second;
                        cerr << "Sending myself to: " << _robberLocation << ", probability of robber: " << positions.top().first << endl;
                }
-               if (positions.size() > 1){
+               for (int i = 0; i < 2 && positions.size() > 1; ++i ){
                        positions.pop();
-                       secondLocation = positions.top().second;
-                       cerr << "Sending another cop to: " << secondLocation << ", probability of robber: " << positions.top().first << endl;
+                       locations.push_back(positions.top().second);
+                       cerr << "Sending another cop to: " << locations.back() << ", probability of robber: " << positions.top().first << endl;
                }
+       }else{
+               locations.push_back(_robberLocation);
        }
        if (!_robberLocation.empty()){
                //cerr << "Robber found at " << _robberLocation << endl;
                _copTargets[_name].first = _robberLocation;
-
-               if (!secondLocation.empty()){
-                       list<string> closestFootCop = shortestPath(_robberLocation, cop_foot, FindPlayer(_players, cop_foot), true);
-                       list<string> closestCarCop = shortestPath(_robberLocation, cop_car, FindPlayer(_players, cop_car, closestFootCop.size() - 1), true);
-                       PlayerType copType = cop_foot;
-                       string copLocation;
-                       if (closestCarCop.size() > 0){
-                               copType = cop_car;
-                               copLocation = closestCarCop.back();
-                       }else
-                               copLocation = closestFootCop.back();
-
-
+               
+               vector<string> busyCops;
+               busyCops.push_back(_name);
+               while (locations.size() > 0){
+                       string cop;
+                       int dist = 1000000;
                        for (hash_map<string,Player>::const_iterator player = _players.begin();
-                                       player != _players.end(); ++player){
-                               if (player->first == _name || player->second.type == robber)
+                                       player != _players.end();++player){
+                               if (player->second.type == robber || find(busyCops.begin(), busyCops.end(), player->first) != busyCops.end())
                                        continue;
-                               if (player->second.type == copType && player->second.location == copLocation)
-                                       _copTargets[player->first].first = _robberLocation;
+                               list<string> l = shortestPath(player->second.location, player->second.type,SimpleSPGoal(locations.front(), dist-1));
+                               if (l.size() > 0 && l.size() < dist){
+                                       dist = l.size();
+                                       cop = player->first;
+                                       if (dist == 1)
+                                               break;
+                               }
+                       }
+                       if (!cop.empty()){
+                               cerr << "Sending " << cop << " to " << locations.front() << endl;
+                               _copTargets[cop].first = locations.front();
+                               busyCops.push_back(cop);
                        }
+                       locations.pop_front();
                }
        }
        //cerr << "Sending plan." << endl;