]> ruin.nu Git - icfp05.git/commitdiff
initial implementation of new robber
authorMichael Andreen <harv@ruin.nu>
Sun, 10 Jul 2005 13:08:00 +0000 (13:08 +0000)
committerMichael Andreen <harv@ruin.nu>
Sun, 10 Jul 2005 13:08:00 +0000 (13:08 +0000)
botsrc/bot.h
newrobber/newrobber.pro [new file with mode: 0644]
newrobber/robber.cpp
newrobber/robber.h
newrobber/robbersrc.pro [deleted file]

index 15be23460cefcf566370f030cc2e7ed1c20613fc..62f25569fd2f3f57089fc8d58733675bfee1a605 100644 (file)
@@ -85,9 +85,9 @@ class Bot {
                virtual void voteResult();
                void getPlayers();
                template<class Goal, class Cost>
-               std::list<std::string> shortestPath(const std::string& from, PlayerType type, const Goal& goal, const Cost& cost, bool reverse = false);
+               std::list<std::string> shortestPath(const std::string& from, PlayerType type, const Goal& goal, const Cost& cost, bool reverse = false) const;
                template<class Goal>
-               std::list<std::string> shortestPath(const std::string& from, PlayerType type, const Goal& goal, bool reverse = false);
+               std::list<std::string> shortestPath(const std::string& from, PlayerType type, const Goal& goal, bool reverse = false) const;
 
                __gnu_cxx::hash_map<std::string, Intersection> _intersections;
                __gnu_cxx::hash_map<std::string, Player> _players;
diff --git a/newrobber/newrobber.pro b/newrobber/newrobber.pro
new file mode 100644 (file)
index 0000000..d8e180d
--- /dev/null
@@ -0,0 +1,14 @@
+######################################################################
+# Automatically generated by qmake (1.07a) Fri Jun 24 23:15:16 2005
+######################################################################
+
+TEMPLATE = app
+CONFIG -= qt
+#CONFIG += debug
+unix:LIBS += -lm
+TARGET = ../nrobber
+
+
+# Input
+HEADERS += robber.h ../botsrc/bot.h ../botsrc/shortestPath.cpp
+SOURCES += robber.cpp ../botsrc/bot.cpp
index 32124a864158e7962217aa0cae515e855b0886bf..ccac7d918ac804382b51ebfd5383643db8ea889a 100644 (file)
@@ -12,115 +12,82 @@ string Robber::turn(){
        //Ignore bribing for now
        cout << "nobribe:" << endl;
        string input;
+       cerr << "New turn" << endl;
        getline(cin,input);
+       _time = clock();
 
-       hash_map<string,double> streets;
-       Intersection& inter = _intersections[_location];
-       for (hash_map<string,StreetType>::const_iterator street = inter.connections.begin();
-               street != inter.connections.end(); ++street){
-               if (street->second == car){
-                       //cerr << "Discarding: " << street->first << " since car is needed" << endl;
-                       continue;
-               }
-               //cerr << "Looking at street: " << street->first << endl;
-               Intersection& conInter = _intersections[street->first];
-               double goodness = conInter.connections.size()*5;
+       cerr << "Starting to calculate shortest path" << endl;
+       list<string> l = shortestPath(_location, robber,*this, *this);
+       _oldLocation = _location;
+       if (l.size() > 0){
+               cerr << "Found a route" << endl;
+               list<string>::iterator i = l.begin();
+               _location = *++i;
+       }
+       cerr << "Moving to: " << _location << endl;
+       return _location;
+}
 
-               list<string> closestFootCop = shortestPath(street->first, cop_foot, FindPlayer(_players, cop_foot, 6), true);
-               unsigned int closestCop = closestFootCop.size();
-               bool copInCar = false;
-               //cerr << "Cop on fot " << closestCop << " intersections away." << endl;
+int Robber::operator()(const SPInfo* node) const{
+       //cerr << "Goal for " << node->name << endl;
+       if (node->cost > 10 || (clock()-_time)/CLOCKS_PER_SEC > 2.4)
+               return 1;
+       return 0;
+}
 
-               if (closestCop > 0 && closestCop < 3)
-                       continue;
+int Robber::cost(const std::string& from, const std::string& to) const{
 
-               list<string> closestCarCop = shortestPath(street->first, cop_car, FindPlayer(_players, cop_car, closestCop - 1 > 0 ? closestCop : 5), true);
-               //cerr << "Cop in car " << closestCarCop.size() << " intersections away." << endl;
+       //cerr << "Calculating cost between " << from << " and " << to << endl;
+       hash_map<string,Intersection>::const_iterator conInter =  _intersections.find(to);
+       if (conInter == _intersections.end())
+               return 1000000; //Should never happen
 
-               if (closestCarCop.size() > 0){
-                       closestCop = closestCarCop.size();
-                       copInCar = true;
-               }
+       int cost = 1;
 
-               //cerr << "Cop " << closestCop << " intersections away." << endl;
-               if (closestCop > 0 && closestCop < 3)
-                       continue;
-
-               priority_queue<double> banks;
-               for(hash_map<string,int>::const_iterator bank = _banks.begin();
-                               bank != _banks.end(); ++bank){
-                       //cerr << "Handling bank at: " << bank->first << endl;
-                       if (bank->second > 0){
-                               list<string> cop = shortestPath(bank->first, cop_car, FindPlayer(_players, cop_car, 3), true);
-                               if (cop.size() > 0)
-                                       continue;
-                               else{
-                                       cop = shortestPath(bank->first, cop_foot, FindPlayer(_players, cop_foot, 3), true);
-                                       if (cop.size() > 0)
-                                               continue;
-                               }
-                               list<string> l = shortestPath(street->first, _type, SimpleSPGoal(bank->first));
-                               if (l.size() < 1)
-                                       continue;
-                               //list<string>::iterator i = l.begin();
-                               //++i;
-                               banks.push(bank->second/(pow(l.size(),4.0)));
-                       }
-               }
-               //sort(banks.begin(),banks.end(),greater<double>());
+       list<string> closestFootCop = shortestPath(to, cop_foot, FindPlayer(_players, cop_foot, 10), true);
+       unsigned int closestCop = closestFootCop.size();
+       bool copInCar = false;
+       //cerr << "Cop on fot " << closestCop << " intersections away." << endl;
 
-               for (unsigned int i = 0; i < 2 && banks.size() > 0;++i){
-                       goodness += banks.top();
-                       banks.pop();
-               }
-
-               //cerr << "Goodness before cop: " << goodness << endl;
-               if (closestCop > 2){
-                       //cerr << "Cop " << closestCop << " intersections away." << endl;
-                       goodness *= 1 - 1/(copInCar ? closestCop : closestCop - 1);
-               }
-               //cerr << "Goodness after cop: " << goodness << endl;
-
-               if (conInter.type == bank){
-                       //cerr << "FOUND A BANK" << endl;
-                       if (closestCop > 0 && closestCop < 4)
-                               continue;
-                       else if (_banks[street->first] > 0){
-                               //cerr << "No cop close to bank" << endl;
-                               return street->first;
-                       }
-               }
-               
-               //cerr << "Street: " << street->first << " goodness: " << goodness << endl;
-               streets[street->first] = goodness;
-       }
-       streets[_oldLocation] /= 10;
+       if (closestCop > 0 && closestCop < 3)
+               return 100;
 
+       list<string> closestCarCop = shortestPath(to, cop_car, FindPlayer(_players, cop_car, closestCop - 1 > 0 ? closestCop : 5), true);
+       //cerr << "Cop in car " << closestCarCop.size() << " intersections away." << endl;
 
+       if (closestCarCop.size() > 0){
+               closestCop = closestCarCop.size();
+               copInCar = true;
+       }
 
-       /*cerr << "Using route: ";
-       copy(v.begin(), v.end(), ostream_iterator<string>(cerr, " : "));
-       cerr << endl;
-       */
+       //cerr << "Cop " << closestCop << " intersections away." << endl;
+       if (closestCop > 0 && closestCop < 3)
+               return 100;
 
-       //stand still if we can't find a better choice..
-       string destination = _location;
-       double goodness = 0;
-       for (hash_map<string,double>::const_iterator dest = streets.begin();
-                       dest != streets.end(); ++dest){
-               //cerr << "Goodness: " << dest->second << endl;
-               if (dest->second > goodness){
-               //cerr << "New Goodness: " << dest->second << endl;
-                       goodness = dest->second;
-                       destination = dest->first;
+       //cerr << "Goodness before cop: " << goodness << endl;
+       if (closestCop > 2){
+               //cerr << "Cop " << closestCop << " intersections away." << endl;
+               cost += 8 - (copInCar ? closestCop : closestCop - 1);
+       }
+       //cerr << "Goodness after cop: " << goodness << endl;
+
+       if (conInter->second.type == bank){
+               //cerr << "FOUND A BANK" << endl;
+               if (closestCop > 0 && closestCop < 4)
+                       return 1000;
+               else if (_banks.find(to)->second > 0){
+                       //cerr << "No cop close to bank" << endl;
+                       return 1;
                }
        }
-       _oldLocation = _location;
-       //cerr << "Moving to: " << destination << endl;
-               
-       return destination;
-       
+
+       if (to == _oldLocation)
+               cost *= 2;
+       cerr << "Street: " << to << " cost: " << cost << endl;
+
+       return cost;
 }
+
 void Robber::move(std::string location){
        cout << "rmov\\" << endl;
        Bot::move(location);
index 7624986cbbfa2a48a41a82156200aa4111910383..53b1e6ffca3e8f991e7e6d5b33e5f2e47f351b84 100644 (file)
@@ -2,16 +2,19 @@
 #define __ROBBER_H__
 
 #include "../botsrc/bot.h"
+#include <time.h>
 
 class Robber : public Bot {
        public:
                Robber(std::string name):Bot(name,robber){};
                
                std::string turn();
+               int cost(const std::string& from,const std::string& to) const;
+               int operator()(const SPInfo* node) const;
 
        protected:
                std::string _oldLocation;
-               std::string _maybeNextLocation;
                virtual void move(std::string location);
+               clock_t _time;
 };
 #endif
diff --git a/newrobber/robbersrc.pro b/newrobber/robbersrc.pro
deleted file mode 100644 (file)
index e95eca1..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-######################################################################
-# Automatically generated by qmake (1.07a) Fri Jun 24 23:15:16 2005
-######################################################################
-
-TEMPLATE = app
-CONFIG -= qt
-#CONFIG += debug
-unix:LIBS += -lm
-TARGET = ../robber
-
-
-# Input
-HEADERS += robber.h ../botsrc/bot.h ../botsrc/shortestPath.cpp
-SOURCES += robber.cpp ../botsrc/bot.cpp