From 323df5e43260bbc5ca10b7304eff77ca0c5a428b Mon Sep 17 00:00:00 2001 From: locker98 Date: Mon, 21 Oct 2024 22:49:35 -0400 Subject: [PATCH] files --- README.md | 69 +++- docs/map_generator.png | Bin 0 -> 22418 bytes docs/q-table.png | Bin 0 -> 28436 bytes images/plot_20241021_224820.png | Bin 0 -> 29847 bytes images/plot_20241021_224858.png | Bin 0 -> 30729 bytes map_data.json | 1 + map_generator | 162 ++++++++ q-learning-terrain-navigator.ipynb | 577 +++++++++++++++++++++++++++++ 8 files changed, 808 insertions(+), 1 deletion(-) create mode 100644 docs/map_generator.png create mode 100644 docs/q-table.png create mode 100644 images/plot_20241021_224820.png create mode 100644 images/plot_20241021_224858.png create mode 100644 map_data.json create mode 100755 map_generator create mode 100644 q-learning-terrain-navigator.ipynb diff --git a/README.md b/README.md index 7702ee2..a0843de 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,69 @@ -# q-learning-terrain-navigator +# Q-Learning Terrain Navigator +This repository demonstrates the application of Q-learning algorithm in a jupyter notebook environment. The Q-learning algorithm is used to navigate a terrain map and learn the optimal path. +## Jupyter Notebook + + + +### Description +This notebook show how Q-learning works and demonstrate how it can learn to navigate a terrain map and find the optimal path to travel down. This map made using a pygame program that allows you to interactavly draw out the different parts of the terain. + +### Features +- Create a map for the Q-learning algorithm to try using pygame +- Visualize the map and q-table using a matplotlib +- Implement a multi-threaded version of Q-learning +- Compare different hyper paramaters of Q-learning algorithm + +### Requirements +- Python 3.x +- `jupyter lab` or `jupyter notebook` + +```bash +pip install numpy, matplotlib, threading, tqdm, +``` + + + +## Pygame Map Builder + + + +### Description +This Pygame-based map editor allows users to generate, edit, and save custom maps. Users can define grid sizes, place various terrain types, and automatically apply boundary walls around the grid. The map is saved to a JSON file, and it will load from the file if it exists on startup. + +### Features +- **Adjustable Grid Size**: Use the slider on the right to set the grid size from 5x5 to 15x15. +- **Terrain Types**: Place different terrain types using keyboard shortcuts. +- **Boundary Walls**: Automatically creates a boundary with walls (-1000) around the grid. +- **Save/Load Functionality**: The map is saved to and loaded from `map_data.json`. If you have already created a map it will automatically detect that and load it on start, so you can make simple changes without having to rebuild it again. +### Controls +- **Slider**: Adjust grid size (5x5 to 15x15) using the slider on the right panel. +- **Mouse Click**: Click inside the grid to select a cell and place terrain based on the active key shortcut. + +### Terrain Shortcuts: +- `G`: Place **Goal** (1000) +- `R`: Place **Road** (-1) +- `C`: Place **Cliff** (-100) +- `V`: Place **River** (-10) +- `M`: Place **Mountain** (-50) + +### How to Use +1. **Start the Program**: Run the Python script to start the map editor. +2. **Set Grid Size**: Use the slider on the right panel to adjust the grid size between 5x5 and 15x15. +3. **Edit the Map**: Click on cells and use the keyboard shortcuts to place terrain types. +4. **Save/Load**: On exiting, the current map is saved to `map_data.json`. The map will automatically load the next time the program is started if the file exists. + +### Requirements +- Python 3.x +- `pygame` library +- `numpy` library + +### Installation +Install dependencies using: +```bash +pip install pygame numpy +``` +### Running the Program +```bash +./map_generator +``` diff --git a/docs/map_generator.png b/docs/map_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..9df654a49544948f4a20646a4ae787051d2d8de3 GIT binary patch literal 22418 zcmc({1z43^w=cdB1rZcc5hPVWM3C;Z5Rp=pM!IX!T_&i6(v3=Ycj}^3K)Sm@a?$+9 z0>6Fsx%d0dJ(N5H#hY(L1 z;XL2?N|tX%{5s{P-1vmmdr!=lw?+HCz+?)!B*i3+EdD@|Ec@qP4K8j@--S}|$c0v} z-;`e}`9;BO^NrR0-~tVfqvdp~Pq#J64fVPr&2=qYa- z6H@Lmml;0861@}7#T2cmE!6E&`*kezZ&@m3X(u2h&V(ONd^}qJ zJu-sR$ttamGgPX3F9-**@e$`d6oTKJ+9J6~T^5{@!8G}#{Ck7h|nF85xYDPkYxH65Q{Yb41{n!d>HrQ=DMG$CJ+s;o$^95dA`x|-_Vk2HFu z@r(3Z_zkQ~-TS9o2~@=E+b9?MUNmXeUj5+parWol#e=QdLBZcuRF-S=eR_WuAgfq* z1$V>(ov9p4Tse9(#%Y@77hZY5jkaLlVjHITkwk2fiVqUy6zAxlobWlncmKc( z_4ME%Q1fh9=Ankmn99j9))q;FqUETU19q)~3s*{ec-^K6Mqg2msg>i`mxBFe+LGwyKD7>rqhz+wl_;WpQsS1Nlhs%_N>sWiU z#&Nmh60o1Bsy=$6aZQTm+=UtI@P$i*a2K3GE1uU&MJnG#ADmR&I-uxs&GEY29Nw$4 zwY$4kJ@z(rU+;=HOJU`ZFwM8?G)lY8*^g_75Bge#bCnx|GBi|be7nZ^kQFaG9B>ZW z&J%skiI+@AU6WQOEipY|btYH;JmYS}C%Y{YGM=PbUAM&h`;~&|S)*oRMb%5H4<0n^ z?^$sRAq$7preq=oEY^FTI&G&ua@bu&)_ad4D;=$k)U~49 zjW;V{GZL3?tum%ByQbCZmLPZr?Xe}w_Znhw%n!dfh4Ac(q;Abw35V>S>we+n-8nyy zM3bZD6gZz=_RjZmllCmhM~8zVHzKN`pQi5`Tw7YMaaaZ0P_(3MiFS6rIIP;W8rGX^ zrz_o@yF~U@VcKjThzFcTRaULS)$MfA zzdNU?*D?|wwtu-B!c}|!K9$Drvcp<$A+wP+UlE<1U-j}bkPxSIQm!)Rshzc0TeO=M zWYgl*j;2~9Qst-3(_iR_anPzVDBn-tn`1;i50s+l`tc$7<*AW=(}UC@gKRr>Jh3y9 z7y3_~zu-JZ{RlI~h3D(nui3a={dstE%Y(?`ZsPPC`jvx$g4s{M z%KIwW_cubD>|KJ&n69su|``xTl49QLO*zkZbr`!vV>8vQLMhIDt`;Ihj) zUcm-=W$Iz6)T#@*#{=ur%DC+k^(reOvRF;RLqx4QC`|6! z29^Jf*fH~x0=I&cjIo{hblslcpS`49z9)b5+#C9pduGhCA?2D`S9<>lk?H_;W1kKA z0!pTVO7#}^ScyPAoz^>bRwOg))?E07zFf;O^TIMb-Fnygjsa|3R*ALk`_5DzR%pvq zUIH)vy-!LBTBRg4@zPgq7C6o@UB9lTxK}?t&=WIuAuEcbn`8!xxSYFY*?-vDZGhJ%W!F9gaI5Uo^&o^&Ow$`MmoM&=( zSK?xtg*Vw-j&*8OZ^-6t0S*qv8|R6(Ba_UCt0tc-+)o}m!#rLqjM~a-jj+^6iV&4- zKrY&RTUu0>Fcc?}>Q}37DRp#S*$`9hk2|;Z_T{W=uL9yM>TxB}X;M-g=fnM0=Zy;W zExr9y?r0=?k?kN3mD`xOnzJx*0!L*sW2UF)^Ualn=#>`ojEiJs4WlTJSqm3CwUBi` z7gBiU0S7U+^zu2GH}BqPXpNck3UZf|5EExPpj0k&?ih&=F}hDS#_hRICRB7 zCFT|>BzXOLd5a5imC&PzC8N4tT`et*0Jjen`hILOQA$nh%w_A>W#0*U=J@#A4K+>w zz;~l%E+$PF=iTzS+q-h{^?oH2-Qn+RQ?6tWmR@Q*@0*@H*Pqulbc>n!MCB~O6AdDw zq=$M_%=x-|kI)r+p=ly}cLs}Jrfv`Oe~bAhSVKox>>*;aRF&!Gqfy%;iRen*YS8vV zjaIS}G+jKD-`d_DH7C7v`Ld&z6}m%4WUXUqaFhL=<`elThsNEpvA#tMg42mx)qw&i z_c6Z@MQ1)X9F{@4w%i;!5wTJ^cINK=X!{Gi&D&CfL#o-%agz@Qt*YaUzJLEd;DWxh zw=dC?X@S2>*s0m+Tac|eFMDr(ak|0Q3D1~RTAX2FhrvDC4Nqq=fAbQ~gQp_}Bp%Vz z$lg-TL#$XImv_0yiX3mKt-+$yZa;4G3_o&C334vo>UgY)^#!H7xV^r{l3LjwE3WP9 za_xz0%0zq?+d{(*p1U4N&FJ!S>(YXWufe+<5>dT-3!wSD_pvJ zg^@R;$T~9bVjJhh-F?k^J)Bdswk5KQ7v{5xST$Zc>U1Txo7=>%6Qab)%6UmfHnrsP z&)L3nHi)3@xRQ5rZk>yH^KkULNnb!s?0bJKTm`k>&s!n{y1Sc{&VE7n)ei1z3@s z-KHZiD@3$hTyN0sjgCFe=>BeHGu@_nm|7imr9c8D?X0#k&xnqYbo|$+xf`9sKx=ii5H>p!L9^Scp z8KoF{D!1GQYIi`3k2Y4L)0kKD5^}*|57VVE_9(O9lVyUEJZuSKG_&rAizP4Gs1>Ga|f}vF>g%ZlOvU6_1}j zCAxpO5^IAO?&17+$&M+E+A~ToMo%Xt5!u@DsgB&TE_M>36|D`v*0{%@0?vf4k=3@evR2ti}qx zy4B2x=5^b}*hQP}PdV$x-0!$)?GCS5Zaz2pc?l57ucBvSQDob+gX!~{NT5^^#97VC znVOyKteIWPm8LTI5vSSdw?zX{qZ%8B<+{V=LaMvdDXbs!+Yf%QoIZU{dpF&Yf_J91 zHSX)1xB1$KhiU-X_Z$Z{bKLs}QG$o5 zd_|Z?9*j4gSXQaYi=?Ph9gUTaychN`(q2q!9D!u%lXzfovUU#lsd;LM-vyB_q_S^+ z^NS;9@IdhSfy-QF;p8Te1DIp%QAbtbiC_HTDZcop;NyFN#q3+IA?23-bz0JI^gM9m(eudp1Il?^dT^4bss$$ZU23g zq;d$ACF$5bl(cYZSVHz_tggY*s${lWdDTxD677SPj>q3}&R0?^%0BvXN@CS9e<&Y$ zz|Hpksoaw`a_b{@TUYc%?sC>TXdn-u}RN^uieaKu-PppWh1q z+_=uBQG4FP!Jds+>zH;?WM+Hz=M(qu=3?&X>A7|OB1PAMlgj<$w-u&?L{+1U%Zg(6 zV~*ahD;f!vS{J^3eD!Awp;em1c|ZSLz4CT=NQAwWI2|!&=7*oDsy2OODSzZ~j`B1f z-ZfU%PeHd;R)5|nTxn#f=<(=Cd`d%r()j-B)MikfLz8Qx_FI6?L`2aR-7oA`>S%m3 z%?9~b*VY)Am~?hG7bT+vLm4wl{Ypy(cNr=^43#-)lj0DH>}8hOJlt1qr72Io9&SId zTKFyXH)c4N%!>m>{=GT+*sOX@r01xGo3gZP?U&2Yi7Exm0(MI}4FL@KIS*X%8*)4Y zA2k7vdVL+kH0z3jLPHH*4l1z;6@xtn9p}>oH+!^cX=$IAwEKmJOH{b-C#qKnv$3%W zq6e%tua$208RsI0qZ~Kph^VNfeW`>L3(O*GN!{Gs;NcGTwyhWY0zExX`<9nvXS3J% zQp?PDrQs0}&~kGJ(MQ?8`tjqQanr&6E*k+hiuI9BCbu*+n;?}ti z9gB8h0nst{VdnX*XMTPiC!ic^Xlmj-i(od;aB4JT8q2e{K6mGh2Z(oQPqN%AF z7==a=isaS^9c+yU?zqod^EU%KQXb#i+moy;{rv-9s*-?^kSC*X?2NC~g$oxXJ2;zh zshu<1o!$A&NA4JxyXP%Xy`mWWXGC z_Kk-}N3P*Bn3mdaq8}F$6vKFsEt`w|^-WE&4r@~gCZ+6??t>+EYkO<0*prMD4h{|` zL#3e-%tdd$eY^gSklL(y9HQp#!-qJ%y}hYwWnukhC1>3|s2n|Wb2(jiX6fUlBhTD1 zGP#PJe-5Qpxukul40H?c+q;kcpC1Qc~JJ zX?c)*-T%3RLkK2DBAk2$S5KGNE^77V8V*>s3SqWKLF;u$FBL~#xM9T>@ZQI5a8|54}k5K7M?rsHkZ3nY5CL2@`A@gcljt z2e-rBVa!Int&(rAIusNV;%OKb5-%<*>n9hy<{xvt(!c?ul2mm+c=(Xr;OA8}r$w%= z4E0tRRVuM3iJJXOKfeq8SI%F!pyfh!{yf6nFsP!-YVq~^_wQFuUuzEI!v2z*n=4zF zXvl(J`4St~ef7?$`SU&Ly`+Swv1$_aiLs9?`9=wllwQ$E1pQ1=VChO#LSYjM-hpT+ znvD-v%+d3%U28<%-5yriSHR?tmAe^bn`E#ttE#IVQk~zteY*mw1MA82=g%25A|xdx z2@w4S$b`hix@6>FF)_jeb=SZkQ4akO_3kWIU48vZqR3hk2PSv{`lG3ADrrn6r>9G7 zjBICqUIVrkD(u3KdyZmc+*d?zr1GVXj*dBc&`xF8V=tfgRz_wI^-(s+NPCtbJuyA) z9~f9Y^8IyvL&LY&*f*2{wydsu_6RZ_Gv{`>^Cf13#YC4c*Q|`!ic3r1U}5n!?ayDC z@RvF9GfpDdhy^>Rzr>D(j*iZHw*3@}6$Yod(33?W>>Pqw7cWw_SMM*V{_53<@|`)x%gm}X!lrcT(^&S?k#+`MsaIgmb@cRBgDdvlRvhjxpFDX| zBTO$4S1hUxOc0&MHUwFo;Y#BpzYhKkC$)%U?qS= z={-FpVf`8U%z5f3~Z9~moDjS7>y|_Il!EVKYk1#(8p=12-n^1 zU@aP!Ldh4{izIBYC$33-#0sid0mz;VNQ;BTHZlC0(^!R*K`I8n5{V$xa!vb#+}#m< z1xOhS3pUtFU%8lX-)=50%ifo7u{4fxQA3Q)$>8|MaymRc2LS+$(P3sHM}Ug-q? znHhtf&BaD|hUVdeO`cr_wW8(n-4G7_bK>ISztU8KA-6*At!@ZpEZSRbTtqQCOner5 zBq^CYW5xXo z=hI6H=aN$dYveZsKY#wr^rAQb0^kBArRl!pQsMZyASR`IPo8|LrLc?=`25r>F+}m= zEpGkL5RD&`FVZzfBY4tQj!MstYDUq6*zEA#!Ro{Eg9`+#H`PTs31W)9w|1!gF^l6F zfghOjX!575gV)hN>oRJC#BX_A#w0%?B5E!C+sb;!->X0QEG7Ns^4p_|O0*&x?-F+` zXI2&5{8O@JtlXK;T|D~uu#T3B;ZyrRKROa6m0T()iTrizs6J2MlT(Uq_*1LL7%v@7 z`Gcwihj&4@f{x+916Lcf-Up0-s(Z&@A7S{%t)3YiUpqSf=sIKL!rK!U(<=@ff1pqn z{E<~PHI}eTvmMs-cAsQKdh?aF{jJE;2?&IL`g9(Lkjexpmy(+skPz(}hS`|d*y56s z6J_Y3lnqj3ja0NSC5lzC*xImK+|pLGx+?6bL|A+E(%$Mbxj<~n?c>FcEZ&#)UlrOt zDsM-1uI1-b75FBN(_{WL0Rbnb!ih}Aw$wxnoq@82wf34&IJ1DsZotB0)||I#vA>{S zMK43GOtP}6wH2KxvRX$ISWbdsZNfkbdF|3G3W|yb55>g7Nz|RQl$4d{EYc&Q!p$l= zOen7CPF_%uernM6^-qD_BKGZr_=&d}f{doI)RTo`x_OgTAyrZH1|40fdvC1x#kHBX zn9XM?Hr!LWDYI|)>hCoI7LxQpX%1O;NXaikYMJWGGj1+fDsJ5A8@vw*e@|;?dpp#f z&uU7NgNLVkVYs3KFC)1@U84ERm#aCNsCQFmc?LAnUzBt$ zN_I2>O4wbW)#f((RmVwyGHH)}9~u#1GBr8r;3c4B05O;J3pr3|5f>ffWDqLiR*n|} zB|pz-*zK?kZ<3J~(!#otm!Tt1uwj_q!-wziLLgV>*3{3YFz0U3VD_P~{@PUYLSG*K zmxeM*sW8rKG&HD~prD|dxL~z2l`sjAZdPZa8zLZ&({OQhIy$eSfpwue9MGDqzP9WzTwfXfQc0KHd_3+ID%U zx#D1hrJ!xncA*FBPL5u4sxst31gn&PQ~C}v7sr{;~dJY~t}yv6!t_Y+-S!f}#|iE^A{_~P990MZ4(!0D}(aZG8L&!`yM zS#&e~rPuNw)qfJudC9p=5Dh%D)PnY(Qd61KT(@Qo&WmJX9Q;T?pQ0g&Q3Ucfhg$y;SX^1nb%$Rr4%Ne<^Mi2G@d_Ajh zbxA=3ieqzF)tP4tSiY~6Yd|FAxc=Lbz+Pl2yO9}`ma{s#x@{qY9@6f3Eaqjemy{H~z+ z>i#VT1_sGU{y<3iKNDoAebuCfqobp#X~cYVCh9(K233c%jSLpTHq{Kf0UzBAia2!~ ziA2#v)YLME2m4By8ZT>c?A1YxuF5s+Fz8OF#4xe4+xjo>9oeW`0l$7dhb1KyuuUzS zya;$m)Yg`prELAeIS)1ILo(}Q3bPfEn0V8-qTCao?;tDY#ag&;4+(=41DBPQR1){W4?TGhYH!NB3BHE7MyHY48=SkH~wa~oN{F(kj016~-CFljF zG)BuhR^|U(eF%9`V%t`LREKi=8;z!CXZPD(u87{-b2gR)4DKtmNea93BrYxo+|-9k zXpUQ=6WH%#(01*HT?)!3zd}t1Nb!iy_aRg3&$V`)Kwo9)e^pPilU zDim_s{0-?vR$jgaHY@@biIqdYCAX$@rG^|3d#$5tWRcbM1yWM`b{CeUq$CO<#{dk= z&v4ss9K!kXzm@F8`&GDxM-aKH)@5tdqwAf6h=>RTYh7#W^v-<7^pMkX9wGVz&;ReT zP2s*=aX55_sa1HFNz9jOa2kwzsJp;HEhp-TFl-B0&jPA!tT_S$L8_{%My&bMtirjB zaqa+g0CfQ*ifoPVCjf*<*7{I}3OVHy6R4h};6>a4R3$hE;9|wzWO|1T!Y;M%)3y78 zX596B9bCtE)ZvrsOih+q4Kw{hhVW){u&op z{@7%&dj6D^Hy6QcsLN0*szE;7g1JsE<;p7A+Oq$$*G%^!UNTfG?Luh0(tH^MA0Hng z*Qm3hi%3202scS+q)fcy{#p>NWg z{T85jid{WjFyd2asQB~emnW(xpopVK)Hv5J4grK*$JfT)KPr?tuNcH!lTO z1%URnzd7`S(*Kh~Hf*$ll_F_+q~0 zl4W5KqwdSfUVyvPfhMC?=9pzU`Ixz4&l2H?UTRK!8sq8ZMa#<@f`yHfsn<*fg|*VA z`$a9J2i!_f9gtK`3v3{wBmw8Q8*-rUNRZL5bjMP)YUb*)Dz@UKSfB0i03av4yTIX8 z(v_W^-BV~m15^NH&#s}%)N$w|%)0V4+I1(X>|{X2l?f1Z7j@^CG`W%%BM<;H;*i7T zo7vT@1P^_wnt?qD&28S1D=>Qj%0(+6FrhiSL7U)O?UI0iOOU%7BKWLkIud-#UWiMH zc>JwKZm}K%2Tz%gFjsDe2TY2Y?g09o`i-G~MKYY*+jg-}DLA=)`|fe+a#jNk5azhc zsVd?FTSJkQVq(XTrwBkKoU>#)ER7C#h>n`G9{dj!zUyNh z8112hQwlL4qPCJCl4ITyzNC#Qyc3*7YRLDGba~JvAGsQXHAr#XH=h2*=l2%h4k!PG z6y3@X&Ef?a4{Z;e05G1d$XnLl%NvdIUTgZvat=`uxjbI5ik>T2b=ji|3=Cw`t|3r! z+qdCH4iVe|@;cj{K@C)y6?RZwq=jW(WX{u=hZMZ#?u5cy?y#Ta90{H%D%Mfj4SXM~ z{)k6NNYBWa(x5Dtos$DR?d<+8S|8-m&HV1i5)uxZz4{J|dEGsrl3|ERl_$}FZNF(A z8IQ}3HOK``3hFMRfZl~#0JKaFrQWGql{y&;yn(qA;fQ}IEe0n|r%xHl~_3&9S2 zVza}@ntSS`J&0HsuF9oulb1|D&g})-+PkyldPuq1AQdwZ+kGhb#-391Ti=B8o_nGL zLQNuC*hR6>Tr;iaECuf;5TRscWp6SvuJJ0goc)tFxh%#WK*dH>iX5yE0`@>bRSsp> zJp-aOMqUP`>$|Odb4yhOK;T+VDdWIX8Zd7NS~@yt8dx$iw*8Nw!2G;j0diOv6lQ`- z$Q1R>&2g}IL*i$%WT%^X6FS5#E!m-fHih%F@+-7Z{%uHzo%LB%PnNdfKq1@c=&0b< z$ZG;J&eQIqA1@b0TgvKdwP3J-z*6DsjrnesJkYYSA(={PXlUedl|YXYrWAv&V2X4w zfOP`@V8okeD6;^eSnkXRnVQqIF97fl^!8wb+KhEaS(yx6hUCsd*ZmzVR>OAMiGgEO zxN;YskB*)m_e*;efjdZ}{{H@`T530w&i3|pR*c($F-rPpEECxE<$yES_9H8rWkmK* zR)T0}SXOulC4r6LHPDmCc_2O;p9?+)0*}y3gNwHb0SlC_HZT%U3l9vP(10q0;56=P zO3pKAJ8`o@TSZUr#>jplXe{l;HpcR4%5sZp6x$oelG)Z5K!o#aU>=m%G<1T5cta`- z@VX{aZr-E`FVk_uh{|#18p5o6TTik>2PDlvBM@bm5^%6(o4T#E8S~RyW`^oWKaLiiku5;^r{!VnUcz z?AsRP7};`92~w`Cthi6Bg)=;h*9eQZu`h{^1w;<5B_O<1!`*o;Cr*#ocw>(MC8S|u zN|hf+%*UTfQ_jma`s;3qAb44#&hkKc)UNUR3fbq)n>VcXzct`li$KM-2c0Hug}%gz z^p|T(4ui086cDr=P$qrP{!aJ?a26982nY?&kr53{W+OoTR^(f?r3e_-Kzsq!pUP%? z;}5V;1OXd___~RDe?xG_H|9ENI5`8rT>HJ+$g&3H6F~c7Lgx%nk7SB-xGp>EUkeLE z03kLFrRQPX6Ud(D$;m%<%+g-F_7Xkp7ELAO_{&jMUj8yUk6A1%2`HzW z%MPy8_x{;NeEMVKy4{)#~ZY#~Hpx{<-}^Hq~8wp%vywi5wYq;Tfj#}L4< zwOfGmG)ZwVGm{w22;Rk?9p#iFkEv2SvkC7%exv~(yQ=B|@Ccz45vWh#^3Jx$5!1hy zdGbf2Dsw{PT;<^jMwV~a#1z=CXd#sIO~kddzKLaU|1V54zm=5RgcK?jRHde&uS5QjZ-)M&FhaL$nzE3*EvpPAPqu)3g}n#oSc_BI6)>&=Q0D$0Bk_ewFX**dGgH$ z8w8e1@3%$?84i^em6`Hc&zuLzPaEtpx%Bg(S@_ob(_^!OQUr<~W)H<1vOBIDAVA@& zudk0yNZ>#Y2^Qo`s{W|}PYVWZ$r02p>!0Pos-uQWVSfQsCtsEi+#D!su5tIdn}oNR zAs|FRn8%&(&L}VfSDo;krg<}0w_+a9XfPI_3Mi;KoN|Y%je(u>7g8~Lrf$Qfc?y#M z)n?y4kNDS2_Jqdv>Lg^~b}*7b>v{x&1}U4?Nd&-iVBx3T|53u`Rr%0=rZiywLKf(R z{-L3GmGsfhuMESw;xsXEo{Cr@WaS|+W(?$jBzoct=NX5vrf z2Rp_$hi3K z|Jizn=-^C?M#7I74ig2|Fl2^2cvB_pgTN~e95@Xi~=`zQSR26Q8 z4T{c1-IpIaeZl%l;nt};Z)}EQO_lrXk9Y1IP6K+NFd!fR`sEkeJU(QAeyA-k)pGj} zoa>60BJayLZ3OV-03rSISqW!TOKWRupS7B@as!}m4f3bGV17seuZ9j8ZSZ9<)<~QL zNf@W$i94WQy<9aPKO+`zm<`H=rKROo|M0<-@Su1R^JMZ|c6OiTpo0lU0B_FoJtc@P zJ}&4ImS%s-9&b0D7G`^!JKCMKnm$mYU2@`29-p4pPfM1J;3fJ^@FZQ%7a&^zxZHl= zd;~B&GXT^H+?7Jm{wLYI_uqK(7?Ee`pj|tR4N6;GLxWb0*A>WfZ-BjGnfK}jgMY5) z-CSRf^#%Nwzs!6^B^~GJ?{jI_n#E~L~H$=e-LNi;s}9bl~Q<#5Dr`9 z&6(d|K8rblH1Z0c88MPpFqCbR(gpjB(b;X+?!dwA%q6Y)cjrRdXzi^8~^f z{Ij+AqoOGUJizgBi`wjt6_8~xtw>th+TfIeSFgG%4ik*zCMXN+mSh&OM}KN-Gv@iqvo0VtyE6E7pSOO05XNJX}<&EE;hDGEm;;& z7yuaEmIywzQ~6=8R3P(vQSkYJwa}*$bVQEh^X}1>-#zA1V>y3^1iWtCa8~CJB+wsZ zkaB+gM?22_n|5sT5TM0Jz|m@svvd^a$|N`GiUlPx7}r_(`SV|f$SQQrm%Fb?ISoFQ zF$v!xI_{7A8#$(dwk7L9&F}l;#BMtr_|v7c!XOVlcp&}E#xDN?Q6coar7D%fNh0@E zfq|Fuf6VIIeKYPc=&|Zk+ip; zU;um-l<)aR5)#-N!{si}yLZJsltUlWKnIWmoI>F1*q|!@o6^1F^v7)*S7rI6kgkds zpst*2yQmz-ZTbORklmlke1Q(?(3XU0B!L@asuaktsVW66bIZdO!^IT0goFl@39qoj zo|);+h?ZMJqib0SFqRs0lf3Pioq!M?S*fMQpg}T)z<(u??>nh0m zpf&ui6**{gA$@Z2t(%x^0QEr5h=V0Soy-Q3E@s+6ntu!y8mQ;-5YF^2>0ty{*xyVx z24gxaL8B!VaTUy{IN(PBJc`Tf)`r%0aI$4pRV4w!fm;`q_W@2DP^r0W$YFpJIteQT zEIeR(+#>ty{$geE(`gL@MOM&_7<=rLK-9Z6_awJ)G+4>V$B#_Q=W^qp_Ul235+FwCrEksE;_;~*LIWNKoA z;sJ(umg~Nw54A`OsFd!ja^U{1m)e57y)al3{N~L`=q6b-m2hF?@i7l3)3yUGed&`ieH?4eF}`$O8=7Tqo8p?3KaFi zt+9_vWsY1Rw2VRI3m~4wOO68M2#LpY*Cbs^kar|FQVW(7w*N{Ih3XA?kR0YZQ^fAw zdu953(Lo?%zTgn#b$~%BOT|@50I>!JR8!Q*!2<1?2G#1$wytdFKQZd7T}*#XIlLHl zd-TXt&T6s4f-+LTZVDW?F_3d~po>7&qM8_%dlg!%PMGg)S-5VE;?6sOD4$vcd?&S} zu*mHNm_~ONfAk=aXSdFwl9>7OZRIKmCum)HZNt|#``dQt-<$XdsGfl3()a@^&f6s! zz1~Yw&eXu7dFXW&Bx@+Tq1$WI3XT<_9L+Wi-55)ZQpUI|71Iqexz;LDV6?>e1cVTt zJ3U2K337Ie+E}e+%pQc)ID)A5KZ{)FF!F&hy>fUs8geaR2WLv@oB8MV0>}ch!PEHo z;~+DGgX0g#28L zPyoq@Rv|P6Kp{@U_BS9>op%RufQW*k30fw6G)Xb?k_-R*)ai8MtYO9@towQG&HURG zO;YQHp0+L_o1qpbNP+*-zgHO_a$b{y4gfvxD_lmGAjyt_aX*%vl5QE^CV=U_g@Sq# z2j>Dgxde3AU_Jxd9mekjiyzZ?>W+n7xKup9wN$da@GOEGbSsd1Z!$Aa<+KXt6x;^& zAJgC=?6PzI@?}hy0T>q(utXsD^^&3glQ>R!W0>X$BP zl<%BKh7oE0@|tEQojg_#KV;vp6wbdHmo=Mk(!omK#X8ZOi z7;G(2m;*7o4Bz&Ie}74Vz_(Kf1a~_$f`z@X?TtgD4f6w_CzBZrYsGSCb=CKvjL4Qb z5EMWlG#*<`H8~9Oj3F`Qu>~xKepLVMUK|7>;D#~+;oklLAAxuhW`Ko2JiZ9O^Wcsl z=Gr%M zdUTb=^ERR5HHlWJ+^m26Km1((eKYodcjd08UZ-g2gctW)S8ov+OH5UAxqqmNK*T3G zm7kKd{j&oN!)}N>2FoAqh=+aHD5Lm8Y3)=t|F*WagV8GqyL%p!yzi#fyUZzSAqom= z^n);Su4C_`tytblDR!1)e;d0)JMO=C>-^tM#Q)%SH=bH3lSu#(TYQHFP6$8mN-h8D z#*9F8{1O^IaYMlM`;XMJX&+80f7&t$#-pI4S$wI<#n0bI7522a)lJbyJO0qeFm>C1 zl|P{il;n`Z%L>^>I16Y*`ls zJcs`NAq-2_h3ec2ip5&1+d+H?z)S{Q_(*-92uHmATkXcZG){fz0vTMQ4d z_<=_sYZ!((X@flu5_Fwz@QWbm-)92MXo<O4V^+%#qcp><+= zR>m!ic6*AaB2+)xg&Tx3Er9S-r5kC;W++<`jOm41BiztC@SHzVT6itAmB0&myH#*a z5;G=_7GCX!&L|OZZQz-u{3f6+z6GD9^b^u~oLt-w(}^r4+LLeJ#B(1Oh1Hr0`s;@_ zL-nJ2og8|g%_Ic)$ne-19_Gr+%WDE;n)}P;+}+w{;xvnp?L%gV)}qkxrZs?061o+ZIX#Y)rmv;6Qw3a*KGXx9 zj3GHK{EQ$;w}QVDOUiWagPvpb{(CO7+$ty#5H;c%8sA5c;At5f)v^JxY7NcQ?G z`VpU@@+Z z*E5-orDg93IQz6cr%(~*FU_A+#weaW?7BPY#nDoiAiR+@)KgHtkw#lz>adm#$1XN& z{3jY1Gn!JBa#n%5vcb_KYtSra7ht`yzvmZGTS*W>+!J8b)=6M0PU*#S$J48# zsKS6P2&O1xw7_tJGh7yp7sDl!fR=+)-U{wh4(#;_l8P-+TX;y?*|bb&=u&NEtEKQC zwC%qQCYq-0fJH5)Zylon`_oeI{Pb|d;_STD81D#lD+kWDKz|uKjKnFuY_o4OV4>ph zpbQ;tt-hLXIoYrP%evpe-B%+x6?7fy0jct`E4n1deq{{Pw1PQPvI+-wrU2EL_)U}y z@0$T@?(DjKV;4dd`u>X<1Qv6jxx(p}>9S=PBvRdu4r2f>lzHd?es9K{*4fChPrLrHX{7@g?6Hq&F z;V4y1!%x(MM7!A(DNsOiUVL@4ph5_YQ7QI(%il0f=uN3fc#K9-k{1EA7?0Buj=G#% z7}oX`@}mWJ!V*ar2NMcGSqG<@qF9_q@v+wu=0Rs{)%2hY+FdGPfk`&OME&b?{E0$o z(?H@Hpt&W0b{qDGAIP8udZk%Xun+GZ#k%ljmhU8N|JE2^;jj$nNk#`SRo9?jZwl$Q zt0JGO_?fmBj_lwLX$;vykA?oqShctxyuhQrH%6ku;Rne_P~5WLv|ti4LJPbR45{ck zHz1wl%<6>ex(8#sim-zgyeu(^E4RWOI)fM%6Wj6^|ac^AHxCD zxk9&i z(_vFPI0IR^AubG##x(RHHv`@emvJ7u*lSuaXxXKtPbbb?zBRT`G#w>gBhOe|@B)}% z54OoS*i{11*rMS#p-{0S_Ye*dMs@6?hlj&=A>He?eG>(tK*19F4X2^Ysu_BbRv~?@ z3uoJFn>0XX0_^Gj)f(EnCLn4od|-nBc@#i8G^%8Gt2s?tMenM@W*jyR3O4hGoW@hJ zEmgiZ$uj+7*--&{bOSNz5z_LK%ZHw+RXCZN>%lz(#I+8>#-Db0yTuNC@)8|uYfkZ1 z$i!DG_7{=6ddQx5*y|I^n3c?xhRKPr?K4~)WylkW+JcNsu|?xY4vqK=s<6>9@_B!W zV{tT9J{vcu9T=Kr=<(9eFg*fLQ8p`k;LK$EP1tCG=%-%>hVnne68ng1(*ZEc+^#2I59eJFW2*rdov*xHS<_{F*cKwF>+zOkiX^obfI zi&i>fo0>bqxcOqo@ce(8u>FfU_%9m<&^zFv6HOegCWLh2^69F*R9g5LD*99ZepY+u zAd6Z)6$>FY!rcOSiD{o(m$`!m%FhDlynN$u8h-9t zmrTvSm~7@?Uj!p<_*ywB?GeNI57+OjVc6!++^rqy))oBAdW%AK>*dUY{}iUj7dWBq zuAo*o%qh4C`Yi}r?TP`HF91>6#qOa}`YT#Y3XY!2v4eZsh3(N_h#dy1{Z_|n0GAv? zO?sB3==tNVRJeTruDX{NZP{}aXm(&2IB5X`Q8t5BXw>2qCP!7)%+%CjU}Yc2!&DO& z%tOXsm7ev;0k^Yo@a3_Qu zXK!UA3cg7`e?+Ip+s005ftV#Kh`hd^ZBCdjYH z8S;crJVBj%mYyQXcN$)OE7f-WI7j2e=$0DAdy>PYZ>M)(cX`Tw{^LdZdV^sw*}|y8d>CDU|xt{reqv^ zctzFl%CNx74ja6bmH>|<&i?yz?eX)7sMQ=6>Zqq~ksl44^C#_iG!=LGpc{-SQ))d- z$60%f#y2e=Gj?U;z&P>tg*CSWBz>ebR8Q#|9?O|S0ZT2=Mk?ihdmQdB_B`a+taxc4 zUgM||nmT_uNUtP#hTM?iFXO%9lxbGT zY3Nt37)rq<&LPh*{<2W*v+evO=r!dW)lQ!904zVY55l~^{FgLv@nH2_mN~Kv(fHKnh@*vgR z+CwY)bV+Mbr_@8o`2%iJrbV%(5@9M18bfxA^kHh|@&5WAN?UE+2J=})&!G*N!ZKB+ z*`dxJl&{e6lIhO9xIB4FHcfXJrMEfRQ&O((qkO<2tr&``a$|VjaUC4z)@F^ literal 0 HcmV?d00001 diff --git a/docs/q-table.png b/docs/q-table.png new file mode 100644 index 0000000000000000000000000000000000000000..29feeb6a9a2ee8b83caf5aa860cf4b97da541122 GIT binary patch literal 28436 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 literal 0 HcmV?d00001 diff --git a/images/plot_20241021_224820.png b/images/plot_20241021_224820.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca5da6c08640d2a30cee05c14d0221eaeac60fb GIT binary patch literal 29847 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 QNGN5v!9+hz&o1P@0NI^VCIA2c literal 0 HcmV?d00001 diff --git a/images/plot_20241021_224858.png b/images/plot_20241021_224858.png new file mode 100644 index 0000000000000000000000000000000000000000..240c1f93853bf10f21de056ee378e3d37c237e71 GIT binary patch literal 30729 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" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the saved map\n", + "with open(\"map_data.json\", \"r\") as f:\n", + " rewards = np.array(json.load(f))\n", + "\n", + "#rewards[rewards == 1000] = 500\n", + "\n", + "environment_rows = rewards.shape[0]\n", + "environment_columns = rewards.shape[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAGxCAYAAADLfglZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAmWUlEQVR4nO3de3RU5b3/8c8QyCRgLiU2CVEIoUWuckuAwz0KRCBgsadViVQQ6kFBJKIUUpAMWBKFysLKbYGCpQjSdRBElyjhIkiBQ0CIHLxQLZAU5QQBEwiYQPL8/nBlfg5JIOhMnlzer7X2H/PsZ+b57pnM/uTZs2ePwxhjBACABfVsFwAAqLsIIQCANYQQAMAaQggAYA0hBACwhhACAFhDCAEArCGEAADWEEIAAGsIoRrmtddek8PhkMPh0AcffFBmvTFGv/zlL+VwOBQfH1+ltWVlZcnhcGjatGkV9vnnP/8ph8OhJ598UpLUvHlzjR49uooqrNjo0aPVvHlzjzZf1nbp0iW5XK5yX8PS1/jEiRM+GdvbTpw4IYfDoddee83dtmfPHrlcLn377bdl+jdv3lxDhw79SWPm5+fr+eefV/fu3RUaGqoGDRooIiJCgwYN0po1a1RYWPiTHv9G4uPjq/z9VVvVt10AfpygoCC9+uqrZd4IO3fu1JdffqmgoKAqr6ljx46KjY3VqlWrNGfOHPn5+ZXps3LlSknS2LFjJUkbNmxQcHBwldZZWb6s7dKlS5o1a5YklXkNExMTtXfvXjVp0sQnY3tbkyZNtHfvXv3iF79wt+3Zs0ezZs3S6NGjFRoa6tXx/vnPf2rQoEHKzc3Vf/3Xf2n69On62c9+pq+//lrvv/++xowZo08//VTPPfecV8eFbxBCNdQDDzyg119/XYsWLfLYUb766qvq0aOH8vPzrdQ1duxYjR8/Xps3by7z325xcbFWrVql2NhYdezYUZLUuXNnG2VWiq3afv7zn+vnP/+5lbF/DKfTqf/4j/+okrGuXr2q4cOH69y5c9q/f7/atGnjsf7+++/XzJkzdejQoSqpBz8dh+NqqBEjRkiS1q5d627Ly8vT+vXrNWbMmHLvM2vWLHXv3l2NGzdWcHCwunTpoldffVXXXsO29HDJhg0b1KFDBwUEBKhFixb6y1/+csO6kpKSFBgY6J7x/NCWLVt06tQpj/quPeRVUlKiP/3pT2rVqpUCAwMVGhqqDh066KWXXnL3Ke/QmSS5XC45HA6PtkWLFqlv374KDw9Xo0aNdOedd2ru3Lm6cuXKDbfl2tri4+Pdh0KvXUoPRZ05c0bjx49X27Ztdcsttyg8PFx33323PvzwQ/fjnDhxwh0ys2bNcj9G6VgVHY5bsWKFOnbsqICAADVu3Fj33XefPv30U48+o0eP1i233KIvvvhCQ4YM0S233KKmTZvq6aefvuEhqilTpigkJETFxcXutokTJ8rhcGjevHnutrNnz6pevXp6+eWX3dvzw+fA5XJpypQpkqSYmJgKDx+/99576tKliwIDA9W6dWutWLHiuvVJ389OP/nkE02fPr1MAJWKjo7W8OHDPdqys7M1cuRIhYeHy+l0qk2bNnrxxRdVUlLi0a+y7xF4DzOhGio4OFi/+c1vtGLFCo0bN07S94FUr149PfDAA1qwYEGZ+5w4cULjxo1Ts2bNJEn79u3TxIkTderUKc2cOdOj7+HDh5WcnCyXy6XIyEi9/vrrmjRpkoqKivTMM89UWFdISIj+8z//U+vWrdOZM2c8/qNfuXKlAgIClJSUVOH9586dK5fLpRkzZqhv3766cuWKPvvss3I/W6iML7/8UklJSYqJiZG/v7+ysrI0Z84cffbZZ5Xa6f3Q4sWLy8wwn332We3YsUOtWrWSJJ07d06SlJqaqsjISF28eFEbNmxQfHy8tm3bpvj4eDVp0kTvvfeeBg0apLFjx+r3v/+9JF139pOenq4//vGPGjFihNLT03X27Fm5XC716NFDmZmZatmypbvvlStXdO+992rs2LF6+umntWvXLj333HMKCQkp8zr/0IABA/TnP/9Z+/fvV48ePSRJW7duVWBgoDIyMtzBsm3bNhljNGDAgHIf5/e//73OnTunl19+WW+++ab7sGLbtm3dfbKysvT0009r2rRpioiI0CuvvKKxY8fql7/8pfr27VthjRkZGZKke++9t8I+1zpz5ox69uypoqIiPffcc2revLneeecdPfPMM/ryyy+1ePFid9+beY/ASwxqlJUrVxpJJjMz0+zYscNIMv/7v/9rjDGma9euZvTo0cYYY9q1a2f69etX4eMUFxebK1eumNmzZ5uwsDBTUlLiXhcdHW0cDoc5fPiwx30GDhxogoODTUFBwXVrLK1r/vz57razZ88ap9NpHnroIY++0dHRZtSoUe7bQ4cONZ06dbru448aNcpER0eXaU9NTTXX+5Mu3eZVq1YZPz8/c+7cues+5rW1XWvevHlGklm2bFmFfa5evWquXLli+vfvb+677z53+5kzZ4wkk5qaWuY+pa/x8ePHjTHGnD9/3gQGBpohQ4Z49MvOzjZOp9MkJSV5bIck8/e//92j75AhQ0yrVq0qrNMYYwoKCoy/v7+ZPXu2McaYf//730aSmTp1qgkMDDTfffedMcaYRx991ERFRbnvd/z4cSPJrFy5ssxzU7oNPxQdHW0CAgLMyZMn3W2XL182jRs3NuPGjbtujYMGDTKS3LWUKikpMVeuXHEvV69eda+bNm2akWT+53/+x+M+jz/+uHE4HObzzz8vd6zrvUf69et33fcXKo/DcTVYv3799Itf/EIrVqzQkSNHlJmZWeGhOEnavn27BgwYoJCQEPn5+alBgwaaOXOmzp49q9zcXI++7dq1c39uUyopKUn5+fn66KOPKlXXDw/Jvf766yosLLxufZLUrVs3ZWVlafz48Xr//fd/8mdbhw4d0r333quwsDD3Nj/88MMqLi7WsWPHfvTjrl27Vn/4wx80Y8YMPfroox7rli5dqi5duiggIED169dXgwYNtG3btjKHzipr7969unz5cpkz9Zo2baq7775b27Zt82h3OBwaNmyYR1uHDh108uTJ647TsGFD9ejRQ1u3bpX0/awjNDRUU6ZMUVFRkXbv3i3p+9lRRbOgyurUqZN7tiFJAQEBuuOOO25YY0VeeuklNWjQwL388G93+/btatu2rbp16+Zxn9GjR8sYo+3bt3v0rex7BN5BCNVgDodDjzzyiFavXq2lS5fqjjvuUJ8+fcrtu3//fiUkJEiSli9frn/84x/KzMzU9OnTJUmXL1/26B8ZGVnmMUrbzp49e8O6xowZoyNHjujAgQOSvj8UFxMTo7vuuuu6901JSdGf//xn7du3T4MHD1ZYWJj69+/vfpybkZ2drT59+ujUqVN66aWX9OGHHyozM1OLFi2SVHabK2vHjh0aPXq0Hn744TJnYM2fP1+PP/64unfvrvXr12vfvn3KzMzUoEGDfvR4pc93eWfLRUVFlXk9GjZsqICAAI82p9Op77777oZjDRgwQPv27VNBQYG2bt2qu+++W2FhYYqNjdXWrVt1/PhxHT9+/CeHUFhYWJk2p9N5w+eoNLiuDaukpCRlZmYqMzNTXbp08Vh39uzZCp+70vXSzb9H4B2EUA03evRoffPNN1q6dKkeeeSRCvu98cYbatCggd555x3df//96tmzp+Li4irsf/r06QrbytuBlFeXn5+fVqxYoaysLB06dEhjxowpc+LAterXr6/Jkyfro48+0rlz57R27Vrl5OTonnvu0aVLlyR9/19zeR+yf/PNNx63N27cqIKCAr355psaOXKkevfurbi4OPn7+9+w/op8/PHHGj58uPr166fly5eXWb969WrFx8dryZIlSkxMVPfu3RUXF6cLFy786DFLn++vv/66zLqvvvpKt956649+7Gv1799fRUVF2rVrl7Zt26aBAwe62zMyMtyfyfTv399rY96M0no2bdrk0R4eHq64uDjFxcWV+XpCWFhYhc+dJPfzd7PvEXgHIVTD3XbbbZoyZYqGDRumUaNGVdjP4XCofv36Ht/duXz5sv72t7+V2//o0aPKysryaFuzZo2CgoLK/KdZnqioKA0aNEhr167VokWLVK9evevWV57Q0FD95je/0YQJE3Tu3Dn32WLNmzdXbm6u/u///s/dt6ioSO+//77H/UsDz+l0utuMMeWGR2VkZ2dr8ODBatGihdavX68GDRqU6eNwODzGk74Prr1793q0lfapzH/XPXr0UGBgoFavXu3R/u9//1vbt2/3aiB069ZNwcHBWrBggU6fPu3e6Q8YMECHDh3S3//+d7Vt29Y9i6jIzWzfzbjvvvvUtm1bpaWl6bPPPqvUffr3769PPvmkzGHkVatWyeFwuGfnN/segXcQQrXA888/r40bN173y42JiYm6ePGikpKSlJGRoTfeeEN9+vQps8MsFRUVpXvvvVcrV67Ue++9p5EjRyojI0MzZsxQw4YNK1XX2LFj9e233+qVV15RQkKCmjZtesP7DBs2TCkpKVq/fr127dqlv/3tb1qwYIGio6PdZ4A98MAD8vPz04MPPqh3331Xb775phISEjxOLZa+/6/Z399fI0aM0ObNm7Vhwwbdc889On/+fKXqv9bgwYP17bffaubMmTp69Kj27dvnXs6cOSNJGjp0qLZs2aLU1FRt375dS5Ys0T333KOYmBiPxwoKClJ0dLTeeustbdmyRQcOHKjwCgmhoaF69tlntWnTJj388MPavHmzVq9erbvuuksBAQFKTU39UdtTHj8/P/Xr109btmxRTEyM+wuovXr1ktPp1LZt2yp1KO7OO++U9P1nNXv37tWBAwd+0mzwh/Vt3LhRoaGh6tatm55++mm9/fbb2r17t9555x09++yzysrK8vju3FNPPaXbbrtNiYmJWr58ubZs2aJJkyZp8eLFevzxx3XHHXdIuvn3CLzE9pkRuDk/PDvueso7O27FihWmVatWxul0mhYtWpj09HTz6quvljmLKTo62iQmJpr//u//Nu3atTP+/v6mefPmHme7VUZRUZGJiIgo92ytH471wzPQXnzxRdOzZ09z6623Gn9/f9OsWTMzduxYc+LECY/7vfvuu6ZTp04mMDDQtGjRwixcuLDcs+Pefvtt07FjRxMQEGBuu+02M2XKFLN582YjyezYscPdrzJnx0mqcCk9M6ywsNA888wz5rbbbjMBAQGmS5cuZuPGjeU+/tatW03nzp2N0+k0ktxjXXt2XKlXXnnFdOjQwfj7+5uQkBDzq1/9yhw9etSjz6hRo0yjRo3KPM83OnPwh1566SUjyTz66KMe7QMHDjSSzKZNmzzayzs7zhhjUlJSTFRUlKlXr57H813693WtmznjLC8vz6SlpZmuXbua4OBgU79+fRMeHm4GDhxoFi1aVOYMzpMnT5qkpCQTFhZmGjRoYFq1amXmzZtniouLPfpV9j3C2XHe4zCGb2HBU/PmzdW+fXu98847tksBUMtxOA4AYA0hBACwhsNxAABrmAkBAKwhhAAA1hBCAABrqt1POZSUlOirr75SUFDQDS/xAgCofowxunDhgqKiolSv3vXnOtUuhL766qtKfbMeAFC95eTk6Pbbb79un2p3OO7aiw8CAGqmyuzPq10IcQgOAGqHyuzPq10IAQDqDkIIAGANIQQAsIYQAgBYQwgBAKwhhAAA1hBCAABrCCEAgDU+C6HFixcrJiZGAQEBio2N1YcffuiroQAANZRPQmjdunVKTk7W9OnTdejQIfXp00eDBw9Wdna2L4YDANRQPvll1e7du6tLly5asmSJu61NmzYaPny40tPTr3vf/Px8hYSEeLskAEAVy8vLU3Bw8HX7eH0mVFRUpIMHDyohIcGjPSEhQXv27CnTv7CwUPn5+R4LAKBu8HoIffPNNyouLlZERIRHe0REhE6fPl2mf3p6ukJCQtwLP+MAAHWHz05MuPbqqcaY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Define the colormap for the grid values\n", + "cmap = colors.ListedColormap(['black', 'red', (0.5451, 0.2706, 0.0745), 'blue', 'gray', (0,1,0)])\n", + "# Bounds now account for the actual range of values, with small gaps between to handle exact matching\n", + "bounds = [-1000.5, -100.5, -99.5, -49.5, -9, -0.5, 2000.5]\n", + "norm = colors.BoundaryNorm(bounds, cmap.N)\n", + "\n", + "# Create the plot\n", + "plt.imshow(rewards, cmap=cmap, norm=norm)\n", + "\n", + "\n", + "# Display the plot\n", + "plt.title(\"Map Visualization with Goal\")\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Visualization Functions\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def graph(q_table, save=False, title=\"\"):\n", + " # Define the colormap for the grid values\n", + " #fig, ax = plt.subplots(figsize=(8, 8), dpi=200) # Increased figure size and DPI\n", + "\n", + " cmap = colors.ListedColormap(['black', 'red', (0.5451, 0.2706, 0.0745), 'blue', 'gray', (0,1,0)])\n", + " # Bounds now account for the actual range of values, with small gaps between to handle exact matching\n", + " bounds = [-1000.5, -100.5, -99.5, -49.5, -9, -0.5, 1000.5]\n", + " norm = colors.BoundaryNorm(bounds, cmap.N)\n", + "\n", + " \n", + " # Create the plot for rewards\n", + " plt.imshow(rewards, cmap=cmap, norm=norm)\n", + " \n", + " # Calculate the optimal direction from Q-table\n", + " # Directions: up (0), right (1), down (2), left (3)\n", + " optimal_directions = np.argmax(q_table, axis=2)\n", + " \n", + " # Initialize arrays for arrow direction (dx, dy) at each grid point\n", + " dx = np.zeros_like(optimal_directions, dtype=float)\n", + " dy = np.zeros_like(optimal_directions, dtype=float)\n", + " \n", + " # Define movement deltas for [up, right, down, left]\n", + " move_map = {\n", + " 0: (0, -1), # up\n", + " 1: (1, 0), # right\n", + " 2: (0, 1), # down\n", + " 3: (-1, 0), # left\n", + " }\n", + "\n", + " # Fill in dx, dy based on optimal directions, but only if the sum of Q-values is not zero\n", + " for i in range(optimal_directions.shape[0]):\n", + " for j in range(optimal_directions.shape[1]):\n", + " if np.sum(q_table[i, j]) != 0: # Check if the Q-values are non-zero\n", + " direction = optimal_directions[i, j]\n", + " dx[i, j], dy[i, j] = move_map[direction]\n", + " \n", + " # Create a meshgrid for plotting arrows\n", + " x, y = np.meshgrid(np.arange(optimal_directions.shape[1]), np.arange(optimal_directions.shape[0]))\n", + " \n", + " # Plot arrows using quiver, only for non-zero vectors\n", + " plt.quiver(x, y, dx, dy, angles='xy', scale_units='xy', scale=1, color='black')\n", + " plt.title(title)\n", + "\n", + " if save:\n", + " timestamp = datetime.datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", + " filename = f\"images/plot_{timestamp}.png\"\n", + " plt.savefig(filename, format='png')\n", + " \n", + " # Display the plot with arrows\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def graph_path(path):\n", + " # Define the colormap for the grid values\n", + " cmap = colors.ListedColormap(['black', 'red', (0.5451, 0.2706, 0.0745), 'blue', 'gray', (0,1,0)])\n", + " bounds = [-1000.5, -100.5, -99.5, -49.5, -9, -0.5, 1000.5]\n", + " norm = colors.BoundaryNorm(bounds, cmap.N)\n", + "\n", + " # Create the plot for rewards\n", + " plt.imshow(rewards, cmap=cmap, norm=norm)\n", + "\n", + " move_map = {\n", + " 0: (0, -1), # up\n", + " 1: (1, 0), # right\n", + " 2: (0, 1), # down\n", + " 3: (-1, 0), # left\n", + " }\n", + "\n", + " # Now plot the path taken by the robot\n", + " path_x = [pos[1] for pos in path]\n", + " path_y = [pos[0] for pos in path]\n", + " \n", + " # Create arrows for the robot's path\n", + " for i in range(len(path) - 1):\n", + " start_x, start_y = path_x[i], path_y[i]\n", + " end_x, end_y = path_x[i + 1], path_y[i + 1]\n", + " plt.arrow(start_x, start_y, end_x - start_x, end_y - start_y, color='yellow', head_width=0.2)\n", + "\n", + " # Display the plot with arrows\n", + " plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Q-Learning helper functions\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# define actions\n", + "# we will use numeric (index) to represent the actions\n", + "# 0 = up, 1 = right, 2 = down, 3 = left\n", + "actions = ['up', 'right', 'down', 'left']" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# because we will end the episode if we reach Goal\n", + "def is_terminal_state(current_row_index, current_column_index):\n", + " if rewards[current_row_index, current_column_index] != np.max(rewards): # it is not terminal if the rewards is -1\n", + " return False\n", + " else:\n", + " return True\n", + "\n", + "# this starting location must not be on the road\n", + "def get_starting_location():\n", + " current_row_index = np.random.randint(environment_rows) # get a random row index\n", + " current_column_index = np.random.randint(environment_columns) # get a random column index\n", + " \n", + " while rewards[current_row_index, current_column_index] != -1: # True if it is terminal\n", + " current_row_index = np.random.randint(environment_rows) # repeat to get another random row index\n", + " current_column_index = np.random.randint(environment_columns) # repeat to get another random row index\n", + " return current_row_index, current_column_index # returns a random starting location that is not terminal\n", + "\n", + "\n", + "# define an epsilon greedy algorithm for deciding the next action\n", + "def get_next_action(current_row_index, current_column_index, epsilon):\n", + " if np.random.random() < epsilon: # choose the action with the highest q_values\n", + " return np.random.randint(4)\n", + " else: # choose a random action\n", + " return np.argmax(q_values[current_row_index, current_column_index])\n", + "\n", + "\n", + "# define a function that will get the next location based on the chosen action\n", + "# refer to how the board is drawn physically, with the rows and columns\n", + "def get_next_location(current_row_index, current_column_index, action_index):\n", + " new_row_index = current_row_index\n", + " new_column_index = current_column_index\n", + " if actions[action_index] == 'up' and current_row_index > 0:\n", + " new_row_index -= 1\n", + " elif actions[action_index] == 'right' and current_column_index < environment_columns - 1:\n", + " new_column_index += 1\n", + " elif actions[action_index] == 'down' and current_row_index < environment_rows - 1:\n", + " new_row_index += 1\n", + " elif actions[action_index] == 'left' and current_column_index > 0:\n", + " new_column_index -= 1\n", + " return new_row_index, new_column_index\n", + "\n", + "\n", + "# Define a function that will get the shortest path that is on the white tiles \n", + "def get_shortest_path(start_row_index, start_column_index):\n", + " i = 0\n", + " if is_terminal_state(start_row_index, start_column_index): # check if it is on Goal or Cliff\n", + " return [] # if yes, there are no available steps\n", + " \n", + " else: #if this is a 'legal' starting location\n", + " current_row_index, current_column_index = start_row_index, start_column_index\n", + " shortest_path = []\n", + " shortest_path.append([current_row_index, current_column_index]) # add the current coordinate to the list\n", + "\n", + " while not is_terminal_state(current_row_index, current_column_index): # repeat until we reach Goal or Cliff\n", + " action_index = get_next_action(current_row_index, current_column_index, 1.) \n", + " # get next coordinate \n", + " \n", + " current_row_index, current_column_index = get_next_location(current_row_index, current_column_index, action_index)\n", + " # update that next coordinate as current coordinate\n", + " \n", + " shortest_path.append([current_row_index, current_column_index]) \n", + " # add the current coordinate to the list\n", + "\n", + " i += 1\n", + " if i > 100:\n", + " return 0;\n", + " return shortest_path" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def q_learn_single(epsilon = 0.9, discount_factor = 0.9, learning_rate = 0.9, epochs = 1000,):\n", + " q_values = np.zeros((environment_rows, environment_columns, 4))\n", + " \n", + " for episode in tqdm(range(epochs), desc=\"Training Progress\", unit=\"epochs\", ncols=100): # Adjust `ncols` to shorten the bar\n", + " row_index, column_index = get_starting_location()\n", + "\n", + " while not is_terminal_state(row_index, column_index):\n", + " # choose which action to take (i.e., where to move next)\n", + " action_index = get_next_action(row_index, column_index, epsilon)\n", + "\n", + " # perform the chosen action, and transition to the next state / next location\n", + " old_row_index, old_column_index = row_index, column_index # store the old row and column indexes\n", + " row_index, column_index = get_next_location(row_index, column_index, action_index)\n", + "\n", + " # receive the reward for moving to the new state, and calculate the temporal difference\n", + " reward = rewards[row_index, column_index]\n", + " old_q_value = q_values[old_row_index, old_column_index, action_index]\n", + " temporal_difference = reward + (discount_factor * np.max(q_values[row_index, column_index])) - old_q_value\n", + "\n", + " # update the Q-value for the previous state and action pair\n", + " new_q_value = old_q_value + (learning_rate * temporal_difference)\n", + " q_values[old_row_index, old_column_index, action_index] = new_q_value\n", + "\n", + " print('Training complete!')\n", + "\n", + " return q_values\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def q_learn_single(epsilon = 0.9, discount_factor = 0.9, learning_rate = 0.9, epochs = 1000):\n", + " # Initialize the Q-table with zeros for each state-action pair\n", + " # The shape is (environment_rows, environment_columns, 4) \n", + " # where 4 represents 4 possible actions (e.g., up, down, left, right)\n", + " q_values = np.zeros((environment_rows, environment_columns, 4))\n", + " \n", + " # Iterate through a number of episodes (i.e., learning cycles)\n", + " for episode in tqdm(range(epochs), desc=\"Training Progress\", unit=\"epochs\", ncols=100):\n", + " # Start each episode by selecting a random starting location in the environment\n", + " row_index, column_index = get_starting_location()\n", + "\n", + " # Continue taking actions until the agent reaches a terminal state\n", + " while not is_terminal_state(row_index, column_index):\n", + " # Choose the next action based on an epsilon-greedy policy\n", + " # This function should balance exploration (random) vs exploitation (best known action)\n", + " action_index = get_next_action(row_index, column_index, epsilon)\n", + "\n", + " # Save the old position before taking the action\n", + " old_row_index, old_column_index = row_index, column_index\n", + " \n", + " # Move to the new state based on the chosen action\n", + " row_index, column_index = get_next_location(row_index, column_index, action_index)\n", + "\n", + " # Get the reward for the new state the agent has moved to\n", + " reward = rewards[row_index, column_index]\n", + " \n", + " # Retrieve the Q-value of the old state-action pair\n", + " old_q_value = q_values[old_row_index, old_column_index, action_index]\n", + "\n", + " # Calculate the temporal difference: \n", + " # TD = Reward + Discount * (Max Q-value for the next state) - Old Q-value\n", + " temporal_difference = reward + (discount_factor * np.max(q_values[row_index, column_index])) - old_q_value\n", + "\n", + " # Update the Q-value for the previous state-action pair using the learning rate\n", + " new_q_value = old_q_value + (learning_rate * temporal_difference)\n", + " q_values[old_row_index, old_column_index, action_index] = new_q_value # Assign updated value\n", + "\n", + " # After all episodes, print a message indicating the training is complete\n", + " print('Training complete!')\n", + "\n", + " # Return the Q-values for further use (e.g., evaluation or exploitation phase)\n", + " return q_values\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# single episode\n", + "\n", + "def eposode(epsilon, discount_factor, learning_rate, epochs):\n", + " for episode in range(epochs):\n", + " row_index, column_index = get_starting_location()\n", + " \n", + " while not is_terminal_state(row_index, column_index):\n", + " # choose which action to take (i.e., where to move next)\n", + " action_index = get_next_action(row_index, column_index, epsilon)\n", + " \n", + " # perform the chosen action, and transition to the next state / next location\n", + " old_row_index, old_column_index = row_index, column_index # store the old row and column indexes\n", + " row_index, column_index = get_next_location(row_index, column_index, action_index)\n", + " \n", + " # receive the reward for moving to the new state, and calculate the temporal difference\n", + " reward = rewards[row_index, column_index]\n", + " old_q_value = q_values[old_row_index, old_column_index, action_index]\n", + " temporal_difference = reward + (discount_factor * np.max(q_values[row_index, column_index])) - old_q_value\n", + " \n", + " # update the Q-value for the previous state and action pair\n", + " new_q_value = old_q_value + (learning_rate * temporal_difference)\n", + " q_values[old_row_index, old_column_index, action_index] = new_q_value\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def q_learn_multi(epsilon=0.9, discount_factor=0.9, learning_rate=0.9, epochs=250, threads = 4):\n", + " \n", + " thread_array = []\n", + "\n", + " \n", + " for num in range(threads):\n", + " thread = threading.Thread(target=eposode, args=(epsilon, discount_factor, learning_rate, epochs))\n", + " thread_array.append(thread)\n", + " thread.start()\n", + "\n", + " for thread in thread_array:\n", + " thread.join()\n", + " print('Training complete!')\n", + "\n", + " return q_values\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Q-Learning Multi-threaded\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training complete!\n" + ] + } + ], + "source": [ + "q_values = np.zeros((environment_rows, environment_columns, 4))\n", + "\n", + "q_values = q_learn_multi(0.7, 0.6, 0.1, 500, 12)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa0AAAGxCAYAAADRQunXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxN0lEQVR4nO3deXhU5dn48e9kkkwWkgBZSEKWyTbDLrK8FBABURQQtVrrvtRKacWF8qu11iroW6Xq29YFl2JbxVpcqqKCK5VFNgWRRQFnErKQEAgJ2fdM5vz+GGbMZIEwmTknk9yf65oLzpk5cz9n8pxzP89zNp2iKApCCCGEHwjQugBCCCFEd0nSEkII4TckaQkhhPAbkrSEEEL4DUlaQggh/IYkLSGEEH5DkpYQQgi/IUlLCCGE35CkJYQQwm/0yaR16623YjQa3eY99thjvPfeex0+u2nTJnQ6HZs2bTrj927fvp1ly5ZRWVnZ4T2j0cill17qWYFV9sorr6DT6cjPz9e6KN2Wn5+PTqfjlVdecc3zh/V49tlnGTZsGAaDgbS0NB5++GFaWlrOuNyyZcvQ6XRdvt544w2vlbGz39YZv695/vnn3dbzbDQ3N/PLX/6ShIQE9Ho9Y8eO9WrZAD766COWLVvm9e/1hjfeeIOxY8cSEhJCYmIiixcvpra2ttvLFxQUcNttt5GYmIjBYGDo0KH8+Mc/PvuCKH3QLbfcoqSmprrNCw8PV2655ZYOn62qqlJ27NihVFVVnfF7n3zySQVQ8vLyOryXmpqqzJs3z8MSq+vll1/ucj16q8bGRmXHjh3KiRMnXPN6+3r88Y9/VHQ6nXL//fcrGzduVJ544gklODhYWbBgwRmXLSwsVHbs2NHhNWrUKCU0NFSpqKjwWjnz8vIUQHn55Zc7xO9rRo4cqUyfPt2jZZ966ikFUJ599lll+/btyv79+71bOEVRFi1apPTG3fJrr72mAMrtt9+ubNiwQXnxxReVqKgo5aKLLurW8t9++60SHR2tTJw4Ufn3v/+tbN68WXnjjTeUn/3sZ2ddlsCzT3N9S2RkJD/60Y80LUNDQwMhISF9smXrLQaDQfO/09k4efIkf/zjH1mwYAGPPfYYADNmzKClpYU//OEPLF68mBEjRnS5fFJSEklJSW7z8vPzOXDgADfccAMDBw70ZfE7jd/ffffdd4SGhnLnnXdqXZSz1tDQQGhoqEfLtra2cu+99zJ79mxeeuklAGbOnElERAQ33HADH3/8MXPmzOlyeUVRuOmmm0hOTmbLli0YDAbXe9dcc81Zl0e14UHncMP+/fu5+uqriYqKYvDgwSxZsgSbzYbFYuGSSy4hIiICo9HIE0884bZ8V0NB3Rne0+l01NXVsWrVKtfwyowZM7q9vLP89957LwBpaWmu72m/3CeffMK4ceMIDQ1l2LBh/POf/+x0PT777DNuu+02YmNjCQsLo6mpCYA333yTyZMnEx4ezoABA7j44ovZs2eP23d8/fXXXHvttRiNRkJDQzEajVx33XUUFBR0KPeXX37J1KlTXV36+++/v1vDU2fSnXLeeuutDBgwgAMHDjBr1izCw8OJjY3lzjvvpL6+3u2z//nPf5g0aRJRUVGEhYWRnp7Obbfd5nq/syGsrvzzn//knHPOISQkhMGDB/PjH/+YQ4cOdVq2nJwc5s6dy4ABA0hOTub//b//5/pb9MQnn3xCY2MjP/vZz9zm/+xnP0NRlE6Hqs/kn//8J4qicPvtt3tcruLiYn76058SERFBVFQU11xzDcePH+/wuc6GBzds2MCMGTOIjo4mNDSUlJQUrrrqKre/ZVNTE4888gjDhw8nJCSE6OhoZs6cyfbt212faWxs5P777yctLY3g4GCGDh3KokWLOgy763S6TofKjEYjt956q2vauU1t3LiRX/3qV8TExBAdHc2VV15JcXGx23IHDhxg8+bNru23/WGEruh0Ov7+97/T0NDgWtZZF5977jnOP/984uLiCA8PZ/To0TzxxBOdbmeffPIJs2bNctXz4cOHs3z5csBRJ5977jlXPOfLuc/r7u/mPFTx7rvvcu655xISEsLDDz/crfXszJdffsmxY8c61OWrr76aAQMGsGbNmtMu/8UXX7B3714WL17slrA8pfoxrZ/+9Kecc845vPPOOyxYsIC//vWv/PrXv+aKK65g3rx5rFmzhgsuuID77ruPd9991ysxd+zYQWhoKHPnzmXHjh3s2LGD559//qy+4/bbb+euu+4C4N1333V9z7hx41yf2bdvH//v//0/fv3rX/P+++8zZswYfv7zn/PFF190+L7bbruNoKAg/vWvf/H2228TFBTEY489xnXXXceIESN46623+Ne//kVNTQ3Tpk3j4MGDrmXz8/Mxm8089dRTfPrppzz++OMcO3aMiRMnUlZW5vrcwYMHmTVrFpWVlbzyyiu8+OKL7Nmzhz/+8Y8dyuPc8LuTFLpbToCWlhbmzp3LrFmzeO+997jzzjv529/+5tbC2rFjB9dccw3p6em88cYbfPjhhzz00EPYbLYzlqW95cuX8/Of/5yRI0fy7rvv8vTTT7N//34mT55MdnZ2h7JddtllzJo1i/fff5/bbruNv/71rzz++ONun2ttbcVms53xZbfbXct89913AIwePdrtuxISEoiJiXG93112u51XXnmFzMxMpk+fflbLOjU0NHDhhRfy2WefsXz5cv7zn/8QHx/frdZufn4+8+bNIzg4mH/+85988skn/OlPfyI8PJzm5mYAbDYbc+bM4X//93+59NJLWbNmDa+88gpTpkzhyJEjgKPVfcUVV/B///d/3HTTTXz44YcsWbKEVatWccEFF/SowXD77bcTFBTE6tWreeKJJ9i0aRM33nij6/01a9aQnp7Oueee69p+z7TDddqxYwdz584lNDTUtey8efMAOHz4MNdffz3/+te/WLduHT//+c958sknWbhwodt3/OMf/2Du3LnY7XZefPFF1q5dy913301RUREADz74ID/5yU9c8ZyvhISEs/7dvvnmG+69917uvvtuPvnkE6666iqgZ3V5zJgxbjGCgoIYNmzYGeuyc/8XERHB3LlzCQkJYcCAAVx66aV8//333fr93Zz1gKKHli5dqgDKn//8Z7f5Y8eOVQDl3Xffdc1raWlRYmNjlSuvvNI1r6vjFxs3blQAZePGja55Z3NMq7Plu3KmY1ohISFKQUGBa15DQ4MyePBgZeHChR3W4+abb3Zb/siRI0pgYKBy1113uc2vqalR4uPjlZ/+9Kddlstmsym1tbVKeHi48vTTT7vmX3PNNUpoaKhy/Phxt88OGzasw3qsWrVK0ev1yqpVq077G5xNOW+55RYFcCuToijKo48+qgDK1q1bFUVRlP/7v/9TAKWysrLLuJ0dd2lfJyoqKpTQ0FBl7ty5HcpsMBiU66+/vkPZ3nrrLbfPzp07VzGbzW7zUlNTFeCMr6VLl7qWWbBggWIwGDpdF5PJpMyePbvLde3Mxx9/rADK8uXLz2q5tl544QUFUN5//323+QsWLOjw2zq3V6e3335bAZS9e/d2+f2vvvqqAigvvfRSl5/55JNP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PMFf/vIXVqxYwa5du4iPj+eiiy7qnzcYV/qI//mf/1F++ctfus0bNmyY8rvf/U6jEqnvxIkTCqBs3rxZ66L4XE1NjZKVlaWsX79emT59unLPPfdoXSSfuu+++5TzzjtP62Kobt68ecptt93mNu/KK69UbrzxRo1K5HuAsmbNGte03W5X4uPjlT/96U+ueY2NjUpUVJTy4osvalBCbfWJnlZzczO7d+9m9uzZbvNnz57N9u3bNSqV+qqqqgAYPHiwxiXxvUWLFjFv3jwuvPBCrYuiig8++IAJEyZw9dVXExcXx7nnnstLL72kdbF87rzzzuPzzz/HarUCsG/fPrZu3crcuXM1Lpl68vLyOH78uNv+zWAwMH369H61f3PqdXd590RZWRmtra0MGTLEbf6QIUM4fvy4RqVSl6IoLFmyhPPOO49Ro0ZpXRyfeuONN/jmm2/YtWuX1kVRTW5uLi+88AJLlizh97//PTt37uTuu+/GYDBw8803a108n7nvvvuoqqpi2LBh6PV6WltbefTRR7nuuuu0LppqnPuwzvZvBQUFWhRJU30iaTm1f/6WoigePZPLH915553s37+frVu3al0UnyosLOSee+7hs88+IyQkROviqMZutzNhwgQee+wxAM4991wOHDjACy+80KeT1ptvvslrr73G6tWrGTlyJHv37mXx4sUkJiZyyy23aF08VfXn/VtbfSJpxcTEoNfrO/SqTpw40aF10hfdddddfPDBB3zxxRdeeRZZb7Z7925OnDjB+PHjXfNaW1v54osvWLFiBU1NTej1eg1L6BsJCQmMGDHCbd7w4cN55513NCqROu69915+97vfce211wIwevRoCgoKWL58eb9JWvHx8YCjx5WQkOCa31/2b+31iWNawcHBjB8/nvXr17vNX79+PVOmTNGoVL6nKAp33nkn7777Lhs2bCAtLU3rIvncrFmz+Pbbb9m7d6/rNWHCBG644Qb27t3bJxMWwNSpUztczmC1WklNTdWoROqor6/v8ORbvV7f5055P520tDTi4+Pd9m/Nzc1s3ry5T+/futIneloAS5Ys4aabbmLChAlMnjyZlStXcuTIEX75y19qXTSfWbRoEatXr+b9998nIiLC1dOMiooiNDRU49L5RkRERIdjduHh4URHR/fpY3m//vWvmTJlCo899hg//elP2blzJytXrmTlypVaF82n5s+fz6OPPkpKSgojR45kz549/OUvf+G2227TumheVVtbS05Ojms6Ly+PvXv3MnjwYFJSUli8eDGPPfYYWVlZZGVl8dhjjxEWFsb111+vYak1ou3Ji9713HPPKampqUpwcLAybty4Pn/qN9Dp6+WXX9a6aKrqD6e8K4qirF27Vhk1apRiMBiUYcOGKStXrtS6SD5XXV2t3HPPPUpKSooSEhKipKenKw888IDS1NSkddG8auPGjZ1uy7fccouiKI7T3pcuXarEx8crBoNBOf/885Vvv/1W20JrRJ6nJYQQwm/0iWNaQggh+gdJWkIIIfyGJC0hhBB+Q5KWEEIIvyFJSwghhN+QpCWEEMJvSNISQgjhNyRpCSGE8BuStIQQQvgNSVpCCCH8hiQtIYQQfuP/AwSOumi18DtBAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph(q_values, save=True, title=\"multi-thread: epsilon=0.7, discount_factor=0.6\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Q-Learning Single Threaded\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Training Progress: 100%|████████████████████████████████████| 1000/1000 [00:37<00:00, 26.43epochs/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training complete!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "q_values = np.zeros((environment_rows, environment_columns, 4))\n", + "\n", + "q_values = q_learn_single(0.9, 0.7, 0.1, 1000)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAGxCAYAAAADEuOPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0aUlEQVR4nO3dd3xUZdr4/8/MJJkUkhDSG+kz1IAUWUAELLCsYt191hXb6mN5xMKyxbar6K5i2fWHimXxeb6urgvqqqigqFkQRERBFAXEmYQUEgIppPdM5vz+mOSYSYEwmTmTIdf79ZoXnDbXfSb3Ode579N0iqIoCCGEED5G7+0CCCGEEK6QBCaEEMInSQITQgjhkySBCSGE8EmSwIQQQvgkSWBCCCF8kiQwIYQQPkkSmBBCCJ8kCUwIIYRP8noCu+6660hNTfV4nNTUVK677jq3fudzzz3HP/7xj17jt27dik6n480333RrPE+ZN28e8+bN83YxTsmKFSvQ6XRO44b6epSXl3PdddcRFRVFcHAwM2fOZPPmzQNe/l//+hdnnHEGgYGBREVFceWVV1JcXOz2cvb123pi+/G20tJSVqxYwd69e11a/ptvvmHu3LmEh4ej0+lYtWqVW8sH8Mgjj/DOO++4/XsHq6GhgWXLlpGQkEBgYCCTJ0/mtddeO6XvePfdd5k7dy5hYWGEhIQwfvx41qxZc0rf4fUE9qc//Yn169d7uxgu6S+BCc/77//+b3bu3OntYgxYa2sr5557Lps3b+app57i3XffJTY2lp/+9Kds27btpMs/88wzXHXVVUybNo13332Xxx57jK1btzJnzhyqq6s9Xv7169fzpz/9yeNxtFRaWsqDDz7ocgK7/vrrOXr0KK+99ho7d+7kiiuucG8BGboJ7LLLLuPll1/mgQceYNOmTUyfPp1f/epXrF27dkDLP/roo1x22WVMmDCBN954g/fee49bb72Vtra2UyuIMkykpKQo1157rVu/c/z48crcuXN7jf/kk08UQPn3v//t0vc2NjYOsmSnZu7cuX2uh68Zyuvx7LPPKoDy+eefq+Pa29uVcePGKWeeeeYJl21paVHCw8OVxYsXO43//PPPFUC599573VrWBx54QBkOu4bdu3crgPLSSy+5tLyfn5/yP//zP+4tVA8hISFu32+1tbUp7e3tLi///vvvK4Cydu1ap/Hnn3++kpCQoNhsthMu/9VXXyl6vV557LHHXC5DF4+2wCoqKrjppptITk7GaDQSHR3N7Nmz+c9//qPO01cXok6n47bbbuOf//wnY8eOJTg4mEmTJrFx48ZeMd59912ys7MxGo2kp6fz1FNP9dkF0pe6ujp+97vfkZaWRkBAAImJiSxbtozGxsaTLpuamsqBAwfYtm0bOp0OnU7Xaz3a29u57777SEhIICwsjPPOOw+LxeI0z7x585gwYQKffvops2bNIjg4mOuvv/6Uyvfss89y9tlnExMTQ0hICBMnTuTxxx+nvb3daT5FUXj88cdJSUkhMDCQKVOmsGnTppOu68kMtJxdf9e///3vmEwmjEYj48aN69X10NTUpH5fYGAgo0aNYtq0aaxbt06dZ6B/46qqKm699VYSExMJCAggPT2d++67j9bW1j7LNpA654r169djNpuZOXOmOs7Pz4+rrrqKXbt2ceTIkX6X3b9/P7W1tfzsZz9zGj9z5kxGjRrFW2+95XK53n//fSZPnozRaCQtLY2//vWvfc7XswvRbrfzl7/8BbPZTFBQECNHjiQ7O5unnnrKabkffviBX/3qV8TGxmI0Ghk9ejTXXHON0++/f/9+Lr74YiIiItTuqJdfftnpe/7xj3+g0+koLCx0Gt/VXb9161Z1XNc2tXv3bubMmUNwcDDp6ek8+uij2O12dbnp06cD8Otf/1rdhlesWHHS36yrLDabjeeff15dFhz7vFtvvZVx48YxYsQIYmJiOOecc9i+fXuv72ltbeWhhx5i7NixBAYGEhkZyfz58/n8888BR51sbGzk5ZdfVmN07yIfyO/W9fv885//5Le//S2JiYkYjUby8vJOup79Wb9+PSNGjOAXv/iF0/hf//rXlJaW8uWXX55w+dWrV2M0Grn99ttdLkMXv0F/wwlcffXVfP311zz88MOYTCZqamr4+uuvOX78+EmXff/999m9ezcPPfQQI0aM4PHHH+fSSy/FYrGQnp4OwIcffshll13G2Wefzeuvv47NZuOvf/0rZWVlJ/3+pqYm5s6dS0lJCffeey/Z2dkcOHCA+++/n3379vGf//znhDvI9evX8/Of/5zw8HCee+45AIxGo9M89957L7Nnz+Z///d/qaur46677mLx4sUcPHgQg8Ggznf06FGuuuoq/vCHP/DII4+g1+tPqXyH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2LDhlL5r5MiR/PznP+fIkSMsW7aMwsJCxo0bx9y5c/n3v//Nww8/3O/Bwrnnnsv69espLS11+g1eeeUVgoOD+clPfgKg1s/vvvvO6YKj995775TK2l1/PSKDodPpel1s891337Fz506n7r5Fixaxbt06/vGPf5ywG7G/fcxAf7cT6epCHIjuv/mll17Kiy++yFtvvcUvf/lLdfzLL79MQkKCWr/7c/nll/Pxxx+zadMmrrzySnX8Bx98gF6vV68OHZBTOmN2CmpqapQzzjhDeeKJJ5QNGzYoW7duVZ544gklMDDQ6URdfxdx9HVytOeJ5E2bNil6vV6ZN2+esn79euXNN99UZsyYoaSkpCg6ne6EyzY0NChnnHGGkpSUpPztb39TcnJylI8++kh58cUXlV/84hfKF198cdJ1vPbaaxWj0ai89tpryq5du5TvvvtOUZT+7wPrOmna/aTx3LlzlfHjx/f67oGW7+DBg0pAQIAyb9485YMPPlDefvtt5fzzz1eysrJ6nXz94x//qADKDTfcoHz44YfKiy++qCQmJipxcXEuX8RxKr8joCQnJyvjxo1T1q1bp7z33nvKT3/6UwVQXnvtNXW+M888U3nooYeUd955R9m2bZvywgsvKJGRkcrMmTPVeQZyEUdzc7OSnZ2thIaGKk8++aSSk5OjPPDAA4q/v3+vC2wGWudc1dLSoowfP15JTk5W/vWvfyk5OTnKpZdeqvj5+Slbt251mrev3/7NN99Unn76aSUnJ0fZsGGD8tvf/lbx8/NTbrnlll6xrr322j4veOjp448/VvR6vXLWWWep20/XhVE9f9u+LuK4++67lTfffFPZtm2b8sorryipqalKSkqK0tbWpiiKouzdu1cZMWKEkp6erqxZs0bZsmWLsm7dOuVXv/qVerHMDz/8oISGhiomk0l59dVXlQ8++EBZsmSJAiiPP/64Gs9msylms1kZPXq0snbtWmXTpk3KTTfdpKSlpfV5EUdf21TPfU1jY6MSFBSkzJ49W/nkk0+U3bt3K0eOHDnhb9ZdX3Xm/vvvV3Q6nXL//fcrmzdvVp577jklLi5OycjIcIrd3t6uzJ8/X/H391f+8Ic/KJs2bVLef/995f7771fWrVvntC4xMTHKe++9p+zevVv54YcfTul3G+w9qf05//zzlYiICPXveuONNyqA8uqrrzrN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Oeuss7xdDM1dcMEFyvXXX+807rLLLlOuuuoqL5XI8wBl/fr16rDdblfi4uKURx99VB3X0tKihIeHKy+88IIXSjh0nBYtsLa2Nvbs2cOCBQucxi9YsIDPP//cS6XSXm1tLQCjRo3yckk8b+nSpVxwwQWcd9553i6KJt577z2mTZvGL37xC2JiYjjjjDN48cUXvV0sjzvrrLPYvHkzVqsVgG+//ZbPPvuMn/3sZ14umXYKCgo4duyY0/7NaDQyd+7cYbV/68uQexq9KyorK+no6CA2NtZpfGxsLMeOHfNSqbSlKArLly/nrLPOYsKECd4ujke99tprfP311+zevdvbRdFMfn4+zz//PMuXL+fee+9l165d3HHHHRiNRq655hpvF89j7rrrLmpraxkzZgwGg4GOjg4efvhhfvWrX3m7aJrp2of1tX8rKiryRpGGjNMigXXp+f4wRVFceqeYL7rtttv47rvv+Oyzz7xdFI8qLi7mzjvv5OOPPyYwMNDbxdGM3W5n2rRpPPLIIwCcccYZHDhwgOeff/60TmCvv/46r776KmvXrmX8+PHs3buXZcuWkZCQwLXXXuvt4mlqOO/f+nNaJLCoqCgMBkOv1lZ5eXmvo5bT0e233857773Hp59+6pZ3qQ1le/bsoby8nKlTp6rjOjo6+PTTT1m9ejWtra0YDAYvltAz4uPjGTdunNO4sWPH8tZbb3mpRNr4/e9/z913380VV1wBwMSJEykqKmLlypXDJoHFxcUBjpZYfHy8On647N9O5LQ4BxYQEMDUqVPJyclxGp+Tk8OsWbO8VCrPUxSF2267jbfffpstW7aQlpbm7SJ53Lnnnsu+ffvYu3ev+pk2bRpLlixh7969p2XyApg9e3avWySsVispKSleKpE2mpqaer3R12AwnHaX0Z9IWloacXFxTvu3trY2tm3bdlrv3wbitGiBASxfvpyrr76aadOmMXPmTNasWcPhw4e55ZZbvF00j1m6dClr167l3XffJTQ0VG2BhoeHExQU5OXSeUZoaGivc3whISFERkae1uf+fvOb3zBr1iweeeQR/uu//otdu3axZs0a1qxZ4+2iedTixYt5+OGHGT16NOPHj+ebb77hySef5Prrr/d20dyqoaGBvLw8dbigoIC9e/cyatQoRo8ezbJly3jkkUfIysoiKyuLRx55hODgYK688kovlnoI8O5FkO717LPPKikpKUpAQIAyZcqU0/5ycqDPz0svveTtomlqOFxGryiKsmHDBmXChAmK0WhUxowZo6xZs8bbRfK4uro65c4771RGjx6tBAYGKunp6cp9992ntLa2ertobvXJJ5/0uS1fe+21iqI4LqV/4IEHlLi4OMVoNCpnn322sm/fPu8WegiQ94EJIYTwSafFOTAhhBDDjyQwIYQQPkkSmBBCCJ8kCUwIIYRPkgQmhBDCJ0kCE0II4ZMkgQkhhPBJksCEEEL4JElgQgghfJIkMCGEED5JEpgQQgif9P8DviKmJutpNx4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph(q_values, save=True, title=\"single-thread: epsilon=0.9, discount_factor=0.6\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}