diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 5 | ||||
-rwxr-xr-x | gluon.cc | 12 | ||||
-rwxr-xr-x | higgs.cc | 9 | ||||
-rwxr-xr-x | higgs.h | 1 | ||||
-rwxr-xr-x | neutrino.cc | 2 | ||||
-rwxr-xr-x | photon.cc | 86 | ||||
-rw-r--r-- | randino.cpp | 76 |
8 files changed, 167 insertions, 25 deletions
@@ -4,6 +4,7 @@ playerlogs/ gluon neutrino randino +photon *.o @@ -1,6 +1,6 @@ .PHONY: all -all: neutrino randino gluon +all: neutrino randino gluon photon neutrino: neutrino.cc higgs.o g++ -Wall -std=c++11 -O2 -o neutrino neutrino.cc higgs.o @@ -8,6 +8,9 @@ neutrino: neutrino.cc higgs.o gluon: gluon.cc higgs.o g++ -Wall -std=c++11 -O2 -o gluon gluon.cc higgs.o +photon: photon.cc higgs.o + g++ -Wall -std=c++11 -O2 -o photon photon.cc higgs.o + randino: randino.cpp g++ -Wall -std=c++11 -O2 -o randino randino.cpp @@ -7,6 +7,13 @@ using namespace std;
+Move random( Board& board ) {
+ vector<Move> move_list = board.generateMoves();
+ if( move_list.size() == 0 )
+ return {-1,-1,-1};
+ return move_list[ rand() % move_list.size() ];
+}
+
Move importMove() {
Move move;
cin >> move.ndir >> move.p >> move.dir;
@@ -27,7 +34,7 @@ int main() { if( input == "go" ) {
//board.print();
move.ndir = -1;
- move.p = S-1;
+ move.p = S-2;
move.dir = 4;
board.doMove( move );
exportMove( move );
@@ -37,8 +44,7 @@ int main() { board.doMove( importMove() );
//board.print();
- vector<Move> move_list = board.generateMoves();
- move = move_list[ rand() % move_list.size() ];
+ move = random( board );
board.doMove( move );
exportMove( move );
}
@@ -115,3 +115,12 @@ Board::Board() { square[neutron] = -1;
move_count = 0;
}
+
+Board::Board( Board& board ) {
+ for( int i = 0; i < SS; i++ )
+ square[i] = board.square[i];
+ for( int i = 0; i < 2*S; i++ )
+ proton[i] = board.proton[i];
+ neutron = board.neutron;
+ move_count = board.move_count;
+}
@@ -28,4 +28,5 @@ public: int pushPiece( int p, int d, bool e = false );
void print();
Board();
+ Board( Board& );
};
diff --git a/neutrino.cc b/neutrino.cc index 2d8edac..67d8035 100755 --- a/neutrino.cc +++ b/neutrino.cc @@ -69,7 +69,7 @@ int main() { if( input == "go" ) {
//board.print();
move.ndir = -1;
- move.p = S-1;
+ move.p = S-2;
move.dir = 4;
board.doMove( move );
exportMove( move );
diff --git a/photon.cc b/photon.cc new file mode 100755 index 0000000..977a50b --- /dev/null +++ b/photon.cc @@ -0,0 +1,86 @@ +#include <iostream>
+#include <vector>
+#include <climits>
+#include <cstdlib>
+#include <ctime>
+#include "higgs.h"
+
+using namespace std;
+
+const int MONTE_CARLO_COUNT = 256;
+
+Move random( Board& board ) {
+ vector<Move> move_list = board.generateMoves();
+ if( move_list.size() == 0 )
+ return {-1,-1,-1};
+ return move_list[ rand() % move_list.size() ];
+}
+
+Move monteCarlo( Board& board ) {
+ vector<Move> move_list;
+ int win_max = INT_MIN;
+ int win_count;
+ int neutron = board.neutron;
+ Move best_move;
+ Move random_move;
+ for( Move move: move_list ) {
+ win_count = 0;
+ board.doMove( move );
+ for( int i = 0; i < MONTE_CARLO_COUNT; i++ ) {
+ Board playground( board );
+ while( !playground.neutronWin() ) {
+ random_move = random( playground );
+ if( random_move.ndir == -1 )
+ break;
+ playground.doMove( random_move );
+ }
+ if( playground.neutronWin() != 0 )
+ win_count += (1-2*(board.move_count%2))*playground.neutronWin() > 0;
+ else if( random_move.ndir == -1 )
+ win_count += ( playground.move_count%2 == 0 );
+ }
+ board.undoMove( move, neutron );
+ cerr << move.ndir << " " << win_count << endl;;
+ if( win_count > win_max ) {
+ win_max = win_count;
+ best_move = move;
+ }
+ }
+ return best_move;
+}
+
+Move importMove() {
+ Move move;
+ cin >> move.ndir >> move.p >> move.dir;
+ return move;
+}
+
+void exportMove( Move move ) {
+ cout << move.ndir << " " << move.p << " " << move.dir << endl;
+}
+
+int main() {
+ Board board;
+ Move move;
+ string input;
+ srand( time( NULL ) );
+
+ cin >> input;
+ if( input == "go" ) {
+ board.print();
+ move.ndir = -1;
+ move.p = S-2;
+ move.dir = 4;
+ board.doMove( move );
+ exportMove( move );
+ }
+ while( 1 ) {
+ board.print();
+ board.doMove( importMove() );
+
+ board.print();
+ move = monteCarlo( board );
+ board.doMove( move );
+ exportMove( move );
+ }
+}
\ No newline at end of file diff --git a/randino.cpp b/randino.cpp index e9b5abb..bb3d917 100644 --- a/randino.cpp +++ b/randino.cpp @@ -8,10 +8,17 @@ using namespace std; +bool should_flip_board=false; + +struct Move; +class Board; + +Move protocol_get_move(void); +void protocol_put_move(ostream &s,Move m); + int index_deltas[8][2]={{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1}}; -class Move{ -public: +struct Move{ int neudir,from,dir; string str(void){ stringstream ss; @@ -24,7 +31,7 @@ class Board{ public: int grid[S*S]; int neuidx; - Board(void):neuidx(0){ + Board(void):neuidx(S*(S/2)+S/2){ memset(grid,0,S*S*sizeof(int)); grid[S*(S/2)+S/2]=3; for(int i=0;i<S;i++){ @@ -59,12 +66,15 @@ public: } bool isvalid(Move mv){ int oldneuidx=neuidx; + cerr<<"Called isvalid with move "; + protocol_put_move(cerr,mv); + //print(); if(!move(oldneuidx,mv.neudir)){ - undomove(oldneuidx,mv.neudir); + //undomove(oldneuidx,mv.neudir); return false; } if(!move(mv.from,mv.dir)){ - undomove(mv.from,mv.dir); + //undomove(mv.from,mv.dir); undomove(oldneuidx,mv.neudir); return false; } @@ -72,6 +82,20 @@ public: undomove(oldneuidx,mv.neudir); return true; } + void print(void){ + int x,y; + if(should_flip_board){ + for(y=S-1;y>=0;y--){ + for(x=S-1;x>=0;x--)cerr<<grid[S*y+x]<<' '; + cerr<<endl; + } + } else { + for(y=0;y<S;y++){ + for(x=0;x<S;x++)cerr<<grid[S*y+x]<<' '; + cerr<<endl; + } + } + } }; @@ -79,19 +103,23 @@ Move calculate_move(Board &bd){ vector<Move> poss; Move m; int nd,fr,d; - int newneu,newidx; + int newneu; + //bd.print(); for(nd=0;nd<8;nd++){ newneu=bd.moved(bd.neuidx,nd); if(newneu==bd.neuidx)continue; for(fr=0;fr<S*S;fr++){ if(bd.grid[fr]!=1)continue; + //cerr<<"fr="<<fr<<endl; for(d=0;d<8;d++){ - newidx=bd.moved(fr,d); - if(newidx==fr)continue; m.neudir=nd; m.from=fr; m.dir=d; - poss.push_back(m); + if(bd.isvalid(m)){ + cerr<<"push: "; + protocol_put_move(cerr,m); + poss.push_back(m); + } } } } @@ -99,30 +127,33 @@ Move calculate_move(Board &bd){ } -bool should_flip_board=false; - inline int flip_index(int idx){ return S*(S-1-idx/S)+S-1-idx%S; } inline int flip_dir(int dir){ - return (dir+4)%8; + return dir==-1?-1:(dir+4)%8; } Move protocol_get_move(void){ Move m; - cin>>m.neudir>>m.from>>m.dir; + char c=cin.peek(); + if(c=='q'||c=='Q')exit(0); if(should_flip_board){ + m.neudir=flip_dir(m.neudir); m.from=flip_index(m.from); m.dir=flip_dir(m.dir); } + cerr<<"Got: "; + protocol_put_move(cerr,m); + cin.ignore(1024,'\n'); return m; } -void protocol_put_move(Move m){ +void protocol_put_move(ostream &s,Move m){ if(should_flip_board){ - cout<<m.neudir<<' '<<flip_index(m.from)<<' '<<flip_dir(m.dir)<<endl; + s<<flip_dir(m.neudir)<<' '<<flip_index(m.from)<<' '<<flip_dir(m.dir)<<endl; } else { - cout<<m.neudir<<' '<<m.from<<' '<<m.dir<<endl; + s<<m.neudir<<' '<<m.from<<' '<<m.dir<<endl; } } @@ -133,17 +164,19 @@ int main(void){ struct timeval tv; gettimeofday(&tv,NULL); cerr<<"seed="<<(1000000*tv.tv_sec+tv.tv_usec)<<endl; - srand(1000000*tv.tv_sec+tv.tv_usec); + //srand(1000000*tv.tv_sec+tv.tv_usec); + srand(1430075262226814); getline(cin,line); if(line=="go"){ should_flip_board=false; mv.neudir=-1; mv.from=0; mv.dir=4; - protocol_put_move(mv); + protocol_put_move(cout,mv); } else { if(line!="nogo")cerr<<"no0b "<<line<<" not in (go,nogo)"<<endl; should_flip_board=true; mv=protocol_get_move(); bd.move(mv.from,mv.dir); + bd.print(); mv=calculate_move(bd); if(!bd.isvalid(mv)){ cerr<<"calculate_move gave invalid move "<<mv.str()<<endl; @@ -151,11 +184,14 @@ int main(void){ } bd.move(bd.neuidx,mv.neudir); bd.move(mv.from,mv.dir); - protocol_put_move(mv); + protocol_put_move(cout,mv); } while(true){ + bd.print(); mv=protocol_get_move(); + bd.move(bd.neuidx,mv.neudir); bd.move(mv.from,mv.dir); + bd.print(); mv=calculate_move(bd); if(!bd.isvalid(mv)){ cerr<<"calculate_move gave invalid move "<<mv.str()<<endl; @@ -163,7 +199,7 @@ int main(void){ } bd.move(bd.neuidx,mv.neudir); bd.move(mv.from,mv.dir); - protocol_put_move(mv); + protocol_put_move(cout,mv); } return 0; } |