From 140a03b1a125ebf1a1c850ab4c6230b6704824b5 Mon Sep 17 00:00:00 2001 From: SokolovEN <000pulemet000@mail.ru> Date: Sat, 23 May 2026 21:52:19 +0300 Subject: [PATCH 1/2] [1]for 1 zadanie --- SokolovEN/docs/performance_comparison.png | Bin 0 -> 155391 bytes SokolovEN/docs/results.csv | 109 +++++++++ SokolovEN/docs/СтруктурыДанных.py | 257 ++++++++++++++++++++++ SokolovEN/docs/графики.py | 35 +++ 4 files changed, 401 insertions(+) create mode 100644 SokolovEN/docs/performance_comparison.png create mode 100644 SokolovEN/docs/results.csv create mode 100644 SokolovEN/docs/СтруктурыДанных.py create mode 100644 SokolovEN/docs/графики.py diff --git a/SokolovEN/docs/performance_comparison.png b/SokolovEN/docs/performance_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bfdd51dca91671f4dd66f8758ad9ac9362e005 GIT binary patch literal 155391 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�CQ8*(Pm>g^zH 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 SSLD&>WUnz=ow&;O_`d root['name']: + root['right'] = bst_insert(root['right'], name, phone) + else: + root['phone'] = phone + return root + + +def bst_find(root, name): + if root is None: + return None + if name == root['name']: + return root['phone'] + elif name < root['name']: + return bst_find(root['left'], name) + else: + return bst_find(root['right'], name) + + +def _bst_find_min(node): + curr = node + while curr['left'] is not None: + curr = curr['left'] + return curr + + +def bst_delete(root, name): + if root is None: + return None + if name < root['name']: + root['left'] = bst_delete(root['left'], name) + elif name > root['name']: + root['right'] = bst_delete(root['right'], name) + else: + if root['left'] is None: + return root['right'] + elif root['right'] is None: + return root['left'] + else: + successor = _bst_find_min(root['right']) + root['name'] = successor['name'] + root['phone'] = successor['phone'] + root['right'] = bst_delete(root['right'], successor['name']) + return root + + +def bst_list_all(root): + res = [] + + def inorder(node): + if node: + inorder(node['left']) + res.append((node['name'], node['phone'])) + inorder(node['right']) + + inorder(root) + return res + + + +# ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ +def run_experiments(): + N = 10000 + base_records = [(f"User_{i:05d}", f"100{i:05d}") for i in range(N)] + + records_sorted = sorted(base_records, key=lambda x: x[0]) + records_shuffled = base_records[:] + random.shuffle(records_shuffled) + + all_names = [r[0] for r in base_records] + find_existing = random.sample(all_names, 100) + find_non_existing = [f"Missing_{i}" for i in range(10)] + delete_targets = random.sample(all_names, 50) + + all_results = [] + structures = ["LinkedList", "HashTable", "BST"] + data_modes = [("случайный", records_shuffled), ("отсортированный", records_sorted)] + + for mode_name, records in data_modes: + print(f"\n Режим: {mode_name}") + for run in range(1, 6): + print(f" запуск {run}/5") + + + head = None + t = time.perf_counter() + for n, p in records: head = ll_insert(head, n, p) + t_ins = time.perf_counter() - t + + t = time.perf_counter() + for n in find_existing + find_non_existing: ll_find(head, n) + t_find = time.perf_counter() - t + + t = time.perf_counter() + for n in delete_targets: head = ll_delete(head, n) + t_del = time.perf_counter() - t + + all_results.append(["LinkedList", mode_name, "insert", t_ins]) + all_results.append(["LinkedList", mode_name, "find", t_find]) + all_results.append(["LinkedList", mode_name, "delete", t_del]) + + + buckets = [None] * BUCKET_COUNT + t = time.perf_counter() + for n, p in records: ht_insert(buckets, n, p) + t_ins = time.perf_counter() - t + + t = time.perf_counter() + for n in find_existing + find_non_existing: ht_find(buckets, n) + t_find = time.perf_counter() - t + + t = time.perf_counter() + for n in delete_targets: ht_delete(buckets, n) + t_del = time.perf_counter() - t + + all_results.append(["HashTable", mode_name, "insert", t_ins]) + all_results.append(["HashTable", mode_name, "find", t_find]) + all_results.append(["HashTable", mode_name, "delete", t_del]) + + + root = None + t = time.perf_counter() + for n, p in records: root = bst_insert(root, n, p) + t_ins = time.perf_counter() - t + + t = time.perf_counter() + for n in find_existing + find_non_existing: bst_find(root, n) + t_find = time.perf_counter() - t + + t = time.perf_counter() + for n in delete_targets: root = bst_delete(root, n) + t_del = time.perf_counter() - t + + all_results.append(["BST", mode_name, "insert", t_ins]) + all_results.append(["BST", mode_name, "find", t_find]) + all_results.append(["BST", mode_name, "delete", t_del]) + + + averages = [] + for struct in structures: + for mode in ["случайный", "отсортированный"]: + for op in ["insert", "find", "delete"]: + times = [r[3] for r in all_results if r[0] == struct and r[1] == mode and r[2] == op] + avg = sum(times) / len(times) + averages.append([struct, mode, f"{op} (СРЕДНЕЕ)", avg]) + + final_csv_data = [["Структура", "Режим", "Операция", "Время (сек)"]] + all_results + averages + + with open("results.csv", "w", newline="", encoding="utf-8-sig") as f: + writer = csv.writer(f) + writer.writerows(final_csv_data) + + return all_results, averages + + +if __name__ == "__main__": + raw_data, avg_data = run_experiments() + diff --git a/SokolovEN/docs/графики.py b/SokolovEN/docs/графики.py new file mode 100644 index 0000000..bf836a2 --- /dev/null +++ b/SokolovEN/docs/графики.py @@ -0,0 +1,35 @@ +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np + +df = pd.read_csv("results.csv", encoding="utf-8-sig") +df_avg = df[df["Операция"].str.contains("СРЕДНЕЕ")].copy() +df_avg["Операция"] = df_avg["Операция"].str.replace(" (СРЕДНЕЕ)", "") + +modes = ["случайный", "отсортированный"] +operations = ["insert", "find", "delete"] +structures = ["LinkedList", "HashTable", "BST"] + +x = np.arange(len(structures)) +width = 0.35 + +fig, axes = plt.subplots(1, 3, figsize=(18, 5)) + +for i, op in enumerate(operations): + ax = axes[i] + for j, mode in enumerate(modes): + mask = (df_avg["Операция"] == op) & (df_avg["Режим"] == mode) + times = df_avg[mask]["Время (сек)"].values + label = "Случайные данные" if mode == "случайный" else "Отсортированные данные" + ax.bar(x + j * width, times, width, label=label) + + ax.set_title(f"Операция: {op.upper()}") + ax.set_xticks(x + width / 2) + ax.set_xticklabels(structures) + ax.set_ylabel("Время (сек)") + ax.legend() + ax.grid(axis="y", linestyle="--", alpha=0.7) + +plt.tight_layout() +plt.savefig("performance_comparison.png", dpi=300) +plt.show() \ No newline at end of file -- 2.43.0 From 768c8e64f209b64b18c06300df66b2855e88d192 Mon Sep 17 00:00:00 2001 From: SokolovEN <000pulemet000@mail.ru> Date: Sun, 24 May 2026 21:11:08 +0300 Subject: [PATCH 2/2] [2]for zadanie 2 --- SokolovEN/docs/data/empty.txt | 49 ++ SokolovEN/docs/data/experiment_results.csv | 13 + SokolovEN/docs/data/experiment_results.png | Bin 0 -> 80163 bytes SokolovEN/docs/data/large.txt | 54 ++ SokolovEN/docs/data/maze.py | 532 +++++++++++++++++++ SokolovEN/docs/data/maze1.txt | 10 + SokolovEN/docs/data/medium.txt | 48 ++ SokolovEN/docs/data/plots.py | 580 +++++++++++++++++++++ SokolovEN/docs/data/small.txt | 10 + 9 files changed, 1296 insertions(+) create mode 100644 SokolovEN/docs/data/empty.txt create mode 100644 SokolovEN/docs/data/experiment_results.csv create mode 100644 SokolovEN/docs/data/experiment_results.png create mode 100644 SokolovEN/docs/data/large.txt create mode 100644 SokolovEN/docs/data/maze.py create mode 100644 SokolovEN/docs/data/maze1.txt create mode 100644 SokolovEN/docs/data/medium.txt create mode 100644 SokolovEN/docs/data/plots.py create mode 100644 SokolovEN/docs/data/small.txt diff --git a/SokolovEN/docs/data/empty.txt b/SokolovEN/docs/data/empty.txt new file mode 100644 index 0000000..6d0a249 --- /dev/null +++ b/SokolovEN/docs/data/empty.txt @@ -0,0 +1,49 @@ +######################################## +#S # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# E# +######################################## \ No newline at end of file diff --git a/SokolovEN/docs/data/experiment_results.csv b/SokolovEN/docs/data/experiment_results.csv new file mode 100644 index 0000000..b9d6ce1 --- /dev/null +++ b/SokolovEN/docs/data/experiment_results.csv @@ -0,0 +1,13 @@ +maze,strategy,time_ms,visited_cells,path_length,success_rate +Small (10x10),BFS,0.052460000733844936,30.0,14.0,1.0 +Small (10x10),DFS,0.0480999966384843,32.0,14.0,1.0 +Small (10x10),A*,0.07206000154837966,23.0,14.0,1.0 +Medium (50x50),BFS,0.2786600001854822,182.0,92.0,1.0 +Medium (50x50),DFS,0.14713999989908189,93.0,92.0,1.0 +Medium (50x50),A*,0.5699400004232302,182.0,92.0,1.0 +Large (100x100),BFS,0.39185999776236713,201.0,149.0,1.0 +Large (100x100),DFS,0.2371800015680492,151.0,149.0,1.0 +Large (100x100),A*,0.5810399976326153,200.0,149.0,1.0 +Empty,BFS,3.187239999533631,1834.0,86.0,1.0 +Empty,DFS,1.9440599950030446,1797.0,922.0,1.0 +Empty,A*,6.751939994865097,1834.0,86.0,1.0 diff --git a/SokolovEN/docs/data/experiment_results.png b/SokolovEN/docs/data/experiment_results.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9929c6607047c9131e4d25823d8fce18f118c1 GIT binary patch literal 80163 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

  • |eI1?5v@}`LNN6rvqbZld+bjJzzMQ0r|7u_I(&6-Rgeqolg;){o`Bp6P zZUVH~44L9OXzgV7Ys)wLtbo?zKbw2qBRjcN&Jow*eDfy38$KhICCXmI{6Lf4$8MJB z<=riVvbkE2K5pLLUh zk4%9UBvkkGyju0&p-h9ww?6>fXI(Ji~%42%Gsnq8Oi= zx^zIvH)GaLMOu2hB1MdbOqSxii}2B927Qu?@%Cr%ng=$U;G>nSLkgEZc;x8O_M35l zy{8`nn!(VZsHkYK4SM1CWkY@5`q;)~xhHs@(Wa~gJMtNM zPQ7AfON+&}NIY+w_~!DrgR5DbOIDZ1j<;P6CNALmp_sLG8N{rDHE>$G^X8W?AIOdv z=PlxW;1AN1lu)&?nl&AY?^3oasJedR#%1PeUkE#iRYhPke;W!p1Z~SxIjj9v1{TE- zpO1rs6DK7Q&@(N5-P?Wa{(}d8CZlsM4wOgQ-anq1naL_u6{b`5w|m?fedze{i=-1c zA^gYo#w%~w>T{52i?}bpz(`RlK;vrtqxCelw1h`>G&D>Bnqh>$Q6(Vj1N8BOlwxYD z1FTs6HRQE_-@XXSj6`6T3)`3zA3_kI1SuzRB7)cC0~iNMNy+h9`uxswgkeB8fP1I} z)F7_3B5}GLBJQyk6&FWvHNFIsXeuh~n!tb4-kwUt<%N0a%a^=^`zBTv#-JV_T?zwY94Hm(JxQkHzytx{@g zw~!1%;&x>aV?A|3ln9F0!-F59m-bHh!>c-h9YqI%m5qxlmDNEZJ2CO3AnczH#6qN| zP$r(>F7R>$h%lwOn`5Pv#DNHzzTrSsv;s2%lVTJF43PVj+(k=UhJY$` zSks??&mf~90pte-DM5oWZiX*x$F5zdVIZiK3U{OAjg~&uaq}){wAFir)Wk%|$=pGN zc5I4{_V)44lduf7=|7G%1TPP6kX73nxvIBp{$2@c2B z(b3k18wYaBQ&+vky2qyqxEV^x^R57Uc%o7UusJDq%DcC}{{Wqc3(7tN%H#y4D-<3Y z>aigqhgMIrv-^{wreNcz&fmLutZkPxz8hxS{IL{{pA1AzSmQ}xM&|TU?yGA!6mi0i zY>Q`(`gfs*Opx*c?N$T?k(z?j%yJ+@e=FcAtUHa33jH?mp1)^aVVCdSzP0qT_~0Uf z97;hRCEpK^xYW2GJjfW=Qj1A<{3R7OiDU@VmMM*#g8E?gg?20>ttkR-t57t|vq*O_ zIC9?y%MfgWyf)W0dCeRg7XR6?7rKlm_B_f;I2bv!Una{H@UOptYbLV2Rbp%4ci;A| zuEC1if*vTWnyei-G^}BZ?KGS?zJ1};D$)M(PxGm;T+3Q9C$*-H3ghoZ79Bl`|0#R;16(7sl zv&ETI?KZE>2eI9U@7EYA#t4V*CMTD)zjX_!Q2N)FkQ8rZpUs69acTkU;{w(Zj~-n% zH2ew)!EI@pRp3c+>iAh1J3BjmD}HR>C&DsuwVd4CN*6DttB6|A!|~SrRYec{G8R|N zW0k1sKrVu<4wBOfG$&!F>1CMqx(kSAVX`N|!7r}8*$OB!=sYBfIEYjT8R?yw!*6=i z!rt1{jZ*qV2Ig&BBs|cVU?~A(4t7~%qSoRigGq4{xYfo$18?8Hy|}a#3;i9=BS=2b zWNg=(6uo|+?#MK#Rhh4baI|{z)TvWEJSvuXkOZHnHUdjWQHuKn?y9)Cxzgg5S#lHR zkYz)m#m%V9qqfi4k<7uubfF$LZHnqbJ&O2-eFP(1Av6v9Hxj0);k~@hc#8c&5AJUu zPN4MbD714GiG{0euuk?U_ySn)$`D;|-1rW>KK@T0vhpAwD=PQ#Y?sw9DUcyKp(h>Z-22MZNtE{z5khZYpWFrc zv6<4u6@Y#`e7mYNMZf>cyty+h_N=P7j5Jv~T<%0(g=B?21vlU$sFLele z*tz>83hd#mw#xyXUG@zhK2!?}H!01C9So`N{*o^O}{_C1CeD`dR&?;6zzl2SSE>fRBw#8kD<(g$h4dz2VJ(`6v z>~pI6c1r{4_dCE9o+z5T#*Y^hZD^$0SPq~@2L}h35sq@{v1m^dM;>X|m2alh=Y`_H zF_P{93sk(Hhb&k3%AezbbQt1;){gV%ghS3v@lh|<68SiGP3x)Fglz;vy{tUe_mD-X1uKy*xG zq!0#`8M}eJ#~E{8hDc#Vz=KOL2IfL!QC;Zy9(g3greVZ>Vp|pOjcl~Y#NWYzAv!Oj zPLh!dSocc2-xVJ?^-Q`72(xrjrkh zpQfgeqwR40@p%i8(<+S3#1x(=gTc@KET%-y*49=yq&-RYp!Q`4JGUX9Lgz-_S-ip(iO1RFzPLjHc>}G-u6Ugh-#A9ym0Pp zCfHS-LcgUqM>(`4;@Vl**mSVlKpbMn8r%B8Bn~S0UX3AOBP=4GfW8W8kKTVnzH)}M znrLQloH}~z1Kt3>KlI6yZ^Oe5!*!2A#~PzLyA*X9feR ztEH8cT9Dd7sKf2hnW%u{DHETaEedo?4As*XZf>i<^oE9pqy&hvMlbi%3O^+y3c<5g zo3W4hVczud_C~dHb+UA>V8|YBM1+m5UyN9?XKbyPHANl8)9F2z-}LqtKYwmL-kQ*O zB^zMn{JouRyTVh76c9uZ(ks6vZuz{xu#Kb-C)E-bKk$1Y~CK^E{69rKo*EKw`yrb=XN6*6vQK2M>4Q1Q9g z%lNr{$kiFL7G9U82SD5gJi2*tH0>^ZMv7eab@YL8dQEm_EIy`BP_Fwnhwy_mg~mHH zZ*VrKw=(_)v%qjry~8}j+1rqb4VbUvDb!~4VBttJftY%V!UL3ebYvvCBnqu+`D;w2 zXsl5UTLo0?d}nTZp^drl8i!>#o~f{#em13NU7m!YOJR|8x8!=H9vz4WMqn-Iu)1vT4&BE=;u zVogX>P(|F#2p({9T)8s7W@I_?A=GeXLaOxXqelm3MBqg+!VU;|M}0nhyR(7mvbDdk!9bIGQo~GL_qGs;r zRd7y;YRENRCY9hp*I}mujwz@@9aYtkCr|RtTIlfBs2gB8DE3Tr#4ipFfbIr4PxP1C z+s}h?oY+3VbRD(Y=K8D`khSKwg5GexeiZjG@xTr)&4!qk+;5&IO0k0E5AJlq9h z7Ir!W8Hh12P+f(^sdrGJ$pIxSBU0nR@%RUP&Y@O(PCp5yflb7hom>)???+1IJIlh65Bl>icinT3Xhl~t@ zwkY06wACH(8XX@`PfgW;T^Gj%|3eo``Dozz3qf@2Fz%p+!1+K5M;8;2KYWr~w(SHb zzk$<$jeEGs7OtD=zI^znK$}n>KaN^v_kBsYsAemF-@q;_yxlIq#zyoNqZj9lpkUh6 zL|=dZ>hiLP+oCxFdLauL5X5=Av(G@1qiK?8J}WQR)76dszR6r-K7((Eo#%$FZOe%L zin}LfABfonMIV#uNqJ4pUkF6Vk5G{S5etUqL;c6R0$0a9Pp>Y`{GRS38a~lI1}1lM zd|V+;Y#m}Sd@+3YdZz*Ol#twCAfrHsE!x+ex-EUb>-#Jcstin`7aVgHw>y}nAm9S6 zew~^E{OJQWO;C;q3%d|U7Rh7uV0Z$SKA3jN4v~?ah>CsotQ@R4ICWUz(Sm`7OT^;l zXu(-XJPwtQ;pt997Kc=Vu|Na{iwP$+I6zoC{7k4@D!NGM1jAhsR=|rF&;1^hRP_5O})m=n)gsv{EhM%woO(26f zB6EU{(a>=G^=ctq#=EJSosptVye$EhJV|}atUi|gzASr3EvwlFBt^meCr9_3gxFYid$lN`#-xRphF^CXPKx^5;1h6awZ^ZucwqBMiKgc%OPb-WIFT zdiJ+KAfq0`kr@xpjXT$Gzn6e)?a|z%4x*hx^ zpSd!2?}+}f|9mE1Fse|Jkt_Y{Yt7z_g}{CL_DyCx;h%qaoi6;JO&(8a9`Gg6+uIv$ zi%>HmPhI%rxP|0Ss_b%Pxm8<19r{HrFZ{K$EmyLqia9rS>SEp!O0|{c4g({ za1kF;;>nw_1wZeT#a;1g8=xQeZh&?g8923iLZ2Ol8HTnONp zE^KTlO;D=P{pB4DVi4Y6yaj?h*exUgVlM-L_VZ!Dee{z(3}xlsV;@P;E)UBWi%4Ew>4FYh2P z>?VMU!{1}Th%EEqzHu7(?T0Vs1)=lA@Zv?^u&|>RG!(xpGz~kNHV}o0Z@vOTaaH8(x8^XJQ+lJW)xyqZ-IrHgF}IF z?lzM63CW?Qpb1?AfOu$=Ih0b(2T z;5rfpcxXtKXt^-8kBW%chX!3hE{DBxmM|oNriRzuoIz0OJlA28s9g@$lQgRWt-)xx zCieXy#*j(wgy{!YJ%m+h8iB!4=F}iSj^?e z>%Kn9Uk6B{wk+CAhAFdfaC2|Mx{PY_{Q0|ow&9J1eaC3Q?vnAsUK_B86EO`F#YIwF zJaIHykfbmvIaykF9(xz^lyq^rYgT55y0&)x7rTh-dsiO^m+~B^T}J#-kOyfB+=ELr z+Fib~{MoJ||8CcvfMLY;`BLc_*wkPd(?KI>QSq~iigo0e2`gaPJSp$s;bCJK(y;JY zqYN)d*UwOi$Hf_Feo3tT`NPrGbp<5TZUP(}f3DVuuP57c-(kOSo|nlR&BPgPoI}TP zny3oUU>b6A7C`j?@Gv0(&cc0_dhgg%i4zzoR7_M0&Q4C>;nYwZTUa65OZM%9m4+cO z_8&ba5?jsQJXs25lecEl?j^%APq5KOYI$G@v3h zoA9tMI$pgRYhDD63Cpwgp5E&z2ate0b_a%sF7(%&+wPc>cto$hgC)d&l=4r8ymJA3 zsu5b#vBgn(6Wh4_YludvaaC)~jTf{Q9Q=lc2HAk)=b2Zant-lzL(o-tRrpv9V<9qu zXK>Pnz`>(;0=z2Bz2Hs^m5N42N6}o+hAuB0#*j3SS*rNVHBgIqX=p-r>}2qYF*7o==_B!0WT0JQnZZEBV6GE4P*$Sb|HTQaRize z?ixr|QT=y7`Sv3p5Z;NRiKK#}qULig^5e&QUz%KUD=062mUI92(B_7wy`wig2#C$V zltgz&u?dpo>wm9xNp^u305K~@g_a%taA{dlle5 z2n!A6Z`RQGcK|4L$tfvU!0N!P05b<1DO8k{xYee;=ATrhxD6a$U?#Y39>%y}fk6G> z5zy?p=NIxE72R7IV)i+4ALJyiPl#(t^Fj%RhHvma7f0POG6HW3)#Si)vR?Rp){4QA}8wo9}~qQ5!%>OesHpMDQ5ZVh^A| zF|)Lk4_EI)xrdhx4h|x0KQbliy(1wVVos5FFQ{$%X&#l_sNSTu@q6`wDk?lOMu~>g zJMtcD{gZdhPwOArBZiA?{^<^P2ZyG3TWn`P?RdDO*JP!9GfHS72HM2cN|8qA7NIum zg2}_^Kk9_rFGie+L_%_CC;ta%2j4%IbfD=Fk3m$Q($mc`DU!b6t2U+#HUYuQ(PaoG zEcvtMRo9xv#%UZHBnyl7Y)M@A|Q~wjKM?#6$bZdRCN8|+erJ!S$2oyT8|7PdBlC#<0*s7cn0Zf}xCXKeRD+~1%x8q^ z_Cu4OQTzy>J7<7W6vT=osqHLoafwF!dnRqiB5EOUq+==9Ee!+8fB29_9`vsl{GzaRvOPwj=-NJ!QxEPUy0w9xN;$MSVu z9Scq{Qa|J}A)%E%r2s#_Lz3vU(6EvyK%W~r5rIT?cZcp^s|72esGxw0KTgbGjxBzc zz$eXRP^mZi5TUoIpkP>$M+u)stT?+(5I z^Giudi914CK54)vDM@O<#Vs+Gv=L{Oyos+Ea+~4=CbW13mJD?ec12VH-y#tS4^`^B z(T#yQLTdTx&t0h;PON~|rH6Jt`0R5-xOhU=g!|qWl2(G+y=C)v<0nZ-GKrTw0k)yD z2$x`d?Q20Zb_Us36h>f7a~k`%9GS+{1B-U(d8H$E!72;fUXH#x=MH$Iqg=#ExU)Y~=;10$$Bb+!^*MfHquCV*!8%APQy> z_shsIUGUi$cxmDv8L171p_36g0`LEnGn7uy~p~M;B z!h_qh6=S2L-H=Csg~V~w!-u%tE*f|$q8bi+Gyh(I1LP`KG${ho5Q~t%hcjvmE`LF< zP?S*!Zo&hMAP$39YR&vlY#7ggYtbSJ233B3qNM@cG@6RAFztR|rP8{O?`_I!LGT39 zoJIQ(*Jl^|lz=4r3KSgf1prF$TIw@H1D8>X=$0Q>unBz*ZkmOTqCx?f0rT600&6e} zbCQqLiaX4@wefg>K3E#Xix(phUg3wtt2<@Y*}A~xgDo+`l|CKY?$G_+{}+-8o(0!= zg^61bp>`xGNDPVrD*V0%y)?)Y5Sk{i_TFSXJUmA<&wmzz;cr*iMJTwij_%t>17x*2 zjt@qQ915($W_cwgdchld*dZDSc9_51%2oM=afEWnZV^C?nR{2!WcB)5xgi<7&2jzh zBoc*fs00Yri2YYLR8cKRlHQk8A^*8GHaa)gRw&E)YNdNg4*FH0KmY#n@Ou) z1q9-E{zN}mfnm)af;1@5xb^1;#g;$gpcda6dt~|rbP;Sk4Bp2@T!gXqT`uZdG zt`KOzx~XPNx2H6~>BpA6DxvK;o_f#8qFs5H;0}_fNQ=bHLiV4{QfS&lW$~`AuCBIr z6v)gAH*kRc4hV=fvikw6We;EjHj#e03u+mGbLYxXY~o;{M}-C#w>*3(m!gjQ9zOqN zUUnJ#Ay>G7McMZeAsZ=L+fxDB)Wlnu!J1%^2WRo~HDpv;0c=qa2`+=_*RqWc!0K!*PBC&sH1a~jFcW|)RBE4g8IPEK54 z1!xabQf8>nqd*6%x|{IeAbpNw-M~PZLwOiJ<-Q~j`cr&;NeR-x_h=JEm8WUo!HV#hceR^lqo4bXQO z?ybW8c}7O7*ZzErM9>T3os1HcNKnk)E?7&0ct?-|-el-lidtyqH*bCY{yj6Ah=@Aa z*+1`TWl#3U9}0kHQNngsSEK)skfJ+=a0{HWi7O4w8YAW!xT{z~<+JZV!PrfJ->>jP zN(fY(j<0{eH}^C-)b~3@Xb{c1l8I~tKpJ`@<}hPt8DI+hW$n-MxxkB%e);@4-ZAk? zNK}-(|6iuFLX!C8pS8^r^NWgN;Ua3l@FpW|)cu*Z=kRkfU)ipUbt zzoe6f+eb(VU}!#A+!PcP%npH_#mvkM2l~rw#$)Y-be%niXDD=zr02fOUX9kM{k>IL ziY4>|40a`YSGBavjjIDr9Qjzp7MfXHtd*erw66#(oqb8U6ab zKg?Bd}LNJ*OdU&qH;yo)__&+(rO1>9`=pN0GTq`6?uz_tqm z@IVeRDubsivxhMR!qEAs&dcnoY!*Y6qMU#3Hz8TvGjWoHWbu*0JRrzQl`a!(b~0f#I}Yq zFNfv(O8XBS2xIE=g7OGPi0F#~#{-082m+nxWYQ^5^;-Kz-(CxqVaVlMAhdam#Kp}G z(c|pjJBtQvt3>TS-+4N4r=TB4w1Dg@To9c3=fgO(dCgnnK`F?Wv4vWKi9`h&R&Na3 zxP}kz!>fT!6%{z<99?A($r4dx!1M_X2&JMRPsZetdn6DCZQH(EYhA3&86%5i2&JUSlA)YRL^O(Y%B;bx z43V;wDKkkYk|COj5~Z@tNmNQiSSX2v$`IA_J;_)35a&+fm}{WvLmO`(?2VPXDCj!)*?$5S)R>MirKlO z)i-Vk;upWqK54qQ9^cw?1{NWE{(3{@V>ch4@3@y5UlgNzBA4M=nzeu98}|^7fjsak z(jHI^s`7heVJuXz#Ckq-!6xp)EIYeA^3imjKZZEi4kDDr)r0o1Sc!T|CI9ko`JZm% zcZ&S4VD$3kpLjfosK~2ID=O+X&lx>>2dT|QwZ2C$pEj?jt|<9+v-Z2qA8D0-NsWAP z0J*DdqauU*tKjRAEj!}1*}7qC@iQf-2vDJL`*QkVuehYs7|sP-Su7!1)eV=Qp3Pr* z)PH;D&4xd{LE#iuw;RaBYUnmvp`iAB=?M`ktD7e5%OTo|Jj5&Z*0;Nteec18W*Yhi z21z$&MLbOL9%Evd#8H|F#`6L$bLs_uzKn2RL>6HcVW--PZT+@E&TTZlly2geIIV&W z7~RQz?y0ewceGlyY1zx)xLKG%=BYIjQ&bV=~9@PXOHtFWgpBfRZ za#|=pRb+IPVl6rtG!2v}PxJJQal}}4QvF8y_`AAF)H(<&0m?I0)(ldgOY2(1+|=S; z3~BG%SxITCUb}+NM_QQnYOEA48*OFPMgksDI!iYX_L=MkuGmbub=$V~i<0=2<--)o z)Trq1cjACxUg6~=8;GYFUkm6}%+FZG*Nya1{OEFrY(*UzZW3zfZiiK9%!zc+pU>wF zUhG*4o}*!oyhbbj51!p^Ipd($aaZ)`Z(peu{A@@4nb)aka1#?YpDr&rJiL)L0%php zDYhq(^QlY+tZOfw!~vF}c*2`Iv$n3Dz43;$By0?jx{4&q0Yvu`O9vap2~iGUR}W84 z8$s*~du1nR(E-yhgR*ck(jJD>6zI=l1PB_JS>L3rD~w<)Pkl@7F8`>Fv34poZ9sld zNNTs}+11LlkATm05XRaeSqDGb@d)oz=FOcu*UIV!CnAMWXG1r=eMX9M@NbnNH_4h+qZWw zT|rnHKZAZDM&9*K`|*>__ax+W<^_ema>|rPAO}d6Vsy6!1>JG~m!Asl8WA-6c37NE zpY$(p24}nMP&o`Jk`hC1thoHw+zH7n10)t$*0gD@)zqS2{gW`u?^dgy(g)C2TRV%R z@!`X-WV8fzv(>B9V`4l>y;#EDQbeTRuC)>UUmoV8Hq|IEJb|TW1I1o+770%Rl_Z&F zd7_}e6j$Rhu6Y)rp`nru&_$Ug@5#Y+_4KeH`^d>b6W=tlOHM1O^NFRRW7)YEr6N^z z)4;=4TJ!zOW6GWCtXH@yO<89b)lW-{{z%SkLul9WaWHY8oz}1KO#Cr0#rC3;+;-}%{~Vt;@76*NAK+y6z?6G&Iz*ik3aCd zoJ;B{uX0bLE(^Ab=w$EWa(?-{r|iMdeftVAK~)fHv!=|05fBKN{l&tEu=XnK(- z49ADfojrRgazZ#t(drBsg9-9Jy=fOklKm!%7;dm=T}|;w*Sora^>iU&GQ@s;geMZ| zR)7k>(4ti> zbtiU(UD><;yA~joWx}3nsb)AziyWhmt}f2UvE+pgPs__|K{%|@4|VVUbl-yXsJuD9 zD0Nh+HTJP!^)}IXwBp49cm}8?&XlWIjz4w-F zAz?`9~~YcGtMf%fpELg_Qs$Ees~iA%!zW)nzGD z$mTA99k*{92ujHgHT2t}EjAO~r>=mKEX<>Cu8St|($b~K8X-EX&T!y>j@Spw1}>l! zCE^65I*M$@=Sif@<_MLapNr6=YX~Q&q^rjebTrerbNy8eDDl6D22J^%y*0 zmAA-oXa_)pnJ51AP0l^xwPUPi=Ru2SlAeR(;gbX+jFqpqh~Qo`*l!dGz3L6>vP!dM z8KdcK`N+rO%%L5i-d_1#uBCb%AUTo&8XbP^-<+?gQETitS~ujxq|;ZgUY*T?W7*Z3 zHoR!~ByS6N^yi-%Fuiy0PEgk9wTAA4#9P5u*hxo7`^NH(D5py-e^#JyfBlrHt2G?<^xH>{o)9mX9dXZ*E! z$A!lNR4&pm7MJ|U18=r=+YcPj35b-Yp1Hfx&bbfs0KT5g+cAsQjyqby^la(U34PjK zRNCv&`$6;{(+s=#tBr_q=+M4B!5nz2#1aJJ5|*fbsNoHqpdZxw%SEGL^)7465zcaShe4tRZ`$B@W}0$r0Zav2nwIKz%)WV z+HI@nBkZg38xUUfoEzhm6QJ(Lo7Uw&craK)V~sI+2Ko`}0;Hca$R=dQ^L*$7LPJb; zz79eT7o*Rg+qY|17A^rL*bamU%8%I1zIJ{UgaeJpCtOdo{GF4Ig@#etHGwu<#!PxJ z@Bq$L2q6xg5FnWUu$}rN?DmXOZr!e3H7aUQsV`JnJTgVW;ztT{Y;5Rz&dnwoWYEF; z_Ya}1jwTZjIETUlqQfV6-ROJ7f0mLEA)s57SG91P!ZZ^okZOGnl!>@7(0)yu*9u{GFp={}% zc5ww?!h#Y_o`Bc(md<3$(YUgiJUKf%IQ;>-L))rUQI{V)_!w#A@v)(HwvXrSwu%_5 zX<%%8CONtP60h7PEp(=fM^f8IN2h|uD=@6`s2AK<8fp(5JeWaqXw--$6h#zZZXf0% zuB3@-)!Qe-iyeO>V?#w0{fK0oK5`C*d42C6>CmoS&w$?-Ki{Bo5&M7TMPJS=y*NS( zHP_Ci5hoGr^&R9et|!TqxopkqWI5bfeGA+MP!xR^>_C2C-l!h#U9K!%{d1MR=@yad ziZ=<{eLdmKnY&scR+I&SDrieoBs@iRXYGNbnspHkH$_Pa2|M&hvW#WZC~uET4lP`~ zIGWV1#1#3G&&;$R@8@-94=6LX>M_k|Dd=9;4wo>;s^0raMN*`l+VHhj@s3l--IMCT~ zic;NJO zkT4b+qF!rkB9b@u@kh`tNcCl4g7}lb5}u(g8|D7+E;DEw=R<%3f;d;+Km7ug0Pg%& zqed;SNGeQ>H^x_pOmu~h57iwv=M2~!AHOT8c(5s_K#IfMoX7HdJ=~JUc)!X=Ly@*~ zX60F8A0v3bu%4tYX18;bbK{71uOB3jKV;LcLkDia6IN?P#ykQeM@Bsh5gAC+!0Dv7 z6wrOEJb)89Co;7bk)P1z=8!ppWo7xHbM>-)4O{y)R=Ut_-kZ~t9MtXn4&OW&If@&R zf*zHdLc_n!l69XlU*%h6m#^7joT{+4m(3Q*$PmG35pGZlaGFq8vwia#g{oT*RRv~4TOY+~iFzy3OD zW8MJb+m7H8*b$vBtAJTK#c7v8XT0=fUJ2QeZdE!NWJ`R=@uP#41!*U>B6_$sxlK6a zdV6ZKYc2SvlFvNoW&+@~DL?P$4$BSkuZB1mypsH38?}6Bplat}`!K;vpe&v}O zUHY$)=h*ID(KT>|Ulc%{!^-kMyIV!%UEi?gbo-G}4jxGhjY?j=yidC0GzJ(;wOzX* zI`7xE8m0_S^}-J4JWSWk5z9F^aCTg{$6&^q3hb0FdH^oQ0WZe$ZP)~`LBIyO5sJjGG{_y zN;d4@|C_Y%O8BS>#;iCOn?~VBLdo5)TeonQbN>}lg5H7pB}VL8Y$4guxP=-?qpNc3 zu3h6>Qtk|1{T1CvO~iYW7~d3q+s!PlmW#o*ARdY;y8 zu(d!H7{m4j$&ji_7gRW1@Ki*IFkTsE>d%fxLXJ9U(Iay7L*l7Z(R)K?s>pG0{BZB~ zL-BjUG3G9{D3F+I%mf|piJT*)=aerJIxa!|wZg+$z)tXd$KF$rA$NAl zFAyuf`5G5p;s&rVA_SlJ&o{=$%upte!UBmC?)l<#kpu3=OJg2|0fmy8qgR4Ci`WUm z2!y|gPuGN?^E1mbMbjSJhJ%oqNmfVD>=0>N*mq$cs{}-=FlHj

    Hb+E;+~r!6{zjy(927Dpxk;}`5iGB-=HS7T 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 literal 0 HcmV?d00001 diff --git a/SokolovEN/docs/data/large.txt b/SokolovEN/docs/data/large.txt new file mode 100644 index 0000000..90a84ad --- /dev/null +++ b/SokolovEN/docs/data/large.txt @@ -0,0 +1,54 @@ +#################################################################################################### +#S # +# ################################################################################################ # +# # # # +# # ############################################################################################ # # +# # # # # # +# # # ######################################################################################## # # # +# # # # # # # # +# # # # #################################################################################### # # # # +# # # # # # # # # # +# # # # # ################################################################################ # # # # # +# # # # # # # # # # # # +# # # # # # ############################################################################ # # # # # # +# # # # # # # # # # # # # # +# # # # # # # ######################################################################## # # # # # # # +# # # # # # # # # # # # # # # # +# # # # # # # # #################################################################### # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # # # # # # # ################################################################ # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # ############################################################ # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # ######################################################## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # #################################################### # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # ################################################ # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # ############################################ # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # ######################################## # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # #################################### # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # ################################ # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # ############################ # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # ######################## # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # #################### # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # ################ # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # ############ # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # ######## # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # #### # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #E# +#################################################################################################### \ No newline at end of file diff --git a/SokolovEN/docs/data/maze.py b/SokolovEN/docs/data/maze.py new file mode 100644 index 0000000..a74a98c --- /dev/null +++ b/SokolovEN/docs/data/maze.py @@ -0,0 +1,532 @@ +import sys +from collections import deque +import heapq +import time +import os +from abc import ABC, abstractmethod +from typing import List, Optional, Dict, Any + + +DATA_PATH = r"C:\Users\user\Desktop\2026-rff_mp\SokolovEN\docs\data" + + +class Observer(ABC): + @abstractmethod + def update(self, event: str, data: Any = None): + pass + + +class Observable: + def __init__(self): + self._observers: List[Observer] = [] + + def attach(self, observer: Observer): + self._observers.append(observer) + + def detach(self, observer: Observer): + self._observers.remove(observer) + + def notify(self, event: str, data: Any = None): + for observer in self._observers: + observer.update(event, data) + + +class Tile: + def __init__(self, x: int, y: int): + self._x = x + self._y = y + self._wall = False + self._start = False + self._exit = False + + @property + def x(self) -> int: + return self._x + + @property + def y(self) -> int: + return self._y + + @property + def is_wall(self) -> bool: + return self._wall + + @is_wall.setter + def is_wall(self, v: bool): + self._wall = v + + @property + def is_start(self) -> bool: + return self._start + + @is_start.setter + def is_start(self, v: bool): + self._start = v + + @property + def is_exit(self) -> bool: + return self._exit + + @is_exit.setter + def is_exit(self, v: bool): + self._exit = v + + def passable(self) -> bool: + return not self._wall + + def __hash__(self): + return hash((self._x, self._y)) + + def __eq__(self, other): + if not isinstance(other, Tile): + return False + return self._x == other._x and self._y == other._y + + +class Maze: + def __init__(self, w: int, h: int): + self._w = w + self._h = h + self._cells = [[Tile(x, y) for x in range(w)] for y in range(h)] + self._start: Optional[Tile] = None + self._exit: Optional[Tile] = None + + @property + def width(self) -> int: + return self._w + + @property + def height(self) -> int: + return self._h + + @property + def start(self) -> Optional[Tile]: + return self._start + + @property + def exit(self) -> Optional[Tile]: + return self._exit + + def get_cell(self, x: int, y: int) -> Optional[Tile]: + if 0 <= x < self._w and 0 <= y < self._h: + return self._cells[y][x] + return None + + def set_cell(self, x: int, y: int, kind: str): + c = self.get_cell(x, y) + if not c: + return + if kind == 'wall': + c.is_wall = True + elif kind == 'start': + if self._start: + self._start.is_start = False + c.is_start = True + c.is_wall = False + self._start = c + elif kind == 'exit': + if self._exit: + self._exit.is_exit = False + c.is_exit = True + c.is_wall = False + self._exit = c + elif kind == 'path': + c.is_wall = False + + def neighbours(self, cell: Tile) -> List[Tile]: + result = [] + for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]: + nx, ny = cell.x + dx, cell.y + dy + nb = self.get_cell(nx, ny) + if nb and nb.passable(): + result.append(nb) + return result + + +class MazeLoader(ABC): + @abstractmethod + def load(self, filename: str) -> Maze: + pass + + +class TextMazeLoader(MazeLoader): + def load(self, filename: str) -> Maze: + with open(filename, 'r', encoding='utf-8') as f: + lines = [line.rstrip('\n') for line in f.readlines()] + + h = len(lines) + w = max(len(line) for line in lines) if h else 0 + + start_count = 0 + exit_count = 0 + maze = Maze(w, h) + + for y, line in enumerate(lines): + for x, ch in enumerate(line): + if ch == '#': + maze.set_cell(x, y, 'wall') + elif ch == 'S': + maze.set_cell(x, y, 'start') + start_count += 1 + elif ch == 'E': + maze.set_cell(x, y, 'exit') + exit_count += 1 + else: + maze.set_cell(x, y, 'path') + + if start_count != 1 or exit_count != 1: + raise ValueError(f"Maze must have one S and one E. Found: S={start_count}, E={exit_count}") + + return maze + + +class PathFinder(ABC): + def __init__(self): + self._visited = 0 + + @abstractmethod + def find(self, maze: Maze, start: Tile, goal: Tile) -> List[Tile]: + pass + + def _reconstruct(self, parent: Dict[Tile, Optional[Tile]], start: Tile, goal: Tile) -> List[Tile]: + path = [] + current = goal + while current is not None: + path.append(current) + current = parent.get(current) + path.reverse() + return path if path and path[0] == start else [] + + @property + def visited_count(self) -> int: + return self._visited + + +class BFS(PathFinder): + def find(self, maze: Maze, start: Tile, goal: Tile) -> List[Tile]: + queue = deque([start]) + parent = {start: None} + visited = {start} + + while queue: + current = queue.popleft() + + if current == goal: + self._visited = len(visited) + return self._reconstruct(parent, start, goal) + + for neighbor in maze.neighbours(current): + if neighbor not in visited: + visited.add(neighbor) + parent[neighbor] = current + queue.append(neighbor) + + self._visited = len(visited) + return [] + + +class DFS(PathFinder): + def find(self, maze: Maze, start: Tile, goal: Tile) -> List[Tile]: + stack = [start] + parent = {start: None} + visited = {start} + + while stack: + current = stack.pop() + + if current == goal: + self._visited = len(visited) + return self._reconstruct(parent, start, goal) + + for neighbor in maze.neighbours(current): + if neighbor not in visited: + visited.add(neighbor) + parent[neighbor] = current + stack.append(neighbor) + + self._visited = len(visited) + return [] + + +class AStar(PathFinder): + def _heuristic(self, cell: Tile, goal: Tile) -> int: + return abs(cell.x - goal.x) + abs(cell.y - goal.y) + + def find(self, maze: Maze, start: Tile, goal: Tile) -> List[Tile]: + heap = [] + counter = 0 + start_f = self._heuristic(start, goal) + heapq.heappush(heap, (start_f, counter, start)) + counter += 1 + + parent = {} + g_score = {start: 0} + f_score = {start: start_f} + visited = set() + + while heap: + current_f, _, current = heapq.heappop(heap) + visited.add(current) + + if current == goal: + self._visited = len(visited) + return self._reconstruct(parent, start, goal) + + if current_f > f_score.get(current, float('inf')): + continue + + for neighbor in maze.neighbours(current): + tentative_g = g_score[current] + 1 + + if tentative_g < g_score.get(neighbor, float('inf')): + parent[neighbor] = current + g_score[neighbor] = tentative_g + new_f = tentative_g + self._heuristic(neighbor, goal) + f_score[neighbor] = new_f + heapq.heappush(heap, (new_f, counter, neighbor)) + counter += 1 + + self._visited = len(visited) + return [] + + +class MazeSolver(Observable): + def __init__(self, maze: Maze): + super().__init__() + self._maze = maze + self._algorithm: Optional[PathFinder] = None + + def set_algorithm(self, algorithm: PathFinder): + self._algorithm = algorithm + + def solve(self) -> Optional[Dict[str, Any]]: + if not self._algorithm: + raise ValueError("Algorithm not set") + + start_time = time.perf_counter() + path = self._algorithm.find(self._maze, self._maze.start, self._maze.exit) + end_time = time.perf_counter() + + elapsed_ms = (end_time - start_time) * 1000 + + return { + 'time_ms': elapsed_ms, + 'visited': self._algorithm.visited_count, + 'path_length': len(path), + 'path': path + } + + +class Command(ABC): + @abstractmethod + def execute(self) -> bool: + pass + + @abstractmethod + def undo(self) -> bool: + pass + + +class MoveCommand(Command): + def __init__(self, player: 'Player', dx: int, dy: int, maze: Maze): + self._player = player + self._dx = dx + self._dy = dy + self._maze = maze + self._executed = False + + def execute(self) -> bool: + new_x = self._player.position.x + self._dx + new_y = self._player.position.y + self._dy + target = self._maze.get_cell(new_x, new_y) + + if target and target.passable(): + self._player.move_to(target) + self._executed = True + return True + return False + + def undo(self) -> bool: + if self._executed: + self._player.undo() + self._executed = False + return True + return False + + +class Player: + def __init__(self, start_tile: Tile): + self._position = start_tile + self._previous = None + + @property + def position(self) -> Tile: + return self._position + + def move_to(self, tile: Tile): + self._previous = self._position + self._position = tile + + def undo(self): + if self._previous: + self._position, self._previous = self._previous, None + + +class ConsoleView(Observer): + def __init__(self, maze: Maze, player: Optional[Player] = None): + self._maze = maze + self._player = player + self._current_path: List[Tile] = [] + + def update(self, event: str, data: Any = None): + if event == "solving_finished": + self._current_path = data.get('path', []) + self._display_solution(data) + + def _display_solution(self, stats: Dict): + os.system('cls' if os.name == 'nt' else 'clear') + print("=" * (self._maze.width * 2 + 4)) + print("MAZE SOLUTION") + print("=" * (self._maze.width * 2 + 4)) + + for y in range(self._maze.height): + print(" ", end='') + for x in range(self._maze.width): + cell = self._maze.get_cell(x, y) + if cell == self._maze.start: + print('S', end=' ') + elif cell == self._maze.exit: + print('E', end=' ') + elif cell.is_wall: + print('#', end=' ') + elif self._current_path and cell in self._current_path: + print('●', end=' ') + else: + print('.', end=' ') + print() + + print("=" * (self._maze.width * 2 + 4)) + print(f"Time: {stats['time_ms']:.3f} ms") + print(f"Visited: {stats['visited']}") + print(f"Path length: {stats['path_length']}") + + def display_maze(self): + os.system('cls' if os.name == 'nt' else 'clear') + print("=" * (self._maze.width * 2 + 4)) + print("MAZE") + print("=" * (self._maze.width * 2 + 4)) + + for y in range(self._maze.height): + print(" ", end='') + for x in range(self._maze.width): + cell = self._maze.get_cell(x, y) + if self._player and cell == self._player.position: + print('P', end=' ') + elif cell == self._maze.start: + print('S', end=' ') + elif cell == self._maze.exit: + print('E', end=' ') + elif cell.is_wall: + print('#', end=' ') + else: + print('.', end=' ') + print() + + print("=" * (self._maze.width * 2 + 4)) + print("S - start E - exit # - wall . - path P - player") + + +def interactive_mode(maze: Maze): + player = Player(maze.start) + view = ConsoleView(maze, player) + view.display_maze() + + solver = MazeSolver(maze) + solver.attach(view) + + commands_history: List[Command] = [] + + print("\nControls:") + print("H (←) J (↓) K (↑) L (→) - move") + print("U - undo") + print("B - BFS") + print("D - DFS") + print("A - A*") + print("Q - quit") + print("\n" + "=" * 50) + + while True: + cmd = input("\n> ").lower().strip() + + if cmd == 'q': + break + + elif cmd == 'b': + solver.set_algorithm(BFS()) + result = solver.solve() + if result: + print(f"BFS: {result['time_ms']:.3f} ms, visited={result['visited']}, length={result['path_length']}") + + elif cmd == 'd': + solver.set_algorithm(DFS()) + result = solver.solve() + if result: + print(f"DFS: {result['time_ms']:.3f} ms, visited={result['visited']}, length={result['path_length']}") + + elif cmd == 'a': + solver.set_algorithm(AStar()) + result = solver.solve() + if result: + print(f"A*: {result['time_ms']:.3f} ms, visited={result['visited']}, length={result['path_length']}") + + elif cmd in ['h', 'j', 'k', 'l']: + dir_map = {'h': (-1, 0), 'l': (1, 0), 'k': (0, -1), 'j': (0, 1)} + dx, dy = dir_map[cmd] + move = MoveCommand(player, dx, dy, maze) + + if move.execute(): + commands_history.append(move) + view.display_maze() + + if player.position == maze.exit: + print("\n*** YOU ESCAPED! ***") + print(f"Total moves: {len(commands_history)}") + break + else: + print("Blocked!") + + elif cmd == 'u': + if commands_history: + last_command = commands_history.pop() + last_command.undo() + view.display_maze() + print("Undo successful") + else: + print("Nothing to undo") + + else: + print("Unknown command") + + +def main(): + if len(sys.argv) > 1 and sys.argv[1] == 'experiment': + import subprocess + subprocess.run([sys.executable, 'plots.py']) + return + + loader = TextMazeLoader() + + + maze_file = os.path.join(DATA_PATH, "maze1.txt") + + if not os.path.exists(maze_file): + print(f"ERROR: Maze file not found: {maze_file}") + print(f"Please create maze1.txt in: {DATA_PATH}") + return + + maze = loader.load(maze_file) + interactive_mode(maze) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/SokolovEN/docs/data/maze1.txt b/SokolovEN/docs/data/maze1.txt new file mode 100644 index 0000000..07a3ed5 --- /dev/null +++ b/SokolovEN/docs/data/maze1.txt @@ -0,0 +1,10 @@ +########## +#S # +### ##### +# # E# +# # # # ## +# # # +####### # +# # +# ###### # +########## \ No newline at end of file diff --git a/SokolovEN/docs/data/medium.txt b/SokolovEN/docs/data/medium.txt new file mode 100644 index 0000000..c8df775 --- /dev/null +++ b/SokolovEN/docs/data/medium.txt @@ -0,0 +1,48 @@ +################################################## +#S # +# ############################################# # +# # # # +# # ######################################### # # +# # # # # # +# # # ##################################### # # # +# # # # # # # # +# # # # ################################# # # # # +# # # # # # # # # # +# # # # # ############################# # # # # # +# # # # # # # # # # # # +# # # # # # ######################### # # # # # # +# # # # # # # # # # # # # # +# # # # # # # ##################### # # # # # # # +# # # # # # # # # # # # # # # # +# # # # # # # # ################# # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # # # # # # # ############# # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # ######### # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # ##### # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # ##### # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # ######### # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # +# # # # # # # # # ############# # # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # # # # # # ################# # # # # # # # # +# # # # # # # # # # # # # # # # +# # # # # # # ##################### # # # # # # # +# # # # # # # # # # # # # # +# # # # # # ######################### # # # # # # +# # # # # # # # # # # # +# # # # # ############################# # # # # # +# # # # # # # # # # +# # # # ################################# # # # # +# # # # # # # # +# # # ##################################### # # # +# # # # # # +# # ######################################### # # +# # # # +# ############################################# # +# E# +################################################## \ No newline at end of file diff --git a/SokolovEN/docs/data/plots.py b/SokolovEN/docs/data/plots.py new file mode 100644 index 0000000..36e7b5d --- /dev/null +++ b/SokolovEN/docs/data/plots.py @@ -0,0 +1,580 @@ +import csv +import time +import os +import matplotlib.pyplot as plt +import numpy as np +from collections import deque +import heapq + +from maze import DATA_PATH + + + +class Tile: + def __init__(self, x: int, y: int): + self._x = x + self._y = y + self._wall = False + self._start = False + self._exit = False + + @property + def x(self) -> int: + return self._x + + @property + def y(self) -> int: + return self._y + + @property + def is_wall(self) -> bool: + return self._wall + + @is_wall.setter + def is_wall(self, v: bool): + self._wall = v + + @property + def is_start(self) -> bool: + return self._start + + @is_start.setter + def is_start(self, v: bool): + self._start = v + + @property + def is_exit(self) -> bool: + return self._exit + + @is_exit.setter + def is_exit(self, v: bool): + self._exit = v + + def passable(self) -> bool: + return not self._wall + + def __hash__(self): + return hash((self._x, self._y)) + + def __eq__(self, other): + if not isinstance(other, Tile): + return False + return self._x == other._x and self._y == other._y + + +class Maze: + def __init__(self, w: int, h: int): + self._w = w + self._h = h + self._cells = [[Tile(x, y) for x in range(w)] for y in range(h)] + self._start = None + self._exit = None + + @property + def width(self) -> int: + return self._w + + @property + def height(self) -> int: + return self._h + + @property + def start(self): + return self._start + + @property + def exit(self): + return self._exit + + def get_cell(self, x: int, y: int): + if 0 <= x < self._w and 0 <= y < self._h: + return self._cells[y][x] + return None + + def set_cell(self, x: int, y: int, kind: str): + c = self.get_cell(x, y) + if not c: + return + if kind == 'wall': + c.is_wall = True + elif kind == 'start': + if self._start: + self._start.is_start = False + c.is_start = True + c.is_wall = False + self._start = c + elif kind == 'exit': + if self._exit: + self._exit.is_exit = False + c.is_exit = True + c.is_wall = False + self._exit = c + elif kind == 'path': + c.is_wall = False + + def neighbours(self, cell): + result = [] + for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0)]: + nx, ny = cell.x + dx, cell.y + dy + nb = self.get_cell(nx, ny) + if nb and nb.passable(): + result.append(nb) + return result + + +class TextMazeLoader: + def load(self, filename: str): + with open(filename, 'r', encoding='utf-8') as f: + lines = [line.rstrip('\n') for line in f.readlines()] + + h = len(lines) + w = max(len(line) for line in lines) if h else 0 + + start_count = 0 + exit_count = 0 + maze = Maze(w, h) + + for y, line in enumerate(lines): + for x, ch in enumerate(line): + if ch == '#': + maze.set_cell(x, y, 'wall') + elif ch == 'S': + maze.set_cell(x, y, 'start') + start_count += 1 + elif ch == 'E': + maze.set_cell(x, y, 'exit') + exit_count += 1 + else: + maze.set_cell(x, y, 'path') + + if start_count != 1 or exit_count != 1: + raise ValueError(f"Maze must have one S and one E. Found: S={start_count}, E={exit_count}") + + return maze + + +class BFS: + def __init__(self): + self._visited = 0 + + def find(self, maze, start, goal): + from collections import deque + queue = deque([start]) + parent = {start: None} + visited = {start} + + while queue: + current = queue.popleft() + + if current == goal: + self._visited = len(visited) + return self._reconstruct(parent, start, goal) + + for neighbor in maze.neighbours(current): + if neighbor not in visited: + visited.add(neighbor) + parent[neighbor] = current + queue.append(neighbor) + + self._visited = len(visited) + return [] + + def _reconstruct(self, parent, start, goal): + path = [] + current = goal + while current is not None: + path.append(current) + current = parent.get(current) + path.reverse() + return path if path and path[0] == start else [] + + @property + def visited_count(self): + return self._visited + + +class DFS: + def __init__(self): + self._visited = 0 + + def find(self, maze, start, goal): + stack = [start] + parent = {start: None} + visited = {start} + + while stack: + current = stack.pop() + + if current == goal: + self._visited = len(visited) + return self._reconstruct(parent, start, goal) + + for neighbor in maze.neighbours(current): + if neighbor not in visited: + visited.add(neighbor) + parent[neighbor] = current + stack.append(neighbor) + + self._visited = len(visited) + return [] + + def _reconstruct(self, parent, start, goal): + path = [] + current = goal + while current is not None: + path.append(current) + current = parent.get(current) + path.reverse() + return path if path and path[0] == start else [] + + @property + def visited_count(self): + return self._visited + + +class AStar: + def __init__(self): + self._visited = 0 + + def _heuristic(self, cell, goal): + return abs(cell.x - goal.x) + abs(cell.y - goal.y) + + def find(self, maze, start, goal): + import heapq + heap = [] + counter = 0 + start_f = self._heuristic(start, goal) + heapq.heappush(heap, (start_f, counter, start)) + counter += 1 + + parent = {} + g_score = {start: 0} + f_score = {start: start_f} + visited = set() + + while heap: + current_f, _, current = heapq.heappop(heap) + visited.add(current) + + if current == goal: + self._visited = len(visited) + return self._reconstruct(parent, start, goal) + + if current_f > f_score.get(current, float('inf')): + continue + + for neighbor in maze.neighbours(current): + tentative_g = g_score[current] + 1 + + if tentative_g < g_score.get(neighbor, float('inf')): + parent[neighbor] = current + g_score[neighbor] = tentative_g + new_f = tentative_g + self._heuristic(neighbor, goal) + f_score[neighbor] = new_f + heapq.heappush(heap, (new_f, counter, neighbor)) + counter += 1 + + self._visited = len(visited) + return [] + + def _reconstruct(self, parent, start, goal): + path = [] + current = goal + while current is not None: + path.append(current) + current = parent.get(current) + path.reverse() + return path if path and path[0] == start else [] + + @property + def visited_count(self): + return self._visited + + +class MazeSolver: + def __init__(self, maze): + self._maze = maze + self._algorithm = None + + def set_algorithm(self, algorithm): + self._algorithm = algorithm + + def solve(self): + if not self._algorithm: + raise ValueError("Algorithm not set") + + start_time = time.perf_counter() + path = self._algorithm.find(self._maze, self._maze.start, self._maze.exit) + end_time = time.perf_counter() + + elapsed_ms = (end_time - start_time) * 1000 + + return { + 'time_ms': elapsed_ms, + 'visited': self._algorithm.visited_count, + 'path_length': len(path), + 'path': path + } + + + + + +DATA_PATH = r"C:\Users\user\Desktop\2026-rff_mp\SokolovEN\docs\data" + + +class ExperimentRunner: + def __init__(self): + self.algorithms = { + "BFS": BFS(), + "DFS": DFS(), + "A*": AStar() + } + self.loader = TextMazeLoader() + + def run_benchmark(self, maze_file: str, algorithm: str, runs: int = 5): + try: + maze = self.loader.load(maze_file) + except Exception as e: + return None + + total_time = 0.0 + total_visited = 0 + total_length = 0 + successes = 0 + + for _ in range(runs): + solver = MazeSolver(maze) + solver.set_algorithm(self.algorithms[algorithm]) + result = solver.solve() + + if result and result['path_length'] > 0: + total_time += result['time_ms'] + total_visited += result['visited'] + total_length += result['path_length'] + successes += 1 + + if successes == 0: + return None + + return { + 'time_ms': total_time / successes, + 'visited_cells': total_visited / successes, + 'path_length': total_length / successes, + 'success_rate': successes / runs + } + + def run_all_experiments(self, runs: int = 5): + mazes_list = [ + (os.path.join(DATA_PATH, "small.txt"), "Small (10x10)"), + (os.path.join(DATA_PATH, "medium.txt"), "Medium (50x50)"), + (os.path.join(DATA_PATH, "large.txt"), "Large (100x100)"), + (os.path.join(DATA_PATH, "empty.txt"), "Empty"), + (os.path.join(DATA_PATH, "no_exit.txt"), "No exit") + ] + + results = [] + + + print("running experiments") + + print(f"Data path: {DATA_PATH}") + + + for maze_file, maze_name in mazes_list: + if not os.path.exists(maze_file): + print(f"\n[warn] File not found: {maze_file}") + continue + + print(f"\nTesting: {maze_name}") + + for algo_name in self.algorithms.keys(): + stats = self.run_benchmark(maze_file, algo_name, runs) + + if stats: + print( + f" {algo_name}: time={stats['time_ms']:.3f}ms, visited={stats['visited_cells']:.0f}, length={stats['path_length']:.0f}") + results.append({ + 'maze': maze_name, + 'strategy': algo_name, + 'time_ms': stats['time_ms'], + 'visited_cells': stats['visited_cells'], + 'path_length': stats['path_length'], + 'success_rate': stats['success_rate'] + }) + else: + print(f" {algo_name}: no path found") + results.append({ + 'maze': maze_name, + 'strategy': algo_name, + 'time_ms': -1, + 'visited_cells': -1, + 'path_length': -1, + 'success_rate': 0 + }) + + return results + + +def create_visualizations(results): + valid_results = [r for r in results if r['time_ms'] > 0] + if not valid_results: + print("no valid results for visualization") + return + + mazes = sorted(set(r['maze'] for r in valid_results)) + algorithms = ['BFS', 'DFS', 'A*'] + + fig, axes = plt.subplots(1, 3, figsize=(15, 5)) + fig.suptitle('pathfinding algorithms comparison', fontsize=14) + + x = np.arange(len(mazes)) + width = 0.25 + + # Time chart + for i, algo in enumerate(algorithms): + times = [] + for maze in mazes: + val = next((r['time_ms'] for r in valid_results + if r['maze'] == maze and r['strategy'] == algo), 0) + times.append(val) + bars = axes[0].bar(x + i * width, times, width, label=algo, alpha=0.8) + for bar, val in zip(bars, times): + if val > 0: + axes[0].text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 0.5, + f'{val:.1f}', ha='center', va='bottom', fontsize=7) + + axes[0].set_title('execution Time (ms)') + axes[0].set_ylabel('time (ms)') + axes[0].set_xticks(x + width) + axes[0].set_xticklabels(mazes, rotation=45, ha='right', fontsize=8) + axes[0].legend() + axes[0].grid(alpha=0.3, axis='y') + + # Visited cells chart + for i, algo in enumerate(algorithms): + visited = [] + for maze in mazes: + val = next((r['visited_cells'] for r in valid_results + if r['maze'] == maze and r['strategy'] == algo), 0) + visited.append(val) + bars = axes[1].bar(x + i * width, visited, width, label=algo, alpha=0.8) + for bar, val in zip(bars, visited): + if val > 0: + axes[1].text(bar.get_x() + bar.get_width() / 2, bar.get_height(), + f'{val:.0f}', ha='center', va='bottom', fontsize=7) + + axes[1].set_title('visited Cells') + axes[1].set_ylabel('count') + axes[1].set_xticks(x + width) + axes[1].set_xticklabels(mazes, rotation=45, ha='right', fontsize=8) + axes[1].legend() + axes[1].grid(alpha=0.3, axis='y') + + # Path length chart + for i, algo in enumerate(algorithms): + lengths = [] + for maze in mazes: + val = next((r['path_length'] for r in valid_results + if r['maze'] == maze and r['strategy'] == algo), 0) + lengths.append(val) + bars = axes[2].bar(x + i * width, lengths, width, label=algo, alpha=0.8) + for bar, val in zip(bars, lengths): + if val > 0: + axes[2].text(bar.get_x() + bar.get_width() / 2, bar.get_height(), + f'{val:.0f}', ha='center', va='bottom', fontsize=7) + + axes[2].set_title('path Length') + axes[2].set_ylabel('steps') + axes[2].set_xticks(x + width) + axes[2].set_xticklabels(mazes, rotation=45, ha='right', fontsize=8) + axes[2].legend() + axes[2].grid(alpha=0.3, axis='y') + + plt.tight_layout() + + output_path = os.path.join(DATA_PATH, 'experiment_results.png') + plt.savefig(output_path, dpi=150, bbox_inches='tight') + print(f"\nPlot saved to: {output_path}") + plt.show() + + +def save_results_to_csv(results, filename='experiment_results.csv'): + if not results: + return + + filepath = os.path.join(DATA_PATH, filename) + with open(filepath, 'w', newline='', encoding='utf-8') as f: + fieldnames = ['maze', 'strategy', 'time_ms', 'visited_cells', 'path_length', 'success_rate'] + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(results) + + print(f"Results saved to: {filepath}") + + +def analyze_efficiency(results): + valid_results = [r for r in results if r['time_ms'] > 0] + if not valid_results: + print("no valid results for analysis") + return + + algo_stats = {} + for algo in ['BFS', 'DFS', 'A*']: + algo_data = [r for r in valid_results if r['strategy'] == algo] + if algo_data: + algo_stats[algo] = { + 'avg_time': sum(r['time_ms'] for r in algo_data) / len(algo_data), + 'avg_visited': sum(r['visited_cells'] for r in algo_data) / len(algo_data), + 'avg_length': sum(r['path_length'] for r in algo_data) / len(algo_data) + } + + + print("average values across all mazes") + print(f"{'Algorithm':<12} {'Time (ms)':<15} {'Visited':<15} {'Path length':<15}") + + for algo, stats in algo_stats.items(): + print(f"{algo:<12} {stats['avg_time']:<15.3f} {stats['avg_visited']:<15.1f} {stats['avg_length']:<15.1f}") + + fastest = min(algo_stats.items(), key=lambda x: x[1]['avg_time']) + optimal = min(algo_stats.items(), key=lambda x: x[1]['avg_length']) + efficient = min(algo_stats.items(), key=lambda x: x[1]['avg_visited']) + + print("conclusions:") + print(f" fastest algorithm: {fastest[0]} ({fastest[1]['avg_time']:.3f} ms avg)") + print(f" optimal path: {optimal[0]} ({optimal[1]['avg_length']:.1f} steps avg)") + print(f" most efficient (fewest visits): {efficient[0]} ({efficient[1]['avg_visited']:.0f} cells avg)") + print("=" * 70) + + +def main(): + + + if not os.path.exists(DATA_PATH): + print(f"\nerr: directory not found: {DATA_PATH}") + print("please create the directory and place maze files there.") + print("\nexpected structure:") + print(f" {DATA_PATH}/") + print(" ├── small.txt") + print(" ├── medium.txt") + print(" ├── large.txt") + print(" ├── empty.txt") + print(" └── no_exit.txt") + return + + runner = ExperimentRunner() + results = runner.run_all_experiments(runs=5) + + if not results: + print("\nNo results. Check if maze files exist in:", DATA_PATH) + return + + save_results_to_csv(results) + analyze_efficiency(results) + create_visualizations(results) + + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/SokolovEN/docs/data/small.txt b/SokolovEN/docs/data/small.txt new file mode 100644 index 0000000..e21dcdf --- /dev/null +++ b/SokolovEN/docs/data/small.txt @@ -0,0 +1,10 @@ +########## +#S # +### ##### +# # E# +# # # # ## +# # # +####### # +# # +# ###### # +########## \ No newline at end of file -- 2.43.0