From 838c2afa684aa1ee83d5dcbdb0b33970b349c7c7 Mon Sep 17 00:00:00 2001 From: Muihiro Date: Tue, 19 May 2026 20:40:51 +0300 Subject: [PATCH 1/3] for 1-st ex --- fomichevks/{426.md.txt => 426.md} | 0 fomichevks/docs/performance_comparison.png | Bin 0 -> 147536 bytes fomichevks/docs/results.csv | 109 +++++++++ fomichevks/docs/структуры_данных.py | 257 +++++++++++++++++++++ 4 files changed, 366 insertions(+) rename fomichevks/{426.md.txt => 426.md} (100%) create mode 100644 fomichevks/docs/performance_comparison.png create mode 100644 fomichevks/docs/results.csv create mode 100644 fomichevks/docs/структуры_данных.py diff --git a/fomichevks/426.md.txt b/fomichevks/426.md similarity index 100% rename from fomichevks/426.md.txt rename to fomichevks/426.md diff --git a/fomichevks/docs/performance_comparison.png b/fomichevks/docs/performance_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..71e527b91517c64e4ce55547ca22eae7d9517bab GIT binary patch literal 147536 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 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() + From ee0aecd7ca6ecf99db2ad147128d1cdc66ba7001 Mon Sep 17 00:00:00 2001 From: Muihiro Date: Tue, 19 May 2026 21:14:37 +0300 Subject: [PATCH 2/3] for 1-st ex --- fomichevks/docs/отчет.txt | 137 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 fomichevks/docs/отчет.txt diff --git a/fomichevks/docs/отчет.txt b/fomichevks/docs/отчет.txt new file mode 100644 index 0000000..04bd828 --- /dev/null +++ b/fomichevks/docs/отчет.txt @@ -0,0 +1,137 @@ +1. Цель работы +Реализовать три базовые структуры данных без использования объектно-ориентированных механизмов, применить их для хранения записей телефонного справочника, экспериментально измерить производительность операций вставки, поиска и удаления, а также проанализировать влияние порядка входных данных на время выполнения. + +Связный список (LinkedListPhoneBook) +Узел: {'name': str, 'phone': str, 'next': dict | None} +Операции: +ll_insert: линейный проход до конца, обновление при совпадении имени, вставка нового узла в хвост. Возвращает голову списка. +ll_find: последовательный перебор до первого совпадения. +ll_delete: поиск предшественника удаляемого узла, переназначение ссылки next. +ll_list_all: сбор записей в список, явная сортировка по имени. + +Хеш-таблица с цепочками (HashTable) +Структура: список из BUCKET_COUNT = 1024 элементов, каждый элемент — голова связного списка. +Хеширование: idx = hash(name) % BUCKET_COUNT +Операции: делегируют соответствующим ll_* функциям для конкретного бакета. + +Узел: {'name': str, 'phone': str, 'left': dict | None, 'right': dict | None} +Операции: +bst_insert: рекурсивное сравнение имён, создание листа при достижении None. +bst_find: рекурсивный спуск влево/вправо в зависимости от результата сравнения. +bst_delete: три случая: 0 потомков, 1 потомок, 2 потомка. При двух потомках используется inorder-преемник (минимальный элемент правого поддерева). +bst_list_all: центрированный (in-order) обход, гарантирующий отсортированный вывод без дополнительной сортировки. + +Влияние порядка входных данных на скорость вставки в BST +Двоичное дерево поиска (BST) поддерживает инвариант: left.name < root.name < right.name. При вставке новых узлов алгоритм рекурсивно спускается по дереву, выбирая левую или правую ветвь в зависимости от результата сравнения. + +Случай 1: Случайный порядок данных +Ключи распределяются по дереву хаотично +Левые и правые поддеревья заполняются примерно равномерно +Высота дерева: h ≈ log₂(N) ≈ 14 для N=10 000 +Сложность вставки одного элемента: O(log N) +Общая сложность вставки всех N элементов: O(N log N) + +Случай 2: Отсортированный порядок данных +Каждый следующий ключ больше всех предыдущих +Алгоритм всегда выбирает правую ветвь +Дерево вырождается в линейную цепочку + +Почему хеш-таблица почти не чувствительна к порядку? + +Функция hash() в Python: +Детерминирована: один и тот же ключ → один и тот же хеш +Равномерно распределяет значения по пространству хешей +Не зависит от порядка вызова: hash("User_00001") всегда одинаков + +Распределение по бакетам +При N=10 000 записей и 1024 бакетах: +Ожидаемая загрузка: α = N / BUCKET_COUNT ≈ 9.77 элементов на бакет +Даже если все ключи отсортированы, их хеши «размазываются» по всему диапазону +Внутри каждого бакета хранится короткий связный список (~10 элементов) + +Почему связный список всегда медленен при поиске? + +Связный список хранит элементы последовательно, без индексации +Для поиска элемента с именем X: +Начать с головы списка +Сравнить curr['name'] == X +Если не совпало → перейти к curr['next'] +Повторять до нахождения или конца списка +Связный список не подходит для задач с частым поиском. Его удел очереди, стеки, или вспомогательная роль внутри других структур. + +Как удаление работает в каждой структуре? +Связный список +def ll_delete(head, name): + if head['name'] == name: + return head['next'] + curr = head + while curr['next']: + if curr['next']['name'] == name: + curr['next'] = curr['next']['next'] + return head + curr = curr['next'] + return head + +Поиск узла (или его предшественника) — O(N) +Переназначение ссылки next — O(1) +Сборка мусора (автоматически в Python) + +Хеш-таблица +def ht_delete(buckets, name): + idx = hash(name) % BUCKET_COUNT + buckets[idx] = ll_delete(buckets[idx], name) + +Вычисление индекса бакета — O(1) +Поиск и удаление в связном списке бакета — O(L), где L ≈ 10 +Итого: O(1) в среднем + +Двоичное дерево поиска +def bst_delete(root, name): + # 1. Поиск узла + if name < root['name']: + root['left'] = bst_delete(root['left'], name) + elif name > root['name']: + root['right'] = bst_delete(root['right'], name) + else: + # 2. Три случая удаления + if root['left'] is None: + return root['right'] # 0 или 1 потомок + elif root['right'] is None: + return root['left'] + else: + # 2 потомка: найти inorder-преемника + successor = _bst_find_min(root['right']) + root['name'] = successor['name'] + root['phone'] = successor['phone'] + root['right'] = bst_delete(root['right'], successor['name']) + return root + +Поиск удаляемого узла — O(h) +Обработка случая: +0 потомков: просто удалить узел +1 потомок: «поднять» потомка на место удаляемого +2 потомка: найти минимум в правом поддереве (inorder-преемник), скопировать его данные, рекурсивно удалить преемника +Возврат обновлённого корня поддерева + +Когда какую структуру использовать? + +| Сценарий | Рекомендация | +|---|---| +| **Частый поиск** по имени | HashTable или BST (случайные данные) | +| **Данные приходят отсортированными** | HashTable (BST деградирует!) | +| **Нужен отсортированный список** | BST (in-order обход — бесплатный) | +| **Частые вставки/удаления + поиск** | HashTable | +| **Минимальная память, простота** | LinkedList (для малых N) | +| **Диапазонные запросы** (все имена A–M) | BST | + +### Сложности операций + +| Структура | Insert | Find | Delete | List (sorted) | +|---|---|---|---|---| +| LinkedList | O(n) | O(n) | O(n) | O(n log n) | +| HashTable | O(1) avg | O(1) avg | O(1) avg | O(n log n) | +| BST (сбалансированный) | O(log n) | O(log n) | O(log n) | O(n) | +| BST (вырожденный) | O(n) | O(n) | O(n) | O(n) | + + +HashTable — лучший выбор для телефонного справочника при частых вставках и поисках. BST лучше HashTable только если нужен отсортированный вывод без дополнительной сортировки — но при условии случайного порядка вставки или использования самобалансирующегося дерева (AVL, Red-Black). From 380b683b37ab32cd111e064c2393ff41a5d313a4 Mon Sep 17 00:00:00 2001 From: Muihiro Date: Sun, 24 May 2026 20:48:03 +0300 Subject: [PATCH 3/3] [2] for 2-nd ex --- fomichevks/docs/data/empty.txt | 49 ++ fomichevks/docs/data/experiment_results.csv | 13 + fomichevks/docs/data/experiment_results.png | Bin 0 -> 82357 bytes fomichevks/docs/data/large.txt | 54 ++ fomichevks/docs/data/maze.py | 532 ++++++++++++++++++ fomichevks/docs/data/maze1.txt | 10 + fomichevks/docs/data/medium.txt | 48 ++ fomichevks/docs/data/plots.py | 580 ++++++++++++++++++++ fomichevks/docs/data/small.txt | 10 + 9 files changed, 1296 insertions(+) create mode 100644 fomichevks/docs/data/empty.txt create mode 100644 fomichevks/docs/data/experiment_results.csv create mode 100644 fomichevks/docs/data/experiment_results.png create mode 100644 fomichevks/docs/data/large.txt create mode 100644 fomichevks/docs/data/maze.py create mode 100644 fomichevks/docs/data/maze1.txt create mode 100644 fomichevks/docs/data/medium.txt create mode 100644 fomichevks/docs/data/plots.py create mode 100644 fomichevks/docs/data/small.txt diff --git a/fomichevks/docs/data/empty.txt b/fomichevks/docs/data/empty.txt new file mode 100644 index 0000000..6d0a249 --- /dev/null +++ b/fomichevks/docs/data/empty.txt @@ -0,0 +1,49 @@ +######################################## +#S # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# # +# E# +######################################## \ No newline at end of file diff --git a/fomichevks/docs/data/experiment_results.csv b/fomichevks/docs/data/experiment_results.csv new file mode 100644 index 0000000..b9d6ce1 --- /dev/null +++ b/fomichevks/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/fomichevks/docs/data/experiment_results.png b/fomichevks/docs/data/experiment_results.png new file mode 100644 index 0000000000000000000000000000000000000000..c96bc8d406a765117208eafc1a8ad069c3d18654 GIT binary patch literal 82357 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

