package Ġtest Ċ Ċ import Ġagents . M CT S .* Ċ import Ġagents . Simple Action Random Ċ import Ġground War .* Ċ import Ġg gi .* Ċ import Ġorg . junit . jupiter . api .* Ċ import Ġorg . junit . jupiter . api . Assertions .* Ċ import Ġkotlin . math . pow Ċ Ċ class ĠSimple M aze Game ( val Ġplayer Count : ĠInt , Ġval Ġtarget : ĠInt ) Ġ: ĠAction Abstract GameState Ġ{ ĊĊĠĠĠ Ġval Ġevent Queue Ġ= ĠEvent Queue () ĊĠĠĠ Ġoverride Ġfun Ġregister Agent ( player : ĠInt , Ġagent : ĠSimple Action Player Interface ) Ġ= Ġevent Queue . register Agent ( player , Ġagent , Ġn Ticks ()) ĊĠĠĠ Ġoverride Ġfun Ġget Agent ( player : ĠInt ) Ġ= Ġevent Queue . get Agent ( player ) ĊĠĠĠ Ġoverride Ġfun Ġplan Event ( time : ĠInt , Ġaction : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Queue . add ( Event ( time , Ġaction )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcurrent Position Ġ= ĠInt Array ( player Count ) Ġ{ Ġ 0 Ġ} Ġ Ġ// Ġinitialise Ġall Ġplayers Ġto Ġthe Ġorigin ĊĊĠĠĠ Ġoverride Ġfun Ġn Actions () Ġ= Ġ 3 ĊĠĠĠ Ġ// ĠLEFT , ĠRIGHT , ĠSTOP ĊĊĠĠĠ Ġoverride Ġfun Ġscore ( player : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġjust Ġhave Ġa Ġscore Ġof Ġ 1 . 0 Ġfor Ġre aching Ġthe Ġgoal ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( current Position [ player ] Ġ>= Ġtarget ) Ġ 1 . 0 Ġelse Ġ 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġplayer Count () Ġ= Ġplayer Count ĊĊĠĠĠ Ġoverride Ġfun Ġpossible Actions ( player : ĠInt , Ġmax : ĠInt , Ġfilter Type : ĠString ) Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( player , ĠDirection . LEFT ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( player , ĠDirection . RIGHT ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNo Action ( player , Ġ 1 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġcod ons Per Action () Ġ= Ġ 1 ĊĠĠĠ Ġoverride Ġfun Ġtranslate Gene ( player : ĠInt , Ġgene : ĠInt Array , Ġaction Filter : ĠString ) Ġ= Ġpossible Actions ( player ). getOrElse ( gene [ 0 ]) Ġ{ ĠNo Action ( player , Ġ 1 ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠAbstract GameState Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Value Ġ= ĠSimple M aze Game ( player Count , Ġtarget ) ĊĠĠĠĠĠĠĠ Ġret Value . current Position Ġ= Ġcurrent Position . copyOf () ĊĠĠĠĠĠĠĠ Ġret Value . event Queue . addAll ( event Queue ) ĊĠĠĠĠĠĠĠ Ġret Value . event Queue . currentTime Ġ= Ġn Ticks () ĊĠĠĠĠĠĠĠ Ġreturn Ġret Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Terminal () Ġ= Ġcurrent Position . any Ġ{ Ġit Ġ>= Ġtarget Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġn Ticks () Ġ= Ġevent Queue . currentTime ĊĊĠĠĠ Ġoverride Ġfun Ġnext ( forward Ticks : ĠInt ): ĠAction Abstract GameState Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Queue . next ( forward Ticks , Ġthis ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠDirection Ġ{ ĠLEFT , ĠRIGHT Ġ} Ċ Ċ data Ġclass ĠMove ( val Ġplayer Ref : ĠInt , Ġval Ġdirection : ĠDirection ) Ġ: ĠAction Ġ{ ĊĠĠĠ Ġoverride Ġval Ġplayer Ġ= Ġplayer Ref ĊĠĠĠ Ġoverride Ġfun Ġapply ( state : ĠAction Abstract GameState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠSimple M aze Game ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . LEFT Ġ-> Ġstate . current Position [ player ] -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDirection . RIGHT Ġ-> Ġstate . current Position [ player ] ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnext Decision Point ( player : ĠInt , Ġstate : ĠAction Abstract GameState ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( state . n Ticks () Ġ+ Ġ 1 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisible To ( player : ĠInt , Ġstate : ĠAction Abstract GameState ) Ġ= Ġtrue Ċ } Ċ Ċ object ĠM aze State Function Ġ: ĠState Sum mar izer Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( state : ĠAction Abstract GameState ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠSimple M aze Game ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstate Ġis Ġjust Ġtime , Ġand Ġthe Ġcurrent Ġposition Ġof Ġall Ġagents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith ( StringBuilder ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( state . n Ticks ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("| ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( state . current Position . join ToString ( separator Ġ= Ġ"| ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠM CT SM aster Test Ġ{ ĊĊĠĠĠ Ġval Ġparams Ġ= ĠM CT S Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC Ġ= Ġ 1 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Method Ġ= ĠM CT S Selection Method . SIMPLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax P layouts Ġ= Ġ 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Limit Ġ= Ġ 1 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh orizon Ġ= Ġ 2 0 , ĠĠĠĠ Ġ// Ġlimit Ġof Ġactions Ġtaken Ġacross Ġboth Ġtree Ġand Ġrol lout Ġpolicies ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscount Rate Ġ= Ġ 1 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprune Tree Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġsimple M aze Game Ġ= ĠSimple M aze Game ( 3 , Ġ 1 0 ) ĊĠĠĠ Ġval Ġagents Ġ= Ġarray ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM CT ST r ansp osition Table Agent Master ( params Ġ= Ġparams . copy ( max P layouts Ġ= Ġ 2 ), Ġstate Function Ġ= ĠM aze State Function ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM CT ST r ansp osition Table Agent Master ( params Ġ= Ġparams . copy ( max P layouts Ġ= Ġ 5 ), Ġstate Function Ġ= ĠM aze State Function ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM CT ST r ansp osition Table Agent Master ( params Ġ= Ġparams . copy ( max P layouts Ġ= Ġ 1 0 ), Ġstate Function Ġ= ĠM aze State Function ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġagents . with Index (). forEach Ġ{ Ġ( i , Ġagent ) Ġ-> Ġsimple M aze Game . register Agent ( i , Ġagent ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbest Action With Simple Selection () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest State Ġ= Ġsimple M aze Game . copy () Ġas ĠAction Abstract GameState ĊĠĠĠĠĠĠĠ Ġval Ġroot Node Ġ= ĠTT Node ( params , Ġtest State . possible Actions ( 2 )) ĊĠĠĠĠĠĠĠ Ġagents [ 2 ]. tree [" 2 |" Ġ+ ĠM aze State Function ( test State )] Ġ= Ġroot Node ĊĠĠĠĠĠĠĠ Ġroot Node . update ( Move ( 2 , ĠDirection . LEFT ), Ġtest State . possible Actions ( 2 ), Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġroot Node . update ( Move ( 2 , ĠDirection . LEFT ), Ġtest State . possible Actions ( 2 ), Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġroot Node . update ( Move ( 2 , ĠDirection . RIGHT ), Ġtest State . possible Actions ( 2 ), Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ Ġroot Node . update ( No Action ( 2 , Ġ 1 ), Ġtest State . possible Actions ( 2 ), Ġ 1 . 5 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. get Best Action ( 2 , Ġtest State ), ĠMove ( 2 , ĠDirection . RIGHT )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġbest Action With Rob ust Selection () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthis Params Ġ= Ġparams . copy ( selection Method Ġ= ĠM CT S Selection Method . RO BU ST ) ĊĠĠĠĠĠĠĠ Ġagents [ 2 ] Ġ= ĠM CT ST r ansp osition Table Agent Master ( params Ġ= Ġthis Params , Ġstate Function Ġ= ĠM aze State Function ) ĊĠĠĠĠĠĠĠ Ġval Ġtest State Ġ= Ġsimple M aze Game . copy () Ġas ĠAction Abstract GameState ĊĠĠĠĠĠĠĠ Ġval Ġroot Node Ġ= ĠTT Node ( this Params , Ġtest State . possible Actions ( 2 )) ĊĠĠĠĠĠĠĠ Ġagents [ 2 ]. tree [" 2 |" Ġ+ ĠM aze State Function ( test State )] Ġ= Ġroot Node ĊĠĠĠĠĠĠĠ Ġroot Node . update ( Move ( 2 , ĠDirection . LEFT ), Ġtest State . possible Actions ( 2 ), Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġroot Node . update ( Move ( 2 , ĠDirection . LEFT ), Ġtest State . possible Actions ( 2 ), Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġroot Node . update ( Move ( 2 , ĠDirection . RIGHT ), Ġtest State . possible Actions ( 2 ), Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ Ġroot Node . update ( No Action ( 2 , Ġ 1 ), Ġtest State . possible Actions ( 2 ), Ġ 1 . 5 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. get Best Action ( 2 , Ġtest State ), ĠMove ( 2 , ĠDirection . LEFT )) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreset Tree Does So () Ġ{ ĊĠĠĠĠĠĠĠ Ġbest Action With Simple Selection () ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 4 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 0 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġagents [ 2 ]. reset Tree ( simple M aze Game . copy () Ġas ĠAction Abstract GameState , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfirst Action Ens ures State Is Added To Tree () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Agents Ġ= Ġagents . map ( M CT ST r ansp osition Table Agent Master :: get Forward Model Interface ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠM CT ST r ansp osition Table Agent Child Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġchild Agents . with Index (). forEach Ġ{ Ġ( i , Ġit ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . getAction ( simple M aze Game , Ġi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agents [ 0 ]. tree . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agents [ 1 ]. tree . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agents [ 2 ]. tree . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( child Agents . none ( M CT ST r ansp osition Table Agent Child :: first Action )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreset Tree With P rune Option Le aves Nodes () Ġ{ ĊĠĠĠĠĠĠĠ Ġagents [ 2 ] Ġ= ĠM CT ST r ansp osition Table Agent Master ( params Ġ= Ġparams . copy ( prune Tree Ġ= Ġtrue ), Ġstate Function Ġ= ĠM aze State Function ) ĊĠĠĠĠĠĠĠ Ġbest Action With Simple Selection () ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 4 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 0 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġagents [ 2 ]. reset Tree ( simple M aze Game . copy () Ġas ĠAction Abstract GameState , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . values . flatMap Ġ{ Ġit . action Map . values Ġ}. sum By ( MC Statistics :: visit Count ), Ġ 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreset Tree With P rune On Uses Correct State () Ġ{ ĊĠĠĠĠĠĠĠ Ġagents [ 2 ] Ġ= ĠM CT ST r ansp osition Table Agent Master ( params Ġ= Ġparams . copy ( prune Tree Ġ= Ġtrue ), Ġstate Function Ġ= ĠM aze State Function ) ĊĠĠĠĠĠĠĠ Ġval Ġchosen Action Ġ= Ġagents [ 2 ]. getAction ( simple M aze Game . copy () Ġas ĠAction Abstract GameState , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 1 0 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġnext State Ġ= Ġsimple M aze Game . copy () Ġas ĠAction Abstract GameState ĊĠĠĠĠĠĠĠ Ġchosen Action . apply ( next State ) ĊĠĠĠĠĠĠĠ Ġnext State . next ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( agents [ 2 ]. tree . containsKey (" 2 |" Ġ+ ĠM aze State Function ( next State ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 1 0 1 ) ĊĠĠĠĠĠĠĠ Ġagents [ 2 ]. reset Tree ( next State , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size . toDouble (), Ġ 9 2 . 0 , Ġ 2 . 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġone Node Added To Tree Per Iteration () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( simple M aze Game . event Queue . any Ġ{ Ġe Ġ-> Ġe . tick Ġ== Ġ 0 Ġ&& Ġe . action Ġis ĠMake Decision Ġ&& Ġe . action . player Ref Ġ== Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠ Ġassert ( simple M aze Game . event Queue . any Ġ{ Ġe Ġ-> Ġe . tick Ġ== Ġ 0 Ġ&& Ġe . action Ġis ĠMake Decision Ġ&& Ġe . action . player Ref Ġ== Ġ 1 Ġ}) ĊĠĠĠĠĠĠĠ Ġassert ( simple M aze Game . event Queue . any Ġ{ Ġe Ġ-> Ġe . tick Ġ== Ġ 0 Ġ&& Ġe . action Ġis ĠMake Decision Ġ&& Ġe . action . player Ref Ġ== Ġ 2 Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( simple M aze Game . event Queue . size , Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 0 ]. tree . size , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . size , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġsimple M aze Game . next ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġassert ( simple M aze Game . event Queue . any Ġ{ Ġe Ġ-> Ġe . tick Ġ== Ġ 1 Ġ&& Ġe . action Ġis ĠMake Decision Ġ&& Ġe . action . player Ref Ġ== Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠ Ġassert ( simple M aze Game . event Queue . any Ġ{ Ġe Ġ-> Ġe . tick Ġ== Ġ 1 Ġ&& Ġe . action Ġis ĠMake Decision Ġ&& Ġe . action . player Ref Ġ== Ġ 1 Ġ}) ĊĠĠĠĠĠĠĠ Ġassert ( simple M aze Game . event Queue . any Ġ{ Ġe Ġ-> Ġe . tick Ġ== Ġ 1 Ġ&& Ġe . action Ġis ĠMake Decision Ġ&& Ġe . action . player Ref Ġ== Ġ 2 Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 2 ]. tree . size , Ġ 1 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . size , Ġ 6 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 0 ]. tree . size , Ġ 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġall Nodes Expanded Before Next One Pick ed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsimple M aze Game . next ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 0 ]. tree . size , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Agent 0 Ġ= Ġagents [ 0 ]. tree [" 0 | 0 | 0 | 0 | 0 "] ĊĠĠĠĠĠĠĠ ĠassertFalse ( root Agent 0 Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Agent 0 !!. action Map . values . count Ġ{ Ġit . visit Count Ġ== Ġ 1 Ġ}, Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Agent 0 . action Map . values . count Ġ{ Ġit . valid Visit Count Ġ== Ġ 2 Ġ}, Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 0 ]. tree . values . flatMap Ġ{ Ġn Ġ-> Ġn . action Map . values Ġ}. count Ġ{ Ġit . visit Count Ġ== Ġ 1 Ġ}, Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 0 ]. tree . values . flatMap Ġ{ Ġn Ġ-> Ġn . action Map . values Ġ}. count Ġ{ Ġit . valid Visit Count Ġ== Ġ 2 Ġ}, Ġ 3 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . values . flatMap Ġ{ Ġn Ġ-> Ġn . action Map . values Ġ}. count Ġ{ Ġit . visit Count Ġ== Ġ 2 Ġ}, Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . values . flatMap Ġ{ Ġn Ġ-> Ġn . action Map . values Ġ}. count Ġ{ Ġit . valid Visit Count Ġ== Ġ 5 Ġ}, Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . values . flatMap Ġ{ Ġn Ġ-> Ġn . action Map . values Ġ}. count Ġ{ Ġit . visit Count Ġ== Ġ 1 Ġ}, Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( agents [ 1 ]. tree . values . flatMap Ġ{ Ġn Ġ-> Ġn . action Map . values Ġ}. count Ġ{ Ġit . valid Visit Count Ġ== Ġ 1 Ġ}, Ġ 6 ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ class ĠM CT S Child Test Ġ{ ĊĠĠĠ Ġclass ĠM CT S Child Test Agent ( tree : ĠMutable Map < String , ĠTT Node >, Ġstate Links : ĠMutable Map < String , ĠMutable Set < String >>, Ġparams : ĠM CT S Parameters , Ġstate Function : ĠM aze State Function ) ĊĠĠĠĠĠĠĠ Ġ: ĠM CT ST r ansp osition Table Agent Child ( tree , Ġstate Links , Ġmutable Map Of (), Ġparams , Ġstate Function , ĠSimple Action Random ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġvar Ġrol lout Calls Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġexpansion Calls Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġtree Calls Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġaction Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġhardcoded Actions Ġ= ĠlistOf < Action >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġto Ġmake Ġtrajectory Ġvisible Ġfor Ġtesting ĊĠĠĠĠĠĠĠ Ġfun Ġtrajectory () Ġ= Ġtrajectory ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnext Hard Coded Action (): ĠAction ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Index Ġ>= Ġhardcoded Actions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhardcoded Actions [ action Index Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrol lout ( state : ĠAction Abstract GameState , Ġplayer Ref : ĠInt ): ĠAction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrol lout Calls ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnext Hard Coded Action () Ġ?: Ġsuper . rol lout ( state , Ġplayer Ref ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexpansion Policy ( node : ĠTT Node , Ġstate : ĠAction Abstract GameState , Ġpossible Actions : ĠList < Action >): ĠAction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpansion Calls ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnext Hard Coded Action () Ġ?: Ġsuper . expansion Policy ( node , Ġstate , Ġpossible Actions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtree Policy ( node : ĠTT Node , Ġstate : ĠAction Abstract GameState , Ġpossible Actions : ĠList < Action >): ĠAction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree Calls ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnext Hard Coded Action () Ġ?: Ġsuper . tree Policy ( node , Ġstate , Ġpossible Actions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġsimple M aze Game Ġ= ĠSimple M aze Game ( 3 , Ġ 1 0 ) ĊĠĠĠ Ġval Ġtree Ġ= Ġmutable Map Of < String , ĠTT Node >() ĊĠĠĠ Ġval Ġparams Ġ= ĠM CT S Parameters () ĊĠĠĠ Ġvar Ġchild Agent Ġ= ĠM CT S Child Test Agent ( tree , Ġmutable Map Of (), Ġparams , ĠM aze State Function ) ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġsimple M aze Game Ġ= ĠSimple M aze Game ( 3 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġtree . clear () ĊĠĠĠĠĠĠĠ Ġchild Agent Ġ= ĠM CT S Child Test Agent ( tree , Ġmutable Map Of (), Ġparams , ĠM aze State Function ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Trajectory Pop ulated And Back Propagation Is Correct () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġ" 0 |" Ġ+ ĠM aze State Function ( simple M aze Game ) ĊĠĠĠĠĠĠĠ Ġtree [ root ] Ġ= ĠTT Node ( params , Ġsimple M aze Game . possible Actions ( 0 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tree . size , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( tree . containsKey ( root )) ĊĊĠĠĠĠĠĠĠ Ġval Ġactions Selected Ġ= Ġmutable ListOf < Action >() ĊĠĠĠĠĠĠĠ Ġval Ġstates En Route Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions Selected . add ( child Agent . getAction ( simple M aze Game , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions Selected . last (). apply ( simple M aze Game ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates En Route . add (" 0 |" Ġ+ ĠM aze State Function ( simple M aze Game )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . trajectory (). size , Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġchild Agent . back Propag ate ( 5 . 0 , Ġ 5 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tree . size , Ġ 2 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( tree . containsKey ( root )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( tree . containsKey ( states En Route [ 0 ])) ĊĊĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġ 5 ). forEach Ġ{ Ġi Ġ-> ĠassertEquals ( actions Selected [ i ], Ġchild Agent . trajectory (). poll (). chosen Action ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtree Policy () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTree Ġpolicy Ġwill Ġpriorit ise Ġunused Ġactions Ġfirst ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠM aze State Function ( simple M aze Game ) ĊĠĠĠĠĠĠĠ Ġtree [ root ] Ġ= ĠTT Node ( params , Ġsimple M aze Game . possible Actions ( 0 )) ĊĠĠĠĠĠĠĠ Ġtree [ root ] !!. update ( Move ( 0 , ĠDirection . LEFT ), Ġsimple M aze Game . possible Actions ( 0 ), Ġ 5 . 0 ) ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( child Agent . tree Policy ( tree [ root ] !! , Ġsimple M aze Game , Ġsimple M aze Game . possible Actions ( 0 )), ĠMove ( 0 , ĠDirection . LEFT )) ĊĠĠĠĠĠĠĠ Ġtree [ root ] !!. update ( No Action ( 0 , Ġ 1 ), Ġsimple M aze Game . possible Actions ( 0 ), Ġ 4 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . tree Policy ( tree [ root ] !! , Ġsimple M aze Game , Ġsimple M aze Game . possible Actions ( 0 )), ĠMove ( 0 , ĠDirection . RIGHT )) ĊĠĠĠĠĠĠĠ Ġtree [ root ] !!. update ( Move ( 0 , ĠDirection . RIGHT ), Ġsimple M aze Game . possible Actions ( 0 ), Ġ 4 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . tree Policy ( tree [ root ] !! , Ġsimple M aze Game , Ġsimple M aze Game . possible Actions ( 0 )), ĠMove ( 0 , ĠDirection . LEFT )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . tree Calls , Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . expansion Calls , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . rol lout Calls , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġexpansion Policy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠM aze State Function ( simple M aze Game ) ĊĠĠĠĠĠĠĠ Ġtree [ root ] Ġ= ĠTT Node ( params , Ġsimple M aze Game . possible Actions ( 0 )) ĊĠĠĠĠĠĠĠ Ġtree [ root ] !!. update ( Move ( 0 , ĠDirection . LEFT ), Ġsimple M aze Game . possible Actions ( 0 ), Ġ 5 . 0 ) ĊĠĠĠĠĠĠĠ Ġassert Not Equals ( child Agent . expansion Policy ( tree [ root ] !! , Ġsimple M aze Game , Ġsimple M aze Game . possible Actions ( 0 )), ĠMove ( 0 , ĠDirection . LEFT )) ĊĠĠĠĠĠĠĠ Ġtree [ root ] !!. update ( No Action ( 0 , Ġ 1 ), Ġsimple M aze Game . possible Actions ( 0 ), Ġ 4 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . expansion Policy ( tree [ root ] !! , Ġsimple M aze Game , Ġsimple M aze Game . possible Actions ( 0 )), ĠMove ( 0 , ĠDirection . RIGHT )) ĊĠĠĠĠĠĠĠ Ġtree [ root ] !!. update ( Move ( 0 , ĠDirection . RIGHT ), Ġsimple M aze Game . possible Actions ( 0 ), Ġ 4 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertThrows ( AssertionError :: class . java ) Ġ{ Ġchild Agent . expansion Policy ( tree [ root ] !! , Ġsimple M aze Game , Ġsimple M aze Game . possible Actions ( 0 )) Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . tree Calls , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . expansion Calls , Ġ 3 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . rol lout Calls , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrol lout Policy () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrol lout Actions Ġ= Ġmutable ListOf < Action >() ĊĠĠĠĠĠĠĠ Ġrepeat ( 1 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrol lout Actions . add ( child Agent . rol lout ( simple M aze Game , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( rol lout Actions . count Ġ{ Ġit Ġ== ĠNo Action ( 0 , Ġ 1 ) Ġ}. toDouble (), Ġ 3 3 . 0 , Ġ 1 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( rol lout Actions . count Ġ{ Ġit Ġ== ĠMove ( 0 , ĠDirection . LEFT ) Ġ}. toDouble (), Ġ 3 3 . 0 , Ġ 1 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( rol lout Actions . count Ġ{ Ġit Ġ== ĠMove ( 0 , ĠDirection . RIGHT ) Ġ}. toDouble (), Ġ 3 3 . 0 , Ġ 1 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . tree Calls , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . expansion Calls , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( child Agent . rol lout Calls , Ġ 1 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcorrect Updates With Discount () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġthis Params Ġ= Ġparams . copy ( discount Rate Ġ= Ġ 0 . 9 5 ) ĊĠĠĠĠĠĠĠ Ġvar Ġdiscount Agent Ġ= ĠM CT S Child Test Agent ( tree , Ġmutable Map Of (), Ġthis Params , ĠM aze State Function ) ĊĠĠĠĠĠĠĠ Ġval Ġtest State Ġ= Ġsimple M aze Game . copy () Ġas ĠAction Abstract GameState ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġ" 0 |" Ġ+ ĠM aze State Function ( test State ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Node Ġ= ĠTT Node ( this Params , Ġtest State . possible Actions ( 0 )) ĊĠĠĠĠĠĠĠ Ġtree [ root ] Ġ= Ġroot Node ĊĊĠĠĠĠĠĠĠ Ġtest State . register Agent ( 0 , Ġdiscount Agent ) ĊĠĠĠĠĠĠĠ Ġdiscount Agent . hard coded Actions Ġ= ĠList ( 1 0 ) Ġ{ ĠMove ( 0 , ĠDirection . RIGHT ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest State . next ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġdiscount Agent . back Propag ate ( 1 . 0 , Ġtest State . n Ticks ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Node . action Map [ Move ( 0 , ĠDirection . RIGHT )] ?. visit Count , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( root Node . action Map [ Move ( 0 , ĠDirection . RIGHT )] ?. mean , Ġ 0 . 9 5 . pow ( 9 )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMC Statistics Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck Mean () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĠMC Statistics () ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . mean , ĠDouble . NaN ) ĊĠĠĠĠĠĠĠ Ġstats . sum Ġ+= Ġ 1 0 . 0 ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . mean , ĠDouble . NaN ) ĊĠĠĠĠĠĠĠ Ġstats . visit Count ++ ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . mean , Ġ 1 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġstats . sum Ġ+= Ġ 2 5 . 0 ĊĠĠĠĠĠĠĠ Ġstats . visit Count ++ ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . mean , Ġ 1 7 . 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest UCT Default () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= ĠMC Statistics ( params Ġ= ĠM CT S Parameters ( C Ġ= Ġ 2 . 0 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . UCT Score (), ĠDouble . POSITIVE _ INFINITY ) ĊĠĠĠĠĠĠĠ Ġstats . sum Ġ= Ġ 3 0 . 0 ĊĠĠĠĠĠĠĠ Ġstats . visit Count Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġstats . valid Visit Count Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . UCT Score (), Ġ 3 . 0 Ġ+ Ġ 2 . 0 Ġ* ĠMath . sqrt ( Math . log ( 1 0 0 . 0 ) Ġ/ Ġ 1 0 )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠTT Node Test Ġ{ ĊĊĠĠĠ Ġval Ġall Actions Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( 0 , ĠDirection . LEFT ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMove ( 0 , ĠDirection . RIGHT ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNo Action ( 0 , Ġ 1 )) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġupdate Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠTT Node ( M CT S Parameters (), Ġall Actions ) ĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= Ġnode . action Map [ No Action ( 0 , Ġ 1 )] !! ĊĠĠĠĠĠĠĠ ĠassertTrue ( node . action Map . values . all Ġ{ Ġit . valid Visit Count Ġ== Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . mean , ĠDouble . NaN ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . max , ĠDouble . NEGATIVE _ INFINITY ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . min , ĠDouble . POSITIVE _ INFINITY ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . sum , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . sum S quares , Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġnode . update ( No Action ( 0 , Ġ 1 ), Ġall Actions , Ġ 2 . 0 ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . mean , Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . max , Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . min , Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . sum , Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . sum S quares , Ġ 4 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . valid Visit Count , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( stats . visit Count , Ġ 1 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( node . action Map . values . all Ġ{ Ġit . valid Visit Count Ġ== Ġ 1 Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Un explo red Actions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠTT Node ( M CT S Parameters (), Ġall Actions ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( node . has Un explo red Actions ()) ĊĠĠĠĠĠĠĠ Ġval Ġactions Ġ= ĠArrayList < Action >( 3 ) ĊĠĠĠĠĠĠĠ Ġactions . add ( node . getRandom Un explo red Action ( all Actions )) ĊĠĠĠĠĠĠĠ Ġnode . update ( actions [ 0 ], Ġall Actions , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( node . has Un explo red Actions ()) ĊĠĠĠĠĠĠĠ Ġactions . add ( node . getRandom Un explo red Action ( all Actions )) ĊĠĠĠĠĠĠĠ Ġnode . update ( actions [ 1 ], Ġall Actions , Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( node . has Un explo red Actions ()) ĊĠĠĠĠĠĠĠ Ġactions . add ( node . getRandom Un explo red Action ( all Actions )) ĊĠĠĠĠĠĠĠ Ġnode . update ( actions [ 2 ], Ġall Actions , Ġ 3 . 0 ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( node . has Un explo red Actions ()) ĊĊĠĠĠĠĠĠĠ ĠassertTrue (( all Actions Ġ- Ġactions ). isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue (( actions Ġ- Ġall Actions ). isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( node . get UCT Action ( all Actions ), Ġactions [ 2 ]) ĊĠĠĠ Ġ} Ċ } ĊĊ