From: Michael Andreen Date: Sun, 10 Jul 2005 12:06:53 +0000 (+0000) Subject: branched the robber for new idea X-Git-Url: https://ruin.nu/git/?p=icfp05.git;a=commitdiff_plain;h=f8095bf8fc76eec739a00ae86612881b743e3d8b branched the robber for new idea --- diff --git a/newrobber/robber.cpp b/newrobber/robber.cpp new file mode 100644 index 0000000..32124a8 --- /dev/null +++ b/newrobber/robber.cpp @@ -0,0 +1,138 @@ +#include "robber.h" +#include +#include +#include +#include + +using namespace std; +using namespace __gnu_cxx; + +string Robber::turn(){ + + //Ignore bribing for now + cout << "nobribe:" << endl; + string input; + getline(cin,input); + + hash_map streets; + Intersection& inter = _intersections[_location]; + for (hash_map::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; + + list 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; + + if (closestCop > 0 && closestCop < 3) + continue; + + list 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; + + if (closestCarCop.size() > 0){ + closestCop = closestCarCop.size(); + copInCar = true; + } + + //cerr << "Cop " << closestCop << " intersections away." << endl; + if (closestCop > 0 && closestCop < 3) + continue; + + priority_queue banks; + for(hash_map::const_iterator bank = _banks.begin(); + bank != _banks.end(); ++bank){ + //cerr << "Handling bank at: " << bank->first << endl; + if (bank->second > 0){ + list 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 l = shortestPath(street->first, _type, SimpleSPGoal(bank->first)); + if (l.size() < 1) + continue; + //list::iterator i = l.begin(); + //++i; + banks.push(bank->second/(pow(l.size(),4.0))); + } + } + //sort(banks.begin(),banks.end(),greater()); + + 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; + + + + /*cerr << "Using route: "; + copy(v.begin(), v.end(), ostream_iterator(cerr, " : ")); + cerr << endl; + */ + + //stand still if we can't find a better choice.. + string destination = _location; + double goodness = 0; + for (hash_map::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; + } + } + _oldLocation = _location; + //cerr << "Moving to: " << destination << endl; + + return destination; + +} +void Robber::move(std::string location){ + cout << "rmov\\" << endl; + Bot::move(location); + cout << "nobribe:" << endl; + cout << "rmov/" << endl; +} + +int main(){ + Robber robber("harv-robber"); + robber.play(); + + return 0; +} + +#include "../botsrc/shortestPath.cpp" diff --git a/newrobber/robber.h b/newrobber/robber.h new file mode 100644 index 0000000..7624986 --- /dev/null +++ b/newrobber/robber.h @@ -0,0 +1,17 @@ +#ifndef __ROBBER_H__ +#define __ROBBER_H__ + +#include "../botsrc/bot.h" + +class Robber : public Bot { + public: + Robber(std::string name):Bot(name,robber){}; + + std::string turn(); + + protected: + std::string _oldLocation; + std::string _maybeNextLocation; + virtual void move(std::string location); +}; +#endif diff --git a/newrobber/robbersrc.pro b/newrobber/robbersrc.pro new file mode 100644 index 0000000..e95eca1 --- /dev/null +++ b/newrobber/robbersrc.pro @@ -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 = ../robber + + +# Input +HEADERS += robber.h ../botsrc/bot.h ../botsrc/shortestPath.cpp +SOURCES += robber.cpp ../botsrc/bot.cpp