s&zfGydngz2RI=T zr1t*$X_Qanlpy(2qKwb^OUn=G-`KOSU|Q8CZ5oAs150mxf(*Ee4O}>3Zc(j|tPJJQ zc&oGY|HiH5J`&F&vht*@MC|t^AxJ3#JFHQ`F`cI2+2n+?Az^&eFJxm<@Mew;qW;&Kk<7Y`tRP?vj4Fk(8sd-PXz`)8rlqa+ z18)wVt3&Rb3^#A;s9-rbI4+Yp384fHUk%Iy-zq5s!^?m z&=4SShHfYVLf8J|JQ}|TXud9a1|cgB{%{g(H4xoaenfRbiSv@6P+V8hO(p1FOF!*!|&z@*L`QRRw zWE5dKC&sjCQnFDYIFrFOt5RoDA^Oo*0g47RdzY7h!Jo|o7)bUcxR#>+v|MxoFTe`i zJ;*_r+7+XqZ~v39XZzZPePzi`MiZDexQe_VfSMp9=m>oYP5XyMBgyC`QoayBGWRAg zEzM*zUo!GpXW;HiPUO_^Tz^mii68WnMw@1vwA=+{@y)S?J72ImV>R*sK#vUB3#f>i zcgC&^w=t$J;a8!1OOLA>42)uDq~hT*6@|iD6RJ(KEd%%Q5SfI&n3&obY@Pj)?1um) zsg%2=@CTqO#{mWkHTb#(j@_B3PE+D=c3=Qazmf?s%TA@tTFZ zV5lZnfP{w%F~kM*5~fQOC6{ynmHgX4S!6VUhoW*$P<20PjD$hK934_Qh^UdchdA$%n#Wxa^@;pgh+@0V#!O_`kyRP}+O2YZZqcCkN*$qGwXflr0|y%dGiqy86iPIQT#Zyvk=Z z??=f$MV?o5`Id}a_(T2urd?UDD*EzPq2g&h8Ypkz5c_tUL%)ennhP{*fx-rt$(@il zQa$K>T&(iI)brdAN*qSu&~g**BJ9WeXr!sW>Cjhe6`wZQ(XZ=l{wP-x58}Mf_EF17 z$@G>dZ|qm`APaOgx(OvNNqB1vypK773Nb}Bd6%j~8S9GALSU;Lce=z_AYmF42u8To zd`ei|mJVBnd%6gB*@aJFiMD2eK{06LAoeKqD9eIW>C@4{a8rGy^S5clm}%vL%no0< zrQKyh^4OPMNt;1c7(6#WLT@iPvB7!d008xWZu!0$+>_+JVY)c#N^H=E#{viS&DKTb zHPg@w)CfYQ(tX#+_ybNy9e+m5^w7Oo>uLJ*D(^z`S64wb2{GN+aqN*izqg4PkL4a? zW!tie#<{BF*5l7jYt>>q!Y#Ee3wCLJ!OH1CkV~N%-iq^T&~}@!8iYO~pmbSHm6|V@ zXGg=|-(TZQ01Liy`s9|zetm-IzoBTAf4exN@j&!SRl_oMi83{YwaVE9xb%4xhsnyS z=XriehK7cyXpgvIpT0W4^;B%nOokoEOm~F!{xL5I=+B6g z=C`)?50F0Ys8E^TUN6eF7fG#sVXV!=8ymW8=_FTNnuBi8hbUKm-6%yzy!-;^ltD|3 zPoeHru%XO^Mfl>`=mO|J-X|p!mhw*!nt697YG=4f94eve&f~@S;35IbOW_)Rxwbav zpa03os_4kAs>xN04xZY5V6S=YEIV&?tFptxUWC%?4Q+9lbrxweu|--V)pWmq?kh=I z$Y>D4!D*P4vjaHaj*~4f3ZWEAuNJy$iLn_kHfuy3c)ma5i9ogbK1S##I$Fe_yniOA zty;R|{0=3t%;B9r7Xk2}oVs&2OjcAf->!Zua75QlmbCzF!ua{dFIQNYd3C>TN;b6qwfc!<{>Lusmpiq2uazDetK{I|KyJ z2em_BSktD-)41WD7QZ;)bWCM5`4rmxZA#su@yDVvm7YF`h=#W$Q9NxX$0@~rk9dQ= zO6wWDmnai<NV+pi>Kd-YKkk2rQU70YW$57fZ< z{j@cODukVC@fpR?!9aEdeU$L`K4cvQB%aItf&XTX*2gYrh#)ZcW`jOuFbKNfGfle693#d7Kpaxb56EDgP@WL-XuyUv?CSA?%p z|8e9gmmtD z@qSMYcIkn10L5HQE-UimFjmA#md$u>2k zax+DuwxGn``{?12UUd5#u>-d_4WD~|x49a9b<5=DT^9ll@R<%Qbe^BU^ORqE7KiHP zqzTovd`HaIx|d6?SlWAjrdyhVfxwP=<~+*RGy6rZNBdoJPhkqTJ+H21?=|vTqnlV7IgowjM5{|U?ACj6 zrech0po0ew#&|8Bk6xt%u_1QMFolqTEC>nDyDfA=Y)x(?+99nM6I}8ug^bZlJvFL5 zZ>4y#K+`BH!V>@8K(K{hwv%l%>1j~k=B9lFp$PO z4C?~%!Y-7i#w#rsN2$g27xoekzBSgNh=*dGbJSrXwr0|zpf}2O0ht?vQ9hW<^ zNFUh!#o@wTs1jN`Y#H8pOS(H0B~&-qjK9)pSKRj57`%i*BdyH+O*D^0(P`j54y`K( zITCf9_ZOhwc-!ElPE^aYfo<`=))Z4){bf)rX6)Gb+83Zwz>5jj*l)`;dd|;eOod+= z8(pp#EpKk|fNkZd=2vLzub%Z%j8>8`d6%sd^FVdmz_pgn@X&}oopkLJP)FmM!ms{zJ?xme<^$yfPp+kf#+Dir zA&1O2em`@@rv3;2xGWq4dK6HlQC5=duKR$Ek)^~j&(eZTD2`^!X1I5#Z6v#n_U%rn zj{E8!YXr2RRJfD&p2HU@q4fx7jnA>#rKV@YzsK`2mmPiGY+?;+4%ct>8uxb3(gc6UpnHCHG8E~7o9sxQpcTg^SQDgR+8F0z ze^*gB=v(;W_O)Rq6^DCKfMiXa(w?iR+DMA*9G>q=^Bf3!IecyKWOefrOZ!K@k3~m# zvPf+^k`cN1S&~smN^*td{n&f`R*-k=M|Fv9WR3-9ldp-F$@=-k-kNHwE7Y8Qo3J)P z{r4)vH~GGvP5hI_Zru*B-Y%Jyi!@)P%_2!Zomc1iv$Q@?N@)%ijr=<`==t*;n&lrd z(?cTmbpQPq<(s%y*lnwG%eQqgtz}mTx@W09Cua^h5dgmn;0`SIO;v0UJvy+pRv^$|6A}tmBQ&OGZ_mi9`BA< zs^*XFSC*R4KM-xwUfE7|PcPEXet}N)Ch|l_iwp*%K1$Cp>GbEC{&m&SwgdO?u2an| zYq@E4Gg{U3(%c<^%Q!hLsycmNX5HYtf83#+=g7nX*(j41#n{nBdeQ6Pu>W{)J1KDfI>dKJ3&k zzYZ=LXqqP){{g}foN}d?-Bl#}e0v-J#MB_feMOjsr1C&Hwlx?=7!|M7+uPP#Zj5Z3 z0&!XY*7nA}4^HQFb~-WH7=k7Pe&Ab62~_xLq@3%K&C&{Kw$6RfUz7?!Ibi-#hgsd| z=-hdHY{w&@sO3)f4>gv5UEG1dmqHj3Ap%V<4zn)ua+^KcUpohm1P~7gs~BBHrWdqm zpsY;%0jV$RlP-C#%Y3F$?>}JQ5KJ;193;;lJvFsK@rK5Bxalk-GTX0Mq@?{t43o_p zw=9uor5xRl=bLe z+7^B2m-7i#Dd+!SNuwa+GNc^(ACls}#pQM#tJ{aA;*(2z)jXfchdG6-(S+L5TzR+u z7(rV^84)W&H=fOR)Fs05w#7v0>d2AC*2ZX;heH>KS6)BKMB+PrD_8J!7HF$xS4PJs zv)^`+e4t_8X)y8BjBtFZE4*(W)3|oPF2<9wFf*~Zb=LwaYfG)FT(R-bkOZ|?M*BGd+k>HaO9r7N_?Y7lg}=D=GHC93@P}Xwi<_=PQtO_avZC3!TLFud`sZE(w<9>ui|<&*jyM3ourx&yEXL>f9yLSB z(luK4Jg7ZRZw%2xHXCJxhTN7Rt=$1rb08Bh)GfHNUdjTCO;{=UkJ!8S_`)sw3sqD-%7Tw4K>VRNR@xK# z^|22@<&jc~w)$hNg-u?{Llr_hEEEM(Ci<1VasAJYEP}TA5Rudu1r!{Of55+GEnuM_~it@0!8pE+Iaram>TBJEKy)bGyL6RqP+Q}mEGGjhkQQM z3n3M)mrz_)^H`AX3DWXQL`Vv!d2mM-N%P+H(GcYb{%1*jQ*@;w*Lj_|!6VO#b>kKC z?rALA{tT_U3J7h_@Cm4OAA76$V*H&<>*%aJOcLp83ByZv+66MY3eN{hwLByG*FFLg z6CkIn09^GJ?WTX~@RSP?qOEGmP493}CJCd$X}~!A-J%g1K7p1p6~f0?EM{r`#EZhREl2_zV=FsL#H zE#;Pk)$#ab2mE3^j5?uDV17;OFu33LRd%fR-Y%#yhWb(G)$7-v2OX%pNZkhfo&xlj zjlk5Q0o)`{toREYU#ynPA6&CAE>qE?tQPvKW>9|y@z{pr$)Qf^{ZdGyYxm$W;>*qZ z?m5^Xd-Nqq6%f90?iQf)QT&m&%Kv+Hmb0TI2Jz4+_pC6#!E+kg?w}JF{akNkBU>S% zJ$5P;W8zGo1IG1PU_g}`b)YK5Ay5z<@-s>|vVbc3KHClC#;JUJ&B`OQTz_^kTd+p_ z@z=^|?i4>otYI1oqf`{_wiX}d9MwS|CyDPhQJV?=1>d!&rW0>+vLv9G8 zvr%&~cHW7qRP6WM8oQsmapZUPXg^wXw>MNO!oYQhO`v7v!}UM)}it0 zeDbfLwxn18x!lAo^3iL#F_AU{f64YzQ~toBA%Rm(@e+V&fQq?oYbCA@kM2 zlMQh`dtLY+d=2$Z$x;PP*OXf@2^h8563=ybOh12W2lF)8<0N)Z=|A04hSjvP4_0A$ zIc+(7Mg`4X3$u%m#MzJ$91Xvrksai$02WATOfB%p{;paLB4h!D^#Ltk31pX&r%X=% zbYn^G7B{+9%rEXZkP0tTONi{inXV|vN=ej4q*hH=jPKnDlXJz(M4hCT5Orm!Ntx z_+8fMXQws;D>|!Wc!=636)j>wy6>HaHldJ{r-?(E~Q;h6o$O$1YPxfC%IY&`&( z<14o_@7?3-w4*tqLLx>xksZ>HpNVWUo&il!Du7QW)HKgNk>f3-rC>IFYHFG$-3Ukg z`{FXF#s422-O8>MGXESZ<9Rjxn7jYykyWAdYWO(4xiqZ)llQ9a>JZNeVQNyGX8i-@ zr4_FpV)cOCu!#BKmkI9%cWPJdTIO$YTJTG<=8;H-4lwb%L55T0gS>e&IsFQf%C-~z z+Koh1BJl@VRN##EV=Cj9F@H@1Q6w54J?VYnAw+RM)qVPD?1AHk`ROv#`mD_K=?y$} zBfIwB?Zx~du35h>f%z>2UrB<~8^LWVVEE2(%w{MPr~jf+dYb5uAIvrwMFK~9f?G&1 z*dSBHp`4FLZKd}D9xfC`;S8ZlG#&CTM(@;(8u~2Qcqn2bb_U2TQr%FN_e>g4DUET(*H$h%N2$nc)E4bwwMHRAb8|{pE?gP2y4>kv2g%kjLvs|Pv4e13s zN~c^oHEH%K)SL-27%NhMj)4=1IFXj+7hQ|vCMZ!Dz$39z-{S0o2%b*cv-*jD~aezv~EH|V}J7d^ZPI(T8%YUBi zE)=8p?dEEuvS9=nt7knOF**AV#)1Zm^l0{)&zU|nEo-Xb;w4Wz2OyBB;+7yzTHI-SF0it3nLbAzssz&Z zeT+|7R6qUN|D}8PtSsZX4Z`&?rP~|6Bw6A;Vh+VF#<)qweR zPd^7O_9HS;9Ce~qxdt5RLDxbz2*IQP{p`)T&YO##@-3ic9r_d)rcX?4!UW`PIsU^P zA5uoXrs=Q59&;+fS#^qeR?*`CVe-xGgW;A}Y55zi){X4cKZ1~KNY1pFp2R#`x@s!d zUlTq3>4WKWn9(bN%s?F0GTv7?k;qs?-l9;G5^zQTS<#~GpS$yAhIbP47n$YtygX2L z-G-HYVv|+9)eXrU_yCV3E@$)VRsMYcvuuQ<&30djg6qOQRBuLHsEqqa$JbsRA6Ahj z`Y{r!Tc$S#n*AENk|$rW(&$4d+TWPkhe(}M>Eu(3*vn2M95r&8A83wQ;b&>GOlNFr zPBlKyc=&6Y^p~+ZOF{H;`fu3g_QzM7Ab0V8Rj~7YL?&c1x zh_8eDOHL1Iu{uQybhZ7ricc-`kNVGzOY+{Pp)e3Gd`+6fZ-XzhAjlg-U(>(?*bKX< z!LZt7b3Sr~2H`d5=!0I-iS0BV5yukAEDlw*l>}=P!k;)-(!6T3&$Wnny2YMF4e=;!MSmd3DVkcWHBi$c;Fr-tjw<$%>f6A_D!*QirW~<`Vewv`g z%E~G&YQN8v<&eeXXZpBcq|p=@Lj1ZuCgvqImkmlo@^s3=Wvk$Uf6pCnjb~|QPy#xl2~u$sXtiy@rRJ*(cb&UKSO$s>nuVMG zaZ=skQWP&sJDW}HW*^L&syJ?nDWSwIdIaa~>Rfj0lC)C*{QkFaJwQG9T8V3J%Un9F za%4HeIKq5+d{PyduTG}@BpVNnQ+f)2ZSU&^)uv*BWasL)-wVz#$*N^wda16xre09C zNf4qkKj_qClitva@6j_ExH)yWtmnn))l2`6fV7jd|4FnoDhexVBQhEej7ycZARZGa zU4VmC2#@79<$09JPQ7|TV;*x1xO`C06r!>mwT>5 zPS&&I&N6q2g+&zACq0?JAS+vlLl;fj_4rI*@WhmXA4SAi!Sx$5Tnz*Qxh((#INK^( z7Cu+&A6&o)+q0RT)38t@u81+r0-^Z`@wc5(Z|cOQ3RJt{T+24+mEn^qP;hix>%vV& zJU^cT%5|3BJw*K&LdW!6dR@vm2((7TSiI6=!*8Ry9`gZ09t zjaC2itt@p4koHYTJ}(v@yR8>@F44 zx9|2S>dlDf^8PdL{*>2H)|8k1lGN6q__rc@q2|Sj)8A^%klilPjh7M%UCW8dCuDr{ zwcB}9$&~Yg9@X#5Yr#}5&K$HpHz!CaCpo<}xKBm6dh&UiOzEF_qTPL;?OUJciMD>6 zGRZi#eW7RCB|Dj|bz_Z->O)Rl9m-0(U_WRVU~X+1*IU=#>Cw_8Zk5xQEiX5V#J?99_9bs#yLOewN9<20TOOPJw@%bUS!-ihaZu18ycgA zu-PC8hRD;T4@IHQi<|NX`ux*fLFa!h-=h=Kg2Uq$4yi&!f%OpMkob=b zPf-~=INH(2hVT0CuCepc;{z`HKVRIFzs%wP{X6ez6TE-FAD;EABAx!LhNb^z{>;B{ z)B88PPyYZ@O7rhO$5#D+`vnb4Hy8aFT(BTdI1fLnKgW8B{z{ua@bU&1n6F8}UrNuz z#}3B;P0xpf#)xYUD{H_Q!n2+IQIBW~8_1(x)$Z9Po$W3Gn<9nH^AD``bC068(kRtv zZ?~vdTKc-3%xPTOfz3Zw&Yv?!dSl2QywRJ8cjQt@PLEG9)*(@P7t1{DGx76f#}5*R z7I`M+F-lCq_WGP%RINEtPZ5Q{HfOt;485Jw^Uve6_!btuK7!CZyh-0aZ6!YLiXB(z zZt2w$y>b8W89O%70JikD1~uq2q;oG^zT76H+0{{%>6;*UT$B8}G0=7zraeDbk#J4juQ)mmM5U717C#~4$-vF8)~7QF?1 zm0%*`mmV2ai$D0T{0@j^1A|*;xY=pf?Z!o$|IYc`JV4-e0>5T4i8sJ#3Hq5tCJ&T5#)2%~ zQl(z2Wtm>~v{AC0M(%^(Xq?H_je(}-t-;4<_yE%)Z-aEDlc-QBv{}7iWmt3eN`Jb7 zhrb&Se+?dfkw?py(|GWIV!!_0>omSweyQ}5k~8Mur~w^)pV9jPX3GVb5xNGKAZoQc z?rE!AK5#aRIz!PTIy0N@-sL{>yEVGCZ^SMg14G;Tu83UaH^~Z?3(x)yb93T`ydFkE{n2wnY2RIC4*4=){CE!E=FYP&t`l=B>0XO_hIkP z8x_Kh?$7D-uw>rsh#f}exw(@i{6sI28D_Dv9z&g?j@j;^)Uv6_jwzt5YO0t47D z4{p8+BX`A5@WiTCN5?h>@axBF+7qM5p<@B@X@Rhu-~!R!hB0y?`Bn`=oX|C{$yV%T zb-)BM2p65mJX0ZpJsBcxU+&QRW@#)^&}ig;Rn%TfK_ZvjJp>bTO&mH&aH06TA#V@& zQ+On3Q=g?0refxJI#sCVVrg&_`9SzWA8C$G{-EXS*RQ+0f!J8U73@_F6blvB^U!R; zQ=lh6ad|=M%pUoiA0F(?efINphtCZ^2ZI)KWJH4!OT|FqHisyt3eA%kq<_b7tfgRv zmCC_PSX?ElLJbpx#nmTk(F}LT{qyb?)2_urX2D5-+{xvh zDOdOdqn8vJY5TXQAA?r1B3@<8AL{g@#FEE1%GH=HsYV*CLJu_nAZTw3%w4j1OX;3; zDQOklTMKF-yrjjBY;r3F77rrbEhL5Kw+{(}k`J7XeR!0O9mFs*skB(0n^)?Ttrx1L z3L`D8MBEi|tjV4O1iakai4}{kq@)8nRUmRd`j{W<+7_N^K`9y8Yz_t0Hyf2U&q2RR zu3RD#ZxohBHz)CU(Yg-tj*#>BPEU_XI617rH*c%c+GQbl%ynI?c3Xr#!C_C>ZVogGnx=_jyuij zk-s@}c_r|9`;JFZ&EVFF?pT&w8f6($9!e8#Lj#Wx53Q(wPe_)esawSAei+1YI9Rrs4^r9|C-c^NaF~*Jtb5gJ7fz`|NN5t&8Jm zb&O_(VaBR$XR>4XUN1_KY#7cx;n?>Z%s%kmgZUTt7qXVTPo5>2(j|I#9*FQbglpPD z1@4xOL|W}kY1=by94rx(Z0;D-CkQGo@0cSBb>6#G+?moQ&Dg z3CjmmP|z%&1j_#gWHT8~7@gCad8FN`O!DCn^oPQHA^m1ccZ7cYD#iXvJK4-g=3RTG zRxX%@!`>jqYQkk)I2HO!bGYQ~ zciy$?^9$Gd$zfDm>geXiwuL&r?dOmmU$SuF$?rnPGfZF>ly8P)W&qkJO>}b-aaF4m zzr*}U{n)X9_7GSi$abRiJ~Y}?36qyim{yQvb2T*aNr_m9Ho|5Vx+*J-P80h^2~x`e zxD0vdv{aXIkx7V_;|@|1n+0< z8j%lP%M3Tnr1mo=0alvImYCTTf2cgHPfRDC#g<0-3uN0rz58}rz*iHBX@bQqaD}%6 zqtQspm>lhViuor;HmMY?HWPm^nA-_C{zl)2ff*g34&J0LB~IJ$l6g_rj*Um=35A%~ zh@^lnOKFNo{Myp%G?YTe=&rL@a$d}!#ZmN(T93B{%A|CeM`%dE^SCY|o-J#8Y5#=k zSgzF5Rl!N6QG**~P|s3(?f9l+ZTDiEjp0kEqHc%tvBHL|X6t1CWN^*-zaHJvoM;_w z7f?LKFL55B)`pRW=DGdM0(ADF|9jnU`u@ks)pb`|A>Z7!SW#}*QP=T=3HE(6JArQp zICHlDEvI}XM8>&>KYmWuuKI1Zr*XuoLdwLPZ;Y%f=x`7mc5a~zP$M>tQWfUgzU&XG zoUc!k9|9R}CsY{Wu#(tiht&R?m7LpkKZ*BE)!@ac>K$W`l*P~*n{QV)qu1V=Qx^NR(=ci!7{ck{AcqubwZlhRU z`AOm@4bYU(vmPJ?CXu2}=n!T(_n*>@;`v78CL&a}wxP{Z6GlU-BiA1Vb{+%26uTC& zm*+|8xC!dtN*qZWIX!&66%1{)*OhZIs$zRg0D8F2PToY4&x2YjN{M^c@Iy> zojP*T-XAFQ`*mPaI-rVlfOR^K&=QI|ZcM4GFL=t)=vY@_u1SgOAO?B`IMxRHaLK_T z-k{D6fMqOFKXXu>4uz%yN3TL^wqsNavhCLavx^Y|6NM57UeZ~SfcCK!3lT+Y+a3&7 zR4}yL%Fs;Us&Sp)>p$3I0ok#nAUj4ty0A2mJNfGOw&`^sMw>Vz2<;!ksG6J=pft3L z)Pk~Vj^xo;(%EQXAeWEr3*iJ-ZOJC>l$iDd+Hl}>Tu>rC zvtb_6K2_YQ<#c+$$nrSGm4MuV{)7184Qr|^ZJZYumE48NRf6O`6Te`Au`y4ftSwf1 zgW6k%bCZEh`Uq#CQjKa`_wMg#iPh}3WLCBH{3`!iro?IN2Z)=AsLhsi1<$pT@^}lG zV=PiWex!x1o0hQa^c!YFe_>h@CR-l_{2wmlk{qn<1sC!;y>+EZ1I#^Cyfv}HlC)AR zO!dTpf%BtI7QEP=-=8^v>Y@sjX>lozf$ux<3Mr$*E5unpvqy}Q0K7iRc~ITm#4C(I zCDW=(UVl}981K{_6MeEA8M6J%6|kRB!a=N(ZcrMbNhtU z5687LMBF~?#pO|9_v`X#g;C1=^Ab6E7VMP6LR|;HfpQ7KY@-J%gj^=Z$ zMLFXKkgBE{8Tp5>b-P$1k2o!{uiHlRH*aq^w0o}?=SCX2jy>_Ac%3iwUevj_ABU4& za5@ZY4$t@IvOf78rh;b+NJk3p7Kya?AuES#<_8%e&&B+_h-c#72$Nrug&4+=cKN~|sIW*6gSalqtWt@5Z%8eP?G(t}hGW#&8D2=_WlSTK(8pXdhgHu0V%f-9 zaAv4xyMy|`G_#8x^PG?0goL&LeM&>f7ODLn+(Og6Cs9_k+9SK{hVh&0j?nfyWd_xh z96pt{|B;W2E|D$*2TU_EZ?pD0pe&YDEKB~)kp4Yny8|bfxc;C6)_R*t#oNy75H1!D zz+|*6@+G0kgXDKY-LMc3$Y?0lLiLdP3)cV^O-M_|^x5nEb^X=9*c;cghjQ?Y*2_N6 zV*3a>L>=d5YAcfIvJ*&SydLTR_-_J?R>riz?@6+Et^OE|JPY+F^=$+Br1V4|zJ=z- zd8PAfa#YJ0X$>}>cOBh*@XUCDu=yk551fAn)HYv~T1ud{XHGnAQ0PyihM7n`TpK|Q#XOkQx&xkd4;S#tGqqMkp9>;z3#0Hg|8Be{lZ zX4x@+Cv;uk+ns1wu$BY|Xr-01R;~D8h!ghq((O>B6%1D1<+S@#DoQlJY-=0}G@JD6 zmftr{JdrTS{Ub4RwtRL33>P2cu*&0XTbrosdjk{+*ymi4JajitGPB$a5CCuRCu=U2 z?54G$?#}_61>@#`xG*xVBN!rZ)X4$i!2id;{#nktlxvCtANzrhDWi+pj5H8C=+6=8 zFjfBwo?Q#|&(=UI0_8AV^rc~M$KSgW^Pj_bB=q7;7S8tIOS9kA7#!+8g<&;?+?xaz zM}ExknsE+=AT?Zh&CeqRr4-9Xem9WW5}ia}o%^Yqb*%5K9Ni^|IS(+lHFGFF4vIT# zp_fJ8CUz4tJ|8Wf?0G%kIEzI%VO3)PdY{<^R1~A>{J~VWdFU8>ikPyFfL78zur!nv zb4_;^A$!>)`hp->0% z@KZwu46>nbW8fuyq-vW=@J_02T86sohYHQzy6LHlLB!JuXsNXgZ}k{}iKjF^2xmsQ z6gYFvwdgKKIcn%@xeu3!OMq__;-!GnRY97tcU|%@gnd6xps+#F# z(S7M=+deGMSdc-Ek-5D6oo9%2m2jRCS?UUZ(lMJY)yze!KbLZzW6WGQyLv&ALJK=B$rA7)>H%eRvg5y(gTf)hj@nm#~lh>4t|AL1H9+5{#lii zcZFvi^l(k`KZS!(C$2)`9!j>F;#hz@`7|`s;Zlbat^B|+x9FW(jvIk49tR|`7Ob7t zt4r9u;MK1Ht4#^b45Imt+*OB1R^Lh01KeL#wPbS%s-%sY z@8HAg?=!+DAAl`Yr zl%bTKEc(5Qp;dnaTv<78b{fyav{GcPhkDqK zoAbBmoexTu9pfgLI~}O7;?GV;Jz!?dl^S|tc>>O>-~WhrsEA(BUl5JWaYgh035+({lPr*wqj1TL zSs`Y245UnvA~F*eK;~QsuF3$6xV12kArWM^hNOD%GD2Lkke|#sK4V-BKOKukl@^>D zu2?@ulCF)kF@a(erm@ueE6B;&ow(h@2dBU!8l!U>^~O`7DMaE};5^!pmOl|c{b`xe zB%Sl>;1rw#EViNaQC@m}o>Yz%#Gfg<_w0#98mfh)E`|Ik$OIp!bb7I)A@KUHT2Qo0 zC)2>|FkY<@V894vr8Wf?!Y|-f83z@%_8AGB!pOKjeQ{0hZAeWr^cigB#M!#>%l#y2 zpTQ0I^`Sd_4x4U_Lh2Iq!<|~Z=$Qc8k^JjP`5!7q+I#)BS%@lE?{(yVjN~xz4_$$a z%T@{SMP{0aaoFW}EG$Q49qW_y`^svO#}y*tpyp}ZUgITCqGVx%+Sgv>W_!0}F8i`C{&-oF-|>-f%|-{KUBFDpxV3mkrqn$En#S5CoT()u znJmgf$z}G&!4bv63~w~x|1a1j*Z1t_$2fnxuM8rQ(#j6kVMs#*TWYKhDX%g!%^}+j zz;2fH3KtEucRGWyeB`W3(H{BS88f^%XVxRNBNO)$1A&uKR%>halv-;mjIOal9v`{+ z6q=$D(yJTxc^{IJwb+%w+uO{sXP-3!*9^*_*6^7W?0{3+@8 zR=>xh-9)GDoZOVG93_0*MV-`2?lzn|gZ#@yH&7wJ^f=qNDvm`Sm=i$;X0m^Q$rg(- z?x@aO@6|%&14Lutp8nOPHRe(?|7aU$-j?Yq>}Me@L13IX07%~HG%Da+JnX;zN@{9j%*$joNK#-ew?2ZAOAb&c`-~cZJBh9^Y!1-*9%4 zBT~l_Y3z%q&UGJJKa!yu%=yc4UXPIYSVrqvA5|PXmNECI{>)!$hc}QJa{7E_kG{ z{ZUlt({6*#lY?K}R|ieh+qbQPMP67%->rhVAv0?ndjW&{Qm2hYMT8H5j>(UpG4cpB zAJzTAsQILG=>}SSbchjF*@#xFSfJmt>&7Qpy!s1gl;nPf$3JWxYWt6FCbJoX8^)Ky z;P}A#0{udM)FF|WleZ7>n|@U%XGQs6UU^d4xqn@{%H^H3G{J!FWUWrckaFfzr8Ymm zKdOqYLku>dpXm~x_mtd@M^@nQn86AGlQO@SL>5W>n*;f!iI_l$)btENW@s=qSpZSfp}VR9}dlddt~~ zlg{`vwnPl{9mhaTd4iFfUjb8c3$A03aa0U*!Gh5;TuuL6p`cIwQeUa58t&2f7dotX~_vffPd0 zs3izqMd(tT_<#HTMmABtXb|1_IG^*E1v|JiK%!j>fX!$9lVchY}9c!gWwAx=H9WEzH;_!&PNSe5or=?UOu2BcKLz_G0KVrq9?C_&Q8q5WBl;7Vzh(yy3XkHm-H#o^B zmF%Usx*4@&wZ!xRgxDHD$U*z(=czOz#RbKb<45%n2`Sh9Wf~|#j?5mUS<(nHMaavD znc3>BK6EN{2EjjP`0$bu@0mN^6$cxhgn|X01{$od4Ww`Fzj*9H%WJwcpG%L15NQ(Q zD-Q41(ozvAN)}z)v&Dhuf^mzKahH_w-{!_?e)r8GImhjpF18X#p) z9x5GcxH$h??crzhgfrLB&~SA)q{J*eZue3OXhe~{2>khv+^R@;AL+Mdrp^c!Xe?D6 z$1hYEqv6y#d>hjc%u(?3o=JeVE<^Hk`zX>$N25ZD37NaCLNWKsJ z3-NrG8hM#yW1N<0l*?VOz}A}XBV*-fzrA`*I$<22VMXV>Y)+#c%^Of<@Bx|Sw;~L` zJa03TVYN0i?=`|*#ji_Ul_1SE3zs^dh+5NJ@)K)+qcPLG80;>Q5ej-Yqhkrv74V^$So`Z>#adv4d-ITgX;mQMldS)ut= zblau!Y5bi(84ap9xaK7=^K1gacj{nq1Yr5DM72ppmns{pH92}efZOYjDs3y01Qr_% z054Iz;pX~%SP&M=glbX}h7+xT2;|tgG+=uK71;xX05Xjuql^1EXSc$6jOaw@4{8yX z6WW9(I1#@@qM(TG>hfomy@B^bU2!M03D3fFF_E}spZMTyi`Kgl*VI(A@>l{|l$K|I zj&7mY;Tg}!a?v>gY}^kIAs@}fh|l}m`~mGfrnxJeuSu|PS{)ZcOy|}BI7DcT*|5+m zTPKBMdp2!k5LvC+a8lufvf`fJ$Qt%yC9@M?#=Ctm&(QOA8H98(NJ6#Yl6odc2-NvR zWF)7-GC!G{KbE&kxlDn%lm<7yzD#6qIeJtwms}*5twX{V2uz)~yOA zYkwFtzcuVPTYjM7P-~!{tpKn9$x!(`>$-MdA!7Szl)^(SyFHzeO|Rnj1hCqUF|i%) zxHWzXw)i{6>6+MXuBn~%QKUZ;!XF#Y*n*-!#>Iphj>jx-l+q)i8N7o1016b4t3OOb z%fsd8K2nbj8poDJGP4K?j`zoIASHfiRwT-5tmo!U+5DMCO;h)X$Y>8>T1Q;DAp0h> zN#ZONzrph^M1-bp`tg;r;}->9!vlEqDGn_WcN(6e2=}7fmX>{%2!5?;Y~yukazd<2PL|^-q<4jUEwtGf7|42H&u0fDS zHcTuzmo?B{p@3P`0~>0;j>8h!2fDdMpSZ7nmC^Yq^Qj)gM&LEQ7VTw;%xeP)gW=az z;zP@P<^mer-1i5gVJX54`d4S>V7=~i0w`~V6K6ZNtpAPgY&p9|FE{4*s_wR;ZU+<= z0TzlSf277Hc4>gEmy?siaG3T3e5r~%vZi^tScnmS3*Dcxbs4=3bNF>Lo&wQYU^ zi3mxwGMkMJQ}~ZzL~u)Dsf-U1Hp%qT=YR|nA+K$g(PQRkVs|C6)3p&!9t{#7s=nz* z7xa?6}G0!M46N%JjY5pyFg$*qElC`s$PJPVRHNBPxV z6ExxVn9U$6$S~3{>3Pft1y-h>g0y!Y{V9+4<^FZ0=j`&Dq9Y<}NJu*t?A~=f&+lF| z&!Xh|@Im8m=t-kS%KsLfiZHK%9E%4g2RFbz7kaU2cxK+++`(;;I~C$p-Z4(0NN#N- z*bt&Z(vRE%xMY7Kr-vplZFwM?tQYmxSAi`O;m=Yg$uu{OYl!+u)X{-=X+DC0w3G{` zMa)7N2AWA>n6Y3rUa0oZ7#z(K6JWfC@xlftIhOl%``4tlyszy4mX$dOy>sA2hQL>K zj5rao5`BR_auTK(!O73!f^|t_<)l3&_5OMboj!xk#sk7es|+G)u~6oZ?A}e6-Me1E zi7pUBLq^U-8FfwSIS$QOFCQ{!J+8TM$qnu=8!jjN zaQB{I<3H5E*wwLq`ND&TcI~`**Zp@p2PK*Hr~H$+C#w4Fc619`4;VW{26ji8ef$_2 z8XNf7{kxvkj*0QUiSyEH!)uXGb!}^9)}jbi3JngF@MuAF$!+l z2M*<}#%|PXY;25M@$d!OP;~N~)8Jjd{@4wYQooYv3kCiY`h<=2P}He1idQrqW3QjW zhMQRRWtXMr$KPyQsMKsf{IcYW%S^_F*X%qF;c0*SVCE1$z;Un9#&z0<*NXHRe?d)8h-Sk)ROkj7Z z3|%A)nwbvCe`3N)3T`lZQ1^AxGxdP1{!>E%0T{YkDg(;>#$A32+y0;4t~{>hylo#X zM3xAdQjStFQJ5M=nUb`KLdJ61q$sVTPD&_BOj?98sYpd0ofPf+C@rFW-;^|MTD6gQ zuRAmI&ii?u=ij%#I`KK@cYeR`_x@h@bzk>&`*+Y4p{-?Qsl@Wa4}6ltN}t`-g>pKP zo=c-qjn83!k3}9>!@AkqHL6c^+QNr86784==T-&9{ubn5m>C(`krUO_dfzHvN=mB1 za275v0GwsL#cLAIBGF3q%|2wFZKkJ!nS<}PM5I9jd z%qR3zN!14$|0^@!IeYLsi-oI)d95hx;+m*~$t_sNHSFi*>pAX7vg9%Lp~Osjp6JR4 zO)4DeJ790?KH%KFfdMM074MMcmk)6`$#GORBv#qyw@M~wO4$J} z-Z_Pku&rBd<*(zisNC0X+<973~~I7K9hi!ev>lB8oinw&lLy5FFT#l7!&=Gh(Dq&G`ih|Ad|JiUOt z4ii{Nk7>%V#*)ZuWQsb3MWM-=Mr2MxGOo0Ac7l6GH8&VmNl zm3pRn-%DyrNXjp!;q2Hna>y!g5m*uW2z?6mexmjFQcjlby_(vtD{7gKO~7=ToclUB zYy5UcOSpf)`l%Ad0iJyOKY+es239cKdRG=>tqjwZU={~98Wzs8Ux82^0EI`x>Hbf5bE4$SQZQ23y7!f3P(O}q zGcc2<0P?hfpDNl*)cA*$GStH8Mh@Ot=Jiavbu#v)AM^n_8ynWt zKQYcWD>byl^4W-)gygE5S5Tl0XkwFo*+%pspMj6BTGc`?VK(`9il*6?q4JnX!yC~k z{QcL70%hyI{79XFGTi_vuaU^tf02S&WGD>|xjrapyfg8v&_`r=sjvNZ+y+uVu!%H+I%)aNyM7-7Wi%J zdafj((?vo;(x@ChRXCyGCf(O4sm9Itd=Xc-vN%_p!dHTLslTr3&&SF`S+Cno1lhIv1Q|t-UVB{wwC@9!2Z`aZU z+sBSy#(85OqS;Odx?-s9KJg@x=I%G;3t2Z1xF153Py%hS>|;{m@QQJ-!6UZYOghmU z{{BalOYdwd^)C5OerRRg_(ri03kFpX&c z&Nd4BtJS~Gc6v6??Wc1Pv=a^e< zkaFw}cIq!B5(#}+4Vv+o=VC+-J2WcPM??`*U7yy@kQEL3?WS*46${$!5Z*uVzh9EL zqqN%-r{ky@66~ce^7~QtShH(j`T6^fQ3W!|EjUlY4{cAVNK|%I>O=>;-~_i@mX1a` zySrisyk&M1gv6y8Vd=^Id2-S(XFQesL}q&@%viWfcX>aHSj<2?2W^x{S3%H-_KKFA zqC&&sAG(Flq)|k@iHBQPD}C2h98MKCAO-a7`@nqK#R`j$j~_cE7nk7c(0Jj?hZSou zO{_Ys<_LDtF+|3SM|#ryRcUXoERv-7YXXgy$Lw{o>dx_sRbB(u*U|xE(|D>469Ut1SQuSJ(QToJM;%ro+|3 zG&W!Fw3ld`%dfV26Qj4mo5UwHhJkpWaC9g&S74S&?<(Eyff)u3-^GfilSB-)XBT6RV9woyCkqMlh)_PAj~{_DkOu+@fXRqc7spR1xg*;q|6t=w?Ye zZV$VYD5QqN&m}KyD&LGH`SpFU%{iTE@s(fLprcsnT;#f;CcrH8?ceRKp5< zt|0N@sT^IBXqo{~#||Lq&KpX@LTH$}T;@msWF*o}c7i`gN_1ljN&sTsz&7fA>!@L# z|KdgcLGU%l$f-W#jD7l~NVFtk zx_DK|?<5n^LL-7-V4HLZDqWIiW11(RD+QH@Qg8y&`hPJGbw zc_$^QZ5!c|H7kYvw&syuL6X(&SnwevT2s|V2|a+f=b(}E4q_3Ibic zh->~yNtfl70vsXhG~b85HC00)pAx~LC_YGa$Sg&QrbSaYK+GPn0)#cmlR;}L)(23^ zxAn0U>jU?EdVTn+3o*GYEZCP4*m^yD>qiSE{4|mOzk|(tf~{fSSapffCQYkokV?Le zT$Nf^ttd|L1`(4JXObK92YJzmwju&0dnbY1sL#^kPGkq_VsbIbHhVoRL%W0NZaXZ0 zJ8Ok2Gr8%MH)r%wK`f2rLdn3qU?V3RvN;~3hoS9TgyWH%A29W>V7RS7#$ZXw)?W)6 zXBs72th~+r7g>zwsXlYd438Ju1bvN}uZ7ERLgT1RL5M2#q_zo400GtzA zh(6RFH>Q~CmYdkMC7z|nQg#VBi_TuIHdgIdYn-W^?T?)@R?VyI0n`mZROy+^5E#PE zR`}~?Q;vaa$IaH*U#2d^XtRd|E~g!6W(!&^?T?z8hQem`Cp!2MzU-WEQ#$kV@-`#p zIf8TOC#LHWG?8TaXO0BU#_&cWH?%UXiAK#u;DTV6wMiIDyMJ7+aTVMDj|TEgmxzU}Y{epv+589jsu z#gDkt1@)G?pD0;a)MQ$MXA(l#TL<4V6xBM}`k(Q5=6RfGF1;nc3-Z2d z-?J!WjZX-|T%Z$x9HCHkIusuNc4Fd8=SGHZQVX4xG_Iip&?^LQQJ*w1aYh=#eI4jP z)@r7^ci}OXfO8AMc#+>>?RufrNg&dGD@##01ajTup&3xtC6vXuQ*F+v1=Nh0y9?S) zm%2e1x`eMiC#oO>gvu7&==7-#_prxxR8=q9=(2vGNL#%R97!njnjfF8&xAlYJw+c) zubp?f(VY&oWQ1@C^ahgxU!?_dxX;$_oLikXe9}z`(&f5ejV<^NRoOtCHihW}Su%(+ z34Nd5K&tzZMl&7v(#*ldzO)jG}&-0@mb5VC%9s>UjFt?h>P-qTVQO%EEP?}x^A$bx9 zsd>@^djwgUUa&8EPq^8rGwK9Ih-inD(LH}*F;LatoP;k>)iyC)T09s0Uaqfi9!#6n)0<7_{(*b%QCRJ408l;Y5KX+=&B}V@nBAW7x>VyUP{| z7V6FU^J1$2*$2s%FWLU}P@U~=sowC!vv{$2<6ku#Gu9NG?V1br6r1#`{LT;GpAMODj zBxMazpiD)W_}HoZbq$UaK97DNCVj&|lsKDKVDB!*m*K~kx%$_aamV((-s%4J6ywZ& zfG(X~yRMyvX@DYrPqcw%nqNs7Z8@C}?%1B9@DF{*W{|saQ(mxPDMd?a_4zQ=ZR&pJ z7Ow?!^L`Q^7m8}mPXO@GT*_T6A*cR;x?$aip`jriWQ`#Rriyf!KyTPXgQK)C)#w?v z!uktyCdkV1Jq^C_)n{2DhOm*OykEZ6MLw<+^@~t=uGD?NYM5X3$X550D8o%tgP6pQ zh4cTS>yV8TT5sK)UHXDc;1uOiIxXZyfCBmvE4kw@Zx-d(pLqC$&031dun5&sB#(zk zr*VrjbkK3Na>iLrW9b-sojbKxAlymH;$c7db8EwPz^)+h=d9O>c5hnxe=HkvfFv{k z<{S+lfSMCZhG;$>B6TGAuC_1B1{aDZKXQ^nj`*VHdlIgS<~AuVa~OG06C{@Gu-F>G zKu%vjP(gVH<2*RW|MVr8s$jHc6xaiW$DSR3^+RbPwOqTi3dE4?*3`_d7JMb)r*zcV zWl=?KSHra)RI`(6dj`sw9$it6ZI>5}tG;R;Lk+57b)J2De*KH!8c12vt&K&Cz7r9# za({qw>74Z4$c{bzp_7RX)7DDV#1q{Ol@}Lmg&U-T$213&ry+))2 zSW8=;Z%M{=#CD63$%V^Q$}Tw=7=)0Ph&ZH|I7q4cHfbx-gRqmr(U3lZmiiWWiHewa zvcF12HEy!5JJN{#wvHI!;!ahwvWAMGU^t%La~NnbTqG!nISShkc02XWsg1w$By%j7 z_k?JCJ$ijquE35oI|FMfs9Jb1y8+cbegL<WYq&1&1XBH;{dyq659Z0zoK9!FuRU)`fQd8~HLlnShNKR`^ zZ*h<39Tu_xFc4}e;!6P*>}&1kVICSeR1It*QhgXER+E?9eRa%6q^8Nmg*(lhCwOrp zwI2Ki+s|*q+Au*0X_c+NEm~zc&JQEH(UB|zw2^r78A2CvJw6Xkrx!RH-1gP1s!i!t zkeWItd{2J$!pQJZ{|%<c?745XTD|)x+vu?Ie?-qjIw`lI}_XlIwLZLRF=LD!L zbX$n{MO%3+id;AcMUZE~u9yz_zJym*o{=N>EvNW=5pi!&2IL6>U^cTTPu9tp%FywJ2bjK^QWNOcxH>?jlH$JQ&4vhJ%3Yt$FBwo_qh8%{R;l> zCa`Z2C7D82H0*n;vRR=(QK(|F&u$XaG$)opsP7D!ZwJ_zB)3eIdwbul11v!%YJ0@R zpi*u+TLZJ`G3T(@dE#~^z%1e<_qq#IwR^K3_qND(fz$5_SK@;b6PJNAv2O24&^M_4 zQpKEt#7&E8d?0_Qo}Zb#V6K}67v58z+hItLGH=~Fm>xs4;9 zF9rKDF$=~Mi%+JfKB=zmyDVtPt&6(hYc5BCy0w~*DRIA;!1i(KYq-Vqk*Q#EA{Hdt zLI@{^ZIaX{9C-_Qr|lrPE>;#>o?VQmx%TSStEY}{irWR$ULxIM3m&!4bxddic0T+1T=TvAqFG2|sn56i zd`q(3UCuao%VXdD?3zLxX3`J)X9rc-4nRh^mvs23yVbe@y>k6a^Ya&HqMj#i2mV~;( z)ZX&z4r%J`G`bq8bw!emK9Kh{oTz)DS{11Cn{Q;Wb3m%hc8IDnII1OOWlQ=GE!*M{ zy+3--HZpr&16=57Et;7M&__cLc`Xg4_oGQ7`@#`3X?VRQ0Cxfn;n}oGluomKgMQ1r z0#%ti9AesVK$3E$Ch>7ZcYkVUm{rzs0P~s`G%-dKTuO(hkWrj}B;S^lKnh?uT`WxH zN1s~*+&#rGjK}FX<+ZVOIZ|ltT?@pp@9}|kXPZHTbRfsSNz5yXWw}!ua2LdhaQwf| zMj6lM^9*4l`Bu`-y>S18wMXN-&vIgmqZ7CfX~=S|c|=KW> zF4Z2Nv5#d3%n=Bk$4kW6D7Ysb&>#v3^QQ9hPvRNL4+>ktE2{M+QAvlz;2M?kjiP6W zi`YEQS+N*Lb3_+usF5H0W24Nf;dSJG1>*1hM*zQK$arsLhWTGo*0Uq0Ucg~zNQ1dX z1Cbnyr2ZzaDf3_79y^HXiM-w7Y!lOf1>m$4kSe55)0CyvHEbmek0*?tgFAcHFE;w@OrT>*Gzm zsNt07ghxUPpx1G$Vk~^UA2Dzl^#Q*B`VN3Wcn7rkE#j|&!9n~0iaUF%8QGx>O>_;rH(!SND3GzhB^&L0%L@|MAnxk2m_qPmU0> zoPWG_lf!cT$7_c1z4C7+(0~3h>)$>Ql*~VVCb)cL|MBww{{k@VdBq*BNzE%MV$*|K NwRY&J#i|~;_&-i237P-^ literal 0 HcmV?d00001 diff --git a/fomichevks/docs/data/large.txt b/fomichevks/docs/data/large.txt new file mode 100644 index 0000000..90a84ad --- /dev/null +++ b/fomichevks/docs/data/large.txt @@ -0,0 +1,54 @@ +#################################################################################################### +#S # +# ################################################################################################ # +# # # # +# # ############################################################################################ # # +# # # # # # +# # # ######################################################################################## # # # +# # # # # # # # +# # # # #################################################################################### # # # # +# # # # # # # # # # +# # # # # ################################################################################ # # # # # +# # # # # # # # # # # # +# # # # # # ############################################################################ # # # # # # +# # # # # # # # # # # # # # +# # # # # # # ######################################################################## # # # # # # # +# # # # # # # # # # # # # # # # +# # # # # # # # #################################################################### # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # # # # # # # ################################################################ # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # ############################################################ # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # ######################################################## # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # #################################################### # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # ################################################ # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # ############################################ # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # ######################################## # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # #################################### # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # ################################ # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # ############################ # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # ######################## # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # #################### # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # ################ # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # ############ # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # ######## # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # #### # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #E# +#################################################################################################### \ No newline at end of file diff --git a/fomichevks/docs/data/maze.py b/fomichevks/docs/data/maze.py new file mode 100644 index 0000000..3581713 --- /dev/null +++ b/fomichevks/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\Kirill\2026-rff_mp\fomichevks\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/fomichevks/docs/data/maze1.txt b/fomichevks/docs/data/maze1.txt new file mode 100644 index 0000000..07a3ed5 --- /dev/null +++ b/fomichevks/docs/data/maze1.txt @@ -0,0 +1,10 @@ +########## +#S # +### ##### +# # E# +# # # # ## +# # # +####### # +# # +# ###### # +########## \ No newline at end of file diff --git a/fomichevks/docs/data/medium.txt b/fomichevks/docs/data/medium.txt new file mode 100644 index 0000000..c8df775 --- /dev/null +++ b/fomichevks/docs/data/medium.txt @@ -0,0 +1,48 @@ +################################################## +#S # +# ############################################# # +# # # # +# # ######################################### # # +# # # # # # +# # # ##################################### # # # +# # # # # # # # +# # # # ################################# # # # # +# # # # # # # # # # +# # # # # ############################# # # # # # +# # # # # # # # # # # # +# # # # # # ######################### # # # # # # +# # # # # # # # # # # # # # +# # # # # # # ##################### # # # # # # # +# # # # # # # # # # # # # # # # +# # # # # # # # ################# # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # # # # # # # ############# # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # ######### # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # ##### # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # ##### # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # ######### # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # +# # # # # # # # # ############# # # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # # # # # # ################# # # # # # # # # +# # # # # # # # # # # # # # # # +# # # # # # # ##################### # # # # # # # +# # # # # # # # # # # # # # +# # # # # # ######################### # # # # # # +# # # # # # # # # # # # +# # # # # ############################# # # # # # +# # # # # # # # # # +# # # # ################################# # # # # +# # # # # # # # +# # # ##################################### # # # +# # # # # # +# # ######################################### # # +# # # # +# ############################################# # +# E# +################################################## \ No newline at end of file diff --git a/fomichevks/docs/data/plots.py b/fomichevks/docs/data/plots.py new file mode 100644 index 0000000..ad41b04 --- /dev/null +++ b/fomichevks/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\Kirill\2026-rff_mp\fomichevks\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/fomichevks/docs/data/small.txt b/fomichevks/docs/data/small.txt new file mode 100644 index 0000000..e21dcdf --- /dev/null +++ b/fomichevks/docs/data/small.txt @@ -0,0 +1,10 @@ +########## +#S # +### ##### +# # E# +# # # # ## +# # # +####### # +# # +# ###### # +########## \ No newline at end of file