diff options
| author | tomsmeding <hallo@tomsmeding.nl> | 2015-05-08 17:42:08 +0200 | 
|---|---|---|
| committer | tomsmeding <hallo@tomsmeding.nl> | 2015-05-08 17:42:08 +0200 | 
| commit | 82f2a1702e060d96d40f1bc3ef6a38442d11166f (patch) | |
| tree | c0cc21101c8eb6d569698a7e4d57fd862569f187 | |
| parent | c7ed2fc4a0080123983ec0aff21c9727bbd18e83 (diff) | |
Start a MCTS player
| -rw-r--r-- | charm.cpp | 91 | ||||
| -rwxr-xr-x | competition.py | 7 | ||||
| -rwxr-xr-x | fullcompTabMT.sh | 2 | 
3 files changed, 45 insertions, 55 deletions
| @@ -44,7 +44,7 @@ public:  			grid[S*(S-1)+i]=2;  		}  	} -	int moved(int at,int dir){ +	int moved(int at,int dir) const{  		int x=at%S,y=at/S,x2,y2;  		while(true){  			x2=x+index_deltas[dir][0]; @@ -87,7 +87,7 @@ public:  		undomove(oldneuidx,mv.neudir);  		return true;  	} -	void print(void){ +	void print(void) const{  		int x,y;  		if(should_flip_board){  			for(y=S-1;y>=0;y--){ @@ -101,59 +101,27 @@ public:  			}  		}  	} -}; - - -int scorefor(const Board &bd){ -	int i,score=0; -	for(i=0;i<S*S;i++){ -		if(bd.grid[i]==1)score+=i/S; -		else if(bd.grid[i]==2)score-=i/S; -		else if(bd.grid[i]==3){ -			score-=(i/S)*(i/S); -			if(i<S)score+=10000; -		} -	} -	return score; -} - -bool sortscoresfunc(const pair<Move,int> &a,const pair<Move,int> &b){ -	return a.second>b.second; -} - -Move calculate_move(Board &bd){ -	vector<pair<Move,int>> poss; -	Move m; -	int nd,fr,d; -	int newneu; -	int score,oldneuidx; -	//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++){ -				m.neudir=nd; -				m.from=fr; -				m.dir=d; -				if(bd.isvalid(m)){ -					oldneuidx=bd.neuidx; -					bd.move(oldneuidx,m.neudir,newneu); -					bd.move(m.from,m.dir); -					score=scorefor(bd); -					bd.undomove(m.from,m.dir); -					bd.undomove(oldneuidx,m.neudir); -					poss.push_back({m,score}); +	vector<Move> generate_moves(void){ +		vector<Move> poss; +		Move m; +		int nd,fr,d; +		int newneu; +		for(nd=0;nd<8;nd++){ +			newneu=moved(neuidx,nd); +			if(newneu==neuidx)continue; +			for(fr=0;fr<S*S;fr++){ +				if(grid[fr]!=1)continue; +				for(d=0;d<8;d++){ +					m.neudir=nd; +					m.from=fr; +					m.dir=d; +					if(isvalid(m))poss.push_back(m);  				}  			}  		} +		return poss;  	} -	sort(poss.begin(),poss.end(),sortscoresfunc); -	for(auto p : poss)cerr<<p.first.str()<<": "<<p.second<<endl; -	return poss[ipow(rand()%(poss.size()/2+1),2)/(poss.size()/2+1)].first; -} +};  inline int flip_index(int idx){ @@ -163,7 +131,7 @@ inline int flip_dir(int dir){  	return dir==-1?-1:(dir+4)%8;  } -Move protocol_get_move(void){ +inline Move protocol_get_move(void){  	Move m;  	char c=cin.peek();  	if(c=='q'||c=='Q')exit(0); @@ -179,7 +147,7 @@ Move protocol_get_move(void){  	return m;  } -void protocol_put_move(ostream &s,Move m){ +inline void protocol_put_move(ostream &s,Move m){  	if(should_flip_board){  		s<<flip_dir(m.neudir)<<' '<<flip_index(m.from)<<' '<<flip_dir(m.dir)<<endl;  	} else { @@ -187,6 +155,8 @@ void protocol_put_move(ostream &s,Move m){  	}  } +Move calculate_move(Board &bd); +  int main(void){  	Board bd;  	Move mv; @@ -234,3 +204,18 @@ int main(void){  	}  	return 0;  } + + + +class Node{ +	Node *firstchild,*nextsibling; +	uint8_t flags; +#define NFLAG_PLAYER (0x1) +#define NFLAG_IS_TERMINAL (0x2) +#define NFLAG_TERMINAL_PLAYER (0x4) +	uint8_t board[7]; //7*8=56; 5*5*2=50 (5*5=25 cells, 2 bits per cell); of last byte only 2 bits used +}; + +Move calculate_move(Board &bd){ +	static Node root; +} diff --git a/competition.py b/competition.py index 7c48846..9d3c15a 100755 --- a/competition.py +++ b/competition.py @@ -18,6 +18,8 @@ Options:  import os,sys,subprocess,shlex,re,time +MAXTIMELIMIT=None #in seconds +  S=5  PNONE=0  PP1=1 @@ -282,14 +284,15 @@ while True:  			if len(line)>0:  				break  			time.sleep(0.1) +			if MAXTIMELIMIT==None: continue  			timeoutfail=False  			if player==1:  				p1totaltime+=0.1 -				if p1totaltime>=50: +				if p1totaltime>=MAXTIMELIMIT:  					timeoutfail=True  			else:  				p2totaltime+=0.1 -				if p2totaltime>=50: +				if p2totaltime>=MAXTIMELIMIT:  					timeoutfail=True  			if timeoutfail:  				print("P"+str(player)+" timed out!") diff --git a/fullcompTabMT.sh b/fullcompTabMT.sh index 53c442e..c592c00 100755 --- a/fullcompTabMT.sh +++ b/fullcompTabMT.sh @@ -156,5 +156,7 @@ EOF  	ponei=$((ponei + 1))  done +echo COMPETITION START >competition.log +  #run the competition in threads  find competitionstubs -type f -name 'game_*' | xargs -P$num_cores -n1 -- bash | 
