@ file : Suppress (" UN CHECK ED _ CAST ") Ċ Ċ package Ġlab . mars . rl . algo . el ig ibility _ trace . control Ċ Ċ import Ġch . qos . log back . classic . Level Ċ import Ġjavafx . application . Application Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġlab . mars . rl . model . impl . func . Linear Func Ċ import Ġlab . mars . rl . model . impl . func . S utton Tile Coding Ċ import Ġlab . mars . rl . model . impl . md p . Default Action Ċ import Ġlab . mars . rl . model . impl . md p . Epsilon G reedy Function Policy Ċ import Ġlab . mars . rl . problem . Mount ain Car Ċ import Ġlab . mars . rl . problem . Mount ain Car . Car State Ċ import Ġlab . mars . rl . util . async s Ċ import Ġlab . mars . rl . util . await Ċ import Ġlab . mars . rl . util . format Ċ import Ġlab . mars . rl . util . logLevel Ċ import Ġlab . mars . rl . util . matrix . Sparse Matrix Ċ import Ġlab . mars . rl . util . range . range To Ċ import Ġlab . mars . rl . util . range . step Ċ import Ġlab . mars . rl . util . tuples . tuple 2 Ċ import Ġlab . mars . rl . util . ui .* Ċ import Ġorg . junit . Test Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġkotlin . concurrent . thread Ċ Ċ class Ġ` Test ĠOpt imal ĠSar sa ĠÎ» ` Ġ{ ĊĠ Ġval Ġnum Til ings Ġ= Ġ 8 ĊĠ Ġval Ġposition Scale Ġ= Ġnum Til ings Ġ/ Ġ( Mount ain Car . POSITION _ MAX Ġ- ĠMountain Car . POSITION _ MIN ) ĊĠ Ġval Ġvelocity Scale Ġ= Ġnum Til ings Ġ/ Ġ( Mount ain Car . VE LOC ITY _ MAX Ġ- ĠMountain Car . VE LOC ITY _ MIN ) ĊĠĠĊĠ Ġfun Ġfunc (): ĠLinear Func < tuple 2 < Double Array , ĠInt Array >> Ġ{ ĊĠĠĠ Ġval Ġfeature Ġ= ĠS utton Tile Coding ( 5 1 1 , Ġnum Til ings ) Ġ{ Ġ( s , Ġa ) Ġ-> ĊĠĠĠĠĠ Ġs Ġas ĠCar State ĊĠĠĠĠĠ Ġa Ġas ĠDefault Action < Int , ĠCar State > ĊĠĠĠĠĠ Ġtuple 2 ( double ArrayOf ( position Scale Ġ* Ġs . position , Ġvelocity Scale Ġ* Ġs . velocity ), ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( a . value )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠLinear Func ( feature ) ĊĠ Ġ} ĊĠĠĊĠ Ġ@ Test ĊĠ Ġfun Ġ` Mount ain ĠCar ĠUI `() Ġ{ ĊĠĠĠ Ġval Ġprob Ġ= ĠMountain Car . make () ĊĠĠĠĠĊĠĠĠ Ġval Ġepisode s Ġ= Ġint ArrayOf ( 1 , Ġ 1 2 , Ġ 1 0 4 , Ġ 1 0 0 0 , Ġ 9 0 0 0 ) ĊĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠ Ġl atch . await () ĊĠĠĠĠĠ Ġval ĠQ func Ġ= Ġfunc () ĊĠĠĠĠĠ Ġprob .` True ĠOnline ĠSar sa ( Î» )` ( ĊĠĠĠĠĠĠĠĠĠ ĠQ func Ġ= ĠQ func , ĊĠĠĠĠĠĠĠĠĠ ĠÏĢ Ġ= ĠE psilon G reedy Function Policy ( Q func , Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠĠĠ ĠÎ» Ġ= Ġ 0 . 9 6 , ĊĠĠĠĠĠĠĠĠĠ ĠÎ± Ġ= Ġ 0 . 3 Ġ/ Ġnum Til ings , ĊĠĠĠĠĠĠĠĠĠ Ġepisode s Ġ= Ġ 9 0 0 0 , ĊĠĠĠĠĠĠĠĠĠ Ġz _ maker Ġ= Ġ{ Ġm , Ġn Ġ-> ĠSparse Matrix ( m , Ġn ) Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġstep Listener Ġ= Ġstep @{ Ġepisode , Ġstep , Ġs , Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( episode Ġ! in Ġepisode s ) Ġreturn @ step ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMountain Car UI . render ( episode , Ġstep , Ġs Ġas ĠCar State , Ġa Ġas ĠDefault Action < Int , ĠCar State >) ĊĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠĠĠ ĠMountain Car UI . after Ġ= Ġ{ Ġl atch . count Down () Ġ} ĊĠĠĠ ĠApplication . launch ( Mount ain Car UI :: class . java ) ĊĠ Ġ} ĊĠĠĊĠ Ġ@ Test ĊĠ Ġfun Ġ` Early Ġperformance Ġon Ġthe ĠMountain ĠCar `() Ġ{ ĊĠĠĠ Ġlog Level ( Level . ERROR ) ĊĠĠĠ Ġval Ġprob Ġ= ĠMountain Car . make () ĊĠĠĠĠĊĠĠĠ Ġval Ġepisode s Ġ= Ġ 5 0 ĊĠĠĠ Ġval Ġruns Ġ= Ġ 1 0 0 ĊĠĠĠ Ġval ĠÎ± s Ġ= Ġ 0 . 2 5 .. 1 . 7 5 Ġstep Ġ 0 . 2 5 ĊĠĠĠ Ġval ĠÎ» s Ġ= ĠlistOf ( 0 . 0 , Ġ 0 . 6 8 , Ġ 0 . 8 4 , Ġ 0 . 9 2 , Ġ 0 . 9 6 , Ġ 0 . 9 8 , Ġ 0 . 9 9 ) ĊĠĠĠĠĊĠĠĠ Ġval Ġchart Ġ= ĠLine Chart (" Early Ġperformance Ġon Ġthe ĠMountain ĠCar Ġtask Ġof ĠSar sa ( Î» )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Î± Ġx Ġnumber Ġof Ġtil ings Ġ( 8 )", Ġ" steps Ġper Ġepisode ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Axis Config Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Auto R anging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound Ġ= Ġ 3 0 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower Bound Ġ= Ġ 1 6 5 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( Î» Ġin ĠÎ» s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= ĠLine (" Î» =$ Î» Ġ") ĊĠĠĠĠĠĠĠ Ġasync s ( Î± s ) Ġ{ ĠÎ± Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Step Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠ Ġasync s ( runs ) Ġ{ Ġrun Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠQ func Ġ= Ġfunc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstep Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprob .` Sar sa ( Î» ) Ġlinear Ġtrace `( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Op Ġ= Ġ` repl acing Ġtrace `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQ Ġ= ĠQ func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÏĢ Ġ= ĠE psilon G reedy Function Policy ( Q func , Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÎ» Ġ= ĠÎ» , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÎ± Ġ= ĠÎ± Ġ/ Ġnum Til ings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode s Ġ= Ġepisode s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Step Ġ= Ġ 5 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz _ maker Ġ= Ġ{ Ġm , Ġn Ġ-> ĠSparse Matrix ( m , Ġn ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode Listener Ġ= Ġ{ Ġ_, Ġ_ step Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ+= Ġ_ step ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" finish Ġ\ t Î» =$ Î» Ġ\ t Î± =${ Î± . format ( 2 )} Ġ\ tr un =$ run Ġ\ t step =$ step ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep ĊĠĠĠĠĠĠĠĠĠ Ġ}. await Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Step Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġtotal Step Ġ/= Ġ( runs Ġ* Ġepisode s ) ĊĠĠĠĠĠĠĠĠĠ Ġprintln (" finish Ġ\ t Î» =$ Î» Ġ\ t Î± =${ Î± . format ( 2 )} Ġ\ tt otal =${ total Step . format ( 2 )} ") ĊĠĠĠĠĠĠĠĠĠ Ġtuple 2 ( Î± , Ġtotal Step ) ĊĠĠĠĠĠĠĠ Ġ}. await Ġ{ Ġ( alpha , Ġstep ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġline [ alpha ] Ġ= Ġstep ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchart Ġ+= Ġline ĊĠĠĠĠĠĠĠ Ġprintln (" finish Ġ\ t Î» =$ Î» ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠD 2 D Chart . charts Ġ+= Ġchart ĊĠĠĠ ĠApplication . launch ( Chart App :: class . java ) ĊĠ Ġ} ĊĠĠĊĠ Ġ@ Test ĊĠ Ġfun Ġ` Comparison `() Ġ{ ĊĠĠĠ Ġlog Level ( Level . ERROR ) ĊĠĠĠ Ġval Ġprob Ġ= ĠMountain Car . make () ĊĠĠĠĠĊĠĠĠ Ġval Ġepisode s Ġ= Ġ 2 0 ĊĠĠĠ Ġval Ġruns Ġ= Ġ 3 0 ĊĠĠĠ Ġval ĠÎ± s Ġ= Ġ 0 . 2 .. 2 . 0 Ġstep Ġ 0 . 2 ĊĠĠĠ Ġval ĠÎ» Ġ= Ġ 0 . 9 ĊĠĠĠ Ġval Ġtraces Ġ= ĠlistOf (` dut ch Ġtrace `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` repl acing Ġtrace `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` repl acing Ġtrace Ġwith Ġclearing `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` acc umul ating Ġtrace `) ĊĠĠĠ Ġval Ġtrace _ description Ġ= ĠlistOf (" dut ch Ġtrace ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" repl acing Ġtrace ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" repl acing Ġtrace Ġwith Ġclearing ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" acc umul ating Ġtrace ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" true Ġonline ĠSar sa ( Î» )") ĊĠĠĠ Ġval Ġchart Ġ= ĠLine Chart (" Summary Ġcomparison Ġof ĠSar sa ( Î» )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Î± Ġx Ġnumber Ġof Ġtil ings Ġ( 8 )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" reward Ġper Ġepisode ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Axis Config Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Auto R anging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtick Unit Ġ= Ġ 5 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound Ġ= Ġ- 1 5 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower Bound Ġ= Ġ- 5 5 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġfor Ġ(( idx , Ġtrace _ desc ) Ġin Ġtrace _ description . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= ĠLine ( trace _ desc ) ĊĠĠĠĠĠĠĠ Ġasync s ( Î± s ) Ġ{ ĠÎ± Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( trace _ desc Ġ== Ġ" acc umul ating Ġtrace " Ġ&& ĠÎ± Ġ> Ġ 0 . 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ async s Ġtuple 2 ( Î± , Ġ- 5 6 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Reward Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠ Ġasync s ( runs ) Ġ{ Ġrun Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreward Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠQ func Ġ= Ġfunc () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ<= Ġtraces . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprob .` Sar sa ( Î» ) Ġlinear Ġtrace `( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace Op Ġ= Ġtraces [ idx ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQ Ġ= ĠQ func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÏĢ Ġ= ĠE psilon G reedy Function Policy ( Q func , Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÎ» Ġ= ĠÎ» , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÎ± Ġ= ĠÎ± Ġ/ Ġnum Til ings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode s Ġ= Ġepisode s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Step Ġ= Ġ 5 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode Listener Ġ= Ġ{ Ġ_, Ġ_ step Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreward Ġ+= Ġ- _ step // reward Ġis Ġnegative Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprob .` True ĠOnline ĠSar sa ( Î» )` ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQ func Ġ= ĠQ func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÏĢ Ġ= ĠE psilon G reedy Function Policy ( Q func , Ġ 0 . 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÎ» Ġ= ĠÎ» , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠÎ± Ġ= ĠÎ± Ġ/ Ġnum Til ings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode s Ġ= Ġepisode s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Step Ġ= Ġ 5 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġepisode Listener Ġ= Ġ{ Ġ_, Ġ_ step , Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreward Ġ+= Ġ- _ step // reward Ġis Ġnegative Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" finish Ġ\ t $ trace _ desc " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t Î± =${ Î± . format ( 2 )} Ġ\ tr un =$ run Ġ\ tre ward =$ reward ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreward ĊĠĠĠĠĠĠĠĠĠ Ġ}. await Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Reward Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġtotal Reward Ġ/= Ġ( runs Ġ* Ġepisode s ) ĊĠĠĠĠĠĠĠĠĠ Ġprintln (" finish Ġ\ t $ trace _ desc " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t Î± =${ Î± . format ( 2 )} Ġ\ tt otal =${ total Reward . format ( 2 )} ") ĊĠĠĠĠĠĠĠĠĠ Ġtuple 2 ( Î± , Ġtotal Reward ) ĊĠĠĠĠĠĠĠ Ġ}. await Ġ{ Ġ( alpha , Ġreward ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġline [ alpha ] Ġ= Ġreward ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchart Ġ+= Ġline ĊĠĠĠĠĠĠĠ Ġprintln (" finish Ġ\ t $ trace _ desc ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠD 2 D Chart . charts Ġ+= Ġchart ĊĠĠĠ ĠApplication . launch ( Chart App :: class . java ) ĊĠ Ġ} Ċ }