From f4a032747be07b4c2d70dd0a5cd2f0d487091fd1 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 17:02:50 +0000 Subject: [PATCH 01/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/otchet_1.md | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 kalinovskiymi/docs/otchet_1.md diff --git a/kalinovskiymi/docs/otchet_1.md b/kalinovskiymi/docs/otchet_1.md new file mode 100644 index 0000000..845e0c3 --- /dev/null +++ b/kalinovskiymi/docs/otchet_1.md @@ -0,0 +1,43 @@ +Отчёт по лабораторной работе "Структуры данных" + +1. Введение +В рамках работы были реализованы три структуры данных для телефонного справочника: связный список, хеш-таблица и бинарное дерево поиска (BST). Проведено экспериментальное сравнение производительности операций вставки, поиска и удаления на наборе из 1000 записей. Каждая структура тестировалась на двух вариантах входных данных: случайный порядок и отсортированный по имени. Все эксперименты повторялись пять раз с последующим усреднением результатов. + +2. Вывод результатов: +Структура | Режим | Вставка, с| Поиск, с | Удаление, с +LinkedList | Случайный | 0.027106 | 0.004267 | 0.002981 +LinkedList | Сорт. | 0.054406 | 0.004726 | 0.003020 +HashTable | Случайный | 0.000654 | 0.000053 | 0.000028 +HashTable | Сорт. | 0.000472 | 0.000036 | 0.000021 +BST | Случайный | 0.002561 | 0.000156 | 0.000250 +BST | Сорт. | 0.109515 | 0.005790 | 0.005869 + +Графическое представление результатов приведено на рисунке в файле benchmark_results.png + +3. Анализ результатов +3.1. Влияние порядка данных на BST +При поступлении записей в отсортированном виде BST вырождается в связный список: каждый новый узел добавляется исключительно в правое поддерево. Глубина дерева достигает N, а сложность операций деградирует до O(n). Эксперимент подтверждает это: +Вставка отсортированных данных заняла 0.111692 с — это в 42.9 раз медленнее, чем на случайных данных (0.002601 с). +На отсортированных данных BST проиграло даже связному списку из-за накладных расходов на рекурсию. +3.2. Устойчивость хеш-таблицы к порядку данных +Хеш-функция равномерно распределяет ключи по корзинам вне зависимости от порядка поступления. Производительность остаётся стабильной: +Вставка: 0.000681 с (случайный) и 0.000665 с (отсортированный). +Поиск: около 0.0006857 с в обоих режимах. +Незначительные колебания вызваны случайным характером коллизий. +Это согласуется с теоретической оценкой средней сложности O(1). +3.3. Причины медленного поиска в связном списке +Отсутствие прямого доступа вынуждает последовательно обходить узлы, что даёт сложность O(n): +Поиск в списке (0.004320 с) существенно уступает хеш-таблице (0.000054 с) и BST на случайных данных (0.00018099 с). +С ростом объёма разрыв будет только увеличиваться. +Вставка также медленная (2,8 с), поскольку при уникальных именах каждый раз приходится проходить весь список до конца. +3.4. Сравнение удаления в трёх структурах +Связный список: поиск элемента за O(n), затем изменение указателей за O(1). Время удаления (0.003085 с) практически совпадает со временем поиска. +Хеш-таблица: определение корзины за O(1) и удаление из короткого списка. Время удаления (0.000031 с) на два порядка ниже, чем в списке. +BST: на случайных данных удаление выполняется за 0.000139 с благодаря логарифмической высоте. На отсортированных данных время возрастает до 0.006047 с, что отражает деградацию до O(n). + +4. Выводы и практические рекомендации +На основе полученных экспериментальных данных можно сформулировать следующие рекомендации: +Хеш-таблица — оптимальный выбор, когда приоритетна скорость операций вставки, поиска и удаления, а упорядоченность данных не требуется. Идеально подходит для словарей, кэшей, индексных хранилищ. В тестах показала стабильно высокую производительность во всех сценариях. +Бинарное дерево поиска следует применять, когда необходимо получать данные в отсортированном виде (например, вывод справочника по алфавиту). Однако критический недостаток — деградация до O(n) на упорядоченных входных данных. В таких ситуациях стоит использовать сбалансированные деревья (AVL или красно-чёрные). В эксперименте BST на случайных данных работало почти наравне с хеш-таблицей, а на отсортированных показало худшие результаты. +Связный список малопригоден для больших объёмов из-за линейной сложности операций. Оправдан лишь для маленьких коллекций, задач с частыми вставками в начало (в данном тестировании не рассматривались) или в учебных целях. +Итог: в реальных проектах выбор стоит между хеш-таблицами и сбалансированными деревьями — в зависимости от того, насколько важна отсортированность хранимых данных. \ No newline at end of file -- 2.43.0 From 4633efddaeaa9c946540f506375dde0ff530eaf6 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 17:04:17 +0000 Subject: [PATCH 02/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs/data=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/data/benchmark_results.png | Bin 0 -> 93612 bytes kalinovskiymi/docs/data/results.csv | 91 +++++ kalinovskiymi/docs/data/task_1.py | 377 ++++++++++++++++++ 3 files changed, 468 insertions(+) create mode 100644 kalinovskiymi/docs/data/benchmark_results.png create mode 100644 kalinovskiymi/docs/data/results.csv create mode 100644 kalinovskiymi/docs/data/task_1.py diff --git a/kalinovskiymi/docs/data/benchmark_results.png b/kalinovskiymi/docs/data/benchmark_results.png new file mode 100644 index 0000000000000000000000000000000000000000..a97eb487cd0454f25b780b7524708dd547200e3b GIT binary patch literal 93612 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

uhu&IDNNj{BX)D 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%0D}(~@>BHM`?`ZBHN?Oy4` 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

9rW!bgVs4H!UwW!LF{mT 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 literal 0 HcmV?d00001 diff --git a/kalinovskiymi/docs/data/results.csv b/kalinovskiymi/docs/data/results.csv new file mode 100644 index 0000000..2c555e4 --- /dev/null +++ b/kalinovskiymi/docs/data/results.csv @@ -0,0 +1,91 @@ +structure,order,operation,time,run +LinkedList,shuffled,insert,0.030281299999999955,1 +LinkedList,shuffled,find,0.004695899999999975,1 +LinkedList,shuffled,delete,0.0033233999999999764,1 +LinkedList,shuffled,insert,0.0353907,2 +LinkedList,shuffled,find,0.005563899999999955,2 +LinkedList,shuffled,delete,0.0034716999999999665,2 +LinkedList,shuffled,insert,0.01944009999999996,3 +LinkedList,shuffled,find,0.002577700000000016,3 +LinkedList,shuffled,delete,0.0018714000000000786,3 +LinkedList,shuffled,insert,0.022181000000000006,4 +LinkedList,shuffled,find,0.004234000000000071,4 +LinkedList,shuffled,delete,0.0031284999999999785,4 +LinkedList,shuffled,insert,0.02823869999999995,5 +LinkedList,shuffled,find,0.004262699999999953,5 +LinkedList,shuffled,delete,0.0031122999999999568,5 +HashTable,shuffled,insert,0.000658699999999901,1 +HashTable,shuffled,find,5.359999999998699e-05,1 +HashTable,shuffled,delete,2.869999999999262e-05,1 +HashTable,shuffled,insert,0.0008105999999999947,2 +HashTable,shuffled,find,5.250000000001087e-05,2 +HashTable,shuffled,delete,2.8000000000028002e-05,2 +HashTable,shuffled,insert,0.0006085000000000118,3 +HashTable,shuffled,find,5.270000000001662e-05,3 +HashTable,shuffled,delete,2.76000000000165e-05,3 +HashTable,shuffled,insert,0.0005973000000000228,4 +HashTable,shuffled,find,5.179999999993523e-05,4 +HashTable,shuffled,delete,2.740000000001075e-05,4 +HashTable,shuffled,insert,0.0005963999999999414,5 +HashTable,shuffled,find,5.250000000001087e-05,5 +HashTable,shuffled,delete,2.7699999999963865e-05,5 +BST,shuffled,insert,0.0025841999999999254,1 +BST,shuffled,find,0.0001540000000000985,1 +BST,shuffled,delete,0.00013839999999998298,1 +BST,shuffled,insert,0.0025424000000000557,2 +BST,shuffled,find,0.000152800000000064,2 +BST,shuffled,delete,0.00013700000000005375,2 +BST,shuffled,insert,0.0025473999999999775,3 +BST,shuffled,find,0.00015370000000003436,3 +BST,shuffled,delete,0.00013370000000001436,3 +BST,shuffled,insert,0.0025645000000000806,4 +BST,shuffled,find,0.00015940000000003174,4 +BST,shuffled,delete,0.00013249999999997986,4 +BST,shuffled,insert,0.0025673999999999975,5 +BST,shuffled,find,0.00015799999999999148,5 +BST,shuffled,delete,0.0007081999999999367,5 +LinkedList,sorted,insert,0.04947849999999998,1 +LinkedList,sorted,find,0.0053706999999999505,1 +LinkedList,sorted,delete,0.003119800000000006,1 +LinkedList,sorted,insert,0.05800839999999996,2 +LinkedList,sorted,find,0.005768099999999943,2 +LinkedList,sorted,delete,0.0038080000000000336,2 +LinkedList,sorted,insert,0.05770470000000005,3 +LinkedList,sorted,find,0.0049146999999999386,3 +LinkedList,sorted,delete,0.003128599999999926,3 +LinkedList,sorted,insert,0.05588850000000001,4 +LinkedList,sorted,find,0.004705699999999924,4 +LinkedList,sorted,delete,0.0031733000000000455,4 +LinkedList,sorted,insert,0.05095189999999983,5 +LinkedList,sorted,find,0.0028690999999998468,5 +LinkedList,sorted,delete,0.0018724999999999437,5 +HashTable,sorted,insert,0.0004965999999999582,1 +HashTable,sorted,find,3.719999999995949e-05,1 +HashTable,sorted,delete,2.10999999998851e-05,1 +HashTable,sorted,insert,0.0004729999999999457,2 +HashTable,sorted,find,3.5199999999901976e-05,2 +HashTable,sorted,delete,2.0600000000037255e-05,2 +HashTable,sorted,insert,0.00046370000000006684,3 +HashTable,sorted,find,3.5699999999971865e-05,3 +HashTable,sorted,delete,2.0400000000142526e-05,3 +HashTable,sorted,insert,0.0004648999999998793,4 +HashTable,sorted,find,3.520000000012402e-05,4 +HashTable,sorted,delete,2.0600000000037255e-05,4 +HashTable,sorted,insert,0.000461600000000173,5 +HashTable,sorted,find,3.690000000000637e-05,5 +HashTable,sorted,delete,2.1499999999896602e-05,5 +BST,sorted,insert,0.09513269999999996,1 +BST,sorted,find,0.006302800000000053,1 +BST,sorted,delete,0.006097499999999867,1 +BST,sorted,insert,0.12047529999999984,2 +BST,sorted,find,0.006049799999999994,2 +BST,sorted,delete,0.0062197999999999976,2 +BST,sorted,insert,0.10559420000000008,3 +BST,sorted,find,0.003817999999999877,3 +BST,sorted,delete,0.004166000000000114,3 +BST,sorted,insert,0.09572439999999993,4 +BST,sorted,find,0.005789299999999997,4 +BST,sorted,delete,0.006035599999999919,4 +BST,sorted,insert,0.13064960000000014,5 +BST,sorted,find,0.006988800000000017,5 +BST,sorted,delete,0.006825800000000104,5 diff --git a/kalinovskiymi/docs/data/task_1.py b/kalinovskiymi/docs/data/task_1.py new file mode 100644 index 0000000..ee7c141 --- /dev/null +++ b/kalinovskiymi/docs/data/task_1.py @@ -0,0 +1,377 @@ +import sys + +sys.setrecursionlimit(10000) + +import time +import random +import csv +import os +import matplotlib.pyplot as plt +import numpy as np + + +def ll_insert(head, name, phone): + new_node = {'name': name, 'phone': phone, 'next': None} + if head is None: + return new_node + if head['name'] > name: + new_node['next'] = head + return new_node + current = head + while current['next'] is not None and current['next']['name'] < name: + current = current['next'] + if current['name'] == name: + current['phone'] = phone + return head + new_node['next'] = current['next'] + current['next'] = new_node + return head + + +def ll_find(head, name): + current = head + while current is not None: + if current['name'] == name: + return current['phone'] + current = current['next'] + return None + + +def ll_delete(head, name): + if head is None: + return None + if head['name'] == name: + return head['next'] + current = head + while current['next'] is not None: + if current['next']['name'] == name: + current['next'] = current['next']['next'] + return head + current = current['next'] + return head + + +def ll_list_all(head): + result = [] + current = head + while current is not None: + result.append((current['name'], current['phone'])) + current = current['next'] + result.sort(key=lambda x: x[0]) + return result + + +def ht_insert(buckets, name, phone): + index = hash(name) % len(buckets) + buckets[index] = ll_insert(buckets[index], name, phone) + + +def ht_find(buckets, name): + index = hash(name) % len(buckets) + return ll_find(buckets[index], name) + + +def ht_delete(buckets, name): + index = hash(name) % len(buckets) + buckets[index] = ll_delete(buckets[index], name) + + +def ht_list_all(buckets): + result = [] + for bucket in buckets: + if bucket is not None: + current = bucket + while current is not None: + result.append((current['name'], current['phone'])) + current = current['next'] + result.sort(key=lambda x: x[0]) + return result + + +def bst_insert(root, name, phone): + if root is None: + return {'name': name, 'phone': phone, 'left': None, 'right': None} + if name < root['name']: + root['left'] = bst_insert(root['left'], name, phone) + elif name > root['name']: + root['right'] = bst_insert(root['right'], name, phone) + else: + root['phone'] = phone + return root + + +def bst_find(root, name): + current = root + while current is not None: + if name == current['name']: + return current['phone'] + elif name < current['name']: + current = current['left'] + else: + current = current['right'] + return None + + +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'] + if root['right'] is None: + return root['left'] + min_node = root['right'] + while min_node['left'] is not None: + min_node = min_node['left'] + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + root['right'] = bst_delete(root['right'], min_node['name']) + return root + + +def bst_list_all(root): + result = [] + + def inorder(node): + if node is not None: + inorder(node['left']) + result.append((node['name'], node['phone'])) + inorder(node['right']) + + inorder(root) + return result + + +def generate_records(n, mode='shuffled'): + names = [f"User_{i:05d}" for i in range(n)] + if mode == 'shuffled': + random.shuffle(names) + records = [(name, f"Phone_{i}") for i, name in enumerate(names)] + return records + + +def benchmark_insert(structure_type, records, buckets_size=512): + if structure_type == 'LinkedList': + head = None + start = time.perf_counter() + for name, phone in records: + head = ll_insert(head, name, phone) + end = time.perf_counter() + return end - start, head + elif structure_type == 'HashTable': + buckets = [None] * buckets_size + start = time.perf_counter() + for name, phone in records: + ht_insert(buckets, name, phone) + end = time.perf_counter() + return end - start, buckets + elif structure_type == 'BST': + root = None + start = time.perf_counter() + for name, phone in records: + root = bst_insert(root, name, phone) + end = time.perf_counter() + return end - start, root + + +def benchmark_find(structure_type, structure, names): + start = time.perf_counter() + if structure_type == 'LinkedList': + for name in names: + ll_find(structure, name) + elif structure_type == 'HashTable': + for name in names: + ht_find(structure, name) + elif structure_type == 'BST': + for name in names: + bst_find(structure, name) + end = time.perf_counter() + return end - start + + +def benchmark_delete(structure_type, structure, names): + start = time.perf_counter() + if structure_type == 'LinkedList': + head = structure + for name in names: + head = ll_delete(head, name) + end = time.perf_counter() + return end - start, head + elif structure_type == 'HashTable': + buckets = structure + for name in names: + ht_delete(buckets, name) + end = time.perf_counter() + return end - start, buckets + elif structure_type == 'BST': + root = structure + for name in names: + root = bst_delete(root, name) + end = time.perf_counter() + return end - start, root + + +def benchmark_list_all(structure_type, structure): + start = time.perf_counter() + if structure_type == 'LinkedList': + ll_list_all(structure) + elif structure_type == 'HashTable': + ht_list_all(structure) + elif structure_type == 'BST': + bst_list_all(structure) + end = time.perf_counter() + return end - start + + +def main(): + random.seed(42) + N = 1000 + REPETITIONS = 5 + + all_results = [] + structures = ['LinkedList', 'HashTable', 'BST'] + modes = ['shuffled', 'sorted'] + + os.makedirs('docs/data', exist_ok=True) + + for mode in modes: + records = generate_records(N, mode) + find_names = [random.choice(records)[0] for _ in range(100)] + [f"None_{i}" for i in range(10)] + delete_names = [random.choice(records)[0] for _ in range(50)] + + for struct in structures: + print(f"Тестирую {struct} на {mode} данных...") + for rep in range(REPETITIONS): + insert_time, structure = benchmark_insert(struct, records) + all_results.append([struct, mode, 'insert', insert_time, rep + 1]) + + find_time = benchmark_find(struct, structure, find_names) + all_results.append([struct, mode, 'find', find_time, rep + 1]) + + delete_time, _ = benchmark_delete(struct, structure, delete_names) + all_results.append([struct, mode, 'delete', delete_time, rep + 1]) + + with open('docs/data/results.csv', 'w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['structure', 'order', 'operation', 'time', 'run']) + writer.writerows(all_results) + + print("\nCSV сохранён в docs/data/results.csv") + + data = {} + for row in all_results: + key = (row[0], row[1], row[2]) + if key not in data: + data[key] = [] + data[key].append(row[3]) + + averaged = [] + for key, times in data.items(): + avg_time = sum(times) / len(times) + averaged.append([key[0], key[1], key[2], avg_time]) + + print("\nУСРЕДНЁННЫЕ РЕЗУЛЬТАТЫ (сек):") + print(f"{'Структура':<15} {'Режим':<15} {'Операция':<10} {'Среднее время':<15}") + print("-" * 55) + for row in sorted(averaged, key=lambda x: (x[0], x[1], x[2])): + print(f"{row[0]:<15} {row[1]:<15} {row[2]:<10} {row[3]:<15.6f}") + + structures_list = ['LinkedList', 'HashTable', 'BST'] + operations_list = ['insert', 'find', 'delete'] + + fig, axes = plt.subplots(1, 3, figsize=(18, 6)) + + for i, op in enumerate(operations_list): + ax = axes[i] + x = np.arange(len(structures_list)) + width = 0.35 + + shuffled_times = [] + sorted_times = [] + + for struct in structures_list: + shuffled_times.append( + next(row[3] for row in averaged if row[0] == struct and row[1] == 'shuffled' and row[2] == op)) + sorted_times.append( + next(row[3] for row in averaged if row[0] == struct and row[1] == 'sorted' and row[2] == op)) + + bars1 = ax.bar(x - width / 2, shuffled_times, width, label='Случайный', color='#3498db') + bars2 = ax.bar(x + width / 2, sorted_times, width, label='Отсортированный', color='#e74c3c') + + for bar in bars1: + height = bar.get_height() + ax.text(bar.get_x() + bar.get_width() / 2., height + max(shuffled_times) * 0.01, + f'{height:.6f}', ha='center', va='bottom', fontsize=7) + for bar in bars2: + height = bar.get_height() + ax.text(bar.get_x() + bar.get_width() / 2., height + max(sorted_times) * 0.01, + f'{height:.6f}', ha='center', va='bottom', fontsize=7) + + ax.set_xlabel('Структура данных') + ax.set_ylabel('Время (сек)') + ax.set_title(f'Операция: {op}') + ax.set_xticks(x) + ax.set_xticklabels(structures_list) + ax.legend() + ax.grid(axis='y', alpha=0.3) + + if op == 'find': + ax.set_yscale('log') + + plt.suptitle(f'Сравнение производительности структур данных (N = {N} записей)', + fontsize=14, fontweight='bold') + plt.tight_layout() + + os.makedirs('docs', exist_ok=True) + plt.savefig('docs/benchmark_results.png', dpi=150, bbox_inches='tight') + plt.show() + print(f"График сохранён в docs/benchmark_results.png") + + print("\nАНАЛИЗ РЕЗУЛЬТАТОВ") + + print("\n1. Влияние порядка данных на BST:") + bst_shuffled_insert = next( + row[3] for row in averaged if row[0] == 'BST' and row[1] == 'shuffled' and row[2] == 'insert') + bst_sorted_insert = next( + row[3] for row in averaged if row[0] == 'BST' and row[1] == 'sorted' and row[2] == 'insert') + print(f" - Случайные данные: {bst_shuffled_insert:.6f} сек") + print(f" - Отсортированные данные: {bst_sorted_insert:.6f} сек") + if bst_shuffled_insert > 0: + print(f" - Замедление в {bst_sorted_insert / bst_shuffled_insert:.1f} раз") + print(" Причина: на отсортированных данных BST вырождается в связный список (глубина = N)") + + print("\n2. Стабильность хеш-таблицы:") + ht_shuffled = next( + row[3] for row in averaged if row[0] == 'HashTable' and row[1] == 'shuffled' and row[2] == 'insert') + ht_sorted = next(row[3] for row in averaged if row[0] == 'HashTable' and row[1] == 'sorted' and row[2] == 'insert') + print(f" - Случайные: {ht_shuffled:.6f} сек") + print(f" - Отсортированные: {ht_sorted:.6f} сек") + print(" Причина: хеш-функция равномерно распределяет ключи независимо от порядка") + + print("\n3. Медленный поиск в связном списке:") + ll_search = next(row[3] for row in averaged if row[0] == 'LinkedList' and row[1] == 'shuffled' and row[2] == 'find') + ht_search = next(row[3] for row in averaged if row[0] == 'HashTable' and row[1] == 'shuffled' and row[2] == 'find') + print(f" - LinkedList: {ll_search:.6f} сек") + print(f" - HashTable: {ht_search:.6f} сек") + if ht_search > 0: + print(f" - Хеш-таблица быстрее в {ll_search / ht_search:.1f} раз") + print(" Причина: поиск в списке всегда O(n), в хеш-таблице ~O(1)") + + print("\n4. Удаление:") + for label in ['LinkedList', 'HashTable', 'BST']: + del_shuff = next(row[3] for row in averaged if row[0] == label and row[1] == 'shuffled' and row[2] == 'delete') + del_sort = next(row[3] for row in averaged if row[0] == label and row[1] == 'sorted' and row[2] == 'delete') + print(f" - {label:15}: случ.={del_shuff:.6f} сек, отсорт.={del_sort:.6f} сек") + + print("\n5. Рекомендации:") + print(" - Частый поиск + вставки → Хеш-таблица") + print(" - Нужна сортировка «из коробки» → Сбалансированное BST (AVL/Красно-чёрное)") + print(" - Только добавление в конец → Связный список") + print(" - Обычный BST опасен на реальных частично упорядоченных данных!") + +if __name__ == '__main__': + main() \ No newline at end of file -- 2.43.0 From 97dbb34c10f5adc2acc1cadd4971f6addd14a9e7 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 19:58:55 +0000 Subject: [PATCH 03/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/otchet_2.md | 146 +++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 kalinovskiymi/docs/otchet_2.md diff --git a/kalinovskiymi/docs/otchet_2.md b/kalinovskiymi/docs/otchet_2.md new file mode 100644 index 0000000..214bac7 --- /dev/null +++ b/kalinovskiymi/docs/otchet_2.md @@ -0,0 +1,146 @@ +Отчёт по лабораторной работе + +«Поиск выхода из лабиринта: объектно-ориентированная реализация с паттернами проектирования» + +1. Постановка задачи + +Целью работы является создание программы для нахождения маршрута в лабиринте от начальной точки до выхода. Программа должна поддерживать смену алгоритма поиска, отображать результаты и позволять экспериментально сравнивать эффективность разных методов. +Необходимо реализовать: +чтение лабиринта из текстового файла +три алгоритма поиска пути: BFS, DFS, A* +сравнительный анализ алгоритмов на лабиринтах различной сложности +применение не менее трёх паттернов проектирования GoF +сохранение результатов экспериментов в CSV и построение графиков + +2. Архитектура приложения и применённые паттерны + +2.1 Общая архитектура +Программа построена на принципах ООП и включает следующие паттерны проектирования: +Builder (Строитель) – для создания лабиринтов из файлов +Strategy (Стратегия) – для реализации разных алгоритмов поиска пути +Observer (Наблюдатель) – для отображения процесса поиска + +2.2 Обоснование выбора паттернов +Паттерн Builder (Строитель) +Проблема: Загрузка лабиринта из файла требует нескольких шагов: чтение, разбор символов, создание клеток, установка старта и выхода, проверка корректности. Без Builder код загрузки оказался бы жестко связан с одним форматом. +Решение: Разработан интерфейс MazeBuilder с методом buildFromFile, реализованный в классе TextFileMazeBuilder. +Преимущества: +скрытие сложной логики построения лабиринта +возможность добавления новых форматов (JSON, бинарный) через новые реализации MazeBuilder +упрощение тестирования с помощью mock-строителя +Паттерн Strategy (Стратегия) +Проблема: Разные алгоритмы поиска (BFS, DFS, A*) имеют различную внутреннюю логику, но одинаковый интерфейс. Клиентский код не должен зависеть от конкретного алгоритма. +Решение: Создан интерфейс PathFindingStrategy с методом findPath. Каждый алгоритм реализует этот интерфейс. +Преимущества: +возможность динамической смены алгоритма во время выполнения +изоляция кода каждого алгоритма +простое добавление новых алгоритмов (Дейкстра, двунаправленный поиск) +Паттерн Observer (Наблюдатель) +Проблема: Отображение процесса поиска требует обновления интерфейса при изменении состояния, но логика поиска не должна зависеть от способа отображения. +Решение: Реализован интерфейс Observer с методом update. MazeSolver оповещает наблюдателей о событиях. +Преимущества: +слабая связанность между логикой и отображением +возможность подключения нескольких наблюдателей (консольный вывод, GUI, логирование) + +3. Реализация алгоритмов поиска + +3.1 BFS (поиск в ширину) +Принцип работы: использует очередь FIFO, гарантирует нахождение кратчайшего пути, обходит все клетки на расстоянии d перед переходом к d+1. +Сложность: временная O(V + E), пространственная O(V). +3.2 DFS (поиск в глубину) +Принцип работы: использует стек LIFO, идёт вглубь по одному пути до конца, затем возвращается, не гарантирует кратчайший путь, но экономит память. +Сложность: временная O(V + E), пространственная O(V) в худшем случае. +3.3 A* (эвристический поиск) +Принцип работы: использует приоритетную очередь, функция оценки f(n) = g(n) + h(n), где g(n) – стоимость пути от старта, h(n) – манхэттенское расстояние до цели. +Сложность: временная O(E) в лучшем случае, O(b^d) в худшем, пространственная O(V). + +4. Экспериментальная часть + +4.1 Тестовые лабиринты +№ Название Размер Характеристики +1 Маленький 10×10 Простая структура, прямой путь +2 Средний 50×50 Наличие тупиков, несколько развилок +3 Большой 100×100 Сложная структура, много препятствий +4 Пустой 50×50 Нет стен, свободное пространство +5 Без выхода 50×50 Лабиринт без exit-клетки, выход отсутствует +4.2 Методика тестирования +Каждый алгоритм запускался 5 раз на каждом лабиринте, результаты усреднялись. Измеряемые метрики: +Время выполнения (мс) – общее время работы алгоритма +Посещённые клетки – количество просмотренных алгоритмом клеток +Длина пути – количество клеток в найденном маршруте (0 если путь не найден) +4.3 Результаты экспериментов + +Таблица 1. Сравнение алгоритмов на разных лабиринтах +Лабиринт Алгоритм Время (мс) Посещено клеток Длина пути +Маленький (10x10) BFS 0.204 91 16 +Маленький (10x10) DFS 0.148 91 44 +Маленький (10x10) A* 0.172 87 16 +Средний (50x50) BFS 3.377 1526 72 +Средний (50x50) DFS 2.881 1526 194 +Средний (50x50) A* 3.154 1061 72 +Большой (100x100) BFS 18.363 7064 123 +Большой (100x100) DFS 14.031 7064 305 +Большой (100x100) A* 15.562 4785 123 +Пустой (50x50) BFS 1.113 2500 98 +Пустой (50x50) DFS 0.760 2500 98 +Пустой (50x50) A* 0.961 2500 98 +Без выхода (50x50) BFS 3.210 2036 0 +Без выхода (50x50) DFS 3.086 2036 0 +Без выхода (50x50) A* 2.746 2036 0 + +Таблица 2. Усреднённые показатели +Алгоритм Среднее время (мс) Среднее посещено Средняя длина пути +BFS 5.253 2643 62 +DFS 4.181 2643 127 +A* 4.519 2094 62 + +5. Анализ результатов + +5.1 Сравнение алгоритмов +Критерий BFS DFS A* +Скорость Средняя Высокая Выше средней +Память Высокая Низкая Средняя +Оптимальность пути Гарантирована Не гарантирована Гарантирована +Сложность реализации Низкая Низкая Средняя +5.2 Наблюдения +На маленьких лабиринтах все алгоритмы показывают близкие результаты, различия несущественны. +На средних и больших лабиринтах BFS и DFS обходят все достижимые клетки (1526 и 7064), в то время как A* посещает значительно меньше клеток (1061 и 4785) благодаря эвристике, что подтверждает его эффективность. +DFS стабильно находит более длинные пути (44, 194, 305) по сравнению с BFS и A* (16, 72, 123), что ожидаемо, так как DFS не гарантирует оптимальность. +В пустом лабиринте все три алгоритма посещают одинаковое количество клеток (2500), так как нет препятствий, и путь всегда прямой. Длина пути одинакова (98). +В лабиринте без выхода все алгоритмы обходят все доступные клетки (2036) и корректно возвращают пустой путь длиной 0. +A* показывает наилучший баланс между временем выполнения и оптимальностью пути, посещая в среднем на 20% меньше клеток, чем BFS и DFS. +5.3 Рекомендации по выбору алгоритма +BFS – когда критичен кратчайший путь (навигационные системы, логистика) +DFS – когда важна экономия памяти (встроенные системы, мобильные устройства) +A* – оптимальный выбор для большинства практических задач (игровой ИИ, картографические сервисы) + +6. Эффективность применения паттернов + +6.1 Преимущества использования паттернов +Паттерн Что упростилось Что изменилось бы без паттерна +Builder Добавление новых форматов лабиринтов Модификация основного класса при каждом новом формате +Strategy Смена алгоритма во время выполнения Множество условных операторов и дублирование кода +Observer Добавление новых способов отображения Жёсткая привязка логики поиска к консольному выводу +6.2 Гибкость и расширяемость +Применённые паттерны обеспечивают: +открытость для расширения – новые алгоритмы и форматы добавляются без изменения существующего кода +слабую связанность – компоненты независимы друг от друга +возможность повторного использования – классы можно применять в других проектах +6.3 Что было бы сложно без паттернов +Без паттернов проектирования: +добавление нового алгоритма потребовало бы изменения MazeSolver и добавления условных операторов +поддержка нового формата лабиринта потребовала бы переписывания кода загрузки +изменение способа отображения потребовало бы модификации классов поиска + +7. Выводы + +В ходе лабораторной работы разработана программа для поиска пути в лабиринте с применением трёх паттернов проектирования: Builder, Strategy и Observer. +Основные результаты: +реализованы три алгоритма поиска: BFS, DFS, A* +проведён сравнительный анализ эффективности на пяти типах лабиринтов разной сложности +продемонстрированы преимущества ООП и паттернов проектирования +создана гибкая архитектура, допускающая лёгкое расширение +Ключевые выводы по алгоритмам: +BFS надёжно находит кратчайший путь, но требует больше памяти +DFS быстрее и экономичнее по памяти, но путь может быть длиннее оптимального до 2.5 раз +A* обеспечивает наилучший баланс скорости и качества, посещая меньше клеток благодаря эвристике \ No newline at end of file -- 2.43.0 From 8f8ae504e3df7f22538323d151a44519243d7206 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 20:05:03 +0000 Subject: [PATCH 04/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs/data=5F2=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/data_2/comparative_results.png | Bin 0 -> 63399 bytes .../docs/data_2/mazes_visualization.png | Bin 0 -> 98420 bytes kalinovskiymi/docs/data_2/results.csv | 16 + kalinovskiymi/docs/data_2/task_2_2.py | 483 ++++++++++++++++++ .../docs/data_2/Без_выхода_50x50.txt | 50 ++ 5 files changed, 549 insertions(+) create mode 100644 kalinovskiymi/docs/data_2/comparative_results.png create mode 100644 kalinovskiymi/docs/data_2/mazes_visualization.png create mode 100644 kalinovskiymi/docs/data_2/results.csv create mode 100644 kalinovskiymi/docs/data_2/task_2_2.py create mode 100644 kalinovskiymi/docs/data_2/Без_выхода_50x50.txt diff --git a/kalinovskiymi/docs/data_2/comparative_results.png b/kalinovskiymi/docs/data_2/comparative_results.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a3592a6121a6b62fb782789451403656611cc8 GIT binary patch literal 63399 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

$c%kH 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%0D6FkyHLOwk0 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 literal 0 HcmV?d00001 diff --git a/kalinovskiymi/docs/data_2/mazes_visualization.png b/kalinovskiymi/docs/data_2/mazes_visualization.png new file mode 100644 index 0000000000000000000000000000000000000000..ea95abe61e267885ea573012ee453ab43ea52154 GIT binary patch literal 98420 zcmdSB2UwHox-J|mmJw7?P)b0Spwf#V9UJJ-M5Q;Sh!Fx(0zznx1*IcO=qN}SrAZ4l zV4;c_AwnRbC>=tGv;+u{^L}Aw)||a(t^eO=uf5Mcxh^l@%WIPFeV=ka_j5mae92gU z&#uF}U@+L8ix7d^{R29(L@EdEr*Ygo}^DT5sQnU15(~xOv_fpU8MM zGxd6kIUkU5{UY4VQ`l~>a2@YyR&*@l2zXoQVU>ia{_WSdBggh`=3La(+5uOhz)TmdT=S)cj&Ps7O^-g7pg|b$t<})U5S=3lp zAu||dxk&Zs#>Ph9dRD)j-E4$~p@#pAA+wroqCQhceNx)fVnY_PxtR3z!DmH5qrMc%fC_$%=IOv(akHOKq1q3!YbLTHx$9;; z*$hu&Iz4FIw=2*7q}}=)#)MSeUH)-&wK;UPxma$?o0D_-_H+4m0e;DCwpe$j+*+qx zj;j{cYI1d+0AEVBWHB4S27IFq;fu9mwHQ6VRc&^KpKvyVE8U~Gm33yl4#Q>B>jc!| z6BKP3{{z1M9sZFa5-<{vaB*?@<|e+Ipia%VrkvIGQ|^aZ(n>IR_rPY2f%uSF{?OUD zW*tUxY|euR59VHm(Q5i>9{xY%Z0Ug{ia9-FT!+0pS?G^FUdtF$tq%yCc7oS<91a)uvs|X{w*T>q@5kf0Pupf+N@~55-Wx)5b1-19 z64+@2i-rCbr&=xaFGuQH^r`IU;Yc}eOU#}2%J1o6lz=SSiCT0Dr z+NznF!-ohL>VNF6zun>l*+5$;unjuarhm$O^8Ic(L!Qv34{b-TkBo$_kB4F{>gJwJ z#;#Aqc76|sYcob+dg9b6F)BG8C8qA9H{O11HF)U*+_-*Ds@}V09?o8BZu=}fYh_7u zSRZxxsM35)|JRpc2k#6E4q7(METz^jr#6}udOsVI)LCv7BV^tgdfX`E8PGPA

w< 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 0 else 0 + maze = Maze(width, height) + for y, line in enumerate(lines): + for x, char in enumerate(line): + if char == '#': + maze.grid[x][y] = Cell(x, y, True) + else: + cell = Cell(x, y, False) + if char == 'S': + cell.is_start = True + maze.start = cell + elif char == 'E': + cell.is_exit = True + maze.exit = cell + maze.grid[x][y] = cell + if not maze.start or not maze.exit: + raise ValueError("Лабиринт должен содержать старт (S) и выход (E)") + return maze + +class PathFindingStrategy(ABC): + @abstractmethod + def find_path(self, maze, start, exit_cell): + pass + +class BFSPathFinding(PathFindingStrategy): + def find_path(self, maze, start, exit_cell): + queue = deque([start]) + visited = {start: None} + visited_count = 0 + while queue: + current = queue.popleft() + visited_count += 1 + if exit_cell is not None and current == exit_cell: + path = [] + while current: + path.append(current) + current = visited[current] + return path[::-1], visited_count + for neighbor in maze.get_neighbors(current): + if neighbor not in visited: + visited[neighbor] = current + queue.append(neighbor) + return [], visited_count + +class DFSPathFinding(PathFindingStrategy): + def find_path(self, maze, start, exit_cell): + stack = [start] + visited = {start: None} + visited_count = 0 + while stack: + current = stack.pop() + visited_count += 1 + if exit_cell is not None and current == exit_cell: + path = [] + while current: + path.append(current) + current = visited[current] + return path[::-1], visited_count + for neighbor in maze.get_neighbors(current): + if neighbor not in visited: + visited[neighbor] = current + stack.append(neighbor) + return [], visited_count + +class AStarPathFinding(PathFindingStrategy): + def heuristic(self, a, b): + if b is None: + return 0 + return abs(a.x - b.x) + abs(a.y - b.y) + + def find_path(self, maze, start, exit_cell): + open_set = [(0, 0, start, None)] + heapq.heapify(open_set) + g_score = {start: 0} + came_from = {} + visited_count = 0 + while open_set: + _, _, current, parent = heapq.heappop(open_set) + if current in came_from: + continue + visited_count += 1 + came_from[current] = parent + if exit_cell is not None and current == exit_cell: + path = [] + while current: + path.append(current) + current = came_from[current] + return path[::-1], visited_count + for neighbor in maze.get_neighbors(current): + tentative_g = g_score[current] + 1 + if neighbor not in g_score or tentative_g < g_score[neighbor]: + g_score[neighbor] = tentative_g + f_score = tentative_g + self.heuristic(neighbor, exit_cell) + heapq.heappush(open_set, (f_score, id(neighbor), neighbor, current)) + return [], visited_count + + +class SearchStats: + def __init__(self, path, visited_count, time_ms): + self.path = path + self.path_length = len(path) + self.visited_count = visited_count + self.time_ms = time_ms + +class Observer(ABC): + @abstractmethod + def update(self, event): + pass + +class ConsoleView(Observer): + def update(self, event): + if event['type'] == 'path_found': + self.render(event['maze'], event.get('player_pos'), event['path']) + elif event['type'] == 'maze_loaded': + print(f"Лабиринт загружен: {event['maze'].width}x{event['maze'].height}") + elif event['type'] == 'search_start': + print(f"Поиск пути алгоритмом {event['strategy']}...") + elif event['type'] == 'search_end': + print( + f"Путь найден: длина {event['stats'].path_length}, посещено клеток {event['stats'].visited_count}, время {event['stats'].time_ms:.3f}мс") + + def render(self, maze, player_pos=None, path=None): + os.system('cls' if os.name == 'nt' else 'clear') + path_set = set((c.x, c.y) for c in path) if path else set() + for y in range(maze.height): + for x in range(maze.width): + cell = maze.get_cell(x, y) + if player_pos and (x, y) == (player_pos.x, player_pos.y): + print('P', end='') + elif cell.is_start: + print('S', end='') + elif cell.is_exit: + print('E', end='') + elif (x, y) in path_set: + print('.', end='') + elif cell.is_wall: + print('#', end='') + else: + print(' ', end='') + print() + +class MazeSolver: + def __init__(self, maze, strategy=None): + self.maze = maze + self.strategy = strategy + self.observers = [] + + def set_strategy(self, strategy): + self.strategy = strategy + + def add_observer(self, observer): + self.observers.append(observer) + + def notify(self, event): + for observer in self.observers: + observer.update(event) + + def solve(self): + if not self.strategy: + raise ValueError("Стратегия не задана") + self.notify({'type': 'search_start', 'strategy': type(self.strategy).__name__}) + start_time = time.perf_counter() + if self.maze.exit is None: + path, visited = self.strategy.find_path(self.maze, self.maze.start, None) + else: + path, visited = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit) + end_time = time.perf_counter() + time_ms = (end_time - start_time) * 1000 + stats = SearchStats(path, visited, time_ms) + self.notify({'type': 'search_end', 'stats': stats, 'strategy': type(self.strategy).__name__}) + self.notify({'type': 'path_found', 'maze': self.maze, 'path': path}) + return stats + +def is_path_exists(maze): + if maze.exit is None: + return False + queue = deque([maze.start]) + visited = {maze.start} + while queue: + current = queue.popleft() + if current == maze.exit: + return True + for neighbor in maze.get_neighbors(current): + if neighbor not in visited: + visited.add(neighbor) + queue.append(neighbor) + return False + +def generate_maze(width, height, wall_density=0.3, seed=42): + np.random.seed(seed) + maze = Maze(width, height) + for x in range(width): + for y in range(height): + if x == 0 or x == width - 1 or y == 0 or y == height - 1: + maze.grid[x][y] = Cell(x, y, True) + else: + is_wall = np.random.random() < wall_density + maze.grid[x][y] = Cell(x, y, is_wall) + maze.start = maze.get_cell(1, 1) + maze.start.is_wall = False + maze.start.is_start = True + maze.grid[1][1] = maze.start + maze.grid[1][2] = Cell(1, 2, False) + maze.grid[2][1] = Cell(2, 1, False) + maze.exit = maze.get_cell(width - 2, height - 2) + maze.exit.is_wall = False + maze.exit.is_exit = True + maze.grid[width - 2][height - 3] = Cell(width - 2, height - 3, False) + maze.grid[width - 3][height - 2] = Cell(width - 3, height - 2, False) + if not is_path_exists(maze): + for x in range(1, width - 1): + for y in range(1, height - 1): + if np.random.random() < 0.5: + maze.grid[x][y].is_wall = False + if not is_path_exists(maze): + for x in range(1, width - 1): + for y in range(1, height - 1): + if x == 1 and y == 1: + continue + if x == width - 2 and y == height - 2: + continue + maze.grid[x][y].is_wall = False + return maze + +def generate_empty_maze(width, height): + maze = Maze(width, height) + for x in range(width): + for y in range(height): + maze.grid[x][y] = Cell(x, y, False) + maze.start = maze.get_cell(0, 0) + maze.start.is_start = True + maze.exit = maze.get_cell(width - 1, height - 1) + maze.exit.is_exit = True + return maze + +def generate_no_exit_maze(width, height): + maze = Maze(width, height) + np.random.seed(123) + for x in range(width): + for y in range(height): + if x == 0 or x == width - 1 or y == 0 or y == height - 1: + maze.grid[x][y] = Cell(x, y, True) + else: + is_wall = np.random.random() < 0.3 + maze.grid[x][y] = Cell(x, y, is_wall) + maze.start = maze.get_cell(1, 1) + maze.start.is_wall = False + maze.start.is_start = True + maze.grid[1][1] = maze.start + maze.grid[1][2] = Cell(1, 2, False) + maze.grid[2][1] = Cell(2, 1, False) + maze.exit = None + return maze + +def save_maze_to_file(maze, filename): + with open(filename, 'w') as f: + for y in range(maze.height): + for x in range(maze.width): + cell = maze.get_cell(x, y) + if cell.is_start: + f.write('S') + elif cell.is_exit: + f.write('E') + elif cell.is_wall: + f.write('#') + else: + f.write(' ') + f.write('\n') + +def visualize_maze(maze, path=None, title="Лабиринт", ax=None): + grid = np.zeros((maze.height, maze.width)) + for y in range(maze.height): + for x in range(maze.width): + cell = maze.get_cell(x, y) + if cell.is_wall: + grid[y, x] = 1 + elif cell.is_start: + grid[y, x] = 2 + elif cell.is_exit: + grid[y, x] = 3 + if ax is None: + fig, ax = plt.subplots(figsize=(8, 8)) + cmap = plt.cm.colors.ListedColormap(['white', 'black', 'green', 'red']) + ax.imshow(grid, cmap=cmap, interpolation='nearest') + if path: + path_x = [cell.x for cell in path] + path_y = [cell.y for cell in path] + ax.plot(path_x, path_y, 'b-', linewidth=2, label='Путь') + ax.set_title(title) + ax.set_xticks([]) + ax.set_yticks([]) + +def run_experiments(): + mazes_data = { + "Маленький (10x10)": generate_maze(10, 10, 0.2, 10), + "Средний (50x50)": generate_maze(50, 50, 0.3, 20), + "Большой (100x100)": generate_maze(100, 100, 0.3, 30), + "Пустой (50x50)": generate_empty_maze(50, 50), + "Без выхода (50x50)": generate_no_exit_maze(50, 50) + } + os.makedirs("mazes", exist_ok=True) + for name, maze in mazes_data.items(): + filename = f"mazes/{name.replace(' ', '_').replace('(', '').replace(')', '')}.txt" + save_maze_to_file(maze, filename) + print(f"Сохранён {filename}") + strategies = { + "BFS": BFSPathFinding(), + "DFS": DFSPathFinding(), + "A*": AStarPathFinding() + } + results = [] + runs = 5 + fig_mazes, axes_mazes = plt.subplots(len(mazes_data), len(strategies) + 1, figsize=(18, 4 * len(mazes_data))) + if len(mazes_data) == 1: + axes_mazes = [axes_mazes] + for row_idx, (maze_name, maze) in enumerate(mazes_data.items()): + visualize_maze(maze, title=f"{maze_name}", ax=axes_mazes[row_idx][0]) + for col_idx, (strat_name, strategy) in enumerate(strategies.items()): + solver = MazeSolver(maze, strategy) + times = [] + visited_counts = [] + path_lengths = [] + best_path = None + for _ in range(runs): + stats = solver.solve() + times.append(stats.time_ms) + visited_counts.append(stats.visited_count) + path_lengths.append(stats.path_length) + if stats.path: + best_path = stats.path + avg_time = np.mean(times) + avg_visited = np.mean(visited_counts) + avg_path = np.mean(path_lengths) + results.append([maze_name, strat_name, avg_time, avg_visited, avg_path]) + print(f"{maze_name} - {strat_name}: Время={avg_time:.3f}мс, Посещено={avg_visited:.0f}, Длина пути={avg_path:.0f}") + visualize_maze(maze, best_path, f"{maze_name} - {strat_name}", ax=axes_mazes[row_idx][col_idx + 1]) + plt.tight_layout() + plt.savefig('mazes_visualization.png') + plt.close() + with open('results.csv', 'w', newline='', encoding='utf-8-sig') as f: + writer = csv.writer(f) + writer.writerow(["Лабиринт", "Стратегия", "Время_мс", "Посещено", "Длина_пути"]) + writer.writerows(results) + print("\nРезультаты сохранены в results.csv") + return results + +def plot_results(results): + strategies = ["BFS", "DFS", "A*"] + mazes = ["Маленький (10x10)", "Средний (50x50)", "Большой (100x100)", "Пустой (50x50)", "Без выхода (50x50)"] + data = {} + for strat in strategies: + data[strat] = {"times": [], "visited": [], "paths": []} + for row in results: + maze, strat, time_ms, visited, path_len = row + data[strat]["times"].append(time_ms) + data[strat]["visited"].append(visited) + data[strat]["paths"].append(path_len) + + fig, axes = plt.subplots(1, 3, figsize=(18, 6)) + x = np.arange(len(mazes)) + width = 0.25 + colors = {'BFS': 'skyblue', 'DFS': 'lightgreen', 'A*': 'salmon'} + + for i, strat in enumerate(strategies): + offset = (i - 1) * width + times_display = [t if t > 0 else 0.001 for t in data[strat]["times"]] + bars = axes[0].bar(x + offset, times_display, width, label=strat, color=colors[strat]) + for bar, val in zip(bars, data[strat]["times"]): + if val > 0: + axes[0].text(bar.get_x() + bar.get_width() / 2, bar.get_height() * 1.1, + f'{val:.2f}', ha='center', va='bottom', fontsize=8, rotation=90) + axes[0].set_title("Время выполнения (мс)") + axes[0].set_xticks(x) + axes[0].set_xticklabels(mazes, rotation=15, ha='right') + axes[0].set_ylabel("Время (мс)") + axes[0].set_yscale('log') + axes[0].legend() + axes[0].grid(axis='y', alpha=0.3) + + for i, strat in enumerate(strategies): + offset = (i - 1) * width + visited_display = [v if v > 0 else 1 for v in data[strat]["visited"]] + bars = axes[1].bar(x + offset, visited_display, width, label=strat, color=colors[strat]) + for bar, val in zip(bars, data[strat]["visited"]): + if val > 0: + axes[1].text(bar.get_x() + bar.get_width() / 2, bar.get_height() * 1.1, + f'{val:.0f}', ha='center', va='bottom', fontsize=8, rotation=90) + axes[1].set_title("Посещено клеток") + axes[1].set_xticks(x) + axes[1].set_xticklabels(mazes, rotation=15, ha='right') + axes[1].set_ylabel("Количество клеток") + axes[1].set_yscale('log') + axes[1].legend() + axes[1].grid(axis='y', alpha=0.3) + + for i, strat in enumerate(strategies): + offset = (i - 1) * width + paths_display = [p if p > 0 else 1 for p in data[strat]["paths"]] + bars = axes[2].bar(x + offset, paths_display, width, label=strat, color=colors[strat]) + for bar, val in zip(bars, data[strat]["paths"]): + height = bar.get_height() + axes[2].text(bar.get_x() + bar.get_width() / 2, height * 1.1, + f'{val:.0f}', ha='center', va='bottom', fontsize=8, rotation=90) + axes[2].set_title("Длина найденного пути") + axes[2].set_xticks(x) + axes[2].set_xticklabels(mazes, rotation=15, ha='right') + axes[2].set_ylabel("Длина пути") + axes[2].set_yscale('log') + axes[2].legend() + axes[2].grid(axis='y', alpha=0.3) + + plt.tight_layout() + plt.savefig('comparative_results.png') + plt.show() + print("Сравнительные графики сохранены в comparative_results.png") + +if __name__ == "__main__": + print("\nГенерация лабиринтов и запуск экспериментов\n") + results = run_experiments() + print("\nСоздание графиков") + plot_results(results) + print("\nЭксперименты завершены") + print("\nСозданные файлы:") + print(" - 5 текстовых файлов с лабиринтами") + print(" - mazes_visualization.png: Визуализация всех лабиринтов с путями") + print(" - results.csv: Таблица с числовыми результатами") + print(" - comparative_results.png: Сравнительные графики (Время, Посещено, Длина пути)") + print("\nСводка результатов:") + for row in results: + maze, strat, time_ms, visited, path_len = row + print(f"{maze:20s} | {strat:5s} | Время: {time_ms:8.3f}мс | Посещено: {visited:6.0f} | Путь: {path_len:4.0f}") \ No newline at end of file diff --git a/kalinovskiymi/docs/data_2/Без_выхода_50x50.txt b/kalinovskiymi/docs/data_2/Без_выхода_50x50.txt new file mode 100644 index 0000000..d557173 --- /dev/null +++ b/kalinovskiymi/docs/data_2/Без_выхода_50x50.txt @@ -0,0 +1,50 @@ +################################################## +#S # # ## ### # ### # # # # # +# ## # ### ## # # ## +#### # # ### ## # # # ### +# # # # ## # # ## ## # ### +# ## # ## # # ## ### # # # # ## +# #### # # ## # # ## # ## +# ## # # # # # # # ##### # # +# # # # # # # ### # # # +# # # # ### ## ## ## ### # #### +# # # # ### ## ## # # # # # # # +# ## # # ## # # ## # ## # +# # # # # # # # # # ### ## +# # ## # ## ## ## # # # # # # +## # # # # # # # # # ### +# ### # # # ### ## # # # # +# # # # # ## # # # # # #### # +## # # ## # ##### ## ## # +### # ### # ## # # ## # ## ## +# # # # ## # ### ## ## # ### ### +# # # # # # # # # ## # # # # +# # # # # ## # # # ## # # ### +# #### # # # # # # # # # # # +# ## # # ## ## # ## # # +# # #### # # # ## # ## # +# # # # ## # ### +# # # ### # ## # # # # # ### +# ## # # # # ## ## # # ##### # # ## +## ### # # # ## # # # # # # # # # +## # # # # # # # ## # +# # # # ### # # ### # # # # # +#### ## # ## # # # ## # # ### # # +# # #### ## ## # # ### #### # +# # ## # # # ## # # # ## # # +# ## ## ## # # # ### # ### # # +# # # # # #### # # # # +# # ## # # # # # ## # # ## +# ## # # # # # # # # # +# ### # # ## # # # # ## # ## # +# ## # ### # ### # # # ## ### # ### +# ## ## # ## ### ## # # # # #### # +# # # # ## # #### ## # # +## # # # # # ## ## ## # #### # +# # # # ## # # # # # # +# # # ## # ## # # ## # ## +# # # ## # # # ## # #### # # # ## # ## +## # # # ### ## ## # # # # +# # # # #### # # ## # # ## # # # +# ### ## # ## # # # ## +################################################## -- 2.43.0 From d3e6a241b21ef99b47bc4338a375e82d7df9a8c8 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 20:05:56 +0000 Subject: [PATCH 05/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs/data=5F2=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/data_2/Большой_100x100.txt | 100 ++++++++++++++++++ kalinovskiymi/docs/data_2/Маленький_10x10.txt | 10 ++ kalinovskiymi/docs/data_2/Пустой_50x50.txt | 50 +++++++++ kalinovskiymi/docs/data_2/Средний_50x50.txt | 50 +++++++++ 4 files changed, 210 insertions(+) create mode 100644 kalinovskiymi/docs/data_2/Большой_100x100.txt create mode 100644 kalinovskiymi/docs/data_2/Маленький_10x10.txt create mode 100644 kalinovskiymi/docs/data_2/Пустой_50x50.txt create mode 100644 kalinovskiymi/docs/data_2/Средний_50x50.txt diff --git a/kalinovskiymi/docs/data_2/Большой_100x100.txt b/kalinovskiymi/docs/data_2/Большой_100x100.txt new file mode 100644 index 0000000..e08be03 --- /dev/null +++ b/kalinovskiymi/docs/data_2/Большой_100x100.txt @@ -0,0 +1,100 @@ +#################################################################################################### +#S # # # # # # ## ## # # ## # ## # # +# ## # # # ## # # # # # # # # # # # # +# # # # # # ## # # # # # # ## # # ## # # +# # # # # # ## # ### # +# ## # # # # # # ## # # +# # # # # # # # # ### # # +# # # # # # # # # # # # # # +# # # # # # # # # # # ## # ## # # +# # ## # # # # # # # # # # ## +# ## ## # # # # # ## # ## # # # # # # +# # # # # ## # ## # # # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # ## # # # # # # # ## # # # # # ## +# # # # # # # # # # # +# ## ## # # # # # ## # # # # +## ## # # # # # # # # # +## # # # # # # # # # +# ## # # # # # ## # # +## # # ## # # # # # ## # # +## # # ## ### # # # # # # # # # # # # +# # # # # # # # # # ## # # # +# # # # ## # # # # # # # # # # +# # ## # # # # # # # # +### ## # # ## # ### # # # # # ## +# # ## # # # # # # # # # # +### # # # # # # # # # # # # +# ## # # # # # # # # # +# # # # # # # ## # # # # # # +# ## # # # ## # # # # # ## ## ## # ## ### +# # # # # ### # # # # +# # # # ## # # ## # ## # # # # +# # # # # # # ## # # # # ## ## # ## # # +# # # # # # # # # ## ## # # +# ## # # # # # # # # # # # # # ## +# # # # ## # # # # ## ## ## # # # # # +# # # # # # # # # # # # ## +# # # # # # ## # # # # # +# # ## # # # # # # # # # # # +# # # # # # # # # # ## # # # # ## # # # # +# # # # # # # # # ## # # # # # # # +## # # # # # ## # # # # # # # # # +# # # # # # # # # ## # # # # # ## # +# # # # ## # # # # ## # # # # +# ## # # ### # # # # # # # # +# # ## # # # # # ## # # # # # +# # # ## # # # # # # # ## +# # # # # # # # # # # # ## # # +# # # # # # # # # # # # # ## # # # # # +# # # # # ### # # # # # # # # +### # # # # ## # ## # # # # # # +# # # # ## # # # # # # ## # # +# # # # # ## # # # # +# # # # ## ## # # # # # # # +# # # # # # # # # # # # ## # +# # # # # # # # # # ## # # ## # # ## +# # # # # # # # # # # # # # # # +# # # ## # # # # ## +# # # ## # # # # # # # # ## # # # # # # +## # # # # # # # # # # # # # ## # # # # +### # # ## ### ### # # # # # ### # +# # ## ## # # # # # # # # # # +# # # # # # ## # # # # # # +# # # # # # # # # # # # # # # ## +# # # # # # # # # # # ### # ## # # # +# # # # # # # # ## # # # # # # +# ## # # # # ## # # # # # # # # # # ## +# # # ## # # # # # # # ## # # # # # # +# # # # ## # # # ## # ## # # +# # # # # # # # ### # +# ## # ### # # # # # # ### # # # +# # # ### ## # ## # # ## # # # # +# # # # # # # # # # ## # # # ### # # +# # ## # # # # # # # # # # # +## # # # # # # # # # ## # ## # # # +# # # # # # ## # ## # # # # +# # # # # # # ## # # ### ## ## # # +# # # # # # # # # # # # +## # # # # # # # # # +# # # # # # # # # # # # # ## # +# # # # # # # # # # # # ## # +# # # # # # # ## # # ## # # # # # # # # ## # # +# # ## # # ## # # # # # ## +# ### # # ## # # # # ## # ## # ## ## # # +# # # # # # # ## # # # # # # +# # # # # # # ## # # # ## ### ## # # +# # # # ## # # # # # # # ## # ## +# # ## # # # ## # # # # ## # # # # # # +# # # # # # # # # +# # # # # ## # # ### # ## ## # # # +# # # # # # # # ## # ## # # # # +# # # ## # # ### # # # # ## # # # +# # # # ### # # # # ## # # # +# # # # # # ## # # # ## ## # +# # ### # # ### # # # # # # #### # +# # # # # # ## ## # # # # # +# # # # # # # # ## # # # # # +## # # # # # # # # ### # +# # # # # ## # ## ## # # # # # # E# +#################################################################################################### diff --git a/kalinovskiymi/docs/data_2/Маленький_10x10.txt b/kalinovskiymi/docs/data_2/Маленький_10x10.txt new file mode 100644 index 0000000..78d02bb --- /dev/null +++ b/kalinovskiymi/docs/data_2/Маленький_10x10.txt @@ -0,0 +1,10 @@ +########## +#S # +# # # # +# ## # +# # # +# # # # +# # # # +## # # +# E# +########## diff --git a/kalinovskiymi/docs/data_2/Пустой_50x50.txt b/kalinovskiymi/docs/data_2/Пустой_50x50.txt new file mode 100644 index 0000000..f35f554 --- /dev/null +++ b/kalinovskiymi/docs/data_2/Пустой_50x50.txt @@ -0,0 +1,50 @@ +S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + E diff --git a/kalinovskiymi/docs/data_2/Средний_50x50.txt b/kalinovskiymi/docs/data_2/Средний_50x50.txt new file mode 100644 index 0000000..1db18dd --- /dev/null +++ b/kalinovskiymi/docs/data_2/Средний_50x50.txt @@ -0,0 +1,50 @@ +################################################## +#S # # # # # # # # # # ## # +# # # ### ### # # # # # #### # +# ## # ## ## ####### ### # # # # # # +# # # # # # # # # # # # +## ### # ## # # # ## ### # ## # # +# # # # ## ## # ## # +# ##### # # # # # ### # # +# # # # # ### # # ## ## # +# # # # # # # # # # # # +## # # ## ##### ### # # # # +## ## # ### ### # ## # # # # ### +# # # # ## # # # # ### +# ## ### # # # # #### # # # +# # # ## ### # # # ## # ## +# ## # #### # # # # ## # # +## # # # ### ### # # # # ## # +## # ## # # ## # # +# ## # # # # # # # # # # ## +## # # # # ### ## # +#### # ## # ### # # # # # # +# # ## ## ### # # # # # # ## ### # +# # # #### # # # # ## # ## # +# # ## # # ## ### # # # # +## ### ## ### # # # # +# ### ## # ## # # # # #### +# # # # # #### # # # ## # ## +# # ## ### # # # # ## ## +# # # # # # # # # ###### # # # +# # # # ### ### # ### # # +# # ## ## # # # # #### ## +# # # # # # ### # ## +# # # ##### # # ## # # ## ## # +### # ## # # # # # #### # # +## # ## # # ## ## ## ## # # +# # # ## ## #### ## # # ## # # ## # # # +# # ## # # ## ## # # # #### # # # #### +# # # # # # ## # # # # +# # # # ## # # # # +## # # # ## # # ## # # # # # # # +# # # #### # # # # # +# ## # # # # # # ### # ## # # # +# # ### # ## # # # # #### +# # # # # # # # # # # ## # # +# # ## # # # # # # # # # # # +#### # # # ## ## ## ## # # # # ## # # # # +# # # # # ### # # # ## # +## ## ### # # # ## # # # # # +# ## # # # ## # # # # # E# +################################################## -- 2.43.0 From 0415405f0d22d6e7fd1791e75687b4a575398eef Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:53:18 +0000 Subject: [PATCH 06/24] revert d3e6a241b21ef99b47bc4338a375e82d7df9a8c8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert Загрузить файлы в «kalinovskiymi/docs/data_2» --- kalinovskiymi/docs/data_2/Большой_100x100.txt | 100 ------------------ kalinovskiymi/docs/data_2/Маленький_10x10.txt | 10 -- kalinovskiymi/docs/data_2/Пустой_50x50.txt | 50 --------- kalinovskiymi/docs/data_2/Средний_50x50.txt | 50 --------- 4 files changed, 210 deletions(-) delete mode 100644 kalinovskiymi/docs/data_2/Большой_100x100.txt delete mode 100644 kalinovskiymi/docs/data_2/Маленький_10x10.txt delete mode 100644 kalinovskiymi/docs/data_2/Пустой_50x50.txt delete mode 100644 kalinovskiymi/docs/data_2/Средний_50x50.txt diff --git a/kalinovskiymi/docs/data_2/Большой_100x100.txt b/kalinovskiymi/docs/data_2/Большой_100x100.txt deleted file mode 100644 index e08be03..0000000 --- a/kalinovskiymi/docs/data_2/Большой_100x100.txt +++ /dev/null @@ -1,100 +0,0 @@ -#################################################################################################### -#S # # # # # # ## ## # # ## # ## # # -# ## # # # ## # # # # # # # # # # # # -# # # # # # ## # # # # # # ## # # ## # # -# # # # # # ## # ### # -# ## # # # # # # ## # # -# # # # # # # # # ### # # -# # # # # # # # # # # # # # -# # # # # # # # # # # ## # ## # # -# # ## # # # # # # # # # # ## -# ## ## # # # # # ## # ## # # # # # # -# # # # # ## # ## # # # # # # # # # # -# # # # # # # # # # # # # # # # # # -# # # ## # # # # # # # ## # # # # # ## -# # # # # # # # # # # -# ## ## # # # # # ## # # # # -## ## # # # # # # # # # -## # # # # # # # # # -# ## # # # # # ## # # -## # # ## # # # # # ## # # -## # # ## ### # # # # # # # # # # # # -# # # # # # # # # # ## # # # -# # # # ## # # # # # # # # # # -# # ## # # # # # # # # -### ## # # ## # ### # # # # # ## -# # ## # # # # # # # # # # -### # # # # # # # # # # # # -# ## # # # # # # # # # -# # # # # # # ## # # # # # # -# ## # # # ## # # # # # ## ## ## # ## ### -# # # # # ### # # # # -# # # # ## # # ## # ## # # # # -# # # # # # # ## # # # # ## ## # ## # # -# # # # # # # # # ## ## # # -# ## # # # # # # # # # # # # # ## -# # # # ## # # # # ## ## ## # # # # # -# # # # # # # # # # # # ## -# # # # # # ## # # # # # -# # ## # # # # # # # # # # # -# # # # # # # # # # ## # # # # ## # # # # -# # # # # # # # # ## # # # # # # # -## # # # # # ## # # # # # # # # # -# # # # # # # # # ## # # # # # ## # -# # # # ## # # # # ## # # # # -# ## # # ### # # # # # # # # -# # ## # # # # # ## # # # # # -# # # ## # # # # # # # ## -# # # # # # # # # # # # ## # # -# # # # # # # # # # # # # ## # # # # # -# # # # # ### # # # # # # # # -### # # # # ## # ## # # # # # # -# # # # ## # # # # # # ## # # -# # # # # ## # # # # -# # # # ## ## # # # # # # # -# # # # # # # # # # # # ## # -# # # # # # # # # # ## # # ## # # ## -# # # # # # # # # # # # # # # # -# # # ## # # # # ## -# # # ## # # # # # # # # ## # # # # # # -## # # # # # # # # # # # # # ## # # # # -### # # ## ### ### # # # # # ### # -# # ## ## # # # # # # # # # # -# # # # # # ## # # # # # # -# # # # # # # # # # # # # # # ## -# # # # # # # # # # # ### # ## # # # -# # # # # # # # ## # # # # # # -# ## # # # # ## # # # # # # # # # # ## -# # # ## # # # # # # # ## # # # # # # -# # # # ## # # # ## # ## # # -# # # # # # # # ### # -# ## # ### # # # # # # ### # # # -# # # ### ## # ## # # ## # # # # -# # # # # # # # # # ## # # # ### # # -# # ## # # # # # # # # # # # -## # # # # # # # # # ## # ## # # # -# # # # # # ## # ## # # # # -# # # # # # # ## # # ### ## ## # # -# # # # # # # # # # # # -## # # # # # # # # # -# # # # # # # # # # # # # ## # -# # # # # # # # # # # # ## # -# # # # # # # ## # # ## # # # # # # # # ## # # -# # ## # # ## # # # # # ## -# ### # # ## # # # # ## # ## # ## ## # # -# # # # # # # ## # # # # # # -# # # # # # # ## # # # ## ### ## # # -# # # # ## # # # # # # # ## # ## -# # ## # # # ## # # # # ## # # # # # # -# # # # # # # # # -# # # # # ## # # ### # ## ## # # # -# # # # # # # # ## # ## # # # # -# # # ## # # ### # # # # ## # # # -# # # # ### # # # # ## # # # -# # # # # # ## # # # ## ## # -# # ### # # ### # # # # # # #### # -# # # # # # ## ## # # # # # -# # # # # # # # ## # # # # # -## # # # # # # # # ### # -# # # # # ## # ## ## # # # # # # E# -#################################################################################################### diff --git a/kalinovskiymi/docs/data_2/Маленький_10x10.txt b/kalinovskiymi/docs/data_2/Маленький_10x10.txt deleted file mode 100644 index 78d02bb..0000000 --- a/kalinovskiymi/docs/data_2/Маленький_10x10.txt +++ /dev/null @@ -1,10 +0,0 @@ -########## -#S # -# # # # -# ## # -# # # -# # # # -# # # # -## # # -# E# -########## diff --git a/kalinovskiymi/docs/data_2/Пустой_50x50.txt b/kalinovskiymi/docs/data_2/Пустой_50x50.txt deleted file mode 100644 index f35f554..0000000 --- a/kalinovskiymi/docs/data_2/Пустой_50x50.txt +++ /dev/null @@ -1,50 +0,0 @@ -S - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - E diff --git a/kalinovskiymi/docs/data_2/Средний_50x50.txt b/kalinovskiymi/docs/data_2/Средний_50x50.txt deleted file mode 100644 index 1db18dd..0000000 --- a/kalinovskiymi/docs/data_2/Средний_50x50.txt +++ /dev/null @@ -1,50 +0,0 @@ -################################################## -#S # # # # # # # # # # ## # -# # # ### ### # # # # # #### # -# ## # ## ## ####### ### # # # # # # -# # # # # # # # # # # # -## ### # ## # # # ## ### # ## # # -# # # # ## ## # ## # -# ##### # # # # # ### # # -# # # # # ### # # ## ## # -# # # # # # # # # # # # -## # # ## ##### ### # # # # -## ## # ### ### # ## # # # # ### -# # # # ## # # # # ### -# ## ### # # # # #### # # # -# # # ## ### # # # ## # ## -# ## # #### # # # # ## # # -## # # # ### ### # # # # ## # -## # ## # # ## # # -# ## # # # # # # # # # # ## -## # # # # ### ## # -#### # ## # ### # # # # # # -# # ## ## ### # # # # # # ## ### # -# # # #### # # # # ## # ## # -# # ## # # ## ### # # # # -## ### ## ### # # # # -# ### ## # ## # # # # #### -# # # # # #### # # # ## # ## -# # ## ### # # # # ## ## -# # # # # # # # # ###### # # # -# # # # ### ### # ### # # -# # ## ## # # # # #### ## -# # # # # # ### # ## -# # # ##### # # ## # # ## ## # -### # ## # # # # # #### # # -## # ## # # ## ## ## ## # # -# # # ## ## #### ## # # ## # # ## # # # -# # ## # # ## ## # # # #### # # # #### -# # # # # # ## # # # # -# # # # ## # # # # -## # # # ## # # ## # # # # # # # -# # # #### # # # # # -# ## # # # # # # ### # ## # # # -# # ### # ## # # # # #### -# # # # # # # # # # # ## # # -# # ## # # # # # # # # # # # -#### # # # ## ## ## ## # # # # ## # # # # -# # # # # ### # # # ## # -## ## ### # # # ## # # # # # -# ## # # # ## # # # # # E# -################################################## -- 2.43.0 From 6e7f88a63cd4da28fe486b6f4746ccbfbeedba63 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:54:53 +0000 Subject: [PATCH 07/24] revert 4633efddaeaa9c946540f506375dde0ff530eaf6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert Загрузить файлы в «kalinovskiymi/docs/data» --- kalinovskiymi/docs/data/benchmark_results.png | Bin 93612 -> 0 bytes kalinovskiymi/docs/data/results.csv | 91 ----- kalinovskiymi/docs/data/task_1.py | 377 ------------------ 3 files changed, 468 deletions(-) delete mode 100644 kalinovskiymi/docs/data/benchmark_results.png delete mode 100644 kalinovskiymi/docs/data/results.csv delete mode 100644 kalinovskiymi/docs/data/task_1.py diff --git a/kalinovskiymi/docs/data/benchmark_results.png b/kalinovskiymi/docs/data/benchmark_results.png deleted file mode 100644 index a97eb487cd0454f25b780b7524708dd547200e3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93612 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

uhu&IDNNj{BX)D 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%0D}(~@>BHM`?`ZBHN?Oy4` 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

9rW!bgVs4H!UwW!LF{mT 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 diff --git a/kalinovskiymi/docs/data/results.csv b/kalinovskiymi/docs/data/results.csv deleted file mode 100644 index 2c555e4..0000000 --- a/kalinovskiymi/docs/data/results.csv +++ /dev/null @@ -1,91 +0,0 @@ -structure,order,operation,time,run -LinkedList,shuffled,insert,0.030281299999999955,1 -LinkedList,shuffled,find,0.004695899999999975,1 -LinkedList,shuffled,delete,0.0033233999999999764,1 -LinkedList,shuffled,insert,0.0353907,2 -LinkedList,shuffled,find,0.005563899999999955,2 -LinkedList,shuffled,delete,0.0034716999999999665,2 -LinkedList,shuffled,insert,0.01944009999999996,3 -LinkedList,shuffled,find,0.002577700000000016,3 -LinkedList,shuffled,delete,0.0018714000000000786,3 -LinkedList,shuffled,insert,0.022181000000000006,4 -LinkedList,shuffled,find,0.004234000000000071,4 -LinkedList,shuffled,delete,0.0031284999999999785,4 -LinkedList,shuffled,insert,0.02823869999999995,5 -LinkedList,shuffled,find,0.004262699999999953,5 -LinkedList,shuffled,delete,0.0031122999999999568,5 -HashTable,shuffled,insert,0.000658699999999901,1 -HashTable,shuffled,find,5.359999999998699e-05,1 -HashTable,shuffled,delete,2.869999999999262e-05,1 -HashTable,shuffled,insert,0.0008105999999999947,2 -HashTable,shuffled,find,5.250000000001087e-05,2 -HashTable,shuffled,delete,2.8000000000028002e-05,2 -HashTable,shuffled,insert,0.0006085000000000118,3 -HashTable,shuffled,find,5.270000000001662e-05,3 -HashTable,shuffled,delete,2.76000000000165e-05,3 -HashTable,shuffled,insert,0.0005973000000000228,4 -HashTable,shuffled,find,5.179999999993523e-05,4 -HashTable,shuffled,delete,2.740000000001075e-05,4 -HashTable,shuffled,insert,0.0005963999999999414,5 -HashTable,shuffled,find,5.250000000001087e-05,5 -HashTable,shuffled,delete,2.7699999999963865e-05,5 -BST,shuffled,insert,0.0025841999999999254,1 -BST,shuffled,find,0.0001540000000000985,1 -BST,shuffled,delete,0.00013839999999998298,1 -BST,shuffled,insert,0.0025424000000000557,2 -BST,shuffled,find,0.000152800000000064,2 -BST,shuffled,delete,0.00013700000000005375,2 -BST,shuffled,insert,0.0025473999999999775,3 -BST,shuffled,find,0.00015370000000003436,3 -BST,shuffled,delete,0.00013370000000001436,3 -BST,shuffled,insert,0.0025645000000000806,4 -BST,shuffled,find,0.00015940000000003174,4 -BST,shuffled,delete,0.00013249999999997986,4 -BST,shuffled,insert,0.0025673999999999975,5 -BST,shuffled,find,0.00015799999999999148,5 -BST,shuffled,delete,0.0007081999999999367,5 -LinkedList,sorted,insert,0.04947849999999998,1 -LinkedList,sorted,find,0.0053706999999999505,1 -LinkedList,sorted,delete,0.003119800000000006,1 -LinkedList,sorted,insert,0.05800839999999996,2 -LinkedList,sorted,find,0.005768099999999943,2 -LinkedList,sorted,delete,0.0038080000000000336,2 -LinkedList,sorted,insert,0.05770470000000005,3 -LinkedList,sorted,find,0.0049146999999999386,3 -LinkedList,sorted,delete,0.003128599999999926,3 -LinkedList,sorted,insert,0.05588850000000001,4 -LinkedList,sorted,find,0.004705699999999924,4 -LinkedList,sorted,delete,0.0031733000000000455,4 -LinkedList,sorted,insert,0.05095189999999983,5 -LinkedList,sorted,find,0.0028690999999998468,5 -LinkedList,sorted,delete,0.0018724999999999437,5 -HashTable,sorted,insert,0.0004965999999999582,1 -HashTable,sorted,find,3.719999999995949e-05,1 -HashTable,sorted,delete,2.10999999998851e-05,1 -HashTable,sorted,insert,0.0004729999999999457,2 -HashTable,sorted,find,3.5199999999901976e-05,2 -HashTable,sorted,delete,2.0600000000037255e-05,2 -HashTable,sorted,insert,0.00046370000000006684,3 -HashTable,sorted,find,3.5699999999971865e-05,3 -HashTable,sorted,delete,2.0400000000142526e-05,3 -HashTable,sorted,insert,0.0004648999999998793,4 -HashTable,sorted,find,3.520000000012402e-05,4 -HashTable,sorted,delete,2.0600000000037255e-05,4 -HashTable,sorted,insert,0.000461600000000173,5 -HashTable,sorted,find,3.690000000000637e-05,5 -HashTable,sorted,delete,2.1499999999896602e-05,5 -BST,sorted,insert,0.09513269999999996,1 -BST,sorted,find,0.006302800000000053,1 -BST,sorted,delete,0.006097499999999867,1 -BST,sorted,insert,0.12047529999999984,2 -BST,sorted,find,0.006049799999999994,2 -BST,sorted,delete,0.0062197999999999976,2 -BST,sorted,insert,0.10559420000000008,3 -BST,sorted,find,0.003817999999999877,3 -BST,sorted,delete,0.004166000000000114,3 -BST,sorted,insert,0.09572439999999993,4 -BST,sorted,find,0.005789299999999997,4 -BST,sorted,delete,0.006035599999999919,4 -BST,sorted,insert,0.13064960000000014,5 -BST,sorted,find,0.006988800000000017,5 -BST,sorted,delete,0.006825800000000104,5 diff --git a/kalinovskiymi/docs/data/task_1.py b/kalinovskiymi/docs/data/task_1.py deleted file mode 100644 index ee7c141..0000000 --- a/kalinovskiymi/docs/data/task_1.py +++ /dev/null @@ -1,377 +0,0 @@ -import sys - -sys.setrecursionlimit(10000) - -import time -import random -import csv -import os -import matplotlib.pyplot as plt -import numpy as np - - -def ll_insert(head, name, phone): - new_node = {'name': name, 'phone': phone, 'next': None} - if head is None: - return new_node - if head['name'] > name: - new_node['next'] = head - return new_node - current = head - while current['next'] is not None and current['next']['name'] < name: - current = current['next'] - if current['name'] == name: - current['phone'] = phone - return head - new_node['next'] = current['next'] - current['next'] = new_node - return head - - -def ll_find(head, name): - current = head - while current is not None: - if current['name'] == name: - return current['phone'] - current = current['next'] - return None - - -def ll_delete(head, name): - if head is None: - return None - if head['name'] == name: - return head['next'] - current = head - while current['next'] is not None: - if current['next']['name'] == name: - current['next'] = current['next']['next'] - return head - current = current['next'] - return head - - -def ll_list_all(head): - result = [] - current = head - while current is not None: - result.append((current['name'], current['phone'])) - current = current['next'] - result.sort(key=lambda x: x[0]) - return result - - -def ht_insert(buckets, name, phone): - index = hash(name) % len(buckets) - buckets[index] = ll_insert(buckets[index], name, phone) - - -def ht_find(buckets, name): - index = hash(name) % len(buckets) - return ll_find(buckets[index], name) - - -def ht_delete(buckets, name): - index = hash(name) % len(buckets) - buckets[index] = ll_delete(buckets[index], name) - - -def ht_list_all(buckets): - result = [] - for bucket in buckets: - if bucket is not None: - current = bucket - while current is not None: - result.append((current['name'], current['phone'])) - current = current['next'] - result.sort(key=lambda x: x[0]) - return result - - -def bst_insert(root, name, phone): - if root is None: - return {'name': name, 'phone': phone, 'left': None, 'right': None} - if name < root['name']: - root['left'] = bst_insert(root['left'], name, phone) - elif name > root['name']: - root['right'] = bst_insert(root['right'], name, phone) - else: - root['phone'] = phone - return root - - -def bst_find(root, name): - current = root - while current is not None: - if name == current['name']: - return current['phone'] - elif name < current['name']: - current = current['left'] - else: - current = current['right'] - return None - - -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'] - if root['right'] is None: - return root['left'] - min_node = root['right'] - while min_node['left'] is not None: - min_node = min_node['left'] - root['name'] = min_node['name'] - root['phone'] = min_node['phone'] - root['right'] = bst_delete(root['right'], min_node['name']) - return root - - -def bst_list_all(root): - result = [] - - def inorder(node): - if node is not None: - inorder(node['left']) - result.append((node['name'], node['phone'])) - inorder(node['right']) - - inorder(root) - return result - - -def generate_records(n, mode='shuffled'): - names = [f"User_{i:05d}" for i in range(n)] - if mode == 'shuffled': - random.shuffle(names) - records = [(name, f"Phone_{i}") for i, name in enumerate(names)] - return records - - -def benchmark_insert(structure_type, records, buckets_size=512): - if structure_type == 'LinkedList': - head = None - start = time.perf_counter() - for name, phone in records: - head = ll_insert(head, name, phone) - end = time.perf_counter() - return end - start, head - elif structure_type == 'HashTable': - buckets = [None] * buckets_size - start = time.perf_counter() - for name, phone in records: - ht_insert(buckets, name, phone) - end = time.perf_counter() - return end - start, buckets - elif structure_type == 'BST': - root = None - start = time.perf_counter() - for name, phone in records: - root = bst_insert(root, name, phone) - end = time.perf_counter() - return end - start, root - - -def benchmark_find(structure_type, structure, names): - start = time.perf_counter() - if structure_type == 'LinkedList': - for name in names: - ll_find(structure, name) - elif structure_type == 'HashTable': - for name in names: - ht_find(structure, name) - elif structure_type == 'BST': - for name in names: - bst_find(structure, name) - end = time.perf_counter() - return end - start - - -def benchmark_delete(structure_type, structure, names): - start = time.perf_counter() - if structure_type == 'LinkedList': - head = structure - for name in names: - head = ll_delete(head, name) - end = time.perf_counter() - return end - start, head - elif structure_type == 'HashTable': - buckets = structure - for name in names: - ht_delete(buckets, name) - end = time.perf_counter() - return end - start, buckets - elif structure_type == 'BST': - root = structure - for name in names: - root = bst_delete(root, name) - end = time.perf_counter() - return end - start, root - - -def benchmark_list_all(structure_type, structure): - start = time.perf_counter() - if structure_type == 'LinkedList': - ll_list_all(structure) - elif structure_type == 'HashTable': - ht_list_all(structure) - elif structure_type == 'BST': - bst_list_all(structure) - end = time.perf_counter() - return end - start - - -def main(): - random.seed(42) - N = 1000 - REPETITIONS = 5 - - all_results = [] - structures = ['LinkedList', 'HashTable', 'BST'] - modes = ['shuffled', 'sorted'] - - os.makedirs('docs/data', exist_ok=True) - - for mode in modes: - records = generate_records(N, mode) - find_names = [random.choice(records)[0] for _ in range(100)] + [f"None_{i}" for i in range(10)] - delete_names = [random.choice(records)[0] for _ in range(50)] - - for struct in structures: - print(f"Тестирую {struct} на {mode} данных...") - for rep in range(REPETITIONS): - insert_time, structure = benchmark_insert(struct, records) - all_results.append([struct, mode, 'insert', insert_time, rep + 1]) - - find_time = benchmark_find(struct, structure, find_names) - all_results.append([struct, mode, 'find', find_time, rep + 1]) - - delete_time, _ = benchmark_delete(struct, structure, delete_names) - all_results.append([struct, mode, 'delete', delete_time, rep + 1]) - - with open('docs/data/results.csv', 'w', newline='') as f: - writer = csv.writer(f) - writer.writerow(['structure', 'order', 'operation', 'time', 'run']) - writer.writerows(all_results) - - print("\nCSV сохранён в docs/data/results.csv") - - data = {} - for row in all_results: - key = (row[0], row[1], row[2]) - if key not in data: - data[key] = [] - data[key].append(row[3]) - - averaged = [] - for key, times in data.items(): - avg_time = sum(times) / len(times) - averaged.append([key[0], key[1], key[2], avg_time]) - - print("\nУСРЕДНЁННЫЕ РЕЗУЛЬТАТЫ (сек):") - print(f"{'Структура':<15} {'Режим':<15} {'Операция':<10} {'Среднее время':<15}") - print("-" * 55) - for row in sorted(averaged, key=lambda x: (x[0], x[1], x[2])): - print(f"{row[0]:<15} {row[1]:<15} {row[2]:<10} {row[3]:<15.6f}") - - structures_list = ['LinkedList', 'HashTable', 'BST'] - operations_list = ['insert', 'find', 'delete'] - - fig, axes = plt.subplots(1, 3, figsize=(18, 6)) - - for i, op in enumerate(operations_list): - ax = axes[i] - x = np.arange(len(structures_list)) - width = 0.35 - - shuffled_times = [] - sorted_times = [] - - for struct in structures_list: - shuffled_times.append( - next(row[3] for row in averaged if row[0] == struct and row[1] == 'shuffled' and row[2] == op)) - sorted_times.append( - next(row[3] for row in averaged if row[0] == struct and row[1] == 'sorted' and row[2] == op)) - - bars1 = ax.bar(x - width / 2, shuffled_times, width, label='Случайный', color='#3498db') - bars2 = ax.bar(x + width / 2, sorted_times, width, label='Отсортированный', color='#e74c3c') - - for bar in bars1: - height = bar.get_height() - ax.text(bar.get_x() + bar.get_width() / 2., height + max(shuffled_times) * 0.01, - f'{height:.6f}', ha='center', va='bottom', fontsize=7) - for bar in bars2: - height = bar.get_height() - ax.text(bar.get_x() + bar.get_width() / 2., height + max(sorted_times) * 0.01, - f'{height:.6f}', ha='center', va='bottom', fontsize=7) - - ax.set_xlabel('Структура данных') - ax.set_ylabel('Время (сек)') - ax.set_title(f'Операция: {op}') - ax.set_xticks(x) - ax.set_xticklabels(structures_list) - ax.legend() - ax.grid(axis='y', alpha=0.3) - - if op == 'find': - ax.set_yscale('log') - - plt.suptitle(f'Сравнение производительности структур данных (N = {N} записей)', - fontsize=14, fontweight='bold') - plt.tight_layout() - - os.makedirs('docs', exist_ok=True) - plt.savefig('docs/benchmark_results.png', dpi=150, bbox_inches='tight') - plt.show() - print(f"График сохранён в docs/benchmark_results.png") - - print("\nАНАЛИЗ РЕЗУЛЬТАТОВ") - - print("\n1. Влияние порядка данных на BST:") - bst_shuffled_insert = next( - row[3] for row in averaged if row[0] == 'BST' and row[1] == 'shuffled' and row[2] == 'insert') - bst_sorted_insert = next( - row[3] for row in averaged if row[0] == 'BST' and row[1] == 'sorted' and row[2] == 'insert') - print(f" - Случайные данные: {bst_shuffled_insert:.6f} сек") - print(f" - Отсортированные данные: {bst_sorted_insert:.6f} сек") - if bst_shuffled_insert > 0: - print(f" - Замедление в {bst_sorted_insert / bst_shuffled_insert:.1f} раз") - print(" Причина: на отсортированных данных BST вырождается в связный список (глубина = N)") - - print("\n2. Стабильность хеш-таблицы:") - ht_shuffled = next( - row[3] for row in averaged if row[0] == 'HashTable' and row[1] == 'shuffled' and row[2] == 'insert') - ht_sorted = next(row[3] for row in averaged if row[0] == 'HashTable' and row[1] == 'sorted' and row[2] == 'insert') - print(f" - Случайные: {ht_shuffled:.6f} сек") - print(f" - Отсортированные: {ht_sorted:.6f} сек") - print(" Причина: хеш-функция равномерно распределяет ключи независимо от порядка") - - print("\n3. Медленный поиск в связном списке:") - ll_search = next(row[3] for row in averaged if row[0] == 'LinkedList' and row[1] == 'shuffled' and row[2] == 'find') - ht_search = next(row[3] for row in averaged if row[0] == 'HashTable' and row[1] == 'shuffled' and row[2] == 'find') - print(f" - LinkedList: {ll_search:.6f} сек") - print(f" - HashTable: {ht_search:.6f} сек") - if ht_search > 0: - print(f" - Хеш-таблица быстрее в {ll_search / ht_search:.1f} раз") - print(" Причина: поиск в списке всегда O(n), в хеш-таблице ~O(1)") - - print("\n4. Удаление:") - for label in ['LinkedList', 'HashTable', 'BST']: - del_shuff = next(row[3] for row in averaged if row[0] == label and row[1] == 'shuffled' and row[2] == 'delete') - del_sort = next(row[3] for row in averaged if row[0] == label and row[1] == 'sorted' and row[2] == 'delete') - print(f" - {label:15}: случ.={del_shuff:.6f} сек, отсорт.={del_sort:.6f} сек") - - print("\n5. Рекомендации:") - print(" - Частый поиск + вставки → Хеш-таблица") - print(" - Нужна сортировка «из коробки» → Сбалансированное BST (AVL/Красно-чёрное)") - print(" - Только добавление в конец → Связный список") - print(" - Обычный BST опасен на реальных частично упорядоченных данных!") - -if __name__ == '__main__': - main() \ No newline at end of file -- 2.43.0 From 61f50cedde4f52cdaf168f1200af2d096d8d3f61 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:55:09 +0000 Subject: [PATCH 08/24] revert 0415405f0d22d6e7fd1791e75687b4a575398eef MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert revert d3e6a241b21ef99b47bc4338a375e82d7df9a8c8 revert Загрузить файлы в «kalinovskiymi/docs/data_2» --- kalinovskiymi/docs/data_2/Большой_100x100.txt | 100 ++++++++++++++++++ kalinovskiymi/docs/data_2/Маленький_10x10.txt | 10 ++ kalinovskiymi/docs/data_2/Пустой_50x50.txt | 50 +++++++++ kalinovskiymi/docs/data_2/Средний_50x50.txt | 50 +++++++++ 4 files changed, 210 insertions(+) create mode 100644 kalinovskiymi/docs/data_2/Большой_100x100.txt create mode 100644 kalinovskiymi/docs/data_2/Маленький_10x10.txt create mode 100644 kalinovskiymi/docs/data_2/Пустой_50x50.txt create mode 100644 kalinovskiymi/docs/data_2/Средний_50x50.txt diff --git a/kalinovskiymi/docs/data_2/Большой_100x100.txt b/kalinovskiymi/docs/data_2/Большой_100x100.txt new file mode 100644 index 0000000..e08be03 --- /dev/null +++ b/kalinovskiymi/docs/data_2/Большой_100x100.txt @@ -0,0 +1,100 @@ +#################################################################################################### +#S # # # # # # ## ## # # ## # ## # # +# ## # # # ## # # # # # # # # # # # # +# # # # # # ## # # # # # # ## # # ## # # +# # # # # # ## # ### # +# ## # # # # # # ## # # +# # # # # # # # # ### # # +# # # # # # # # # # # # # # +# # # # # # # # # # # ## # ## # # +# # ## # # # # # # # # # # ## +# ## ## # # # # # ## # ## # # # # # # +# # # # # ## # ## # # # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # ## # # # # # # # ## # # # # # ## +# # # # # # # # # # # +# ## ## # # # # # ## # # # # +## ## # # # # # # # # # +## # # # # # # # # # +# ## # # # # # ## # # +## # # ## # # # # # ## # # +## # # ## ### # # # # # # # # # # # # +# # # # # # # # # # ## # # # +# # # # ## # # # # # # # # # # +# # ## # # # # # # # # +### ## # # ## # ### # # # # # ## +# # ## # # # # # # # # # # +### # # # # # # # # # # # # +# ## # # # # # # # # # +# # # # # # # ## # # # # # # +# ## # # # ## # # # # # ## ## ## # ## ### +# # # # # ### # # # # +# # # # ## # # ## # ## # # # # +# # # # # # # ## # # # # ## ## # ## # # +# # # # # # # # # ## ## # # +# ## # # # # # # # # # # # # # ## +# # # # ## # # # # ## ## ## # # # # # +# # # # # # # # # # # # ## +# # # # # # ## # # # # # +# # ## # # # # # # # # # # # +# # # # # # # # # # ## # # # # ## # # # # +# # # # # # # # # ## # # # # # # # +## # # # # # ## # # # # # # # # # +# # # # # # # # # ## # # # # # ## # +# # # # ## # # # # ## # # # # +# ## # # ### # # # # # # # # +# # ## # # # # # ## # # # # # +# # # ## # # # # # # # ## +# # # # # # # # # # # # ## # # +# # # # # # # # # # # # # ## # # # # # +# # # # # ### # # # # # # # # +### # # # # ## # ## # # # # # # +# # # # ## # # # # # # ## # # +# # # # # ## # # # # +# # # # ## ## # # # # # # # +# # # # # # # # # # # # ## # +# # # # # # # # # # ## # # ## # # ## +# # # # # # # # # # # # # # # # +# # # ## # # # # ## +# # # ## # # # # # # # # ## # # # # # # +## # # # # # # # # # # # # # ## # # # # +### # # ## ### ### # # # # # ### # +# # ## ## # # # # # # # # # # +# # # # # # ## # # # # # # +# # # # # # # # # # # # # # # ## +# # # # # # # # # # # ### # ## # # # +# # # # # # # # ## # # # # # # +# ## # # # # ## # # # # # # # # # # ## +# # # ## # # # # # # # ## # # # # # # +# # # # ## # # # ## # ## # # +# # # # # # # # ### # +# ## # ### # # # # # # ### # # # +# # # ### ## # ## # # ## # # # # +# # # # # # # # # # ## # # # ### # # +# # ## # # # # # # # # # # # +## # # # # # # # # # ## # ## # # # +# # # # # # ## # ## # # # # +# # # # # # # ## # # ### ## ## # # +# # # # # # # # # # # # +## # # # # # # # # # +# # # # # # # # # # # # # ## # +# # # # # # # # # # # # ## # +# # # # # # # ## # # ## # # # # # # # # ## # # +# # ## # # ## # # # # # ## +# ### # # ## # # # # ## # ## # ## ## # # +# # # # # # # ## # # # # # # +# # # # # # # ## # # # ## ### ## # # +# # # # ## # # # # # # # ## # ## +# # ## # # # ## # # # # ## # # # # # # +# # # # # # # # # +# # # # # ## # # ### # ## ## # # # +# # # # # # # # ## # ## # # # # +# # # ## # # ### # # # # ## # # # +# # # # ### # # # # ## # # # +# # # # # # ## # # # ## ## # +# # ### # # ### # # # # # # #### # +# # # # # # ## ## # # # # # +# # # # # # # # ## # # # # # +## # # # # # # # # ### # +# # # # # ## # ## ## # # # # # # E# +#################################################################################################### diff --git a/kalinovskiymi/docs/data_2/Маленький_10x10.txt b/kalinovskiymi/docs/data_2/Маленький_10x10.txt new file mode 100644 index 0000000..78d02bb --- /dev/null +++ b/kalinovskiymi/docs/data_2/Маленький_10x10.txt @@ -0,0 +1,10 @@ +########## +#S # +# # # # +# ## # +# # # +# # # # +# # # # +## # # +# E# +########## diff --git a/kalinovskiymi/docs/data_2/Пустой_50x50.txt b/kalinovskiymi/docs/data_2/Пустой_50x50.txt new file mode 100644 index 0000000..f35f554 --- /dev/null +++ b/kalinovskiymi/docs/data_2/Пустой_50x50.txt @@ -0,0 +1,50 @@ +S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + E diff --git a/kalinovskiymi/docs/data_2/Средний_50x50.txt b/kalinovskiymi/docs/data_2/Средний_50x50.txt new file mode 100644 index 0000000..1db18dd --- /dev/null +++ b/kalinovskiymi/docs/data_2/Средний_50x50.txt @@ -0,0 +1,50 @@ +################################################## +#S # # # # # # # # # # ## # +# # # ### ### # # # # # #### # +# ## # ## ## ####### ### # # # # # # +# # # # # # # # # # # # +## ### # ## # # # ## ### # ## # # +# # # # ## ## # ## # +# ##### # # # # # ### # # +# # # # # ### # # ## ## # +# # # # # # # # # # # # +## # # ## ##### ### # # # # +## ## # ### ### # ## # # # # ### +# # # # ## # # # # ### +# ## ### # # # # #### # # # +# # # ## ### # # # ## # ## +# ## # #### # # # # ## # # +## # # # ### ### # # # # ## # +## # ## # # ## # # +# ## # # # # # # # # # # ## +## # # # # ### ## # +#### # ## # ### # # # # # # +# # ## ## ### # # # # # # ## ### # +# # # #### # # # # ## # ## # +# # ## # # ## ### # # # # +## ### ## ### # # # # +# ### ## # ## # # # # #### +# # # # # #### # # # ## # ## +# # ## ### # # # # ## ## +# # # # # # # # # ###### # # # +# # # # ### ### # ### # # +# # ## ## # # # # #### ## +# # # # # # ### # ## +# # # ##### # # ## # # ## ## # +### # ## # # # # # #### # # +## # ## # # ## ## ## ## # # +# # # ## ## #### ## # # ## # # ## # # # +# # ## # # ## ## # # # #### # # # #### +# # # # # # ## # # # # +# # # # ## # # # # +## # # # ## # # ## # # # # # # # +# # # #### # # # # # +# ## # # # # # # ### # ## # # # +# # ### # ## # # # # #### +# # # # # # # # # # # ## # # +# # ## # # # # # # # # # # # +#### # # # ## ## ## ## # # # # ## # # # # +# # # # # ### # # # ## # +## ## ### # # # ## # # # # # +# ## # # # ## # # # # # E# +################################################## -- 2.43.0 From 541d73abd2b5a5bc98a37ffd05b0ee1bf25387b6 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:55:20 +0000 Subject: [PATCH 09/24] revert 61f50cedde4f52cdaf168f1200af2d096d8d3f61 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert revert 0415405f0d22d6e7fd1791e75687b4a575398eef revert revert d3e6a241b21ef99b47bc4338a375e82d7df9a8c8 revert Загрузить файлы в «kalinovskiymi/docs/data_2» --- kalinovskiymi/docs/data_2/Большой_100x100.txt | 100 ------------------ kalinovskiymi/docs/data_2/Маленький_10x10.txt | 10 -- kalinovskiymi/docs/data_2/Пустой_50x50.txt | 50 --------- kalinovskiymi/docs/data_2/Средний_50x50.txt | 50 --------- 4 files changed, 210 deletions(-) delete mode 100644 kalinovskiymi/docs/data_2/Большой_100x100.txt delete mode 100644 kalinovskiymi/docs/data_2/Маленький_10x10.txt delete mode 100644 kalinovskiymi/docs/data_2/Пустой_50x50.txt delete mode 100644 kalinovskiymi/docs/data_2/Средний_50x50.txt diff --git a/kalinovskiymi/docs/data_2/Большой_100x100.txt b/kalinovskiymi/docs/data_2/Большой_100x100.txt deleted file mode 100644 index e08be03..0000000 --- a/kalinovskiymi/docs/data_2/Большой_100x100.txt +++ /dev/null @@ -1,100 +0,0 @@ -#################################################################################################### -#S # # # # # # ## ## # # ## # ## # # -# ## # # # ## # # # # # # # # # # # # -# # # # # # ## # # # # # # ## # # ## # # -# # # # # # ## # ### # -# ## # # # # # # ## # # -# # # # # # # # # ### # # -# # # # # # # # # # # # # # -# # # # # # # # # # # ## # ## # # -# # ## # # # # # # # # # # ## -# ## ## # # # # # ## # ## # # # # # # -# # # # # ## # ## # # # # # # # # # # -# # # # # # # # # # # # # # # # # # -# # # ## # # # # # # # ## # # # # # ## -# # # # # # # # # # # -# ## ## # # # # # ## # # # # -## ## # # # # # # # # # -## # # # # # # # # # -# ## # # # # # ## # # -## # # ## # # # # # ## # # -## # # ## ### # # # # # # # # # # # # -# # # # # # # # # # ## # # # -# # # # ## # # # # # # # # # # -# # ## # # # # # # # # -### ## # # ## # ### # # # # # ## -# # ## # # # # # # # # # # -### # # # # # # # # # # # # -# ## # # # # # # # # # -# # # # # # # ## # # # # # # -# ## # # # ## # # # # # ## ## ## # ## ### -# # # # # ### # # # # -# # # # ## # # ## # ## # # # # -# # # # # # # ## # # # # ## ## # ## # # -# # # # # # # # # ## ## # # -# ## # # # # # # # # # # # # # ## -# # # # ## # # # # ## ## ## # # # # # -# # # # # # # # # # # # ## -# # # # # # ## # # # # # -# # ## # # # # # # # # # # # -# # # # # # # # # # ## # # # # ## # # # # -# # # # # # # # # ## # # # # # # # -## # # # # # ## # # # # # # # # # -# # # # # # # # # ## # # # # # ## # -# # # # ## # # # # ## # # # # -# ## # # ### # # # # # # # # -# # ## # # # # # ## # # # # # -# # # ## # # # # # # # ## -# # # # # # # # # # # # ## # # -# # # # # # # # # # # # # ## # # # # # -# # # # # ### # # # # # # # # -### # # # # ## # ## # # # # # # -# # # # ## # # # # # # ## # # -# # # # # ## # # # # -# # # # ## ## # # # # # # # -# # # # # # # # # # # # ## # -# # # # # # # # # # ## # # ## # # ## -# # # # # # # # # # # # # # # # -# # # ## # # # # ## -# # # ## # # # # # # # # ## # # # # # # -## # # # # # # # # # # # # # ## # # # # -### # # ## ### ### # # # # # ### # -# # ## ## # # # # # # # # # # -# # # # # # ## # # # # # # -# # # # # # # # # # # # # # # ## -# # # # # # # # # # # ### # ## # # # -# # # # # # # # ## # # # # # # -# ## # # # # ## # # # # # # # # # # ## -# # # ## # # # # # # # ## # # # # # # -# # # # ## # # # ## # ## # # -# # # # # # # # ### # -# ## # ### # # # # # # ### # # # -# # # ### ## # ## # # ## # # # # -# # # # # # # # # # ## # # # ### # # -# # ## # # # # # # # # # # # -## # # # # # # # # # ## # ## # # # -# # # # # # ## # ## # # # # -# # # # # # # ## # # ### ## ## # # -# # # # # # # # # # # # -## # # # # # # # # # -# # # # # # # # # # # # # ## # -# # # # # # # # # # # # ## # -# # # # # # # ## # # ## # # # # # # # # ## # # -# # ## # # ## # # # # # ## -# ### # # ## # # # # ## # ## # ## ## # # -# # # # # # # ## # # # # # # -# # # # # # # ## # # # ## ### ## # # -# # # # ## # # # # # # # ## # ## -# # ## # # # ## # # # # ## # # # # # # -# # # # # # # # # -# # # # # ## # # ### # ## ## # # # -# # # # # # # # ## # ## # # # # -# # # ## # # ### # # # # ## # # # -# # # # ### # # # # ## # # # -# # # # # # ## # # # ## ## # -# # ### # # ### # # # # # # #### # -# # # # # # ## ## # # # # # -# # # # # # # # ## # # # # # -## # # # # # # # # ### # -# # # # # ## # ## ## # # # # # # E# -#################################################################################################### diff --git a/kalinovskiymi/docs/data_2/Маленький_10x10.txt b/kalinovskiymi/docs/data_2/Маленький_10x10.txt deleted file mode 100644 index 78d02bb..0000000 --- a/kalinovskiymi/docs/data_2/Маленький_10x10.txt +++ /dev/null @@ -1,10 +0,0 @@ -########## -#S # -# # # # -# ## # -# # # -# # # # -# # # # -## # # -# E# -########## diff --git a/kalinovskiymi/docs/data_2/Пустой_50x50.txt b/kalinovskiymi/docs/data_2/Пустой_50x50.txt deleted file mode 100644 index f35f554..0000000 --- a/kalinovskiymi/docs/data_2/Пустой_50x50.txt +++ /dev/null @@ -1,50 +0,0 @@ -S - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - E diff --git a/kalinovskiymi/docs/data_2/Средний_50x50.txt b/kalinovskiymi/docs/data_2/Средний_50x50.txt deleted file mode 100644 index 1db18dd..0000000 --- a/kalinovskiymi/docs/data_2/Средний_50x50.txt +++ /dev/null @@ -1,50 +0,0 @@ -################################################## -#S # # # # # # # # # # ## # -# # # ### ### # # # # # #### # -# ## # ## ## ####### ### # # # # # # -# # # # # # # # # # # # -## ### # ## # # # ## ### # ## # # -# # # # ## ## # ## # -# ##### # # # # # ### # # -# # # # # ### # # ## ## # -# # # # # # # # # # # # -## # # ## ##### ### # # # # -## ## # ### ### # ## # # # # ### -# # # # ## # # # # ### -# ## ### # # # # #### # # # -# # # ## ### # # # ## # ## -# ## # #### # # # # ## # # -## # # # ### ### # # # # ## # -## # ## # # ## # # -# ## # # # # # # # # # # ## -## # # # # ### ## # -#### # ## # ### # # # # # # -# # ## ## ### # # # # # # ## ### # -# # # #### # # # # ## # ## # -# # ## # # ## ### # # # # -## ### ## ### # # # # -# ### ## # ## # # # # #### -# # # # # #### # # # ## # ## -# # ## ### # # # # ## ## -# # # # # # # # # ###### # # # -# # # # ### ### # ### # # -# # ## ## # # # # #### ## -# # # # # # ### # ## -# # # ##### # # ## # # ## ## # -### # ## # # # # # #### # # -## # ## # # ## ## ## ## # # -# # # ## ## #### ## # # ## # # ## # # # -# # ## # # ## ## # # # #### # # # #### -# # # # # # ## # # # # -# # # # ## # # # # -## # # # ## # # ## # # # # # # # -# # # #### # # # # # -# ## # # # # # # ### # ## # # # -# # ### # ## # # # # #### -# # # # # # # # # # # ## # # -# # ## # # # # # # # # # # # -#### # # # ## ## ## ## # # # # ## # # # # -# # # # # ### # # # ## # -## ## ### # # # ## # # # # # -# ## # # # ## # # # # # E# -################################################## -- 2.43.0 From cb4a60d325293ec04d7b6dbf9a5aae7e1367410f Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:55:46 +0000 Subject: [PATCH 10/24] revert 61f50cedde4f52cdaf168f1200af2d096d8d3f61 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit revert revert 0415405f0d22d6e7fd1791e75687b4a575398eef revert revert d3e6a241b21ef99b47bc4338a375e82d7df9a8c8 revert Загрузить файлы в «kalinovskiymi/docs/data_2» -- 2.43.0 From 2769e3eb011e58bb3c3a63e31bfcc37401d8491e Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:55:59 +0000 Subject: [PATCH 11/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/docs/otchet=5F1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/otchet_1.md | 43 ---------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 kalinovskiymi/docs/otchet_1.md diff --git a/kalinovskiymi/docs/otchet_1.md b/kalinovskiymi/docs/otchet_1.md deleted file mode 100644 index 845e0c3..0000000 --- a/kalinovskiymi/docs/otchet_1.md +++ /dev/null @@ -1,43 +0,0 @@ -Отчёт по лабораторной работе "Структуры данных" - -1. Введение -В рамках работы были реализованы три структуры данных для телефонного справочника: связный список, хеш-таблица и бинарное дерево поиска (BST). Проведено экспериментальное сравнение производительности операций вставки, поиска и удаления на наборе из 1000 записей. Каждая структура тестировалась на двух вариантах входных данных: случайный порядок и отсортированный по имени. Все эксперименты повторялись пять раз с последующим усреднением результатов. - -2. Вывод результатов: -Структура | Режим | Вставка, с| Поиск, с | Удаление, с -LinkedList | Случайный | 0.027106 | 0.004267 | 0.002981 -LinkedList | Сорт. | 0.054406 | 0.004726 | 0.003020 -HashTable | Случайный | 0.000654 | 0.000053 | 0.000028 -HashTable | Сорт. | 0.000472 | 0.000036 | 0.000021 -BST | Случайный | 0.002561 | 0.000156 | 0.000250 -BST | Сорт. | 0.109515 | 0.005790 | 0.005869 - -Графическое представление результатов приведено на рисунке в файле benchmark_results.png - -3. Анализ результатов -3.1. Влияние порядка данных на BST -При поступлении записей в отсортированном виде BST вырождается в связный список: каждый новый узел добавляется исключительно в правое поддерево. Глубина дерева достигает N, а сложность операций деградирует до O(n). Эксперимент подтверждает это: -Вставка отсортированных данных заняла 0.111692 с — это в 42.9 раз медленнее, чем на случайных данных (0.002601 с). -На отсортированных данных BST проиграло даже связному списку из-за накладных расходов на рекурсию. -3.2. Устойчивость хеш-таблицы к порядку данных -Хеш-функция равномерно распределяет ключи по корзинам вне зависимости от порядка поступления. Производительность остаётся стабильной: -Вставка: 0.000681 с (случайный) и 0.000665 с (отсортированный). -Поиск: около 0.0006857 с в обоих режимах. -Незначительные колебания вызваны случайным характером коллизий. -Это согласуется с теоретической оценкой средней сложности O(1). -3.3. Причины медленного поиска в связном списке -Отсутствие прямого доступа вынуждает последовательно обходить узлы, что даёт сложность O(n): -Поиск в списке (0.004320 с) существенно уступает хеш-таблице (0.000054 с) и BST на случайных данных (0.00018099 с). -С ростом объёма разрыв будет только увеличиваться. -Вставка также медленная (2,8 с), поскольку при уникальных именах каждый раз приходится проходить весь список до конца. -3.4. Сравнение удаления в трёх структурах -Связный список: поиск элемента за O(n), затем изменение указателей за O(1). Время удаления (0.003085 с) практически совпадает со временем поиска. -Хеш-таблица: определение корзины за O(1) и удаление из короткого списка. Время удаления (0.000031 с) на два порядка ниже, чем в списке. -BST: на случайных данных удаление выполняется за 0.000139 с благодаря логарифмической высоте. На отсортированных данных время возрастает до 0.006047 с, что отражает деградацию до O(n). - -4. Выводы и практические рекомендации -На основе полученных экспериментальных данных можно сформулировать следующие рекомендации: -Хеш-таблица — оптимальный выбор, когда приоритетна скорость операций вставки, поиска и удаления, а упорядоченность данных не требуется. Идеально подходит для словарей, кэшей, индексных хранилищ. В тестах показала стабильно высокую производительность во всех сценариях. -Бинарное дерево поиска следует применять, когда необходимо получать данные в отсортированном виде (например, вывод справочника по алфавиту). Однако критический недостаток — деградация до O(n) на упорядоченных входных данных. В таких ситуациях стоит использовать сбалансированные деревья (AVL или красно-чёрные). В эксперименте BST на случайных данных работало почти наравне с хеш-таблицей, а на отсортированных показало худшие результаты. -Связный список малопригоден для больших объёмов из-за линейной сложности операций. Оправдан лишь для маленьких коллекций, задач с частыми вставками в начало (в данном тестировании не рассматривались) или в учебных целях. -Итог: в реальных проектах выбор стоит между хеш-таблицами и сбалансированными деревьями — в зависимости от того, насколько важна отсортированность хранимых данных. \ No newline at end of file -- 2.43.0 From e5dd2683e991f9f11d970835fea2f0efb753856a Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:56:05 +0000 Subject: [PATCH 12/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/docs/otchet=5F2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/otchet_2.md | 146 --------------------------------- 1 file changed, 146 deletions(-) delete mode 100644 kalinovskiymi/docs/otchet_2.md diff --git a/kalinovskiymi/docs/otchet_2.md b/kalinovskiymi/docs/otchet_2.md deleted file mode 100644 index 214bac7..0000000 --- a/kalinovskiymi/docs/otchet_2.md +++ /dev/null @@ -1,146 +0,0 @@ -Отчёт по лабораторной работе - -«Поиск выхода из лабиринта: объектно-ориентированная реализация с паттернами проектирования» - -1. Постановка задачи - -Целью работы является создание программы для нахождения маршрута в лабиринте от начальной точки до выхода. Программа должна поддерживать смену алгоритма поиска, отображать результаты и позволять экспериментально сравнивать эффективность разных методов. -Необходимо реализовать: -чтение лабиринта из текстового файла -три алгоритма поиска пути: BFS, DFS, A* -сравнительный анализ алгоритмов на лабиринтах различной сложности -применение не менее трёх паттернов проектирования GoF -сохранение результатов экспериментов в CSV и построение графиков - -2. Архитектура приложения и применённые паттерны - -2.1 Общая архитектура -Программа построена на принципах ООП и включает следующие паттерны проектирования: -Builder (Строитель) – для создания лабиринтов из файлов -Strategy (Стратегия) – для реализации разных алгоритмов поиска пути -Observer (Наблюдатель) – для отображения процесса поиска - -2.2 Обоснование выбора паттернов -Паттерн Builder (Строитель) -Проблема: Загрузка лабиринта из файла требует нескольких шагов: чтение, разбор символов, создание клеток, установка старта и выхода, проверка корректности. Без Builder код загрузки оказался бы жестко связан с одним форматом. -Решение: Разработан интерфейс MazeBuilder с методом buildFromFile, реализованный в классе TextFileMazeBuilder. -Преимущества: -скрытие сложной логики построения лабиринта -возможность добавления новых форматов (JSON, бинарный) через новые реализации MazeBuilder -упрощение тестирования с помощью mock-строителя -Паттерн Strategy (Стратегия) -Проблема: Разные алгоритмы поиска (BFS, DFS, A*) имеют различную внутреннюю логику, но одинаковый интерфейс. Клиентский код не должен зависеть от конкретного алгоритма. -Решение: Создан интерфейс PathFindingStrategy с методом findPath. Каждый алгоритм реализует этот интерфейс. -Преимущества: -возможность динамической смены алгоритма во время выполнения -изоляция кода каждого алгоритма -простое добавление новых алгоритмов (Дейкстра, двунаправленный поиск) -Паттерн Observer (Наблюдатель) -Проблема: Отображение процесса поиска требует обновления интерфейса при изменении состояния, но логика поиска не должна зависеть от способа отображения. -Решение: Реализован интерфейс Observer с методом update. MazeSolver оповещает наблюдателей о событиях. -Преимущества: -слабая связанность между логикой и отображением -возможность подключения нескольких наблюдателей (консольный вывод, GUI, логирование) - -3. Реализация алгоритмов поиска - -3.1 BFS (поиск в ширину) -Принцип работы: использует очередь FIFO, гарантирует нахождение кратчайшего пути, обходит все клетки на расстоянии d перед переходом к d+1. -Сложность: временная O(V + E), пространственная O(V). -3.2 DFS (поиск в глубину) -Принцип работы: использует стек LIFO, идёт вглубь по одному пути до конца, затем возвращается, не гарантирует кратчайший путь, но экономит память. -Сложность: временная O(V + E), пространственная O(V) в худшем случае. -3.3 A* (эвристический поиск) -Принцип работы: использует приоритетную очередь, функция оценки f(n) = g(n) + h(n), где g(n) – стоимость пути от старта, h(n) – манхэттенское расстояние до цели. -Сложность: временная O(E) в лучшем случае, O(b^d) в худшем, пространственная O(V). - -4. Экспериментальная часть - -4.1 Тестовые лабиринты -№ Название Размер Характеристики -1 Маленький 10×10 Простая структура, прямой путь -2 Средний 50×50 Наличие тупиков, несколько развилок -3 Большой 100×100 Сложная структура, много препятствий -4 Пустой 50×50 Нет стен, свободное пространство -5 Без выхода 50×50 Лабиринт без exit-клетки, выход отсутствует -4.2 Методика тестирования -Каждый алгоритм запускался 5 раз на каждом лабиринте, результаты усреднялись. Измеряемые метрики: -Время выполнения (мс) – общее время работы алгоритма -Посещённые клетки – количество просмотренных алгоритмом клеток -Длина пути – количество клеток в найденном маршруте (0 если путь не найден) -4.3 Результаты экспериментов - -Таблица 1. Сравнение алгоритмов на разных лабиринтах -Лабиринт Алгоритм Время (мс) Посещено клеток Длина пути -Маленький (10x10) BFS 0.204 91 16 -Маленький (10x10) DFS 0.148 91 44 -Маленький (10x10) A* 0.172 87 16 -Средний (50x50) BFS 3.377 1526 72 -Средний (50x50) DFS 2.881 1526 194 -Средний (50x50) A* 3.154 1061 72 -Большой (100x100) BFS 18.363 7064 123 -Большой (100x100) DFS 14.031 7064 305 -Большой (100x100) A* 15.562 4785 123 -Пустой (50x50) BFS 1.113 2500 98 -Пустой (50x50) DFS 0.760 2500 98 -Пустой (50x50) A* 0.961 2500 98 -Без выхода (50x50) BFS 3.210 2036 0 -Без выхода (50x50) DFS 3.086 2036 0 -Без выхода (50x50) A* 2.746 2036 0 - -Таблица 2. Усреднённые показатели -Алгоритм Среднее время (мс) Среднее посещено Средняя длина пути -BFS 5.253 2643 62 -DFS 4.181 2643 127 -A* 4.519 2094 62 - -5. Анализ результатов - -5.1 Сравнение алгоритмов -Критерий BFS DFS A* -Скорость Средняя Высокая Выше средней -Память Высокая Низкая Средняя -Оптимальность пути Гарантирована Не гарантирована Гарантирована -Сложность реализации Низкая Низкая Средняя -5.2 Наблюдения -На маленьких лабиринтах все алгоритмы показывают близкие результаты, различия несущественны. -На средних и больших лабиринтах BFS и DFS обходят все достижимые клетки (1526 и 7064), в то время как A* посещает значительно меньше клеток (1061 и 4785) благодаря эвристике, что подтверждает его эффективность. -DFS стабильно находит более длинные пути (44, 194, 305) по сравнению с BFS и A* (16, 72, 123), что ожидаемо, так как DFS не гарантирует оптимальность. -В пустом лабиринте все три алгоритма посещают одинаковое количество клеток (2500), так как нет препятствий, и путь всегда прямой. Длина пути одинакова (98). -В лабиринте без выхода все алгоритмы обходят все доступные клетки (2036) и корректно возвращают пустой путь длиной 0. -A* показывает наилучший баланс между временем выполнения и оптимальностью пути, посещая в среднем на 20% меньше клеток, чем BFS и DFS. -5.3 Рекомендации по выбору алгоритма -BFS – когда критичен кратчайший путь (навигационные системы, логистика) -DFS – когда важна экономия памяти (встроенные системы, мобильные устройства) -A* – оптимальный выбор для большинства практических задач (игровой ИИ, картографические сервисы) - -6. Эффективность применения паттернов - -6.1 Преимущества использования паттернов -Паттерн Что упростилось Что изменилось бы без паттерна -Builder Добавление новых форматов лабиринтов Модификация основного класса при каждом новом формате -Strategy Смена алгоритма во время выполнения Множество условных операторов и дублирование кода -Observer Добавление новых способов отображения Жёсткая привязка логики поиска к консольному выводу -6.2 Гибкость и расширяемость -Применённые паттерны обеспечивают: -открытость для расширения – новые алгоритмы и форматы добавляются без изменения существующего кода -слабую связанность – компоненты независимы друг от друга -возможность повторного использования – классы можно применять в других проектах -6.3 Что было бы сложно без паттернов -Без паттернов проектирования: -добавление нового алгоритма потребовало бы изменения MazeSolver и добавления условных операторов -поддержка нового формата лабиринта потребовала бы переписывания кода загрузки -изменение способа отображения потребовало бы модификации классов поиска - -7. Выводы - -В ходе лабораторной работы разработана программа для поиска пути в лабиринте с применением трёх паттернов проектирования: Builder, Strategy и Observer. -Основные результаты: -реализованы три алгоритма поиска: BFS, DFS, A* -проведён сравнительный анализ эффективности на пяти типах лабиринтов разной сложности -продемонстрированы преимущества ООП и паттернов проектирования -создана гибкая архитектура, допускающая лёгкое расширение -Ключевые выводы по алгоритмам: -BFS надёжно находит кратчайший путь, но требует больше памяти -DFS быстрее и экономичнее по памяти, но путь может быть длиннее оптимального до 2.5 раз -A* обеспечивает наилучший баланс скорости и качества, посещая меньше клеток благодаря эвристике \ No newline at end of file -- 2.43.0 From 1949ccff7723ffbd1d8a06c83beea64d9b0e85a4 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:56:13 +0000 Subject: [PATCH 13/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/docs/data=5F2/comparative=5Fresults.png?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/data_2/comparative_results.png | Bin 63399 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 kalinovskiymi/docs/data_2/comparative_results.png diff --git a/kalinovskiymi/docs/data_2/comparative_results.png b/kalinovskiymi/docs/data_2/comparative_results.png deleted file mode 100644 index c6a3592a6121a6b62fb782789451403656611cc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63399 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

$c%kH zl;JqCa}B#eFNjZm@G&kS$neMA6PmHn#bxnMw`N@wVpli2!~tJ)azD;LFn40Ew#BF5 zq_Uj7keIZ|i#tc|*w8Rv`^n&H@17aVn>DF>&wu^o?Y#8Gs_(eYlGiN!ECzg$75hVz z>zwQRLs^KpoO;VP}zt!mYVg z)w13P%d)?kN%GtNW~gXuU4>2TOR#H$tLW_aXfXPGY<=(V>5Amj4*=-Z%A;#|a90v* zxCw+nP>*%I@43CcoK4~FQs%V|T~k>X%cd}?8xKp3IeHpaVya^-?cz4`LJ@yvWl^ms zl9!xq7y;?12JKMabzy6bdJS-zo264RwW9$y)2V1~7U79%exjr{SzEzr_HCoG|fA7m}?(LQK zo#_Ko;qZ|XNAr^X!I`tns>D+Id;O9 zM5!mRrgo;ZM)e+#R9P^bhaxL|j?jzDR)ANIPNBMAUmAaZ=XuKk8>VYwNlXKVP$^A* za;6A{!2>|L>j463XreCInLEX7D|3YGm&!U4yK4jP(OMqq>tSErRMvIlUjF}D`x0oV z`~P3*K`Bc~C5ckDPze>;qEsSeUrWY5LJVT86)J6vLb65HvCh~+mPZ+69m@=f%04Jt z5$^k=-?{&L{^#6t?>YBA=X7#BCBEO!@_xUzH)la~Agt>;;9PFPTU|mUByVl(%R$h& z_5jUUAv_IyrmPSur~Ss$UUV?NL36nX6AXp`x{;io6x0BfEoqYhqz%0T<%$nfvsz14 z%=EAWcf{uX;p(>n**D7kN#AzB^SypWo_UG%r$9Ai6Z_!zonZV9VIyk_&~>)?K_Btf z8+cXUQ~hr0V?n8_Lx8X?f~|Mw#CiwJVabCk<1?I}_}_{lXav}z2B?&sK8JECj{#q( zIRAP%zhUp5UY&UPmTc?lwHsMbgk$a;=2Q76xLYg3rt9LEeV;?-Vq9a-cM2#c+ zJQb1CxdqmWJsJox2SWY(F}DF`q!)5Q%Mkg)n%6(;VV*m(UyeW+3W?zdP(U1zBfU$8 zg*Sk!$C-n@xU&ie3DLBwHDJ?dqeR;aQ2WBP3-e~sCiwq(7=nC+BWW+J3e!$>5dqCA z`g*qr{0MV3Y=SRQnkq=@KJ~lRagZNHSlwQw5!y3AnvH^A5M+w~^DwAhW8+loh4c7I zy*?bv%)_B36hT z;Q5?mI})lDu3O>yFm|ZtDsR#UyGIllW{Th^EM2!$W8c{|?Ig-lh3IBv*y6AmP`ik@ z_)n+5Zb!W6NL)4Tc?A=)4gwxPL z*vQ0Rm-9%uA#k?8o-8eV&Uk{rn|vh#OjU<1-zT{sm3!Y6Uia$k#zexUH`%K?U=U)w zNnw|Hjt^>fIXCnX*JE$_G#`Q;bXOdQT`(8Kj-#|CH1V~C_!OF+J`mm>_MG)rGlP@8 z8Mq_$;DT+@kbriJu5382N(?f>8}?zHj4>P!=sN2#1lWbi5VE%0W*kFqSI&r37|ORp zAMuQs=Um+uzF3~%Zx3gj{pLh1g8*R##5rI0LkG+1^=}I_y z<05@Z5ii02LAQ@Wa0)8&s7l ze~U|(M*7KX26lXE3aW@7lh0O@>jkLVbq zD0Ka>i{Xzdv4J0?YZU_BEatANZPf~@;zDho7*^XPmXGrHJoOkpsiuO zDSh)?p7>WSHW7}TX_9SIK+~8KCalTbf+3E^#*oCV! zOkrkaG$URA2(bk&23ue&oV3n3{6UGd*hueF)oMWhOjXIi`QbU3y}S(NiOyJAh$BH} zYb#l+;fkb^@!&OnlwbUqYsj>KI9T!H{MUKNpu0iu$An6(7>WAbnTauXEm*Zaaz*x5 zSjK%n$kK4J^iI&Nz(_C|eVJlbXeZ}Fu{ZXOb<3fRHwODid>u;dFcbFhzg6vjeMaJv z@5MVv!?j)obe2kYp^P&s-cK}<=wz%?*kCrB4iU`>2i<`1o!CN)CxMS-XWgLxh*Mp3D74$ zpgR|)AyL+o@w#2Ubdp%{4&Hl@>qB7H@4!#L0N?Zo#BqEw2e#Q8E>{}k?UIF{3E1qt zA&~wK6h%Lt{|g1ulV7o*+~^?Bz-Uc?I0J|Qe}HDcNBf9XBz*@wWNLC+i6IQE&<_NK zB`!fw6bk5Fg2>lCawSl>l~82(fQFWR^%JnXBZe^BY4Nvh5da&Wt@h0?hd>I^x9A&r z6xH0`P_^FyQlwx8CSbKMdM*5birg0xD&~;nYz0zX*Rd+8Yj=R9^lZX|jH?nXS)k(R z0|}lF2%r{_LGKnY2DmFn!Qfp2a}(O^yVht%K(dhY?%f&`YQLjN*8Js{f)j(ZZ)2E! z2!S|vaDS+$h4y(%zneWb^WZ3P3uEcjfM-+>;&E2-a2{AesWT?G@B<1*Kh*!>iFmbD z$-i%8E_cE^8W!tEfc1_cL^ctt+>-+w38FxBG=;sVzjL+ z*Z4U8VK4P;a~~X1Mr1huKd+$C`t0~N!7j7{nkSio87I}YWhD05wllYcQ|J>kGDEAA z*6Tk%sjT}S1Ioe*V#ZyPzK;dzLMf658j{5vE6L@@V(3ijB%60K@qVpsRRrLHxFc22={(JL>%SbDafKk<7d*hFaK-u?w8B~(KZ z_e|J7-uZh=Kv@|PywO@75tZgf_&iNG49XG1q3XFl#l&n&* zNoz9!XT!*N%*Pc>vw5rH=3ST?+i1rZV-U7x z6MDGk07`3N#498n6*4@&-`6H%Et_#@`c}6*1zJF{ik1Y~ejwg)z7(bhF%gGpuaUqJ zu{55d+{*%(3y?&lR5xhM&3E7tTk!G&nPepNOLU$xU?nKFAJt6?^6taD@C9+jm6Gag zeBHVc<0$mP^C+!;;stF9rY+sL+69tS+of$0E{aPQeD^8k6@Zec&y3&I6Q$CQ&A*mm zfCeyjdTG#iRG`8#B#tkvYXcM!4+I2h&woIXjmr0b`AnJ!danVGOrZ68DXzOQmrwm?e zxC&R<)Y92MvvtYX3?Xf`7i4SbII!{qkjUx?obElY0H--2R;HBTKaUls^Z5kXqiaKP zm2X4!e@T6xm?_5(VA98Dy0IfpR|Sqo^X~P1?}pbuBDX7JoN4E!n)pIK-i-10=}`ih zL-!vxud&~;_MXh!T&38@L(tGw-Sv5TsOIf*3OQD0?2!2FS%91_om#Z;9`KTnLVeI@ zhzeK7n{KMDn5lC9kN}tnoo6@UFq(Gs*r_sf3RY3Eshh;MLzIxt!MrI|f^TCuvkfM^ zd}$yeFJu_#`m?*-BACw-#PqC^^dr1#lth#sJ9x%QsWzI4Iv>HTdJFGIWjwj;j| z#{A^kz#xLqhX}^nC;=!?vt^3E9lR|xTrFFcB{JNlQ3OYB<9tzEI2nb*gYyknd#w!N zYLG23)f)HIG>T;qF4sl8lrc)E2hhV=y9HV zpW)a^N76EgH^bHHYD?rqSVI7YzG9i@g?^1RSAm_8-B+XHKLH0Q3lvvp<1xUxd)NlRZZRV5;1PBCY zGYm;p^h=&#pSKkipN5o_1QX-QENlt`<%ZI|+yg_+XJ!|!*2{bI^x1WPT8;-0NLn%3 z4c0~r;yl2teG^egqBo5MiGTqlSkM6viHue7%1Ss3w9430uJ- zi0O3S$s3t>X}5 z-#UBSY0rYX_OKObB-rinLUWH-i=jzy3wmxHVVzXY>Q znWQ(CoWGewv!=TOjgEWd2f-gxGQy7hDD)mT#81!RP_*#_k+TMXpXNk0tPS4DoE$TN$3|na;yi z?IOH5M)uSW>SfMqj9DxPWsAPZQ>XoqwYEY&PMQBFK0hi12VbiF0$O^BK6 z#6AQDyj=)v57e~vIXq6KD zUnp{8OqrptL^{1>uWRa@Wps;PtT8?<@RV4&Xr>sE6LMJKQK~zeBsI%u>!wo&u|AH$ zAA1a3)tZb~Ca%BnU{dfYyMDFio=6EEtm2H@0%CH#<#Ds^r9Zc;ZDsYm-aa^yard56 zaP|OI)AH#!XK#6e^-3*>5P6pcR&ynIQhZtZZA-uvz{S$>n5Kj8(ax93+L{;oq{_JD zBMh4ET>-rO+>AFgc*HP@z1Vf-j!U}S<3|3}OU8VxENR4?i*~#6CyHF@Wk1fP$rx-_ z@n`l)2p0?Q*h&KpI5z1m4ksH+rZ{HE24zGp_-flpKZ|M%yH>qLKk$i2QAA7KO7(K; zL_t_}deTMF2S}+@Lj~cCOXGIJ2VJJ@?@+I&%Ij`h=hQCG{Xtn{lc(D5Hl$?veAgvft)5Y$U+KtRBrlBr{<{U<5tQs{G$tGiiP006h@ zDlen`_MF|4H#Aw=3RwI&F4mRFi{wkH%c}YbZILsZ1BNBzHF?|NXu0%9hgohvQ@o)Y zN_5!#Ktz-JhC-CDU_FJQoL_lYXl~G{?9V*vz{rcZZD>A-xg_SN!w6_R^1=tj_O|@$ zI9x~6mb*9+L}>SBE5H>tz3b5UI>hrJJMSo6(^Q$g)WWY~Ei-Bx=J{PV8`oNMOm&&r zG{wYswuY?}Gw)EvjM?hA?nc+z6jarO!H93WLi%?gSTr@KPFO%T^dg*@rz;k(?M{~Q zuoyA>Hkf_o0;XwP2>*um8MY@G<$zpa4;ZjnOw->#mpdQjtuM0GH8~uT6|1_`(*aqgq+K2jq z^-(PII83n6l{fYgNm}lr#S;0v#VqoTygi*%FL z(9cz|?u=JE7JLcq?OWA;RXyF2aQA3;3!|D&Eabf=q3l?pYT${k?A_p5#T^T?2> z8s7rGWLotpx7HC(o6MW)l7!L?w3DSC`oLkK7zH?CA|9HcisSSF3!z8J4vOg$p%qIg zr1+L_kJOY0>dWbCUhl!7p?6>L0j~bxv8rCXcN!jvhS#4#LhUWcOvlAi+9(bJ&-E^B ze#p5~VQ*=W!Da%j4Wl`}h{HsQ`B0Pi7++G&x@hvxOhqUkJLElsiOkH#2ZYBg{K|tZ zwd( zj(t0SL@%0D6FkyHLOwk0 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 -- 2.43.0 From 6a0209fb6bd157edbf12ad7df571588124befa8e Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:56:17 +0000 Subject: [PATCH 14/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/docs/data=5F2/mazes=5Fvisualization.png?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/data_2/mazes_visualization.png | Bin 98420 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 kalinovskiymi/docs/data_2/mazes_visualization.png diff --git a/kalinovskiymi/docs/data_2/mazes_visualization.png b/kalinovskiymi/docs/data_2/mazes_visualization.png deleted file mode 100644 index ea95abe61e267885ea573012ee453ab43ea52154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98420 zcmdSB2UwHox-J|mmJw7?P)b0Spwf#V9UJJ-M5Q;Sh!Fx(0zznx1*IcO=qN}SrAZ4l zV4;c_AwnRbC>=tGv;+u{^L}Aw)||a(t^eO=uf5Mcxh^l@%WIPFeV=ka_j5mae92gU z&#uF}U@+L8ix7d^{R29(L@EdEr*Ygo}^DT5sQnU15(~xOv_fpU8MM zGxd6kIUkU5{UY4VQ`l~>a2@YyR&*@l2zXoQVU>ia{_WSdBggh`=3La(+5uOhz)TmdT=S)cj&Ps7O^-g7pg|b$t<})U5S=3lp zAu||dxk&Zs#>Ph9dRD)j-E4$~p@#pAA+wroqCQhceNx)fVnY_PxtR3z!DmH5qrMc%fC_$%=IOv(akHOKq1q3!YbLTHx$9;; z*$hu&Iz4FIw=2*7q}}=)#)MSeUH)-&wK;UPxma$?o0D_-_H+4m0e;DCwpe$j+*+qx zj;j{cYI1d+0AEVBWHB4S27IFq;fu9mwHQ6VRc&^KpKvyVE8U~Gm33yl4#Q>B>jc!| z6BKP3{{z1M9sZFa5-<{vaB*?@<|e+Ipia%VrkvIGQ|^aZ(n>IR_rPY2f%uSF{?OUD zW*tUxY|euR59VHm(Q5i>9{xY%Z0Ug{ia9-FT!+0pS?G^FUdtF$tq%yCc7oS<91a)uvs|X{w*T>q@5kf0Pupf+N@~55-Wx)5b1-19 z64+@2i-rCbr&=xaFGuQH^r`IU;Yc}eOU#}2%J1o6lz=SSiCT0Dr z+NznF!-ohL>VNF6zun>l*+5$;unjuarhm$O^8Ic(L!Qv34{b-TkBo$_kB4F{>gJwJ z#;#Aqc76|sYcob+dg9b6F)BG8C8qA9H{O11HF)U*+_-*Ds@}V09?o8BZu=}fYh_7u zSRZxxsM35)|JRpc2k#6E4q7(METz^jr#6}udOsVI)LCv7BV^tgdfX`E8PGPA

w< z_|*6NP2^sb!%8P6f)K(eZHx_F9hRvdubuxao!=939RLDNx6pO49+UKt!P3G7TbA!8ssU$-XM|e#aHzzLN z8P^!Ba%XOVFTEWyuc$UFe)Hy%K~2j&gQ(6EJa^u1`8a@PFPN}>e-uZ`)ty@Fa#%A9 z{I&&N`5m2Q!Gdm}#8ux`WF)bo)@6Am+TE`;ULXZ;y-*nX$w}mjJytYO?7T_RxHhvY z{HNI%5#iZ^B(`;jhS#Dp3!~qgZx^gEtz}<9*4LhkFWJ*!41KF&>`W(cTehD9EW8-Ar>`hKpI7;aP zWPl${5BgVr5LOA&mTlXvY>?4fnl>lhH+@6ZKrUo9vMqQTiM=Jm?J?se?~ z!`dsLs$5(t%r6dA;*nB1gQo|3u5`qPJe@%gvaqZ{_WC3^C4yK5dI$6d_Vx!PWM8Z# z6N0dPbh=+f%`-Op*X)?rId&tb@5Y%wzIW#*w@`2%0Y8d)g1&7Ty-h!*>oIavF5se? zyQZx8e&&%!@VcQe^$BdXg7a#DXRzBcKNq_z1b9W_+0sDS4ZXGOXM99^Pe?54TyGVD4~Jj$2*MWG^c&4ewX{4nh?wKx-a@pLQ8VRZ>&@9fHIn1bLccU%d5A zPz!&eMtr8GP;_jjaS-z4x#nMzETrky!1+wL>u_v-){T0YfX=TCT04eI+;v$krDt19 zCqI_9PxqGQe#*7{T<$pNkm?p(Y~-lb81j>Ec)rHd{M5qy$hOF)QRD15L6*-ajnDPn zDapxdmbLx2#P}bYioQf;aW#N@t1B5l#}+-bskZl>cF016d=zUkEoiQF)F?7r-?%T~ zTERr`{*Zaq(9&8SlhsBeH;YK-`Mp7N37OJpmxlJh!PPNUjMyPOFF~6%t-KTZlUT%F zDauV9Sip|*Kc5(_Os?cVyEUXXBxz~$0eloLu>ScPi|JX#Y}XrVZh&GDf>dZn&7kUZ z(^SfK=vXSp-(H?48$FsleTZnndRM`QQS zZUJG4yx1>epy<12b!9{L_5SD`+z4T_WH%FxzG-9US=-hL z2H|JFS};#VB}7f+>{oqYN4a+sNpA@8Ol%LFZ$7$n`{Oo=2KnXQ-rfb((0SFfaz6WY zR)oD8_Koi8<2oLZHQl>lQ@?04sZvqZ{+3keVUQpBdc~nn#d>^gbgEurb*gCn*78xQ zz&nlnrFV=LcBM4bo(;9KU@C6IVm`&I5mVIA%o!QEcYL8<$5Se$iB~e_o|Z6a*2Tdq zMKt#LqKUd(owdnHVfr2Y-Ypu&XPneK?lCHdV{H7B;m;4v8DsD&EcSmdQF3xHJ>5rVCi)YoImgWq_9(O&sR2`mVK}MUP%^SlDu^0hifRq zbrNLJGrg>A&+O~nYtN&3AGZfB<~hiOCl}4QRN`ElZ{=nL-de8c*5exQ!ZWh>u<7iz z`nkDnZVu>Jbf5SdGnDNg@I-NX>(RjWbE3c#i-cAhMFTNGlLihaigJXh{&{+87pFqS zZ1BjH6%x^YEk~vSMINpmC^pJYH=}!Abs1Q5IcW%=69qAnq9hrTZ;3__dK|Vd@^PzH zwHk3(!7r>n->(y)Is4c|I`o1So?th6!lL)bfLLDR#apY5M^V~qlO`A@;_>1EmYMCX zX06ocR=;iNer8t$ypZSXI5gL8~Fl$4HZju4kg3QMP{7 z-`LbjXXJ=EpY5>Rx#mwv=6pG!Y-VVEkhET#$KPg>cVu4@efexCJdf8zQz0EaQ#C5T zB=B=xeCQe})QDL-u0>3r@y(rU3l2(-HHfaAjrQ!5|Kb?9uMA3zD(U_|@yDjtHhrN* zH@Fy@M{Ys=G;1$Iu8TkQ{n3D)S5ao=Rf~nd$8uuqA3W^aEmX(Kzy-d?@OcqdPjg~h zY4Sv4Xg}4yqL$k~Keqkcn@{cSIr^GI`>2W6<0>%CN2F``C$ijE8`t3&vxr~5-;m6IJJO;QkZ6$cpa(uQch{@x?du`^fu6!y{we|1 zxz!7Wx;tn`sm}e%E_QtB!zHi8a9!5%7uPm_zXe~L&{sunamQ>HEAY)^_2mkwtiLh| zeqAfwePey4h+RFsjaO^koM-o-v?!D_Fw8>&BVi)^x3G-kAiPy^SWJ| z8%fq|J4$%(0I8g2rtnE*DQ>oyw@MO73wJ!d3gn{XzpA;@xCJm)m&o3Z6n?AQ#(`SO9|FtR9u|w93$J__8>WBj9lCwS9}yaV*Y>*XeONF& zQLsP&WeW9SxjqlZGh{w>G&Wq!qeY11&jYemeQJ!_SkgTQTYDCnlt>H&^{xdY<}vLc z>2j>Wk%jX+^a(kZ-NP{&GuP;am76?mXRa;I#i9qqWJiA##|GyI@x<{bi~C?@e1;Uy ztg&1hg5@1`BA5Hw>r6Q`%fn3CXLac|C|PlR%vh+R=89YLIy&YBD)yRM{q0}4HzHqS z?5gS8NF+bYdQ}(7nf?@=o6YKv;Lc88FHYw|1(-U(t(}4cKOWBM_dzvFxipu&c8PJf z(b?|v;m?4_xs6`<5)D-jqa}Jb&U^9Qx}v)qifB<9_=CBbAuDf5!akoA8h3&MyTz#p z0EtMdJ+r#eMb;;IsK+T*CKomJDmRfxt$}R4k6Fi*VbBNbJyQJZ=F{8iy8rD|-U-6IN`G4H^+2 z1wci^Z~7Q!^kstai8>~pE*#WP_G4;+R3JAvzf1^Sk0XI#$y6Uftt~gy=V9bT&>fNX zzAbL5sU*Fb00R0Tls;8${qrzxi-S`t_e%-dH9e)SCdEGEpND>Y;E|gF7>dtfZOVd2 zJM{Yl{zU2s$k$S!O3oCT8%QwGu1ZQyKCTS_XSX7~jsu}ts)5`|B8ua%WTo`vQa@I+ z!?Zx%i}N6`;VQxBwX0KMthG6;&v8m6@6grR*ig-G#ugh%0(YEi zz(_AtiVuwgBp<2KKWXfe5zL|t7A_<&LAE#a^osFuQZGbbc*A?k-7Kn#n9KvuwVeAm zm3XX_%z&!ESFIg7l+?O0gbCVuIRz?f1Smn*3+z`-f=BhQ9X?moKJkoK_3Xd|wu*Q} z@ANsj{E5fAbd{XBVMN`GP4YBnVc*QnVsDOmC5-gf_+viMb4_i{B|I((VNjJ&X7lxd zl}Px&lD5zN6o!zbKBxShwo)=u<*-mNSd!2`C9X=uT|8V|j;8y3RzvvtsVoNKv8h|$ zvX4g`k&%ru{}p+UGjmn|E|{Yt)QA(^1>N(hiDKFlTAEl?9B}-L`rvJ@|L# z&HG=)ylrgPzl_NHf8ymzvM0B{xtp6~e%x3l#bdL)7~Z~UQbHc-eE7@Wz9G z(Zx?(b?;4YbehDnw^1e1qS0g9n=PNuuXkhuB3Wq}sW5}=Oe=6(hy!^A2)NvUTukZIhwU*u$+7ecH38H?(E(#3i zl<*tNG^xm3tM#KBBfN?y&2^(kdUazq=~{dOG~&kNn)lz`^}m^A{&z>v+u^&#vglO# z1!O06@p3BP`I>H?e#g*Whk3*! z?)7GhIcT%{j}W$(>JU%r{oikA{5wPY&vi%shrC?8FvzX~MOnvEJkI2SjQLdp$NzRr zNSrGH0qg%Rpq6B~Wnz1C^ShBlc1~OW>v~21`Q2!V!3sjJqSjL(mxD)Nv9|Z9J}O_` z+xv8E{0g}=cQO$MyYzt5?lRQn0}UI`>I3rHK0Z*mvdiJLym-IB)lMlTbQanfRcwE4 zWBoJ2rSYaEEKK$aCm8OG82a}946z_=>i0+pgULrE#}Dk;`1HOJ|Ao!8|KJ8`qcF3;md2?&X_VshqZb~O&_G>+0Zsgv?-L>xEFbpb0rBiH+vN0tGh%5ns)qmv<3fz zck)L%;aDp8&tWrG;AEH}!*zUK-24UWG&1e}^ZfjAS})PpAWUV$E3et;D2G3L_Vgfs zs)rGa#2bgfiHMJn@$I;K_Bbb$ym3+3bu{FrJ!B=cE_lI~kz8bRi$JSD<40T>*G--c zpox>#doJ)`^OtBRXWOwdBk@Cb8UMqYtiSCh1R1`BoHu=`GPxM|%7}~$A$MosirKmY zWJa=&Avk<;)B2VGH;U_Lg;zE-gdmG&BoCRX+MMlCo{OB;@r~a1-`gDi4_X0a&#<@V z(lR+^X#ZOe{_NFX&Ldlu1GdAKZ?-XGRp!zk*+M5=z|ImeH@|FcYgnM5IzF-~Y{oT3 zb4%D{cM~0s9MRaPb{Y7zwM^h_Bmd&)=+_i`jF)3qA_MkC82J%;wSb$%jaN(KyxKvn zCGyuuIoZ}M(ovWl;eTJz{y!K8k*GN;pa3erNFftd7@5G~vFT2iEB^YA@E<($KRo}hu+B$wZwi%WbQpdYzOryg$^?#P^;!hFbjlC(K zk?LLUQns&Q5y^M=bMu&s0NoN56r+!iCp8?K))5vbCOO9FgNq4H8R_Yl$?2U#XMVY2>!vPk6HXGD)Am=~1I`gLG>W`VW@n%6&uwi+66(3K>K zuy1kF2?*jV3%>L5ihh8+!HUP60vJ!`PBT$Iq;^ zh{qZ#DfKd4d-o@A|DrvYe;E3qh-8f%($#1!+fpL;dr@UPClmdfTy#mlvejg7`NVIdrct)TKb6AX$~x`fRLc^&wdLU+Bbchiw*1UtBB- z)mnQ8Up)FDOa%X+xF3U5`G3nY_n&Sd~BQl60Yt0Apnk^ zE~eVol$1Ql01dkwhouJ&$Hs$+sRPRR`EE9_v5yvY z-YMznMx>g7#m;;1)o%-+TXt)@4RDb82`D31yFo}oUCVlSLPaGb0Hm z#`OyZ^;aL-FA;Uth-Gf1LK!?0sMk!O&PH2(bS-G<8ivC|mfo@JzUIi5&zuArvOFTB zRKpIg6bzmi7k1D!R-b&i@BzO5<|pzA$J9EYX3`ib1|iq6p9=cmxi7~x$JHhqcufqO z;h{m0Dkf88=`B~{3pDtZ{f!FNqn|l!cK|ZJrw+GaID;`EQJ)k-S}M>+OoFC}`!ZXu zdLnC~iV!S|Uuu*yhJ%i1rz;@VUrpNlKtHxo5AbTi7O2$1;jkZW2zgGRw{+BB5$2XaB*tC@X3LMO$fbRGGy;waq2 zgYRGrE~gJ(1f7Np;JDa!>!O0^e-Svo*-*#IKP=x(oBBRnXZ8D>kkse$0nj$gh18Qe zBg>w_RGUd4jyY|0!Hx#>KoKl^{=R=!lTS$#}!a7oV#H2V3QMbPeEAPVH8*CGAm z>=1u_WlJLy2&smyWUgGDEiVd2+R)M8cRN_x&Uj;_z^CR3SOvN;nV~PYfk=!ehz&{F zhQ>o?#v^z^>p!kJblg8A7qprSF9iVsg$#}=#uIR1dEolNg9jrFfcmU4TV(Oqd$9%i z`F#Gh!@`k(*XIYa1QVWsH8^_~&fhHLW4L@cj1~t8Y}#Fn4Si^H;mukzUZd)(z${A& z7FSyIwM%-6o%Fqc{}-TVfPziXsqL;xoNM?KS6W-Cr7Gz3;M*3LA}nf$;>L%HyJ+^* zJ|BWiAl}{!=tm3DvSc}uC{M}ErINzs!QH^Tx%iuf{cUG~!@qP7bx-I5`nvU;H1_Ih z&@6B|Y!47`&O&b!xEN9eG>!@DBPQ!3-$M0y z;&s-Cb!5@EY(X553&#usw=#r8GbFrfVY4uPqR6j2@0r#WsGFIiTKj#EAkL}u#bU=< z*YYL$L~&U+q)eP!%q!X{qV=<5&+4s?1Vwv(!eS$Os8}E*6w_NR;Rey1g0B=AV>Q(UsXp;Bh9kNK~j|QH1l=>h&2@`lA z>rt6f<2(DqX(09SfDT8ulru_E>OGe1 znporze7v@+?HIKG#@*$|sYBj4IuQG|nMQK-HtZNifgh%(?hJuGp!PrF&s~75sq=cpOI=TxZyXnAiqV6=DMnf$me}Dz{+l^J*Zz z%vh(^uT#Ideb%7Y&XtHm;!fL;(~sN|nla&!bYXN;pprtFwz2b&T*ytqTqqolepxDb zWbmNzs1@$W`?&?8i3zZdK5Wrrl+fA5;ekEH1CDF?3`o^5T3=D!RlpsfS!dXYYG)Ce z<$;oE*?VoZeQ?!i*)mA%k=#+Qf*<7{mc;p-9)*6=Fyzc_RHLhd=a_)}JosOLQO zx1ty7Cg4lM--Ph@7&HB;Km^Tv8hieYp2^dRs#zZ$rq8I87k-*c^V=pDdS>Oj*(tQp zxtk9waRKZ_uV|`Q1T2AEaNZ){9I0mx zcRc)SD9`X&L+anX$yI<@`&ofY+P*0#u)b9(GEmq z1Wvtj;YpvU;+>y}6tVZ>9bG!IU-iH`q>i4m{?>sW%Ld|)cOCl_=o97TD#|Ra26F;O zjp|ab`t7!@&rgH7S}rz9H87RU)oeY$g4K9X}{z!)T(Vm zpY8`?RJI~`Aqx*=B03D*miBnp)C5*P}1>4|HoDMl| z{RlPq=k%AB_NjFDf@bxl^_HJN_^wd1A{ln$X-H40$S!?&@WQ)bDLs`YEfLnZZwEsl zdF4&Gmb4bDmmsTgS5HA9BG1d=PWF!Et=rD1=jcRf2EKCFzi**4{o!PxSM;30*#+5% zxY&%tkPgU>dpSmIu0ybxP70xsIzbXIT;TMh4HD1sH0{NR3P_9<2c}%NBs76NY&*Bq zgy!0|4vAJvDx4RLACq`^wX#;e*L6>|$=t7eaeJZcu^?W53CQS8q~Wo0KkdsBe2m&p zU^cEqw+TXG6e-UZK?k9Xm9M#lR3pCYmDcyifqoi4*Y*igp$OL|-!?=q@;~UBr|Hz2 zOH;{6nEazpy-A;{oa@%cC7-Ezy~@;KmFh^bL!(k2@eXl>;{Y4E_GSkx^6-i=O4lC; zTCN4HP8`N`KDMt3W%`F&tg|Qf2xqH0UIigN;}nCjr9IA7Fu@h`se&CO`1!>Orp(6P zUVCJ=huQ6s+qJFX*uf_CScCP(qy0m4NSYY1j5{XO6#Mq=!V{EW0t)(ntA8tz?H-0C zrH}x9B5v_Owg_amC9A6E#8hOf4vUL8X)VZwA7)((wbAVdIly?5-BQkQzMcdL52zxM zqK_{{X9&)M49cpXJXsWA)Enuv=&&%f0|clFo`BH%%}`HWX0c?jK9pTOsaKSAdZ@W- z>GJG|q)x!Zg7|&%x<`H0!k(8wCK=?8Bm1zoNBx#lip) zt-PVj+q{mbs;XAx1Y|<$PyUDH^D_>{H)ugDf@fL&!^tfaF&`BPAK7G2_VS5jUe>#+ z@eK42Pui%L3Q#)O9$oubwEFWhfA$eaG(f3E24L8LZN6S(ZW~y}URkn1dt!U!ocOL! zJFtN&HaTN4-}M>ZGnwh_1?l@Jwtz8;7}z9H=c`HO^yM>T%;wS zvMd#d->;+6oKwcq5!ymD=tdfL+bIsN&nL80`vYQ=HVR--g9V$g2{oVG@TbdeooKfdr@`|$!migiJ==-EtVftEJxTf<5Qr`krRcoYv zc)wjo=}oEgxs}&{kg37?JQ+*B6vra*7%6Xy&h9_Gf;nXwESGiN z@j}pjD~GhG^Cr1VN6J=8Hq9Ot4XkSLBmY{kCbl-4vb0~p@VFY=Nk+LGVP%Dd=o`#?ZOIU@gNJ%mbyPN6mKBEHsQoZPG z=VL{Z+gwO{-pik@J!~J7*Lbw_#m-&#eT{)U?|D>MB)k|m1cChOW=Qe)6d$lc3XTzp z*muolSwY%kyAWnELXh9{e4nU4&3E{+ed^=3@blYaJYKp z0zq^BlMG&ajMw2d(4sr^6&-8%!3MK7gQu46tojGtozfX(g4}*$4WRQYfn!RUR`!QQ z3p+&c>fw(E9A>xOT-3rik`*owf#HA)5SZc7UY|4xU5UdjHlikmBU|+F-mvZQYM3~+ z;r6ss2;1PtspXQ7Y!0yW1yBuo4s37jwS=43)LTjoT1x%KtaRFjI-k!v%~yWzKSIjV z6{y1M?jRa<+nwn?i9r?54DFKhx=5-dux=Hva>PypvoZcpF_#~hAA9ap2L?k9a7F+i zT~Q-2_nPnXkeZ!m-G6#)7O07XXTCW>0=@{SBx?k)iGD9uYvBct47bMgo1sXD)uC!c z2++A`kJLl6BXwzG8sH7iiqv;RdtB`U(O-L{c!_=|r~nF5qspJb=G}{hWJsgbY+*>V z1nwRf=F6Z$xdC1}G(XTabQx29wK$Z$eipm02tF3$U+c82>TdM`lHPcS0Mx&mN1Fka zE|uUUZGrDIPmPpA(<>1iaSo(bx)&P^#ypO3>#Y75stBQ0d}N1!c_1@mdOJX8??|hl zN773hMToSY#D^jCv)JPhYotzT}BOioU| zo4mu2%Sw_;jzi7Q&yOlQIgneRSrACHB}`epc2#e0r^KL8J2 zy~E;xHybXkmVYP#itT_O7bVlL4&V@X^&p`H!9zlAdDen-rV2s42C<_A5laN9!XEbsky4ZHjEtzNk*&o>j zr26&63a!k_@5sJSsvaYK_2%eD_Roqvh83N>cn3{_hImJfFxeQRg`vqvk@L{41dBkE z5Q$VKRED)J?!$+yVALPcZ8?KKqZ}M_tTY0rU?_2Yh zG=rA3F(t{sN(S?84_CJT926Gjo}8lKYbShw*mX|Z2#f~R2mC0xP|U^yA>wh8tF)55 z)=2MB02=3{_4b4;w>ii%-&tlfYcq<&^GgdXEiErV=$&W>s=m2SiWj1~vaDYN)R2l& zPF4LLo3WYsHTUz~WT}qY#m0`xt9nCoB%lCi5xkm(RdLH_T*NT~FT@;{KUzcpopNy{ zDD|xv&y&;BWdO0F!3QXswungC>YH|+A1VL>Y6R7H|Bxc4%FqjphGi{56`n`Rc)Gv+ zGC4a|yL#Ho8%VLxChLXteykYUx2>~-*777U4q<@2#wJ;ucYP+CNudjH*3 zhh?>FEA9D7!(NbbC!0hgm*?G?x{|5xn+|i=<4`!Rw7R|7VugWSc?UOUjlSd|UABHl z2v_qKSg0Kz7!K+)Eh(Q#N*Loi`S%w}CSPT#bue)VU~^l+;wp!b#V3l=*TB&}T_ zynrAHX9zE#)GC~PJU0>Loi>29QP_i61Lpzro2?TU%k$@Gww$;mRJu>tXf z?2Ch{+Yd5e?N8KThFb!*zb#8Z#qlsj?<1>0P`+YM3R1GDA$NTw`JT3QWo1Rm{!E-s z$XsO-M4e?$MiZGap_}?{vus^6sshPjf zYfWEBwz0ChIG*NX35(y*w3GXdRI_=V59^{^OKI^480{z#XPmLAjMAIzYF(Gp!RFPv0|ON8B!{AHQwT)o z%Y`w#qc{w1{|zM_V^;@JzH6!h~zr>^ZlNZ7WpY9(Y|z(ME3Ff+~o@)sjPTM6{{uZ{+u{dkR> z#>T_stuUvSvVt+II0WqK3*A%a6hx!Y_2FD@`e0p*-D~st)V^=O_99*~FYE$vSo`*`tV*=aO*`OSyl#?Q(em z%1{XtTvWJtg*5)sAQKPHZE{iDojutZ5|>v<8%Ani+sdY#t+kxN$1Gq~<62bH|uj~lMi%rnmDI-6l8NtpU8@y^ixY|zCp%n4>)CfBIujE*i6WMocu z903{&KaT$I+KKaCx7q9Oia@x(>IT-5&q9sRuvcGy7s?3obB&Kn4oHKGO`JZed{@?~ z$~Rwpr8ZW-5j$@h6`TUJm~)z3_=;OL`c_S^kp+2LW?jYh)D#b1YOXA5nwlL{mvV_z zr`n3>6jm%)LAzM9a2Avn<>V&k*0L%3GX#xdj}#|5A5IV_yso#%DECB{M+2NfbjCtb zNzNl7`;WPGug9jamL8yLtnn`j4f;bUnPmoht4#h~9+WX16kN0k7Pbh&jOf|fvsRW+ zchGB?^r?MWY!6Hz^BDKc;NYiP<)PqWdt5KX~;L&Xi|ez)ax5hl|V^E*RE^UDNo< z@aGyoqZ=7@Bp^~~;=EqRy^vD-1+UhQcD)0eVNoX{?(N>4kc^?9gu&h@Yqu>gignvrC(X~jzp)3}Iv!(UBCjAhZ!rk4n!cJH#inlJd zwM>+_JprK@?J*K&n1DEq-6H|^g+_n{NDzL}6f^|0p9n>w@0N{C32Xhkc~&+Y0~fC# z5tDE66HP9hZE2^EYwTgr3=s5zr-_*68sR^my_j5n{>!q;Qv(P>yOIB0`G|WgCaJ~_ zEE(gtqx>_+rw)8`O38;d7h{(Etd}4qG+tDzd{GnRdB_+XL=N{v(DOvra@8sw4a1Zxf zTQWHM6hmqvE;wYO$?s#1mZA~Z2M+{gJe=W~4W1@|mI&u*Y^&jhE&$xAg#PcsYQ+sp ze`91|z%`?Ps=bYLfW^ou^Y;Yp-hO*-AT0kINAJ^<)!Vy;T?pNDQi;`oO61VD^|gM7 zKQ921+p#efkpdND)~^TKD1K{51&(5@-|o+=w9wqE9onWsww5=m55Qnw_UyX<6mZtJ z60(kgczl|A?F%}uu4pIH&CQPX%E=~X?hpbfRMT3OlcB>j+ztImF}#Nmg>EdtwT$?e zcl94ufkF~0Q474iCviL?OMs;uZd4HiBHN8CuW|lgSbA1EA8@V*kQ51|n~5E=pjsx? zQpfI=6itjs*2fyzQ^-n>3{x|ZtxK(CjCe!>3CH;92odXQqX@pWAb6yAq`W}uUQ6j@ zZ{nY%f*T@&Yi)nn*cB;hnUnqC_$Nd-dw#7A1dPzoTj{;MSQ~I^{VzCf>~0l0@{QwH zIo*69#-w^|gTZ{mITrN>`Nz)c9#DEV0G@#!zEAeu-vg#EJ6XV*dUCBuAmVuTpefiX z^(5?~(qypb)5R+&JgNLM1t*i2f?Z3VeS+vGH@l=53ZAFnT+E1NI!gA61vaco;8@u= zDY*PwDGb*p{S1^FJJEH{oexP#G&3Tu_Z|ID$WbAsR+(K9iLy|Yb*!`OrlVS}OFy@D zjBU3`7fSx7+LU$EX(Fvt9e!T6?P49p9&08^bhajql%$Q+&|E;gH^QQfz*89%J1DS^ zSV2z_-~WTe4SW>|2^pC)t?iz_2g2k&%}uat)|_|^qn!BqfFqQX)Sy?XK}RCM_1nQX z@;UHLC1NBstQB@WNl23fxkBmpr?w8h)Sqq4F_hG@-UowWlQ&;)<~y%28^8#}Ta&LW z;_s1_B2Lo~l)$2D?&>nUUhiil#r_@{B(yx_)Jk6`(rzW6TbvWgjIau{>IExdJx(Y~ zF?32nP5P)uablTLfL>DZ;f?bZh5tR7Vg$CqRLaVHzlG=^#cF3Y%?P z6WFPH61>k_u`K?ZX%l9&7xwycJ*PU5252B9VTW|$=SX&K?l%z;z6Tre2&IVYUF`8Yj&H`D?W1m=6LfQZb;G2}2aAP!DRH9!PZWei<2 zgu`GdFMnH~p~bZh177lHabJ|E(CH$Q;8Kt&pHt@eF{04I!1Xpo1S-F#`l_9Ow)F7x z0PYkII~L(3#)%IFf-B(?FOt@|a=q5sI@sBIG2mm_yK3K0i3r0dhIz4udD;MXT4G{) z6{9c4yDrANc8wn=Y^Qe4T4(Hw5(V=Y;PL0L-m!J$16Q7Z_`|#_*aN>SAzg#!ZLG;5 z8X%WRZ`>Mpq+|d3TGybCY6X7tck^-nMtuO_E^>0>^A9WH%QtRZCYQTW>5=gvQc@In zK;^ULMSY3QurJ0Nes)DP0=0X$P3YQ8|8W^vV~-FRtSo%<_Z<;gzpf707h$m1)lw~E zOuNzCG{pPoYuCQ4yrL>OrIpe0BlZcWxB{oB8Ueg+st1(&;XE~-#izxp3T zxaYiyiQIjXt_8o}WbR}0O>d9>ar=3A2W$t9ZgtO|M}DFQ2$sku;O=ggpDO+d8fTI9 zSWT%?lgxlA%R$H`R%K7J9;MC|Il886j|-dz6$1_Mk+3rB1@&m&wrD-4bFp2gju)t3 z-U4fSm8q|!bR5+Ec;-iCGDFKPX?;ReROdsCFqj$>1YQwl9x0NWx~LxA)_Zl5#tlP3 z;_&y30Z=SZn9^ado4G;h3DW*qFydg8DHV~0W11`64EZpoHc@p^uKCwCE3>XeA`WNX zZ;zye>LE;cfnfJ^N>64@SqL^68{qj^7kr%7pV~P$#~7$6yJ`^$?5D|qV*=)nA#elCLqp?pH@F-H z#`D0B{LbH@Jw=ZDGlA3zLHlA3hz#3v&g=H|7n9~2tFK1`>_&WEI6AQyc%|5$OGcj; zDXdJWCR?Ly{16%@39ngqkxwcRz3Yldc>rjt^{}RmW$vL+sg;1R6DRf*B6=Bf?(*P9 zs`dWajp&ZcK)PS%5>^!o^+7+Q8Bv}oFvEer-Mb{FyqS zkE3*V(UQSS?oL)o_tw;RGr$_PDZD{8KRlh5-O&`>O^>;E2=Exb<_jX}sd)qQp{4eP zQc}a|60r6Oc$+Kajd|o_4=%<7P@*G&_o(RXzDO^Hr2;mhABtkW=C;;1`Y@Qs2H&J* zWBgNK%2K;d?B4yV%h|eu5sU3c@-tjukk$QpU{ZWX_)W@Ud}`%GPrLc)PSkU%C6`g3 zQb{4ozFB>OyskOPP%dUimCU>r;W;D+j_DV}JlAS~ge;B{lm7N^{^sM<7{5PH`18O3 zBp(;Fv{t{J8CjT`ZiEO4S!KdDJ=gI5T=qwK8BH><=%$?_?~>nx6(go)Z$d)(=gpY2 z%tqG1zVAy*FbNX^+B7I3SKu8iPl4sZi3Ou6OMH9 zsk<2uT{c}~Ig^hTWhP$)-(=FR@8x^F-yA9RRyirr&?jbl*<)bXZ%=eY`d9~gH|6+a zU--+wx?0K%AZxxJL`%k^c7NGM^zK7}wSO)jns@wBrYZcuf5<4xia~%}W!g=6x#t%3 z4FhCu*@8@os1oie%Zd+-_|sE887P{L*`N(cQ{Rg29?S9KJaqyNtOB!5&WDEqtS7%2 zfBm@>NzL5}xkb~dR;2)y>8jWB?vxb-r+)i~q5s;)4L4v6DE;mRU%O6(`N6p;O0Mt-~Ntpi7%}QvC+Gd)bO0Z5aACFkQ_2C+4PWeSzmq`HnmB z+uymaKJ-ZZ1YULC%mREhTe_9bJ+ie08bq&Z>{PWd4t~`Pg*HbLlxaF2y5DW%w~h0g z=~F9a_$C{+jVIapV;gfkvQ(+2`Z;B9zTg*$Cl!%_jLg$i-3(-`p3JZn=$HBn{h6qU`_i=4p=_t9>{>#YjEG#`hADq@>|teF*nLxWT&3hIBF}% zz$SK-s+dtBm(;Jt+k~nATVgX^l?$e=)wd<{}FH+zs?Jt!*;mL<=cQt zOAwWDujN0fATK5J>4SBV~n1hB-pvwyAZX98M}c>4FJ*k*?|31Gwv6o&xq zmBjtO2Uh({e2s6%(RlkDCU@ZAF&ZNEHLal9ULTkn%6(SID%5` zW`pk0PF6V#?ytIx0I(prTLfoNbNJUP-VNqy8gg&6`@gFu(?wvAYi*gV(l>0@4@R9F)7t&Zm0ZC zPLZF9)JT8!Q#^F}mp_X+y8Ypj)KN^!Fgw3(2uf?UA7<-sf#B}{J)?nIPUF- zath2y4qZ$X0_`DywF@e+xvBQ#g+u9PS+XN-66H-7aql+LI>r| z#;q`>i7uTfmO5r#Or$XvTV(d5~h@{43_~X1COx8e?v~D zLmsTnFPO{$5Od6a*v&StH&Q}Hn?z&jl8SIL^wcEoq>oQw{HU|9Er2^Bq zr%;D6rO6NXorIai-n09DXAdkONGE>zi^#6~GFSP|%MfXcfzJSJ4@TO4zF3hv6di!C?d`d7JwkT92jM*eg2S&w$MRDTd6{)~y=95;3 zG1afgsRzPl;eTF1`ji9}(9oj{)a)luL^u-10g0KzG)o^m_S)G0i(<^&0AMn(Wk}(x z=^nhS`D3hsm*ZBXkY3yx=(8YrplsWLLxG|_ITynGpmZl6BjdP1=VBg2`hwk1&OJ}* zzN?w%ngIp+zv@!_|7AI$o>?I%NvhW(iHkaKk>M?IC<0h%_H7E>U2N-$$xdBobuy3tPBX0;T0G_#L*sTcp zzADIWaZ#)JtEnicMFz~73>4tMF)nPpfdQ%vH2dZ@MvK47Zj_+Wy}e%LpkpxyRh}@| z*TO%Dl>>m}Y=#;sEl)TpOJ3m*k~0nv*e2vcHELY?eBoiXb4 z4;v`3o`%1I5Q~)G8z>@lg#)l_S3eW4X+k0B+P&Z1vZ*LJ)n{m@VG-0paiA+4gk94} z%YAnTa?H1fIgY7%SdABNHhkYVE&CRXj17%S<$(8Dql&>&IP6-@pOz2%mfGif9Zzi! z%-d|3dW>6ETDc#j`*DQ4$FBS0p!nR9DF-OE)|V6_ZWP|A48F<~@awKGkkrCk=!d}r zdABGlhh7>`l4%JDT8cwD7GVWCqlyK8eI?%Yk2O#drUaz?^|xGXK#t_z-#24mX*nn7 zVg)$V-+BoxhR~2Xd>u@nUn~PBo}|p7Wm*h>=e3dcLTQVlvHI%T@rK zk{~9%M5u?DABEC2ICrPZ*vTHNXPSAjP!NiecLGf)=%K3(og4J{4MOSq{gIEaBqk=N zcz|cWY_vv7c%hOk)#Lp94cAo8b)a4a|FeYnJ6~{|GW2aVh*$tFrf^6%UEJSWff8;v z-p~KmlRE6Y_4{6^BZ!U!&7WJ;mlUN>&lyoA1Cq!~He52pZ)m2dYO~zl`x1=S>hAuR z6&LNAvFZ#B@>y(`KFG4r{YfXA!@*DJ=DbI&f;nB1xv1}dXU#as_yA{Km^m``2XA2L zkpVuR-H_%U97J%!Z~>bIIAg+T)3xJcX?H+hB7YP-2@y#!oLFFZ)6Q>mbI#~@O^;{( zHog;V#{ppPERMYkX1PwhM2G(=p#rOA{9C@zln-IeffGic#q#iwa=-eR+H^1g6rlAv z<*VPTFM+QomCsCFUR3&;Gkl@T<)t7Qx5tHi4TPw!i`a5EwVpa0^6Um{f_j3WS##rZ zkrb1RJraQYPY1f6M5ljJ2lQHV*#E^?!tc1ts0?_|b579*bC%o{woxKRJNz%+-aH)Y z_Wd88Qn^cLRVt~wB8f1T>{=yTD6)qvV+>iwJ}4C>RQA2XAcksYjD0F3874CrW-LW$ ztXanx!|xh(-=FXI_x!%c^E}6M9MAk=oAI7`U)On^%j-PP*9leOHA+GZc(Ehc*WI~% zxsZyQnwi3nCl7hf9|D<8#r34{5%vEq3^3qZ&*OE^SK5_Xuxlf?r%#=n6wQlc3R$n3 z(5;=*0kHkmuXu{Do(_^Q@a_V*=?1y$it2YN;J_rv zfAz@yhKTmJlA@>o*dw+7_w9VV2J-Q}m)z#MQa zs7q`1iOK&MkKx|`i&ZU;f|KR8(?BIh6#{u3X1~1-Npk*%Ij8-5c$cvnzgPcV~y3;)9$HOT7ZK7$t+5KsqIP%PrvHKG&~wz zXQ>EXB5eT0+0!uw(wjf-1j!ktxe~R$bJOF%of%*>RAJz%)s!xW@z6w;kyR(cl(uRU zB>@sN3gwf~L}_ri=u1JsNXvXyEZ64&kzt2HIzm7pb`m(VC9ye|*0G?B!~ZoVT9+Ik zJfEZWpMaC}e*eEIh=Q(Eo=>NhuNji=$vZ|8>mIP&7M@eDjc@xMlifMFeue#!tDirt zJMivRN>V(~;~k}RXDm=y>g##u_xt}S$~-^@u-?-R-pnmG?Kc4kcz=Vqo&T{6!@b#h zj?e6~uPRliudkd-ABhDU=hmJtLmQS13<$S&ITO9szVW)U5>_JWb zCu>lZ$6;q?VRoM+&I)aWAULwaoUOJrX$7L$@PmDJsc~lqqpdtQWpG;W6+Ft=41KIt z-mHk~kCJKmZvc#w^ldAZ#$k_FO=G|D7aMhuoN#`|<2dX7;(ZM*zm2DE4hjc-GXIR7 za<30c*EmQ5@MY`vpu=E!!6Wr=S$X=kvS>B5`UEOr%24iV$QIbE(F-I&H@L5nLE9J|1Vok_=K#<>mPB@km{{f4K%6*GXo+Zsjd1 z3oC}jO0|*;aIVI-n2mt><9EDZCG$A+Kfuk78d&0-A(N?OI`;_tcM@S2#y%%GZ^a*Gz z0R@>H;7Xy9@DM{NI5zjd-B%%>0ua}Z%FA>dAFB|Fei#(Wz<0+X#As$y*GSCW2Ws@^&75qN(*K8MR%PmR)k zPTtq56#6RGM*XR_F87rc$6H-e@*nB0oRa5Y^m9i z%vayP*P|_)zRpO{s>cDw~|lRg%0xB=*h>&=UZld@GO?D&xgFlmi5A* z*PPRk_wMToPRHMIQ?kiTKN#_eew?}34K#tP4M0R~R*>V%vCzS4L z3kvbd&26V|FszzJ3)+H|+xwOAu2ykpJdDtt0A9dVea4NUhnGH%{C4MyV+@Ktc~2Yg zioBY!RiClErzw~JXO;YZ4-caEdR4v-(f6Z>!1-j-lICz~XIXG<-VOg;(z94Egpx<{ z(D;i0{R>9UXkdiexb$@v47Jn2w?FC8W_`vkPWPNWH+3Em%|U$58W%_U64!x-2%(t% zR9ogV(Uh*{N)`xco<_-L6?A^6v{(7Bt~4)~YO)7dB7n3Q62>^?vnz@vIVQlOW`hbx zP!Bax%PWckC=2v@=NqKDOwLQaGVxC!sX`ky0gF*ChOJ%{eSH;;j|7!_0E&;iQiN=UpM|+12mpvZRP&z66BigZHwOcJDKY+ z44HE{e&|o|DYJv;{YI_HZG#}X$gkIdm?mv5sF(QYz3vq8jC1^<%s&|jLx@hsCG$%= zy>fTXl6@k$kQb35pyIC&;;}^R89;9JNkfj&Qv!2b75QElx|fs>E$oT@GixnJ==G%vqZFT|t%Usoltpc<#x&)o1{@o~)) z&dyS$^}K^7OFQ%Ox^x3t4W9ib)-jueGePAWyJ8)d;l+PuM|yuBAV~Maf2{d|X&fh4 z91?NilGf!7cXD^G$iJ4`7BzIZPrLPZAoAkgKWp>(!jtX29)7oMeEhH`4?H|v5}JNT zDiKn@qlYtiJs>>{wVynH(-XLBN`1hbH))Kg+MCVgSvNgs*snA+S+XAqMSOv1$2(3e-$SAvqb=l$n1J@Z3h+zD2 zH9?RwF6R*zNmu__dn3guaq)>lpC0^`CcxN`S@Ew*xdm~k+A+@M_I#%D+pzt-1l&VF ze%B1@1Qc!4x==ivVjW+MM8c{RFbp1Ga+&A)gE9fXVN2+L0-pa&=vmimsfGFZiT>05 ztDJvnan!6fLlRnW=YEJma3Y1#kXY9r6N%*6Yu^MK68u z4XUL76}z;v{7cA&7lvud(KUP!iA%fyDK&ckRuiP+MVmTI+|C0KIi|tEi~SoQ39mpQ z?jP}WPjjWA)tQUi=@Pl5G7#{jjphM?1O=b3>j-fyLF&bjvF6 zA-4HBY~go_8Ib5tKR)wt=4ODOgZp=?NRz1n0rk2Yvg@}T@_^Le$BXBDuHz@*>HnLV zMiXvT8xVlhW$ZDCTUvaCK-j_y$uhbnZqSTv$4j>&PwS_YJMZQM@8%dI7(Vxhb`MeW zhvImsIIuW~239l9{3pd*_fJ@=Jjl6iH3aHA)@wO90%MHvRj6LDasi=RNJdoa-Defpc+)T3UN{xy%p%R#Jcq zqZML6uvr9Xa4EgKzuNDK$9YC_zCHtxiD{y(WjTfnEek+2V5@dn`6Z%-l0OOX;lotv z6ciefQ&f&&$%=_*d@XloQWo7AuJMci(LVoAVZNSyf5p6V12i?;znxv@+2s+U#4oIK z>#o!AT0diZt8q4dpPlsq4F|U%|3k@sGAP++JtpbrNlQ!f#;oXJvDhNoxKiIC$f|LJ z+5P$7O$6_z$?s15PlUmn)`c)4^N00;-!+I4+t<@;;Lra*&E0Z)$r}&_<~!xDtj$dG zsOS;3YiB^GE0ss*JkOmDC!$4+3V0kVOuz{pN^OOto=l@|PvesVMVq3t+i$)5VGI2s zM!kCX=_kOx;&qi*9ZKXeok*$h=mMxb{sP>aH&0hVyM4{dG-kPn9F}aPxzI5WI@Q#~ z!j``Ci?0DTltj>4qMHZ!C_XWHO>$MBx2KY+I4JN5w3ye-3xH8dOy0n$D)1iZ{h;~I zbBPXZJA14Tke{3x-D@uw20DRNvcgx{MUR(!b|K=KjW|b6)9TwaOj}5C%N!Wpb(Ghr zZ4BC8J@Xg&CMA8l5>%-vs&DHorfKbQyslm5e_>Oh0umQPZQ(M|paW)am0;Vh3Ws#p zQveOdq))H~ak+DSxPp(^#so=n7bqmpa)m;nOu#eYSk-Lk`8*5^YS2dgZqCU-N&HPP zKf_ojch6w-qHXwrtT2OV)po&P@>QnRLXmMSN;P8aM_=%)=kl!Q!lLTz=VL9-oZoyZ zZzsHE`E%*=vwLnCWY0WtP2?ZK^V;L{5791VW?o#f0n93Tpo@)BzS7U*t2bO{2gz2% zEQ0>RW9tL3c$^lZ%8?qwQpS4Zpf+F1BgyR4IPKM?dEV47&0lwgPxFm|AJ;z68dIJv zdH;$&7I!j4?$XVsltf<7Boms$Hc*>*Q(unnU7OQhGn3`;dd>Z?8GWZwpgpK>9?wW) znWv0`RkWa2`nm=;O52%~^QGD;jP6o!RfCTHGjYp$bq#cTodiTEIqS29sJuqAcdhVR z&=9BbL-*be?aYVkeDCjgG$Z=!-E!jF0hmbPby>~>N&^)ht-5#!=Pu@%YsynsYL075 zOUtlu9hkeK&-+hmvt&-D-O|T>r6FWqE1{45O&NufX&yCu_>b7~wYKRMBRb#=spJkd zb;E7Pt%gtTd|~^e@5GNjzY$yB&;grl*G6_1k4a*l#~2Z%u?EN)q`BYtwXdjDd=L~0 zTKSho#YpiDVzc5ztXHVh&gwyCK~BG)nbk0Fk``|~)gbR0<^2I*iVb$D(SD^78GlAr zR)j}?!(KB6<5746xq5za1q1{d*BRDL;)6RrG?|;5KjyWX@;bR3=MM53 z+Gcotp5L5!lc}zIl6jKY=x^)SeyNc{F=ekgg-0_RR^L9uv~kw30pj0GuaAm1h0hB) zZkD}y?yW=2E5{8c6JqL%rSkr3@{bNQ7QQ_paX{&S(&JjzF8v9y3CA;jJHFfHrEs-f zC0mlK)zzWuC}PfNr2=b;r0VMG!djTtM(-+0j z+73(CtR%!-ihWq+yw^UPJLkaAI<#T&&3@3HnF#BvLXL2ziDyElA%BU_lxPfEq8hNO zz9Y96>F_d->NTKZ_Gr4Sns-l`CP*5$;oRE)_64)LltW0koQf?C0yCu=gSJ(Jwrvhk zV#z&$L$OerjjtivtiUMEK8&6Ja|RTa9JOBi{OlNX4bb#MM{~l%MwZ9HtgOlGkg2VC zhF7#rpZx7jQaM3V`HM5pOyHtPR&Y!bS0uV~-<{;gw|;&5(7G5jUCZ(q*97$`=_u^# zUH-$L4_hx`k}k!FIIsBwrkTBy>Mo?z2^DP;!O%eULX;39x$ZbkB;gahaj!*3vbAT? zaI&?mdTlMegWbFRu4{JCWri0Kg>53KM9^`tTz8U+vxuxsVStVLeyUR7D-1C`rZxnH_Ib4=1)r$R63NlJUw~=_i>xF+gL}DKFj*et#gYRG7>k^ zD$x%svmX@MPn<1cOwKi<81sM~=_|i@=(j>K2qiYvOjKSnNM4c^+G?;>1zi8&!c?Di zaml-@;KS7N9a)WbP1;F*zK=}uc&|QHaV$e&3bbpR^>8YlPuFo|tJhwfi%i#a$v);S zctv^8*14fNu&KJzcXSMlscUPq>J4AxVu=}xd+DCllkc!cMoDS8zGO|6jH4sea?Xt|T)YC$fAzEu_7I?_6@H9?EC$s}Rd zd+9mt6Ip6VcV$}?wpH1BxkBFI<9&}`t6*?fXUTS~m#6mbn_iW}$rEeQnRh;J)n~~E z)wc#!f@@<)FtT|ljOy0ed9C4sg+91`y@>d z)5%1A^6f4O(xg`y5Q4Y!@=&?6p1lHB*`ZGU-O6l>D{-e=U8naXo+h$6Y|aIym3ctb=eB?AUC_#@${~EO zj~Y*hmo|sh*It|I291fj$1Xqlyjp^zTz#oc0PIl0J;GylA(Qxt^5)&1_Z~F|A?}5r zK=1YiJ>4oTsG-EiV0dLi zz)H>uy3aX0QdJSwoWIt?ZHb(*ewoFLY6=`tc8gIR6Ae*#iESf>Y56kZI;AhhgwmdZN5`lkR8Si)g#dX zNsQEnK-aG4irDjp1Fdp=575Rc2s$pGliE}0;*y_c7{ts^ap5?R1VHz@cRk%yv%c0M zTi3wAjs&hebC)BTf*jt+$MmPKZE$mUe;sHjmLf^j0~6%^`?fYE_n2&iRp*w2%!t!8?7^kBwaS zblT_?K%^7TwQqhyAX+jAPB?&~f)JpkS)p%)!VXl*wqP$criU0J- zVQ3a??z=$5&mH9SW7#*rC5F=o)}lPwnT6$mCT7So&5W8xizHB~~r_UQC*^yXnUf z%FDW$PY10)cX23U_gGZ*<|`49G$!K#mDs9sLb> zXLs-QJ9B|A)1a;{Ycj2Tc18|DQ_jhj5*)Ng-P=L`Qz24whQf1#A#<%OrszKX;_ZVJsm6nk&6WJ2xQyGd6NPcU*Ll4%}dI-NVG9^BTFLYY;e7mt+ zk?~tRr8L70+WCQQyg>4%ekyc|t1KOAs#r{+x>Q@5}BQ`6DY9d2O-Wu_3Cpp^HlMckqr76!5dUYBB zg?^QlP3!P*ae2m;7ypu;rltaJ-~ZS9num6%g&SnV#vR)S#b(+J4gHi}6|li16Hmjy`d-!u|F3(Z_oHRzFyQ29L5Bz6Rq@RUlCA?0S(_$$3C~FU zc7Q1DNhxu4*&})@JBK``MIiB{#yOhj8{1VXDgYDmBf@O zxX6<;T#>l6Z8-upM!tC#?!SeNvZjaQJl&(Syu&wI)gSRhZ3H;n=$?1J+7@;}`30kn zQ{F>K7Ir2wWqT7ojQ}RK*0w6SFPPX3M-DVV2h(g1Qg@MkwAeoqCWt7`;)2b?%2gNt z+O#0tWI4mdbv#k%Z%DK_@3u>M@>IFn0qjdhnLROITSB6iJ(97!$neS#^KICv`xEd> z$< zX2pi9&Ix9!`x^XvoKq&&AgK!*w{Zb6WV6w=_tfBFG^~nw8ZE1&AtM24jEp?X}(!=U~uivmNUeTFwUgK^{KZ_hch$_B%I#^ z$J`k2*=Gfqt8k+oTa3p2=R%*b2Ew&DUd(|Fc?adAQg@H0I@Rg9Yd!tU-BW5j_-QC! zJDVF2DX4r0nW=|&u{)Me@({?ixq2MZek6M*C@{%RQ+i1{a6@}-1seu<8LO=hel3feYWuW_1*pAbW;;nKV^BU3&Dw!`tc`B<`dOSCAa*B%Y=}cw|`WUT?5K zoTunx2R=&KW>)NiIx|iyz|q(Y*rddrRIidf3TwG0OM)+jwU%x%Rj&E4iwt$7k$?r< zl_>AHk;C(H1^pz9tBP7m2F$)_NY0ITZ6q9Y*=akcEy5ErSwJ26stL>qItB(XJM|zE z$n+o5Dw7JNAjMH-f?cF)%E&>Jk?;xFB6KVaPyk=f`a(yk<+moXa)$Qq{)$U9zKv`X`R?zF1gW41U_nf5E z69d=49Moca#0I{1;RiK?ah^o(qQ~RIbD0}1Mg}J9YUqb+Kqr+VLq=3n@76)d8fJh9 zsit_A6eJJ5OL`HZXWX5u8$SUb1#8~+>FQjKrRPSV1Z)q_$lA`dbvU`4N^aZJDi3?p z>I>zT#j5mo6N2yNE9f+M)-IUOA)mg=0nC`LUH0KzQm2J|mSs(#cl#>VrS(fDV3bI+ zs||JrK6L_GW&Kgm$x z`8%#7vwDCfhJulUZGIEo^3dC#pOOxG)tD^WcvO6U zc!@k(Jzdwb+NWXHdO=t-5!U|d(g?WUlHhD#?UBm83ZpB}^<|q&-hDaMGxv6?YTV^= z?13BQb;erk<4}+8Hxs^AE@{pRQHOl4xXk`&))yC7@w7o(6Fk%U0tRY(-iA!q2CRoO zUPP`xhz+um=&-iPjH*5@ajZQ#TN4U6HpM;2@)1A&9#PcZ*N{2im`NG!eCOOk0ym$k z3T(3iSSe(C9WVCs&w)|VH%?D4(Co>)p|EMd-#rr&)(Usv?fxOq(~<^)j!&#bzQVY` zt`(adWQrJ>w7>*yUFBjtM$nN-!hmeZlO9?_$<_4qbOm0twOBU>oS4Ohulf2ZBoS+m zXO&EJ#^b4@koIH!O5h_^&o@-_4nJcNjM^<5)EWq1L-~vQ+Vh=rb68Cfm)-Q#Z{(mp z7$a!pe_$CzYPp_9uTs6XiiQ6Auso9Cl`QMN9a8utbx2H}A2JvjI3hN)9r8Rfa8ztY z2-XNW`t-cZP6l9-F#+gBu3Es*=kX#=ZoRnf_pcp0xBMw`0>4M7 zQLK=j&CgGypY?uK<;Q#_B4c$CAb#)HZYzkkrYq^!1}~VlB!}iSZgo5WX%LNw%3TfCa-)hR@yDxEt#iUA(xj-PN_N#bi2D7HbkkDOsQ@227E@}8it$zodCxPI1 z<Y$@8tnV16wYBudNV0{QsQs%#Y`+uz`3Z^=?TT0J zFs65^FCW_Ww9AINiVP=fifYbA->|=~=JzyC+m7xSbIXz5QA8O|$-swR$C_jE_=FP| zyCYN0^;PquVe;q1WuB^yYi4i0p<7guRd$?^6gX0oY1#l?<87Z#df!s%yuNVJ+->H) z!h?K}2n$rcu`n2A8>%t(>BuF!u$}|oiW?gqQJms?Cf`06QoU$ZbMsjU7s)IxyC=mN zE6y)2oh_@05>G}O%#>*yiR0qzHDzmAb{(-BARW>?p|}Eto;_O}(7`KNi_YJ=+x?8w z%949X$)1=G=Ufr7i#8(ZD#puf*YK82gI&fM8meOtA&@aqzWdI5jHb(+(|w+!iy8RN zah$Wt@O5?Nwo%E#c>%k!M;Sh#WCZV%kQnzWxtwljaVGS1AuIMp=_7mA(O1;3c!C7! z-RcSSPU?0?t6_!WBz=Qp=%a_Hx?T6k$EJ#0F{u9eH}hBhB+Jq{DJjL10GrDdkxdkl zdG6Ad=t4Sa-_#_o&+u?Uh=;!MW9Bywul%ZypS|FamOng&OPFVmj%aifI_2U+-rhPl zLn0vvnBK$c#8v$K(wf9J6(uFF;*3QlCFhR(7`&mug-opgP{8qyi`%;UQ}Lx3tzp(N zV84In-jGSrIxw>x?+^i!3*gaF>ztBgE_;}I>KO68-4s*?3UTZD+wbFcb4%opmLj_X zv&NXUy~&Jn%);~vyNzKLV^=%Da4Ik>SXtb1u%llDoBX{mfW{+R(4pg=RQ*Xd=wT^W zr{bCI7aqZiEfDmZkr;2-xF+jOGDvyosFFa{6Yp_{*=3zSUYan{hAdxmF9t?B?~0B0 z16;34K{Wi&d9q5V0j(+Eq`73B4`sM=kvI_ znT1H9b<3&*?qB(`)mGnb*sAM75w6TOTn;Skbt(MWuFqJ+U;xtG8K z>D;*)xxP<3e9KM^>hbBLR=hi8B8dH;(T#pi{Tj>+uY2yi2J9U|E<3tj(63t;P;U)s z-C&eS)i`L7ta8+^pCIlE`hkP1G#j=bq_-DwO};AV|q2}5$wYe zbmawuxw6dT1N;j^xf2njC~@-vUx1aITIK@3qi89R>6FyMJi_#B+$!HnR8GZD^@o%N zi>mY;2O&6NIU2SY4O>l0_`!iR{>-gpqy&m=A52pRr~ZrHEb8g;?VyGYJRH67oh3PA zhh>%#WwocY`&Zsx9rp7#mEZL`z-zo9eV_gITqQC5Kv>(B(+*x=_T+zjb&1lht6x^L z%d>XGchxo^39xkD83)_{{T~TFBH~Zw6TaB@&`+MvR*ZD~+x=j+GjoxVTg0Km^PS>j z(Vk#^H2$#`jxWb47+KrAII&|0gF(C}qP5Q2Q}u+onORu1nPidg=$)}lbwUsq6wli3 zKT>iIuTfz%_oM4MQ7zi02H)Y3vZgVn@qOWW)7iq&VMPL}cl@ub*D8l|lYhWB27py) z+C_c!>_=e2504%JHCuW6O8Rl9<+d}KNFD;-`kNnE|5Hg=N3eFW=dgtcG#vYPmKurhT1 znPSkpYA3CwBSh3Ho1!|pDcrD4%erdz>Ojl`{rUDW$?Ow)&z%e@LzXA>LS$i;60i>t zaQMJ&jdZntk=Bpdr`spg(6}^XI#5ShVLv_red;^YXhPWN?YJe(SY2j}*ADyxf4X}; zC41!I!v>c-cP8<|#9cys=e>;X5Z-Ag*;Uiwcpkt&jxr+AH^4UZ3s{nLHu5 ze}`e8H0F5h{+)(>g&y5TI`s`gX7zwXn~q)aA+@eix5d0i~(uD6)v^=C$ue+!^^wQVH!iGhY8^vYv|{R$>21+ z9GK~yD`j>s#5NtjYiDinBUjI_y1DWHyeA5G+v&GvjkpLa1BNk-ePYbN;R0N%M<+tI z@?zC$aCnPH=NHafm-p;0>%9l;KpxN)8pj!50BP+svN0ii?bGVmQX<>%W0aivgrS`7uy3F}_rRbYd zt+Hx;45w!v-W6R9xFw$MTRCqKnUkKL2cw?S)@TAhsot_KHTc_)+e|Z*hs86r zY^~lMuYjAreiN7F?-O=NzICGR?;VLx*_T{Q$Yq7?W4Q5n02ek5STZ_)__ zmv+5`uDyo_YMvmzu5 zsT+)Sx2K?i9c(xsV~`~ojBs~1B|Hz^elBwtad!N9fl8)LoByb4A^e-twC^=`cdZur z#nghScO9#*S3Cb>1#PgTmksmqxK4W^(p4Cl+V%Bm`~9t5QBFfm95Z2gnX?Uwj#j-p zs5R24wgzax&w@&9;M@71xfIu&&Gxk5alMdlJini?%5 zmY2J>ZI^63Dc`yl*i}skoh-;dk=?ixr8sEW`&D-?jx3hpv}IkhK(@MU;b--!)GQwk zF`%OYMmgevFXq2U_m6Xi#4#HV9|>FBwtxrH`%SXzw+C?KgBDk@f1#6JcPS?C3})+H z9a70b%T@`bri=Og<-xuwt9b%Q>rl+H zswd5Fwv9Y*^9}WI;3V5?5nToiRVs_-t|Xj%=aJ@5qimNb#V3cJ13p~OWJvp^F1V}; zb-{vYdXkQNR^IdJ>IZ#;VtW7`d9oIY+f3)%?-eBgo44%N*>VYZCSd;|5P8~(>Z!g| z`TjUNhs{i{@Pu;u)gtd6XG*M!6?XikKOt?DIhm!nJjbK^jOgUTb<%JU}kaflNcw^|R zJhZt#EMkqrb2CaMU97a!#?Cq!N_`Due!Ere&)$=LA?m8Nr|9*pvY$^c{ z9%pXQ8gN71J72R8GrYuqz{zWK?p?B{4}DdHJ}WSQ)q#e}D+H0WiW3=vmS$!NRcYCe zn|f(R@%qIt+M;ZY+^Rzx?8J-B3#jFvzGoMnND0|LD%n<+a2$_MuNb}&K+pDJ-F9-y ztx7+9TB8y7@S(wCJ@`5TOCMZZ-K*qiwKBEUF+D)f9bVf2P7FqV@;0>WWHqu$j1s-m zXn>EdpPtcY6^@dYaXpZVd&n>DftaqVp6_;A*h#JOZ@uj*yEui&w~(1<3|tit_dt-d zq>(>$41B5C@!D-ao5c4DNIaO3F1yJXKuKcC)3xOh{TkAHF^oMpmrr91FKb4Eq;+Jn zU5{;X&)U>l4%{Aa6d2bRZBSg(4p5wS z8eWEZbJk`G^OdsOfrS%cm3Qfjw-&NeKW$%+$#urkJ{+5d&m1)(MKNvkwPQaEy(may zm)x0a%@@|be!6z)l@i}sA-mw_W%;TA3y&>vpc#G5YRfeV-qC=_%h?x~m0q_FuEzQ}z9#?YU)3lyHjG>6w&-!{wltcU|nT*|Cv)aywbnvhBTFlmyv0LTStEBnUshk zWRzDo7f;QoxT7v>%?H7 z-P1G52SR-%s{QkOoJpxG2izpHj$>;5YaHpjjc@z4$guHztnLe?d&AD%YE{agYcun3 zO1E@EcE9=Ml&%NO&{u+YE#HoiJG5KkiA9VEDtXmNJT~yM2G~P>;284%gEAloIn()0 zaZ+nH_d|d53QdUlM0a%mv`_O6i39s%a&%_h^MmMQrD{~J3^Q$AD z3u*TfXTi&!KM}ouqXA|0rccpR1r|_a#9q{wK`clw=TaL1+xW^Yv$E@%$MKvPI_V73&0##>bJ7cug`2 zC4Ok4hdKaOUnlgByS>9Ve*9HTp1ji@0kBl4OV??0$+`Uxzp$vnQU~KiP5zT52@q;Q-IK{CKKv~R+FRV`>YvW)1meS$(EPtw-e}Jzy>p$wu6X99#fO7 z)^}*!Wz4G=eKiUtTYtstn!aX!Q;#j@?e9~BL>&%)I<^YTqlzjVupvU{UszX zb2u8-7!7L^kKqFgB_kURn|b;$b@4}ni(t7}%<3WuN>x#~!o<_^5{#44 zMmJ9HDb+mdk;qlI za_6yS7$oAPJP#XuoEDe&_Vy!1hkID3Hud;85K+=>B>}d#z^(EZ%vE9{f!)#-m-1Ib zzH@Qx%sJ6>u1M84?}0#mb3(4C@iGqP)G8~Ze147VHHQic*E_?z^jT0n0EyTG9Z*mb zYqrE@qCz_Tu4PRK0K95%+pdYumgQ^24rRtk^>O~y%uy{=Ub4*IO8?0`s!@U!-c-!0 zM7s28Y31c~ZSAr0y!aq-)zv^ar0VAAtNB-AYBwVz_u1|D7uYGX{#I_!9)-N>jZjij zDgwEK>{&|JbAevC>bc=tMgl~i!!*-4YA+*y-a80^B73v~w(~=Q%c|3el)E|318RPyqzRVKe4<#`U+UX+{4F>lf{<@1 z`;Sk9=e%wB>sOwL!Sm~Qn(Nzuj&bFOa|vDk032}J`Mkq8H+~D`mjKVo9BBy^z=wxR zBV*akm<;smjx57+ zbzS|~!!DE0Mi#g%Vn5@mLBbIH4R?{<1WIn)5pz_9CfP`>IYjhiyq1;PkSGebd=aDr zw5(SC4yA!lWlvyD6%zG@Z{R91J&Fv~sPeG`SL(dTb{Rtex_xO$=Q z9RR%gsQcIitOZ2JHeI7~Sl-Z7qB%7$Po(cw@t=%Qo8({7 zHP9Dvv_k!j4$?I!KGW%#&W;HAuo2E_5})G;i8^u_`7!hL!mTYz*soRoH%^~m*U2C_ zp4EE3qsapSJeV%5xb4GWiU1G z2u>JU14$vg*l-Wu1Q4;%JU~MO9(mUpuOlNbU%0Rzaqj7$kD#OxZc8Xcz2)>V7j^ zlF3UkuV8%7bIl}~{UQ0)Q?vfWR8g$%p`&=j!HeTy2W#D)fm}wZp`qcJOYqLav#5|( zsBOzzWLTx+OFDl0VDPg@QBU?l|F8wuX#6y7>eHvo$k_2gZK-%zZHWGEiJJqT#kIB8 z0vxS^cTk^hf<1yYV1GH%CwfF<4>)&CJO?QPSz_-p=i3L0{+Yeg2QM3NhW9b!)Jsyg ztsyF2;>cPqwVw-}=-;1vws=m~U~w~_>aO37KvZLZuq_;*Rx#7zF79I;BOIV5<`)@V zi^XMEt-TBl<{oPu=zSIc@OZR^#*lB5)j!DH0h-M*kk)=I2-ShP5RRTDYvkUPm%6M6 zP2UbYuKC7&?WNYDS=!7Fvs_P}7rg5acxCD|(LEbJ0F!Kdt$Br^8kXi4ztwrmU*l$L zuR}`SY{WY75;HD4l6N*-M^yW~Hhcs?Jvnrgu4dNRllaW)BiR8rnI4fRCAXggsTZzT zl<&TUg~wH4KXy`UXgmE-4oA_AL#Q4pM=M_w`?A9EC{C(>Mf3cUHlhF20`nNA;uUUn zxxGmd+u!|xUsz_DF-ImIAtHz;Kx32G-^`Pp)&^1~;Xki28~0%*C9|IbO7VVL&1TQ?G`x}Y$|dpE5Zpr?Ijw$ zvS@Cd24>dmX5SNLaxH9he=R)7{}qIJQ6Z1ToXW8$mWJ$S#oOO=FQ##-e^uPoCkScX zbf*~=IVTgLMRBY?!mQSXhjKfBsnm4*4KqGHnPPVeHD?Gcq~BKbD*xf9AmHkgm$AN@ zrM8)R7~(msI~C4uT-GaQQZaauNnXsagZlTMv96;8&LUzpu-Ke(H0p|G$QJwX_`{~7 zZHpX&r;M2QecZ&m4>&Xc^1r?dsE4hMKHF;q9$3;>V6xG&^ZQ@hJ^-YkE?1 zDF=VYVa}&df$xR2hXZD>i-qfRNBR>{QK0oHgN>~$)VI5#+_G8;?n2pz@>b&pMF7pO zHYm>J-xr0R!cPY!Bq~)ed_LAnElIaEw7QLbDE;w*cxzqT@kWrUnfg+6-Gy1#fL(s# z8dfgcxc@g;^`aqG<*H=%Pp`BQY)q?4iWawns8CjMUTyqz{zYlQ{YPRC?nA0aEIYc` zSX`xQIGpds06pUX6SXqrsT;`g2I;c13@`3NR*I@Gniv`BNl)7@9dh81V&r2;@2S*n zwjW9?DN*7NDf>afVuQnLg!4_cYQq1fP^6YC)k7lU5Zf0m!PaZNQew{7#G z>up07zQJXeyt6<~tXJa<(Z?(5nQtG{yYtITG3v?|o|idRzWgZlGVswm2_NC98F-a| zQbmtcpjOyTq-ndo$xdBcNvexCVX;c52Ex6FS?$9q`i6$BEvG$K<3{PF$JziemKvS_W> z8As6S)lxLiZP*M{WcuHkUDr3|XJ+dY(cZe=@m;1yy{6Dj?GFphVm95790YP6YVT-; z_?<0FG&@r!`NJ$MeM8=6fs%o0|H*grZ_#MWxE3jm(%!f0XLxw}!Pecg$S{`eT*u44 zYJKgMYqf2kJ_XTz$(Qt7kgq~B6>{@1>66yW8a3JCDzCHj348}CEnj(u2!h1rZmPlK z!RCa%6!s(`spWL2{T;Km8y0#rTUUhkY&4E$w_2M`n)m?XsL2Nc&;u%^!6B|~^EP7c z7sXrIb@T1+7c}&ZHDam^mfe~^{Yf8rllc29g=_QelUHl?XGX_v{D?31FGcSX}(bM&kcCt6cqb~C%>Q)vmJ^9SX0F7fo{i@Im) z?8ks*6zggsen=4@(78$w_l2dQnL~%R&!T=b?yD6PQdZp54(P&n@c#kl-+y|3f<2jJ z{=A$~%GQ$DD>WXvq4`aqcUZ_crnn4xAlaclZHYQ!u7#9rnGf^-lD8L3|q=T%?W^}BwIhDmTo`T|C241-*i zfkZo0Cp~OJ9u}`TxR+YDW>>}ahcCXf{}hMMhI_WwL)-3zotAG^2OAS7W6~kIpeihY z!rl6+i)|W>Yh4G$y3-Y#$D-5m#=xn0C>#%(^C5f2o{8b4GsSiv&mfz$RIT`cA!FNK zE47X<&$iqdJ0I-YGF4Tqq;um;ZymZ`&hh^I^7z6+=66iI%U5GQNMPdu-j1E7wv$lT zZrA0z*C9jugG>n9AQ7g;50uZkr6z`W-q*av>a_UY73F7%E3DhX-`Y?rL%2S%iCx!@ zj#cz?yEA;OSL*;*5uziLdhVx>du;}{#)!HAf9<#5taM0juj-Scc9Xm;WUzRbDY36| zPHnSh;o@1%(k|sqwz~MC!C&dyGN>V9CJi{$iCD$HYj}?yb;i~#rDCA0csXcZcI4eo z>MLy`IMkqcOSzl_YJ#P+#|HeZ&8Dtr`P28QO)7e^mbff^&LkoB%%s%(bhtjDcUKur zTwaE~p3$EUC--rtrfDCCdJi8o7dwc!Em+Z@gkG4C>hp~!I;SfMS=hW?4g;w)Ry#oQ1y^I;=)&CgHraTM}aQ!ydtJ+A0pQ{^5RCf&s(Z*g+y50 zWOl6*-rU^G=#CespFAD#z(Z9Wb)8%IQK?~zkVn7P^kj1gdw69rjAIGCfA3v?FojR} zie~U83;vG_-=ioFQF=fX)WnS{wEUPNTWI!|tqzQz>y&p-^qZ=jB5vQ8`04WafRNZd zHLoid#1Sh?B#P434Uk{={uET%h?ZJRHXY4?bzU9oRjp8b1iF1rUURX&>)jNTbG-G#|N7WcF&Kp3sW zFMhgq_VGNkVB3>4%cP9_UGqndf4mW>X<=;$Tp25n2nisX^=0uvpAMAeIDV)pvk7!q zFV%s4f;b3P2G)O8pLEq4l=E@n|Iq4d;YLyqa1Jc}iG%9fzg|8$GsyYi+urEz4B{Xod{f_b<@WxTd*Ur+&_OCaji zN9i7mp#%-7}b^P>Dln`F)7$2-ukw^eukGPcXEyl z?NQA0wAaorYjke{c_G~Qhu<4<0D?a)cAcERQ5immTCMy$1wP)UZcW@xr92>u4Lt}H zu~D6GpJ>-Tmfg64r|jOp)k~O-d|+F3<(O`|@TFW&Fhhj>L2!=meVFpkbof<6L!-t1 ziy&zFn)-p&=P!_pM&MVM9Xj~#GuET(JGuGAwZMO~RS+|DYThMXo643SIITThQ)s;f zQW)UU^-S;4{-h0juZj=;`bbKbRypg|Rc#$KOd)!{luJ{Rt$*v>LsU!q@K;0S?}&cO zdenbo#JUij3#;?a<~)4Oygw4g4>@wGMMkoAt!{p0&b+EY4uQWB+9l0b)9rE)HeH*a zER%2R|4eNph34VX@E0t>aK)>hX0K1PE%?Xn56*6^!a%zWnfLV zHN&Dd^XP@gEj^y|(eVy53{i9C&SjO}BQiIE!{#dZZMdsmed*f~ zM|%15)r`KXaarahAuC5;W%TW@ifJObthQn_n=)11f_*VyMj8=cbF-u2b0SRNJI`aiDC8}lhkB1$xhu!LxC#>~XX(+T1!t8c}ugPh-x0X5U zgHT`5>0ttj`|cLAD_+}5+u<>X>p>|649s_ii3`a}I&`$*9VBqF104m|6D|d^m?y9*9%l()m0}5z4k7h{D-dkwnA`o)VE93;IKKlJvQhC&Xr}`;NO{Ah!j#s^$&pto(GxicZ!aJ z7G8`gUSI7Z_)LsD4o%bO!3a@mNoH}whrF{6l3I@r4Z+RoU}ISt%9yBy4nSrt2OzUw zR4ZX-DCWcQy7u?F*oS8qP6;jzyv7K(yiVn>+w9_tJJZaJII{|Uh0;OBuRZt|{kO_6 zdW-K$oa+@V{yVCGp16lUWIR#y{Hdz0S>-1GV9QjgJ{J{)eQd;fG1s|;Zc2$iT6`t3 zIrG-weRdEsn+jn3=|h_^e)+<;7{T3BmCgRcit%vE{Ps3sUcsN`xNP(gZXT112xfH~C5B6hak^+{(^Ic#Rg%(yVx$2)o<7B!WVfDTWB2x8`x!m(mA>UEk_x~IISdl5if#1p29+(f zDE9ONRerT)Hud-Pxf;)NW9C7xk)>jhQ56!*5u2UYzf5+0cb@P!E{|Z{qoPy-%Z6WF z5gO#P3#Cf zP8;!&S`Bj|zMS3DM0TrlLBHS+=J1oOFITJt5o`vp4hh}p$!Mv`|6*6;sgRa6#S=-o_6Xgy18!PM5eGU8UgGEw(y7ge?jq?5ucmYOCS z))!3=9#HJ|MK-=!najPBs*b5$=^{C?e)v=EFfh~pfUu!bx+Z0hbTGaz()O1@wqbbR74QIHVIxdg__nyL$M#vHCg{9zi=vY*b=q@F z&hDkAgDKkf(3%xS4rjrDGGarL&NSXSS`@dm(6taDd>nPxLSL!%__cidHSvAUO6qv| zcbNFESd}SFiwAvSkgLBpPXe(z-@8!Y_;(8bJQ&fpuZdP`d14Y~m(tnSKcdgNMBWqv>vaYz+=hjCFb&`P@q@A-a(&r0xGZI~@NOT} zv)glsy4OAz*&PeIWr3uRo)yw8CkbrD#9VrfheOR%(2;3v$`C{Xe1D_yl^1I?8t4B7 zu>%hkqRIK7S@H`>vXl0nYe_$D<9q@Q6$Ol#+qVl4E@Qugob23WrUMa**xy&#`ZFaU zIwhR(&RwtzyLEIJ;Sy=#a6(wmtMA?4;Mf8Ua@)3Nh4uEPw}33g0@dZ?Qrfk0!e^z3 z`$^OZv2noX%{{ZPx;RY6UE{(?&@!cVRZdjC6j}bZ{SsEQpS4|C=++_CPwXc}(5hIvYRByfo)xQ6w_&W?ok^=q_gur$yyyK{wSYGH2?YPsW22?~1k_<4=`bHtLO zW|Zk6oU`(#fzIo~dRNH>3dx6T))w0EKq+arUhAvGW#hlMqb!Pw9ekc0IE})wdX=|E zMa(>_%Buai8%=^v*`K|zJw`W&+iIFh-@9;%O_m@>JOW_!CMtPf{Fi%+qI2bpN!QD6 zfz^2iesI)-6D_^QKn{{ZI1X@^seZKk&Yb8XPk=vP7~437!F^NHU<`kAZ)H&B!Cs6r zZbiCbhH*_4ICzZN4prGYp;OsAJMuIq1qA8{MucGEJp%X|5%pe~q*rC7pR6mCd}!4~ zypMgzFnKf?d?cCS@2RK|bt_8CtOEi8b3z`6vm!`!ZxI*sQ_HLl%S63~A!Xqm!r&lv z7a97-*t#}{390q1u*SW&HXzQ{K$B3zI+KLuTn4$BZ@!T9wU~t6ma3) zFwhPj)whM1q}@i3^j>%kO4G37McJu>KB2YA{S$Zkq>=p+KPT(`nO`r3|Jbo@K5y^R z?Vat)(<2I5O6R~Kb?1MY%iv%&jl0d9s--@4qhtZ8tGI737f2yE8O3iSm3C{pcZ*k4 zP5Xv@Mn{i)xJciYs2kPB6SZ$YwAmp&S@EHsBYrJC9SH{F_cwFgJNM~k0&T5U@O7^i zR>9JM0i}t5yUTa3t9ug-W#v7|_ zf4veF*Jm~RLnBX1J**%m)EPE;l&KIM2#DF#r-hp0uzXg1i|;X7p8B6&=^08M@;c#9 zuXH?@?Y$a`?GPEdy)1Rn#8?=-VC1||Yp98~-5`1tp*{Q7(%V{V0t8|V(A-a`)`$~c zS+ZtdsoLdh85&4I5K#v&n-C-BlB8f?2?ZJ!)1xZ=%Cy^tn01#XnuiQ9;jgVr_j*>7peAm!$_7=<(R!A1s*Zd1GPr-S2?>nacXJi1})A z8w?|6BA6y-ekMlgQ?y3zxP z$#$Q$aRBO124fP{JLvzW!3j02CzNb|btcdUe34!d+0J z-mc^4IE*8S4LXoPY+`9&p%5R&LpU>Om09P!bCyUU{VAXW5kK>C)fI@~&`|lPl@hgp zFNPzrEcTm<)*=v)f|&q#Ou6y3onxMp*CS}@vrRt|;InT5tMq%GGJ{j@y4od0t)j&m zO+@EOQ5hO_d96$lDZm&ddcY1BTuIdh)39pSCX%Y$s}((UiDMbXF%s52jzDLi$DglM zH#<~U_MJ?X)OxB^7ZpLBpbXK8Fo(Anp1f<@i4*?uSy0fsv78g3Q)fz2!u*;Gs+om{ z(EwA5p2}V+w>D+q3jh%9T99}HgJqowMhTU=t*#a&<~rszh0f^`I;K; zCUk>d6Zly8-2n2*e=?oqoC2Q>e?91>gK#i5kdzIgiF@f>kOhokAQ0a6W-o-&02%UL zn}2)MzU#Y5XZ-1npYVJNIbLzsaCaqIH~mb{u5|9c=i; z4VSt#=@>%bUwqglpsdIf$l0U)<00eI6*&Ie_KtlcighnQf{=Rg#TXz5N~6>g6QnT= zTsIyS=%Q}Y;NSx(xuIH1G_6jCxQmd{_{$Ce*i;n z`7o^Tc%<|RR_m?)kK)k3MTdHGo=vs%pWgo_OxSbuc~*uym?(j_*5*9DqW@UCN?q5W zL51{YTW9&bfm~Vm7Pz1>E1lwhCssV!TY|>dTGl*90Jp^I@;r6h>f-MrTx!~A%g@ej zLyx6lZ=F9HXMCLtVT=q?N(F|1t$HivA%iZuh{jx9(fu)$GX0-m<^r+sj+H zQqJ$9yVLy59CL(ygLYeUXLrd3=EvUyBLV`+A>%vXFmMs)O`!akHEVVd7|WEJZ(44T zwJOanS^jd#D32798B9`J4wnkM96pu(jk@Kb@`>E4<;l#7xs~?4I5S)3xC7|cSLgJ& z$GG2xzmI_Pcn}aVT0d;Yos}4|H%gtxA?gf)bYrcg=CR<(_QNhw!wq#s{cbJ@SSicP z7W=VE$7j}~$^X;3kkSS!E3Vw9c-y`)8;$8TvjsL`VUdD}s=&$g*_63~OCXV}I0&~x z9qwJ59oV+xLl;Uqx>s0ajg23i%JmpVSExO`h4ZY4%W`+maK86IHL8)(q$vsgsr0Eb_H zeu?(1`7{%eXvI%=;G51C~ih0B_Wuxyde?xagBW$#Wwppd3h#Prx# z+4CP)e@?Of4Nlc$kU|nx0VUY1W~&?xV~}TV+{#A3fOad_wDt0ph8e-yRcjnt+EFL0 z&hpS5Xl_$nFSRNsJQ<=+dSMn8IqHUEs!v>xcKX_KK#zSq?OF{1E(Antzl&l)+sE_F zSm+_clRcbSMX6Jgf7o-rM>7n3iO@N7Co%QYn%L3a;qY${${e1Z;x)fz4yaG-@A}AL z?jke4i?~YKh~C~ddqivF(x?ZFw}hd6&nEt|{efM`y@tux718LC*X1E2H_|nPbr1Gl zu*uO`yn2t^8@W=rg*fj5oq#C-bQ9wS!l##S@}_w3=kS?wo^b&nfROKP_o&VxPC$PM zY2O|@3#>!H0PT*oo&g2bFb(M0oEYJZi{{}SWr6nUZuYN)B$B>ximcFc3aRykzv(83(T|=0w`0fp*opDyv@z?LL9yT7CX3FHplQ!m~apyPh5WV5?Gg zAhvFz-`6FwdbkeBdbfzJs3`6%!OMm8*Nt|HKRR_|P8o4YfRdzgy`~1s3=uM1j?uN( z_+7LT2Pzm!)u{)y*{q8MXio!FQ{mQXDD=RgooIYjlTk8mIZ@vI+%Mo-xp_-`AIv@C zqYye1f3`i=iAgYKe;4R@7>(7oS`uID(yR2Q`>wBjwj25fXn9ip=XR{XJGQA$EDt_? zL2(}X_EOo~{;Xx378ud*Sp}4B|+_s9ccY#`%cKO8VT&V?D^P}tQpVgQVJ%IAom@otd7bzopJDx3F4xO(-XX%!_qgegeM54lFT}+wX@@TrD>)g2(E)17^rKq<|wtvUs1n39k zn{z8`b5MShe!?~XIDF=NHHlg86Mh-$hC8FWRY`lcEX&T0iu6ScOzD63I6-Q%(MEQV zYaP_XhMkE%3Otm~P1gXJb11Lk5{BY4SU=Zcd3kAztY%-)k&TkAjg z?ROD4B%dBos){TGuUFvVP3Kj~fj7pPtG-j0=Imi|*Pd53nJS|&x-0Em`U#2a_We0$ zL?6BipG+qpV~Nr#zZX6o9Tbp09th;jfN}$1!z7ctlor^h)|aXlt&-Y7x7RxPbGVD4@19E-8?L1B_)iP%lfo3%_S#Rz5wd{XL428;ol}Uu%+t~4_ zx)s=D3Mp`CIw*Tlss6%=;KCGLwtLi)g?CBTQsZ8^_7yeBsPU+a ze*h1#c@xJ&+y*-PIr$&vi6@u(9g&(@KQlfOA;dRmEb{y?tXvjf>w?EAS=7lVan9^U zQtJJ}Nj)TLa&q!CNPf8KZJbsHT9kX($oIE(9rMl{W^;J#*Dm8>+F`h?0(=kFGZ`Xp z+<2}jXxPG?tIhd&?c~6%kBd}lm_?+JwsB56>8x}{q2FWA!J;_Skf|jV*H3(V@0LDR z$3w{LMfj>8rMjzcvN;dtCrqBsDl0F(GWCq++aMytZ_jfN~{bE#o66zM^zlN z6Qw1qznRb*pFV!h*ID08NA_CbX+WqT@*xt@&FMy{`L7v@Dx-EF)$R!BAUYzZGiU7Dd3}QJvi^KLa%lZP^IGG(6Gx$TJ@=Si(e7ZI-M^DKu`%~U zT0xD6a{Gd$Iai!qHm_<|k^JtCfysnYO#{w2{xm`v5E>6bz&U4RR zF4}czDg{dvxE^HX&xe zz8JUDSsHl07rS~{T2aC;G-V+fX!2ig!mToDz4vdLeis;*)HV`6|1w_jdQS!bSS+p5 zSTF9wkQG_5mGUsxF8vU_zb=jwRos`;++Rc-;JeTMz|$@ORATr{4cg?SL5)2q-J7>IJaLboXF5=4gCi_$?=;CM}xOuA|(C z`DbRIXe=sBULLku`q=7XE~cz_5R5W8huTq7@sRm8%8Hc6+xeXA@-qQ74mIwEMFz%m zm_ntlRiCcNo2}#FI1H>4rBG$=#UtZk8$A*XMkz^@5wF6 z_`T4zaf+Y17xF6rYY4JyFqRpA4{GqP5HGm(QBXT_?0v8%jK1KLK_6sr z?Eaan?Wnshu5flVSD~nG{2fehRwJY>$#xX5nn-K}YOKV23}9LTC17wK zB;Z*WZt{A3K@`wH7Nu4p1XZ4{ev5&jdB5#;flWx_e&Z6Ch0X-96AT5QRKD$^D%-c_ zOgSgMgdY)5-bSPbLiJ>WjH+`Z%9k|txp^cLg*xrp3^D*Q820@a0i-%+dH6j~WY7m7 zRbZGvZUJJEH!Z?p4cAM${togzZTCF7Im4m*MOsCzy@^7ld>Qd8lDr?)R+|sT97+jQ zTemidnu@;r?8f7jC)1iXjk7#_LRm5FH}DtHck%qR;GzqsBsPXg7n7W0K$7MiLOGKB zhqnUO3&t$a0#>!!+t-^{tN7%BGaQ(HSFFZ?Hn;{$n4_=KfvIrt#fi1yY&jvJDNLcp zIA(I)|7_I!MVPkN6#Xril{wq0ox|SJF3nTm$Zlw-)s*v1fSLf(_BYjI#+K4df9)d% zworo63@x;~)>Af!3cqlE{(f{!OlS1ELJRv1S66-f)3=+lJxX&v>ysH)zj`x&&9&g| z1@`dm8~{3@>mPYYf%#s#(Dk9ud1?ylLN|tX^l^9dT?n)XX^g7^B~%1?@wYY3tLY{G z!znD*7YP&dNp7-w2J`Djk}@FdodS|oL#mD}^r;UH zm*betVFRcw7b5?BL%vtWu*tW{TGH=aG@Dzdq=O^8z6RBw=z``O_QyFAn8*DGZQe{^ z*)s(;!+51KHf@${@9bhxsPuP)6O)KsM&ITs4N4!6NZrnf2EMd-h=mONLwVgqMrYEA z^{)(kCg$|616NB6JiUG2Jpnmn%pi>@;WNT5D{ufmju2h>pPd9P|0=U^{S?5%>R5dA z!}BX-2cntI$ZF)i+V7k>I?;V%zs)iD$l$rUm;{*CtOm$uS_EQ|*U_nR@WcIu+Tj$S zA*v`0Js{s+^BW0rcww6cgZPF%^vV=aWPi~JEW1r2jvhyG8`JU-8=S|NCt0*>&O?L z@@|B9y9tWlDS^>Fzn-CxLP`K9Q;PwkRF`B)Mx-0iqw^ZvHV5-#eVqlx-)#PN{+##>081-{wZ~eurN~h}L1fKz|nl2oa6BR zAU%5AsmY#t$OqHHd8dFLF7OLkp+uHcyG+k_oP9IK7Y1{rk(sCvN=uAn8I+!}hZ#dAZPfB>QO4I@e-2 z_q<`NF!+E)gf?ZSK@dQU1UCiGrcM9>%x`m9+|1|-fT|~_YrPYt3jvZAw$q078dX+& z*}Fe4EoS#~HZ!?V7JO<~#rd~y{T0~gXFJs00+-tE$*#c%e9JsOE%-yzKv{>>7dU^0 zAbLeBp&oO329AyMORd+`3#J?p0iWC)ZO2xi@BYywDAMhgzBX z@PbE?$%r5O4gLXR_Za>`M#1V*lJ>}X4cl3X%Ie3r)AR$t=*XBkdfd z_u#tm>{kn|AKPUeb)5#KBI>10RBD7%b!t~8d@)Xq3~NfJ%RaHR9iHH^(~Ww~GuiSz z)mJ=gaqM!+GhXwovddJX*OPL-9(1kc-DT+6L^TE&#(E{0{ za8fj8saItxYcUmxdLGz)!V>8`(1pr$?*3iX1SB6o$MZ?JKzF4W)pPodHc%k4CNkF; zO3>uaGdwIJcjD@lVl3#$kHR|~9NBkaOG6uohxkITVS_34UXj$#Y>PSNWHHc)$cUuL z+2xxT8H+-GU4<;qmpN?XyATFE+<>}baA9o2MvB~(N(4aRax`lqwM-xVd>K=WYz0^| zaHiE@Q$VH- zm77_N?^>uA-g4}Z2<$!ZCH}1(RhQvUlJKbWH6KE>z(wEY{!8;9=9@y8)bsc@>Jqfn zEki*)K0+>GSm2_Q9+KsC@L|qt-w>z3c1hwQPux5Om1E7;>Ih zc;~=j0VI0D8xlPa;kCK0O7CZOjX3ZOf4KW9Klph;6b|!Grpx$hh}Q=fEhSR;_ig3g z4jrEQp9rz8SMQaS8;YO3EUrU{5R=sURdsQ#U|}w2-*}v4rVj~F(lJvw+e_g;2WQo?q^z$zVS($a)yh@p=*|pwiu0C;!6qsh{TlV$$s1=*$TjX=) z-F|1YfVr%QPswhXLIFZZ>7`7}Rbjn6Gv9<}V7oTct*#|wQybO5gS61acT4ORc>$4` z*WlxCNSr*#g!bvH({???=k<&*gRDxW-8!G;a^!u;?~$tnQ+kI0BmCb;k)ekdO%%W^ z%5!n>hbYtDZ{@|bmA3k`zHAXV9yF~CzgFlY^sX;op@rkKHdk7B8nDE(u7sjg9L~CK zj$E1#zr0fm4lGK*Ua<3TWg*z>)B{Q3Nglz!i?#vGY2nnh|MhvUKr4lJN##vEd>2sv zA*;j5%C6n(Q6OQ6w}+5VL~_$Valdh>sV3{g{&!4$qt1r@Uujo_V zA(jNjIY5fTIRE<74w|Z7fGzFBDfKdrY}xrKFfi3S5iLzq5w-3QhWwkSL_;D@y}rb& zXCTq-x+brK^Vjlhj~{jOfc0e`jbi23Sw4Y)>;^fLr>44gY&LaO$2D;7w50!4zkJ`8 z^nrD5AqYD8u&WBlA=+zHHqjN7ORA+Tm0q+0_2Z~NNo$JngQ-MSh%ymYwdkG8ZuJq9uIvK$ftrNN2 zegAk>O>W?>TgBV24s!Q(P`mojNo+>)O<4*XPSKH>2GZ_!RlPk!=83t!!Rkk$3%4Ol zcOf4hPNlXm?H3qP+@Ni3g7seS3|AiXp;`q%?;OQJaDEygpGf1oiVyaMecuM0(GGWp zEM}XKj5;xuv+N}+D5rfdos)C%Ee_G*RPcgI3!l9Mfp9tA`61iPFN_+CHco z4Xx0H0*B4-8f+y#9b$Y-Q`G4gNSi=|WHgYTMQJFci42Jd7&g{I!np=cdOW}mcBEiL zezScjM}tP4jx`|dgnSf2e8>!+pRNEVXq=4Ys#;lyFVx-9oEHqE65^v(2rRM}be4>9pf60!esKdm)Sz~({DqMN3xI@7K9S#t@BLX0}xAexfmwqER+apBovEx6&7cQa2ckhV1~n-l!iXwgFd{x= zni1$74E-VlVT|Ob*W7&;$RgpG8?MOM2{R(72x}Y!EsFU}E68#>S?p-kq9Lpg^Xd`^ z_Tqt86gh=!a65VBx~d5@-bg;zq3`hR92TGvKYM~Q1#A=)5IzOgE)3ws$jtc$*MR?8 z7e`%}60zRTLci-Rj2l1M@56DvTmr>EKScYe{#BRAXGyg{eaUz6)_lL>lZ!^Ipm4`>#{it86;N?No6Mxkqd063J}>?&LFs&*Pk+fRoR^?K)2*cw1zbw1 zpM6~9(c9VfZIbM}A6}(qRE18VbSx_Hp;KLc+jsvVbMAjtiBWggw-0g=}3g;@h$RIm;r@?s+M+KX+=qzy6b1@6WhAaa~%4tnpZdrDl}T8n2) z;9bkU64N@|5J1O()NoZ;vtCed&VCZOcP;vu$mLfYSAL;IBd>#m4z!gkzPZz~Wz2pBiW(!5EZV4b8>8;sD z5R-s!jY-53V5If3&awxO|A!S7Ck8DE~`>H}-)Q`0g=xaHH z1`7I{_ZWPB_n-FKHL7{%FkJIsje)j2HRpS>J(=i z6@e+&BzCKv^Abp%@p}~M>VChKk-?q0jO;b(urj-G9F#h7UB~dXu=O6FA$_fd_G!wM z{BZ%fzKX)M!`9ArT5F-}-Jtv};EwFYt&U`Qg8V#ndi3>e&jXECa}p%lUrc#g1%E7f zm_m5;EMdo+9=biP-$UM>J^iok}3$ViYUR7vL3$$K&k9C^2lt?-y;f!;y1&!i!Er9#thsWBLV!Mj_*wOYsja7a;Q}kC zW@<`8CeR=V55>O&z!?>Vx;ajI$)Vu#Sl;E+v68e60q7$ipf%s?30733N{I0~O~@_W zF5oV?JFUB9zL80)EdvQNXH-1n1Wz~z?1_K3;l-KW$~!w{R2u?~j5BN}%=-%-`QyjEj5|$H!BQ@x6r2WB%DPb&07E;{R&Uf3lWjIjVyc>eSA&Byf zhk$TCVAQ)F+A6GlDq0dmkmbBO5NJXrs;5cHELr-rbfG{F^^h6T5maa?Wkp40+7T5O zAdl=-#u4&HQq*FoogfhFU3q$b|An!eTLD{LTaBC*#+67sD-X2*{WA!|Du*Lyt#D0CdY&u?WP({`pgv5u~P(rQ+i#;td*B!;gY( ze5JMF`QkKqUj2?DMDS1}>Abs5RW2|pn&qar=9_L~uy>wpxj*Fp@Xg26vqj<3iS($f zV1VFk_>x+rQ!`D~qIy+aZr<7|lY~ps$QjbSAyXa9}YTT_L zQGVv^JmYM#Z~rAl@RjW=EswIMs&?yjpHhtoX0V=(LD_NA#ap&kVraFwOLdrRwUhK+ z2f^xx5aYVSNK38B7r(~hAo|k0rUv}_9q}H2zWZ+w3AD)|pY(ob$cO@ImHpagTI;I> zYOeC7Y239ZHN9u82_Gawk^pwa948X}^0kdC+`9NNE^KvbNRN@i$T$#oK0WM1tCO_=8l~3d`6`2VlDcFPu zpdcO9e>8HEuZ$EcYD7igSLdimB?eXWO5)RYpb`eJBk1dd~=C6xB1OFpr1e9jc9fG9`_pLP~Y*t=556zDPezyY-R)eM{ns`IQ_M`Ss>EBbr`Wb!^^I(f(hS-q*Vm<3{)p z8X91wxSKgE$~igBnGT_qcJy*5Z4VGe=c~8w7{LYpeLzD8()$KqUtx0k3kwSk?Tqtz zSNic_OWUIzx9$BECkfYzm{6n0=cU^@YWoSNNf*t@@(J`={Jtn;>PQPb^bJrhfmk5u-J$#~H2hUcnYPQtkctJTuslY;4x~vMO-8!Rj{h}$%aOUXyLw~(|U9Fb+9(s_+*ZxtP z@;QDD^8nF1h^5!CuffEd{E}QoY(a!+_{!u|s_Hp=s>)yS1gFNIDbdi%9>0HU;D7}b z7?A_t$VN~^?)*fR4f?!rX;=nVE5xvsA2z9h%n&6)@_|P0c=v)rY3RPZsiD+>CaBXc zz7J10+`0X{CK=GO4(+OcpP1%gZYV(3xd>@JK%wb_V4S`jH*V_$Y?76$r88KeBSF35Tb4gCp_Wu*4v^Ps*~{31bg2`0CpC2PI{A(d*iow#qSnHOY2Y{a z+nf$B^wN9);BAtBk`&=q=9mS&k&+uexg0VQ$I zq5(QrR#=n&a`A@2Gi{xONP;tUiMo0@zev}IrP2**4KKm+&0)AE^62i#(EW8BvA+DE zjKJToVp*RLJRkq$)55I<Q^4ja|PagU-QnE z_}hU@++1(#6|hV5>48&E3AO1U)6Cu*M9hLrq@3IK1|)xDeUSEw$!5KI>Ev(NN|KH~ zMT)9JN6l0Nf9&5bdT+q!2NdWFmEu3L=~_R`Q*8X23Wpy3*AxJ43d7aWpBKM3T%LB@ z%Z64R_YdXauHuTScN1NL!$AK(*;NQ5fb*rv6tGd{vb$c%p!@L_23JTxgL(h_8lE?$ z@jbmM4Fbz^*3s1i;xb8fi&hc>!qziUYzQOjfKo>5^6Mp}ue*m}276W;(l3Fr7ihN- zvdW3NBlp0o=GsOQfZzK+FaL#yeK_?ATNQz8%vT@=Kb#^f+dl`B7m_$0G@I8fJU7=o z{b%i=p_t(?Bb;NEHUvkPU)x1pR?g z@Djetv8nk3`q#b`huL2;{=URXR&Ye6baO$fJ>e%@0>r54_pc6~{dm{RG9Ws0ks7u2 z`w`yVY|zFDZxpgs;Q4@0X7m(tKJM<>*Vhgmf`?9k?LB&}-6uiR${3Q+>a#Bc>aLk1 z{jqWcB+U+Vs@9w%q-eW?pvaNJfbWEurkNu_bIxB|6J@!rKdN;irdT8xCo%%(OpHnx z5K@2PgUQdDss-5wEizRfKrow`F2sATxh8C4@p`N;%`f5}HvjokH|E6r@mWSF=b2)r&^BAuVx!@bUl#v_nwD!z+a3!U(ac1$pQdGD8Kwye0i@5pNOhTz?nB2R5BXp z--@x*emnNeVDm{&TG5)t0u)kcgYd}l1}-sd~$tZ({cZj2*d=EE^%Eq zs)=r;s9rA(Vg@HPKt#Y%I0%iN3;Jhh>@fWB@#vLA5G>Sz_nK=_nDedkrMQ~*2!4EV zVuki0rbKT|c{Pj4B#LplbAw8luZ3xv0gFT`Lf+}#gYyAHOdwbEmOigh6L|lNpn0w5 zBv^tdowcu=TtGbyZ&~%%$Ga33R^JWrjrG&Z*2;8o)*?%kyXbMi29w!g2NM-!82|Q< z7lB3)INbUo@?mrUQ|*z;Yk$9V-=0dV`2%=&sd+g!-_{ zK$#!XB>}4kr6(ajTcw0E_lISQ|1agWeQfU*_?x7<{WdR{qw+b8zyw(r4YDrc_aru=l9PT=0gi@J-*nH;q8u1Ke#`|HhiF`-(~C1;I$gr?6&c&FyN#x!Oa zw$|kp6xvrkaC)=7v}@$ZZn7A~GF)0+RfM;o0f>KjrBnO|Jes!UM9|@^~Bo`BOs2ww-=*$Oqegt&!$~jOfqkeU$=(T@8k3YKk zkym?IUS%GaGI;Xr;kK>&O|-8OdSiAcOvP|Q3pqc;lBT*yjGTtRp2~}NVPk+~!qKgI zxM|ww)-R4n%o!>mimy{ACd5&}!7V=_6Hz5`QVBfP?`6TJm+5|1)6bOO?u@0G@_o54 zp3~C|xi4?Ns&*~Obhdnm$jbWg;aH?5xD%lpf+X-Cw|xd)uQK1>LL=+QFANWbvnfW^ znSsE+?cf_`wk3i&nh*edo!z+My_D*xIdMuE?&4zt)bx z)eKA$TWPQ-MEVi<6(t|mWkUA8T-VOOU9i9b`Y|pS^=z#j1p;lG<}&0=$`DQs7x(-G zBXu@fpZ9gawG-oP!yj~im~ZyL*Pa>&*0@5{YBhIU)Hy5KS=8y57sj8HquRuoaV=t>1u$`3mVQ$lk&Up=-_b7|2Sj zZW+JOgSNi7`*Jp%9G=zy$VX&`ZA)#Pi` zDfWT52ZEbuboa^DiQ0@MqhM+ywb;4k>OCUC&oc*4MYJJ@Ht3m3n}?@&6M4dp*rz zC);O6fzZnRajck3Wk|@_;g+T6T;09$KwK*WLc?tle|bjxo`L9-ithl~WW37ed;LW~ z>-*o7^3q=QRFWiwzv+OI9Lc^P_z~-_8I3S$bPP88C}8}(16rR7MvuII5a;efHU&}s zM*5)I)Vtn)%a1l0VC0CS0w>PEu}v1XaYMs@-EvB^hyNRq-$_ID`cG=*t^9+xGF9aXF`p<`Gy z1;(88H6EB)gv4Zkez_p@-*AApS7$n96l9$Xdb8B8J;LHlSFAFD&-qf^0bB!s@&DO7 zBz{OGoTdhCQ7oD#fUVHRz&?oBWoS}EM(2gmi!)s^z{-ua#hs)D7v{@84jLb{1(#|;}aKXlsQ z5Xh%fyENP{=5f`=X}@*ubmB@gR`7j}5`X=|D&762R+%;E&x$Yglx=j^eD_<-BxpCh zNlh;+n|v5i87|IXl9vTr78|4`z-FPGzH~>fL`izmbZdpcwQIA$6S%&n9*+a3U-7O@ zL$xyNT|wl#)e9ehe_x$cd=&`IQCy~+q}xiDLtO@Q%!-#e`u5}Q!CIpA1U4`2F@H&0 z=OJUxjMZu#9g8iMx-t(WEn178x>IviF?FN^?f~lMd%i*cqBiN@E728QR{!W%Q7uiW zI}}RqiI8QInC*wj@9+Vl*NI$E`Woeb+>`#B(FzvOmsL46=?@kZ8#?@_(z*#$TI4RE z*I}&PfM7g1{2*R01tiV1*L=H8IOKaZhTo1@ftd0-SLgx)40vbKw>n$Pa_lnUA@!c}gju9qot) z(%wRUi`JHU6HS6ihV;R4_d`_QT(2YCHP%%14|)Ixe!>4_tp?zZ}mrPV* zW*gKD;)K!)qH6s$1N=)ryByWf5`Mj7y%PTVxP6KL>>S-N+Aa*h~rHZ9b(CX5`@UT9yeG02_R ztMKTYhHdK_`{uYnj&MKQqhA6FU`sw3klc4L<^;|!>-C|_`G&c-CF_Q_n%=0Gpe)VX z7sTORW3)nUIqq%xKjPjypsDR!7mW?DP^>5&u_GW&qy}Xxs1y|i=^z3E(t8aGf}()R zriy^lr768fKm_R>=~4rP-a;tJ9V_78``mlpdH3G)`@NSxHf9r6)?9PWF-Q5v_pN>9 zt-E?ZiJ{DqHb05W-1y+cZhoFs0q6tR-%`e%%K-JX;6p+6ZooZ@Prr#KKdx&8WsZ@T z{_ieMomN`v46^C9YX-tCGo>i=IQ6|{D|1BLxGL*2gJ9+R4TBZLQi;GLtr3B{4;p^5 z=&$HB)up;wJDG1XRTHFt=WEG=KZqb)3(xYqT_I%CJ6e~?XH$J>tr8(@oslp-0;+`| zH|@7XI40=ZkQpYKKjhz@b6we~?Op{zbzIVfaR1~fyYU;`YTXMsjgE5shO%?OPOBMF z9zh3;Xj4vVzEYjrXU)z9)zxs`hYpeSl6Rqzc75iXP^+($`l12kHGl@papcHHgi(K! z4ZXcK_g9@5cKt_Bz#7v`GNZrtOxEHW&#`;U}Zt*i7fQD~Ym-386#k8ea73j~q@jTOqBL zlCa9__rx$2>El=Iars)}QQ^B{_W|HrP6{#K(&tB{9tpBL?h+Q{s&rk80-F7=N!rDC zRpr&2?l|-efVSHm(c5`MLqg?U)4~>);?c-JARIhzzvv}8dyMow; zZN-(esZp6}R{O*f@~7k*2@wyl4UHd~0X<#3VL##~@7orrct>}KmqYJKK(hrs5HhR% zg%id70T4JUWFP@Y!o-xSyINag&Epg9a7-#6xN2@JV)vbgV5eU1!Xx@2rizDkr$__0 zxmkeveH_;$OW(-!3xs>SZp8d4^dT>a-6WVjs(OfBGAVf@-$B1Jn7kJMPJLWv=;7cWMxLJK-p`ttR>l_^Vv=1vX=4wozDjeC zjszx84@(NLd_v_Y-sq>E87)fs0B~K|{(1tLz2;yIb$owC+j4h^PGK5gNdgr5z`|+;1$BXvy(sjYF?r7F!*& ze9#paVrUB)`?6=vfabMuN&88zsbP)bKEF{0chuN2FA57iol1L^elL?9$J)_rg0e z8}qE%_bE6Sw11pxE-i)ZaHM4Flv&OjDtfwPKvyWVZXkLKWzENxaSNB;g@?DMKD@eA zrhMS8GjJA*QL|@#s9=o4l6$*K2B^kYh7K1Dnz}rV#b;`Og%*1FJX4@n zw}-TbqaM(9&(G@tDBi<{;$sp;xJcLPPP>k!%&F$W8N&>+&I77vvaddqE+9wxB$g;fw$h95b0+Z>! z9$BI8s9495eJo|Ua(9=lGPW9$$I>TxxTWAHycpi7Y9~dEwgy-~9n5hnT{-a@cY8da z=;EJi)r0h0ID%lq<_ArIDH0IkK+!@x6sjHJ_z^mq_SBwwC#UiF!%;_t2FcTYY*SNX zhgHsCA{AEe2Bz6UEwykamf7NNG_ZiF+p9s#ckIUU-W*<7FwW&nUIx}r7(a!y9K`hu z-g36vUfB8IDe(vDfMup^4CMWIOPz8MK$5?gFuaA1zE?R{HIXMJo@CtN$Dg zaGQJP)YqP)w%4NDj2k;zTM{2(+}`}^>UaMj_m$Ev_aVQ$eZMLQ#qC6w?&wMBSUoDO zH3A`l1adK_lmJM{F>I0y2S0R!P`L>KS@8pk1WBsYTz-r=1#RbXN+Cn+qxaK@+Bk^AEP4%F>)?sGC)+V~{du$TAsbaC#o^{?+` zaT_)pvWF^mV9cTu)aEq;WI4;~U;7h`MF*bdpk{ z9R@J5cW;(v;n}&{N(yOlCC(APj~$99(^7Rhii6iG@OJbQV$@BMXQrBFJg8& zo(LtG;)pz*Zs&^__fu;M&iX$u;QReqQ|apq9CQrF-31K~;aGWGQ+kFjpGmQSzTSx@ z*;KQ@Q?*5CF@t8`Q5K9VX(kH83j|4aV;tG0300xn8q`~g>fgWX2YHW)mV_1Ox(HE0 zaR&7%N#ogH>-wWoEwQ!sGjYaj1PMc!;$ z)TI_#5GGVkI6`i7HUBJc&yr|0-k;LHcZ8jr?8q>0mt*#hj1SgWRW3L-wg=~Q*PhVZ zykGV{o^v&BQJqPVYU$}Y>UvA_Z5$*wAsbC|v+^5=kpoB?h2rW>>^J^?-(4spdo$pu zUMc2PVpuoV$JNgrea(-jS{1#N*JFKWZ5fb*C{zytdN#H#J)^{JE1xc$R1{TI?nX&# zC&y{*puUluW)jySF|f0uPZW1wkagp}Oro9X_-mPz)=#%JiY{S`34IlUCwm1d!#kgk z5`k)Jb`5|t9;>ZjZLh0QtnDy9#LoT3g9Zh~QIJDeYl~E0Ug}~)`@i(e%a){@vT`Q> z99c-Sf6P#wov_)yLYvKc{i^)UNZ{AVZ@oxM+wQFCo>dtzG{^zYjf@MZQ$IJ#{+<PU zprJC2(Xh~p=EJ7+Mc$4{5#DEmXR;rYM)R0hnYyq5o+cR$4Y?HNhrC?4$LlvG1c3&9 zZbJewZ_*DGBG1#Zn$W(j@FVUUY?Sd#$9?cAOG>J}>oDt3im#ET3*w>Fyqt(i9tyebjxy zIm@em z6D`TxxJ%1|xGx>J5j!1h7n9HOrBtp&+rFZ&{0w?@$vH1sn>d?fM^=??Nm20+vrRv|roF0J2aY{fuu04-@iN zO~$>M59J|AZ9|6CF45;U^5P4%ugtMppkf~`sS%C_Atnf=yB{m(r(VwX2~~L&YN&IX z((eGi#^!ge86@625J3&`(xGq*PS4e@M(hRD^l&$J7pYUtZ-Q4-wapOTwbieR`N ze}6XM5qTqyU;o@pQ+gDD{F-+$p1A`-?0aip!1oVyNZKZ5RUEnT+5cv)m;*FyXEld_ zWfjtuj-^Ga%XdJYC!|PGDc!)tG$Ns@{SM}*86i2fEncY7$;73V@RHd*4r3{Jvd`~K zy#d3_uFG+umVqkA6FUxl;)*}ag_tPHkc@gFq318ny$J;9+*>2o(n~V#ygJYVLI(oS zJ!9N{9#2@Cad4k>BaC!Uk6udOgMTMb!K5h+WO4-yifd5r8G!0($FW=-)Y*VQ3q-|< zK8`A{91V4lOV6FZwAHBg`nV6j@cn&fX9K+c2RhdTS|317kMiuvegXo z`U>>S;iA&Njkm~xf&w_x@Y`7C9bUY|pz>~oNX>+R3Ld3AW_z>r;L|_HMUzHcSMDhu z5)CUaku}NJUgGdw%MS)Mry@YH<5?l2yUP>$y^^6l?}2*63E}vS`In16Xt^lY<2nlO z3=xGT+waHvY7p0UVi(df!g$@!$VwJOEZX)W9osxx>9prxA!wl#j1{ow z>2I+5!5ufpe z+s|!2Jy(zSm7NpYEnXqRQXilLxfhq6O`P%f`k*XH5ku)iob4q;lB@B$qtP04`KD(0 z=1*G%7?V$rXH2$(nV@F-ne?b%$31K+FS7o<_+i$Lf^1>A(9zHw-OJa|q(^3$1;0Z5 zLi->fr759^OmW43C~&L<0hR3M-FU!0vBE+Q7TTJp2j+*Drg?zFV}T10pw1(QPhMMF z9>v=DlG>9Ti$42`vIX3XA8!FVh}Wm&XYGrK5);1Mu>g)PG=L#X3%uTxi2%NtLQqVB z>4l7LbeCr$$cz$7FPFRKySAP|1Aq#|IsQs>b(oB|AJLFYPS3cX?QM`Q{-U7aeh;ynY*d zZqbDOS|=+mo=zm-S;cs^zl_EJ8_X)w@pn%~UWNsF)ghrfV(R!)FD!0{SBMVpdpG+z zVM!dz)lZ)#fv}-?)r7?VKz+gP^h}-%XfA+LMRIb7j)J%rMH_c1HuwAC$`N(KcPQ=g zAZ9QQx%v0d*pIaJ0Ge_3;1<5V_00OKVIA_F2YD-+iRMt}&<{v0VaL(IAS?rfx8$w9 zEY#nKFz*Fgw2$Uj*Ik$HEx7?`z?%+)^pGc7@Vg_JiJFB2Xtw~EeL%mQmZE8SwP<6? zqTT77K|7nK-m^1^Y!>PSvQ18k_NR6f6>CS?@ZhS`HCt{E*V-$msa_sVObf<}O|Z%)3iJe*qM^Xip{Y#z zVi5cVy_}8-D%oh)a%-zb#@I}8S>WN+N`91~1ERyTXy!?zbz3eC;OpInRJt>LqZ<8y zwUL9EAM*4@xK_-tcz(ro`?t|@Fx2Rp1lzLe~PqF6iR5WD8#=o0K zhIE`=y&XX>V!W*=Cm~p9mtsxoh~2MKlGl3T7hDvk22@3FV|j0hBP;_5HWsx1sA?Yj zG2J7*`AgLxXu3qh1bCXw#i7gNg)tb&ZanHk$)PbOfIpeapPW5gE4$Vtal*C?bq?@LCA3%IepF za!-@P9w%HT&f+V_fSql?CsE^W6r|9*+z8R8YCMJ0!*5Ss?$`ms>a)!hg#C|i6xhKP z1F-;a;w^`=orKCL2R2qEl#^-d$!yaOSFN%ifeT5p`_n}FQ;J{FilpRJ8X7=F!1=Zf zpawikZ@{E0`*>CB0`WcJuT|FumpDYZ{A$n@q@WLb2v>ADRzp2X~$Ws zaK=J)H@)FO1t3JPkGn+uoGSrDkFB3b5Q?uo9-4?kyBE5Gfe%?l;EudWjXzWhK7tdY07NTv^rRA=Zd1_G4N6l;j zztNl0;DApB?4K`d=EYwSr!Rv*wv5jzd&_jbtk@Wb=^Cs?Mag?#u4&31btkEb5j5A9 z(A4{0L$u~>aUy;f=nodO4%ygS)5+hsvugbO0B{Cu2AQoD1xJm)sk2Ml7#>km9FV`V z-~>m?E@fPpk&03>vCFhs+l8pyA0gTd6qUexv@A#1?S;$fhFWKfdsK){PKkuo*ayAr zJ<`R|QNglk+Uup1`J6D+dL{HAl|K6Cepxvs3BAt2J-2wT)RhL+)~Gxr=u8(50Ct;EM6ICQzxbr-%pITTK33FNrf= znPlU>mpAiSuN_;%%dHS`Cfgz^>SAt#)WTAu3_??Ph#eOjdBb?8jeY0U&iTFg2oVeS zCQwY~9*K{*W7r>}tsZ^R?5VFYHE61Krk+(UdS7`V3}4cGqgkNlKDI@P`@2grfgq7- z+@}FHD_*H#W??cDIERmvln{b!RqahDS|?_F;;V(*Ki@gQb!oAw2Wh);9%+bk!W>KT z_RhXH<0jO?*8VW%)o(>f4=;q?+|cZ0wAAY{<+(4>6N_Dukj4={wjnnnvxg;Cp(a?x zGSs}>E!%q__8C#ac2*a38_&gQ@Vc_{Y8EWv&>HBrl;_2mR?1omz3q< z_J^@i-X}JVsvHManfQ7;wedqK4w1~9+I^W9QZjBVU{i~%SM1t-*n@;l@uY-J{XlW9 z3z%yHOG1oNRF{sRp~`^EjFSlys+9*;#Q}=nUv6C2Q(pbVXm2g2?ssVwK_^hyEa`wG<~-l*hza0_Sx^`ROu6`NzbPNXZ zb0{8lJJIcl68HApjEdlhl4o&FTpWEj?f-=s0lhiVDZwM;eQ^B1i{r5lX3E{tGPn1s z3G}YXac{Z5ATteen%VxJ0yk8&MPD6(02P{rFMKU3wW?~v-@WA&?5XPzIhA((RztZ0 zX)JHV+TMoT1(e++8xe3J@wg5=M~Vv%jk^~11Qyz7pwvz2;>dSl4bA3x1>!c{&+rF> zyE|U;YQ?_ciW?|@VGLs1g*Z0AP^Q`ym9+wWd^+a3jQ7tOReJuZe4Kz7=*LamwO9(z z-e7aP3nmovpesr%$EfXh1}>XRY#*w;+`yj>D1-mwY{ zxyB21p1#K2ra|{e%FEfgx=(zrl`|qFt&qC?CODJs+3X%3<(5?j4Ki7)o2S&RN_n3P zgl##*uR?OT_eQh~+pVmKBS7Lm(6QF*(45_&!p@OGjUg9;K5Acp2tG@4{j+V46)6h` z2Ku|7vMvZ6r9Hlcs4Kh7oLzoetfOeR*fkWn%i~d_lFZRfWY|O~F(+}Hp+5YuChMq1 zdb~dKLsn^?OxxO!*Bv_OmDM9WZ(&{LO*^YPvVkP7Nn3TNm7w7;_58X-$TNd5m$K0s zQd(+Gct+;I{l#VYqUv*ScKNBwW4*w8)NVJ51{i(3K0pI5 zPKQ!~{XyRC{61$=n8%|-AUSE_rbeKUf->Epl&!kX>k+EkvOUV@T0N~h@{t^a!pzZo z&|FQ&Ul+Cd^t{M(vB4uP@=PoXsU6-_5FfNXYX()bmqzmVess(i{nXMYVS?q)jcYsGy zfp_%Pt4Oztk>lssUF3o1bA6f3NxB4d6TErw+|e-N2L}yPlFC57^gtT;F$ggp%uKZNsMzjo8Y4 z`xSjXIlq+3H=EE;Z*Tb-gGrK+>OO;t_V>!K*W84-!Fz zGt>6PSUzFrEZC}~+ypK0KwPXfxxqyPdbpeR%GlnL+Y$kJBf)7W>2rFAE=x2ZB6Sf%J-h^mZ0ndR zpU7aA$>$CD7Q7Vz@&=dHPsXZh7Z0s&%m}W| zVD1GX#MBz*o$H#x$Ky}lWFcXYuN8!^6;rq)@v_|Xl)_wXZFNmu?Mr=jp4@B4e=2{9CStTR*42CZVXAs%WmlDhQxFD z+ETk02VCMg2;nl(L9-S22>_@r5HpV)$;tijB-DH5dsaEU2xf1ZB*aZ{U}a0%r+_9# zMG(|7vah{U+j~Bd(6Vc9EFU&2r>0HkdcGU*&Xe{05J2JF(BX47bZbkQ?aJJeA!u^M zmknLx?6z3N_k-*$@)H1d%ujWm?pfcL1rj&ysTzkROCB{1#&v76b5};x2lKQXZuwN4 z;7TrDtl_JUKO#AD2ybCXRi2MK5`{IvrTr-ykPlh}6Fc05$o?-^HQSy_g-fnJGA8#l zxe6M_9y@2NX(%IO(avl8gp%MyN%vOMYJ1%#ebyTxj5n1tE$)6w)Q!bpj0gX~RO5R( zZ-kiO-aEvWdMtRIo#xQUb56J=RQ&3SG=oVVnD!JbcqVNySh)6m9@sUGxjXoX=y`m z7loWoS{k6Vt5Sidq3n7<9u!2&SO@?0fwm5CLz5A;F|Ko-ZrX@4p9lyK($V;tuM+Qvp=J|roFYM=Q*ac^NLHJ z9;k2|XH2*IHsF5E#;TAG$uYf#A+Nq@^z2+z4oNt|KeTdoo)U zQY|(CL(2=tBm1NrvZ{Z?v0Sy;+^aNK2bdT}n!koxI1AKlUy7YwcxhrRzLAz5tl#fk zv%0%LQDhH3e}Kwp?PMuHp9sAn>o_D!yt3O-)E;qSmeOo#pIf8#E7gs4J)ARuuXJsB zpw(c4e_X1#%h}XaxG~c1mAH86wF>iNUE0@}HM3beq$mfxa{)7bT1+B}zzKq@L|WC;-d~vmHYb-! z&W%N7VrAVc@s`LOvmiN8WVOJWnGwd7i~Ntn)qm~U;l(*JPRkWyb1NTHoYSk2hQBb+ z?gNvGU+|SFu|Rj}hX_KC$c1{PR@@h+bX@deUS2Qy`DrA==Ry8MTeuvS_2F5P%*~n9 zGGWd^doo94^P!g7==UK{3eP-HhqaaNKJqE-9)58l0`!cQl&74uoD8l30|}7nKx2;E zWzK4s;pUsEQBDit=p0KucaO#h7w8Eqiu8<>ET2h$q?9c_wY^wV5wt?Wk zt=XYtLCYIbh^Y+-yXP_zbUXJDw8H&XRhRCqs%sU*3#4WGXBW?XZ;o`i*3Bj;V>6Zg z4sG7$v^xGlWbf`1}S&To=L5IW!fo{X#i7ygI^j@MPpVt)$WaOF}8|)TN|a= z5ho`zrCSYLKhi&3nD&Hc*LFvWLjq~Qhr%v1C6!47at}xO>s;jVtv^d)y~xK#0KNxs@E0GSsr(DC!onH1Bz6Dw}4Io0q~REA-RNtShWK=L$QQkXZ@ zTWBPtf6X00oDvKTzWW=-V)BuiwiMH+&0M_ndHL|zNoTL@F$BYt;aDewqUjDZy3wHx zT@nn31yPSOw}DXpjxudd<1ab;-ZCmpw*Gi>T~PZ;K#1sW8k?QS}W|j zJ~xJxMJ%`Io!j>w-`dii7`Mx<`w0uaz@b}qR%C*Zb4e!(geso~PKM^Bt2H(5JACfO!3;r~0pLEp zG;(dD?+6Y*6nxA>g6xW~gynb%TIuFK+qKflaSo~>A1Hwj96U6rW(ifj>ZOLUgrH5T zb?F-tD_A5=jY91U#w5lXRLD}^Q2rCE*h|k~C=iwi1**@bYgslC+^FY#eKEZQuE3Ew z$2P@++k+b9QO3=**rBB_nYO3=*Pk>~d5=}ft!gDQjK4j3Q^;!Y54-W^lhI$z2&pz zdsF_;1kL7Fp}di1-70!f-X(HvIewIPc3Z7#lsD1-TjZFOcdh%kDk;c253%3cY{`2{Ae9`b zB&EiqA%+>(wr#q~bjdQBik2yB(E_tR#9kB0ynv<}S;y;;0VI?D-mORn>%O|yPo5?c zS**V8H^5K#V=H$Rb1KMnM@zn;G1H6 zayku}wJb|_mE^KZ3+!(Q=ZYjUHq<)l7={^Skyi2eydnRVZeVO&4!uE$e4+8IVQRVC zqCxweL5P-$R)K9(xM^BaIi0w?Me$PbOv4UoX9j#YS36OEZm?paEm<`uRSCUe+qTvi zq0gZReTyg#np0I_9JeQw!1I4Q3jAmtze+trq@o1tFUd%{EZf>nW*N6YVu&ohrd+?& zp_2~vD87y2d&w$w%lUKPneEDUpMKQuMyP8yBT)~F0BC5mHY|`fOFPT7Ls6vP)uySx zzz*O37~4-K5egN0>6wOk{z9}~rq{mPOgVfy zHc+uzMZ+xn@sGDBW2V`U9<9o4*+DPSXuFC9?YB;K)6^i?lIAhf{YFu48EvXMk}k8Q z)R{@n9ff^CO5N4$Mq{!=l*kM)%U!9rU%UtE(A>(*>qI`h;Ew9cpgs zf-nhYg~*@~BdhMolC^1~{d#jqiO|Fs$Ns8l;XtK&d_ejSIW#P;g%Ng#9;;4O>}uPja@6YGl(J2F%R7eAN`-SDi_m}>Vj^K@SF992bGurWOpmgx{wmFjH zgc~=brsZX+-k*Ydy}!-qy=3I82UIbvY6*1s2s{NAJ4^~E+r~T$i;pbIM#~g1$>NfQ z3sTh%V>b|LdLuJ;XgzQ8$F~>^8)kj(c8x#Y?dvvbFJyoNU~rfmvc}m-vp%z6%$%E@ zw%@%zS{3op+gtUe(GB^EsoZ|H(faqy7yBHCtO8QuVY4RF%e|BcG`d=`Bsug-aDL$O zP^Va+S^0||C)|7Df-K!L5o^{FrpD_TitVYdD%o7lM_@=qqS{NB>3k!SO^QXVYRP=i zfH$*wRYMB07#EuKK+C*;c&)O#pS0}Xu~RwjvK(Z;EwGjwOC3JU7DZOA8?Y=D@|M~) z%3)T;U3K=2f#o{?IB&q4_*qky)$T4^yG)1Ja~)f6^SQ1)P3y!3pP82lSXut_4^}GI z20x#PTI<2hw~Xj}RO*}weTZ9+P<1Rwr(@1#x=Ys|NPCM(p2P|UGWS^VoQ>e zbvDkC$uD)*2X7OwV^{gAD}~veB_dB@daNo(@Ngh7ju0wzXa>b9zLZr)erK2Aj~rwV zVa2k1*WqAu8h&F{Ri>1SgpuT^Ms9uKPe1pZ-f^>h3o{7c$0$6H3O8-o{O^efB+ z=2u^T`LH{iKW>5cL#6jV$CUw}Otnly1K8igi8xm4D$W?iy;v~2^Th9KmEmKDmOhA0 zgEwpy;5M*Vr-~gAGJ-xc8YQkyK&T-85Ke)X%nG2wB2*X;EesZUPl8eI1j7(yhRjM5 zq3+wjuEE8G254Pb^Qdu$r&=p+{#U1>7vE_R>S$a>T?yD&JuDri(6VMziz zrI^#9?Ltdlhizy`UI`$FrsnoJcYx|6Tb4D*Vg`<9@wMe#?E7@tlm*z7 zPM}B}K#%65Q=XkPLc8=>v%4+ABCwLuUm_5Us97wfTc)-*o)y5I6-W>qydY@hq;K)1 zFE8>SEm?5+2#$aFJF`Wt51lW;BD3xyF$eqW>E8LJ?MII{L>_ObW_@5=1q*7ynYU=R zY+&tFb=H@31D5YReS}v=5?tN-0g@R9l_dBJ!D@@Ei#NV|*sF|~6flMjc;*8>41UmT zxR^VB|L}SA4upZn+GSyxPe+*lqVTX0>QFp8GmwY9TWnZz&U8W06gG2m(sP7^n z=60I#r6H_(92t)#;b+~z*tsmA&nuoFHP6M16dU*O9h+l}3n>~t>699^K73l$q_dJ8 z<61JAN9$cQACz7j2~Rt~#k|LSE`KiM&o6`c<(%ANv$){hjl5wChr(KpS!q~cH1$Fw1y>%r#sXMchr&w*h!q&_R61B17Hb6*4G^i=YhhnZUN4bAJE_0@5&~FdF+SL zeXgUp?YPtOA*YLyv}G+yXty4Fe{`jppg_x@*+AK|nD(JoWu?0GC83NLM?1u|1NZ0( zWK5sUNE3XJDX6`df3*2^9{a0eK5cqZ{5$h%GOJGJiX?9VF483fT)&bS;miBIkDhe0 zVwpsaJ58&K!^8&kYE!_xGH%FnJ6HNZW+@f(a6)b_x4%nqr{Oz4v1|z@F<~hwsW+GY zDD@YgKB`S#?NBmy;&##UaVQ#MC63QpZTNh%DhuJ$ks4SSn&q3DdovgcvOzZTQg=&X zc*mrOKa|p1Gw9Llv#u_$w3Zt!1@uG27gzqkPYAh1*FRKL4_g3J?d394?67jt-ZA1u z3Y-T6QDkD&0vtP2N2Hd&1UyT3n=&21p~+4p@|VHJ7@3BE+%Fx5&eJwg@94)5`WU|~ zKjAhi81*CF;HZxXQ$8&!{z@e6Tce773hX{<%xASl93IA3bZ15`r3_RKt$rUEg;T#k zqGQl5(!STO!}ZM6r6OkO(?1F>XP7^L!`WU+6Ay>pJNh{$i@ACFxh{V$pJRS94+B`~ zgnic(ip)>mRq%X0T(Ng=QIe+1mepq@+cDp(^nOtSM zKl?!C%>ccNC)|&{WTf_Iyv}x(bbx{H8cX@(kLoetZHzXk9pf+3FV+uX-QhIJcODE# z)I3=!Yto0^{SvwSoV3=Dh%5ozNj|6RQZpaAU!0CS>g(8+tQ|xqC!jZs&zOL_NMvjT zXHblCqPQK@V&9=_P?ecbm6^m`5Z?i-LEVwfs<(gTyNEaVp=){x@9p=fYCDa@VkD@~ zTxplQ+U_T^sCAAl`WSPeOm3*Gs+Qe7@IA!8D;!KOKFS<->ok+s2|iNkc{W<;+QE$u zIF{~W^a8x7I2JSfhL`{AHL5$e=c?Wy9;#l2@8Otfa_@}0$oh&L|LkCs^xTzcK9|lK z6=zXqAVXqlOXkFi0J0Iq$_#FwIfzW-&wFN^(3d4INvps8N50@Byd{n9Cb7=vaSwd zg}yWSn9rRVJ|5{f_+p(r75RmK7#y~_M7}1J^2vrsb$^L>;h_d|(m^Ygql#`0fu_>O zz)01+v5ToNW0Z9iUHRpS_?vbRn+h6<+L4k;TJa{f%+p&~#tx?)NXmbY>WIUhIAxSQpA4V|;46aiCqy zkAh_u@DGU+;4)0_X2&cg>%5noacaQ-oR5}g@>=}!;}dqX>^2o*)|y`t#IpJ#Wu?`z6?MIwfy!Y*LFQRy>!T~|F z>&PjiVb^vq^XkhZeg$Z4xfSGTEE5|rQuM2oMJi{x{$Ob=CO~oJu--?{2Arg@V`9i+3e;Xd1U;EXnLr)HkjkzJ@QJhzRE%eEan3G z;z|7 ze#s(n!g3^`=rmbhC!%Ao_Uu#F@HgJu(cTNUbQOhXhpZu_nCCO#n!=Jvokuhtze)Y_ zor!o`a@>bD!T!l(us+?O-g15)P#m~2LCf8=7; zty!>(Ab2~)n$A9^IRALv8lLR@d6J%JnoCj4ITCAh z*qoc_#3vc-!RMZZiOrd~gHnGh+N&^%+V|F|S0Qp+)+v0!yA;p%Rh2=}#!NPF`YaL8 zoD&0?0I$7#MHd#s9c^2h<8I3E6;6Cg{=~a2`eaxO^FzAVVovSM!^gf3Kh&~#ZPyqs zNON7Cg-th5;o@%7w0y%$vtM_V&sDPP*j-00o(bC_&G*^}wJ4@W9ec%-f>}hN4hY0d zAP{zVd5p(wYQdsVyT|vw(D?G;>is-Rz5Dup!dGIN5(`*Rq*MML#SeeH{S2Om*D*ns zh75s+Owt=wnGYyGvXTOgP)jFTs805Cyy7f|*hoc-3Ke+&v+m_kaR>7@1KV9;RJU~I zADh6(-F{>Roo+x)m|Y$W3wHIqz*ZV4F5&fgVx^LiwfIq&>2?k;#4Xo}^+qQcUyt9` z8X&=a4f!GePRxnwmXd(kt$EtAftEFWxdtZk%4BC|Lh&h7>c>N@m-P>lwKv|G2YnEUIwAZ=ca2)y{B7LB4-|{smqo$8WHH}X_0`LW7`|`5+d%{flNo35DnR|sp+NW(W4%bKeBl0Ls_TQ z4wUuRMKY5vy}qY)0Ci{(Zl(B7BO4|9l7wxym<2yU-xlQ+Dz({y4Jc8DEqpgh?)jDg zDe45}?vM{2pxgrTuiZ@?2r?CJ+UpSzIwCLWE32Cq40js)z>twLaSqiyzcO@B6@~iq zI%Rz7&htNDar1j|r>7KvvZhDhgXg#5FHOc*@xs*GJ}uW8d4H}xcTaU2$`)2A6kihK zAVV_Ik0BE{AAh+T)P{;pz@ojtMtg+`Ca3L0jR{e1*TjO*D-(*w!dIeD&Yqmt5CA=t z**O0t!xGv=F8}j#uS-7dg)i_>;Vn4hB|eiK;0OyVpW6~3ps9R@&oeAz-a zqsruxA^%clR0}?%=1Sg72{M^tbqq0ZfmVQ4`F!43h9SSs!LFb5s$@?u*n^60iJ;82 zSp!GW#3zPn81MPy0w#~FB4V9qR4Gc@q8WMo(K$?h4DA}}$dk^T_(XZqKPcCQOaHfK z^1m4J4~fNFH0U)o8Z{NWlPF{2LR4}Z3UwxMbGU%o;C!5Yj|Rkk;I}ALamCg+6-12b zw%;{tQIHv%`R5R)rasHi6i&fTKpDUAE6ptt_By7>kMfA5m>B6PGprj8JK3=f>7-bs zswBe?cu8ORPww!)vvmKyoZCGRJ3ygQBka{_jNacv?rVI8eqgp-=F;HvPu$y3VhWp! zSzX^RfmCce{)^UQd}%Jg$FhoZbLDP63E=ATG)mKS)I%PWFv?gh?}C>>4V48X+2O5p zf-$mfZr${|MsxbTkmC+r=cyta8Z_}bGE#%E+g%ZxYuKafKig@4-|l~7g)iPi_@Geo zqrTi%R!ZrwRAs>M)nu z&Rztn~5|f`9R@XMI ztPy3gx=^#Tl)X5uqP0s}eK5>3IpxkjC$^-70Z=mkZWH`_d-m8W(?Bxe_r!v1yqBoW zr+*v?GjDHFS)k<8Q*-GCRI#5ZR&^ggXcbBGKnpERaw^5-tkqduxu1iaRUV2qTPEz4 zkryOlIW?V)x3(^^jPc6K#tgD%&%E6HkkrcyeW*}vTm)jKifjK}M)z-%Ca2Q|+Ya^h zkBswPxy3x-?6ItipjvP*PJjA``L!*l<&1DK2OAP=2F}mHreR;#MeaThjy&irA2`XE1fD{4%ck*&yEc@B>31ALOs-v@6X*H+wy&t8N=}pA5dh0}dfLWXKp;{Yw5(eZAnY`(Of4Ej= zz+goKJ*RNZaW#FvPu$>iJ*0RjF#i7wf9QW_)L$P4^U)8i;$^n1?;sE`{p~QR=bZOK z7I0c2vb0grxfFxxp_971phF7B>K0^NfwC765VXXL}mXS!2FAk*YV^6SS+Z}T4b%kp#Wf~hN;)RaFj#3EvNUQ*FDwEv2QwpQ&R<|G&8P7zqdw5 z(J8NMF%vhyYPC>2!R3qn5?;m2h?#?F)%`awT50Z@5TDs9E{gRH6O_4cmQ8uW(Ujp$ zxsBgMj@5=&$2eJBEon|iX@V~(ov^h_A^wGDA=mADm@~q8;+I+vm>#Pw(>rP8V_AKc zQ`7eLmg&u3?qXnbcl><)s0Dm%>s%ddw4d8NSO1#Z%|PPcuucD$g{&)J6nU%+Lw5M> z08d%`(*e%Xy$lnT0Mi)66E3Hjk?vDJ!M+fi#LInM!xH2h8bVaKJa?t6+CRAw$VZ z1&l?mJ4KDNHbRYZ-fa2q0TT1ASSUbw33sGqFnKIO1ZX+-ffE{!XaXb=r(gQ?<|kcd zTy$s_aH^ZL7IP^C&+Y`Wyxwi`>~o~U~oM(-I^)Z+ewHwfv! z4HpPof##obq(Ve9<7Po4XoOs$(RlO1eRv)AvUMU7BcK|YDb^eY_@8G<{*^<`vIZ|` zeL45H8{9`GG4!o`|7Vyw!93?@SNfEaf54&X2cA%ae*}pWnOBtflh0L;MtnvSmbI}9 zq;1$RMgJVVkc}Y?C|H$o1^k}kj$&R)`sVK`?rMqBhTy`OeqkSKk&SX$82Z0FLf=X* zowDh7<6NI1Q!L5$*L^rXRAb?mgK+ZZm7fn@G92Mc`;XZr2W$(=&cv?KcRrtyEXm*5 zrDE`t7?yv=z>u4pA?G(;=+pS8Gs4~Z_qHvkrymH6LXu{G zxx%70k*kD*O8X!TkplYsvII11*=^Z-|G4>Pn<(b8(^C7(o-zKmyReG~(lNBKlNo?& z69U)Y{zHzxxcOGB`q!EI|E<4tGQ?|kW5x%uB->vH_mfK|_CTP%WoZe0%w>3O#6t5` z0~*}YalA!H7HM+_ZwBQznIB(pY_BGiFkT71r$sBR&RcTH3(Ci{{ZgLWq6wRs4h;*( za!SyIPgMdU29G}d&qojgg@iSbXiZd!xeZ&m@t6RuM`U$Y%@rDPdQwqW3d7UA`?oh5 zxXPMV|8DSn%>Z93P5-iEUzm6b8_Vy$)`LA6_ zm!`+=qQ+F-`Dm1J4U7}9%$&&u5s|;(kA&cl&Qku!!VM2YGH(58*`xK6`|M6smxKBx z-PVShbIGv|E0I*UHXMW^-$KElhAO~Az38W^gNK-!#HdYp`~OoZLUTUXW>uu;*6Cx> zX;CduZAvP5mBvA-5h(b{??~he%b6cOCSA;PU803aZIGw=FboTU6$-cC=MsWNS+nhz z#RG|o*L}L4v}Lc3L4rMj8|n$GZ;UD^Ka7=;LdNxY+8ZT^r;NPLUe6TJM?>{bX_`k6{s5;V-3I_5MB>mpvm5}L|Ec_45?93)un!u%v{&jZ z+?5kgMfW{aB)k@#a;o6g=KoX=MdQyuPQ8OF0C_{N^y#jc$nM95Y<8`;%NtyNJ)ti9 z;KRlQ1y9_wHWdvXGS}CeI;+jDl7sBKJjS^i3VbB+nvqb`=Bka96n|Vo9MuD8&)yJi z=W(x=bwDX^#CAK3H^-GX6arGMTv2@LPh4k92*vl1r{&Cp|3%Kg)+FW6 z9|021meRXlC<55PZZeL%9%Wf^Sk+60PV~e&K!59G+^YcK!mPaxPEG@cv@n1sFQE5! z>}-8knnkBppwPr@ED>F?tEf|pUrPHbJMADcndQU&G z-T}dlHqR}geBanDox+RZV20iDM#D|#cW4cEhR%t%%e_3pQ;n@Go;2WNwj)EOmc=}O zBpB)^-63}vC3!u4-G-R^s|M2?;kn+`+N0nKvr(s$0Dz;^S$uBA5silkmX?B@>n8w~ zTEbL_sS~MekAzcEQOz5mp$w`JMd-kigf&c4vojC`aO=j}WTsLMfK-hToNnTp5{zJ- zbn<4fd_HAqI>6HGHcoi|KU(|pu%@rA>$cvibpWm6#H3P11f+&RfdC3cY?(v_4G5?Z zFiaMi=UN9U$e>JyA*g6TNTd)58U=b)#sEltKOV@GXvid=ToDSb>du8I$hvxCgsTt;RmbU1Z4NOK?tWJ zI4RzzIYBXQq)kkWg6OAF4m94;uBM>aN{&P_V3lK%gMlt>5T8+?urPVsJFoTKxuj#8 zfN_B$$hD6dIl==meNGtnP{wT#}FeebHOAcf^nPR1e!uuU;=S z3~WqAD(UIfJB}z{_Z_R`%E76;%LCB1TbbyXhJwu5-YEapk>PO|jckw!hCkJ>`$0JT zs%S7q;L^P*Y$P0eX%+-W%UKa^K~F$@n_b$_0Mf5t{dnbp%qyb&(e#;HczNaNxwrCh zdmsP)rA}iC>52ty6#hfa7$4b}>rbR|SNmqSfH(+}zp3F{4!v0 z$_DwPOVNj%4Z<3o0j)=qdwlp@YPjAY$N*HjW+$ssa>AnBumz|3L{<#h1XDy)>M1_} zQtS&8YKLki)#FKwx%Sf7kk~m-3(jZ5sfGnjx$juHpyxLOmDgA~CIA3J_6xtvs^oxB zoagsI<)%s>@5}^6D$??LIX6=~x5uxnZrxiX;bRpa$HA`47lp*ZX};;(-oWl9j1-EZ zEhogCQ^%E2&&K$M&p@q!i~w`km&;)hqTM@T$BSZ&19H&LZ07dD73Z30r510gTpf2S zrM9R+e!$Dara}Ibfz5Q6Fu0YKv8B=dnxfyXSQN-6vT9q#rGPbSO+Va{?+>YC z^WsNA2Qsa*IB;}qS~NKLl=N))Kytqc2fp|skE?W6*zM67*q|J7rXdxn^e6l`SZr&H z0u7_K00h2qB(5$Ig3@qq+g7>Ouj3vj6xOADm{%6ZVU^?VtTcGNSry|oB%EU6Wc`D1 zsv8&IAWN?8s|&2`4IdDSl{DQnw=VXMjt1AnN{IUIAGD>GI*|^u)~}!UTJ&VKg!|tG z(Z9EL)$-?gp2;oWZwczjdjBB5!6h2L`dhW95^K;I%>HU_htY?c4H1gv5U7Kq#8SgU zsuMP(yQ$u-*%yT&iBcpLHykN@;GWW2acgF8K_QHd{f~Sdru@uE3f3b89#z7)X=UsQL{xSqRF~E3y`+p9UtS>AD2jVEFgHJO}`5L+R!GAW#(#cGsb>Un##k5`0sA7FX*- zE^j3p&{w4ofeik1I8vd`8LPZlol<|riYa>+R?CcEaRuI*D{F+?q9u(59lh6-g?dxr zKZuRHgvoEEy)Vp!lc434Vp7R)nVLua1e5D15oL@YBivm|3V)o)*dJV!KG zr>0L5UiI#?`cZF9O6C=duVieqnIo}@RvIw?5b~g>eDNOQZf1ONE@geavWDA96SspV zq%M_|nvFP%S3YM-_kQ>-HGJ{D$3OYM@ya<{GyQ(`4{2Ad9P9m8a|0>i4pZTZU+e5t zN@+_Fgvo>r@oYO|?bE=}Ymw0a6jfRBi*~<+9AGpu z7{32)7J$mB{Fuq66eVOGx}0Say!+#oOp~MhgMqGA?>zRMy=Hj9)9$RdozjT?U zhmqTZS#ag}nR*_=b{NXN(B(-_Qy!Q#oVuKBGWj}MHHmN3)x(JGS(D#*Hu=P*VRhEx zCR$e;&8tVSTQ9ovAXp$`raly!nY^>PzC{E#t+D==Adn$Ad%MJJYX8(!gP95)lCtb- z5+aT4ipBdh%L7s=f=)_ecY7Pi8{gj#tM;8TcEr;3NctOf3BW3w#uKGaQ5ut#%Lgic z7ij!U*S0szWXF?L1+NasZYHaq5w0`))#E) zwBZ~``~BGw4Y%avKyHW~_4u|1(v7ls3PFQxef(Y-_qFe0>cfHT>0Y&!mk!G;i-_SJ zF-ox~L6pz5*uzostpz>dv5%1}(~@{59JAS8vjO+U*bfD&AS$i0*L(3`NSKugidw9Q z$Z9FoSS?5ttedOG^yowfx+J+yPV_U?qi4TksyH8u8@kxFEod>Mwx-;vekp7>B z=v8jdh7ML3pouJT!g9T9dRzqd?Zq|OH9D6A)Jz08R&%`giiJvD#Iv!r?%cgC4sXoP z|I4bGDkXJV_4?`?un!n4E!cb21$%P4TmI;E>s?J%7D{&SRzlhNUX^ox1WB;(htYO< zJqPDh>bRgxsB{*{i+9)i8RTlHJ>YPn`^x>VRNdzuxZYa2(%eVW&Hi`C(nv=Yy0GZx zj@ZrhtCH7W$QxR>DE7`?gD_d@j0Ca=+K0~?n=iUxKYE`b34i_-IGa=K>NiujOb=tt zx0$N%QcI3gZWv4U2u(4G47{@;+`=m24a9j`a$rq)>%Chb^rrnSdm6;KX{z|OaTKBjKAn$(AQfBqj=hfC=D`I%tJzi{?D|zle>QJVssbZ;IdwdoGe5GX_ zS6$_la>|=z(UrKO8$%yA{PrQudqOJ%t9TA5;J}=!bcyKRFWmYBZ{<3zMDMfDVzk_r zFDp{VsS6^t1($2A>vVT{6od|~W9@_s$D<|$yOI?okHR?`6-hS86V&c$_KKwg7U16~BnpJCqeCLK`LcMpOG>@E`4KI6h zjg?sVdqV-S-tAfFo%83<&zA;;bE@F;nI?>>rG)ardy_<;C0m&#DRI7$D_CVON=Zps zo3d|2AW$^zjK&~B7TeeKT20oAb@|dIH}1`(a3~`~A#Qr3VKDDdOj%d>cP**mfA8He zApGKm+6*MM74Fgw?h`98F1*$85n4M_?h?blv6pSzq4K4{i*hSBtkJAemH4&)`naYO zpc9N0dTv(6SPi@~3^E1kk@B&}RV6JX>A+;l+ zH?l#^+zE%zkac`!VRiVK`xjuEco4`+QGL1l@pj!{pPBCpDODJ~f#4ECd@|*Vm9FhK zi=9?{M3ya8HJO^~^g+|m$wsyPm%kWBl&^?j4_61v=73D|i`1NZ4xI`-F>=dS$7VZ6 zZ!&#u?+SD5*LeIW@W3^4@vH35t7^(geuUz@|0!|h6)TlGt`IoY$a|f04obyZD*k$y zzx4_>qzoj~Zg{3fJpH~Qkkwo3qHWx!(`9y!7btyJklo|qk*`>5ll+DZ7m#(P%Wqp1 zpZM9!%|V`aox19z={@IeRA|#*Z(X~(wD#+q3s5A9)5(d_BeDr2C#5emR9qEH9lkhf z4_Wx=gjPVxloflb;ltEi_`2Vl6TJIRfJA$Z>AF(O4Ndw*Iw(Lj1U(^Iy%Nd=Iinr! z+_I|hfng|8j-8pim~nl79YFEfXKR~LN*J9NQzN?*ZGH8S<@5|>{HdbBxZfA4HjX3W zKm!))jY_J}pJnY{y~6y(Od=NJk>B&Z=rn>R#d1~I?@M^7kuZu=h<)}c+KPC&SfTG2Zsa@4#!1GKSg{-iVBzXiyR&>PaIiPUEcOipSuN%pA%0+&M*Q0q@$YRxJ)tDyuy^kTYbDnT zl8tue=z81L?D|Bqj4S4@z8S1XrB*r8-bcYgq}9sz7$l8n?X7(<13S?@xFYtZA=v#6 zx6)8u!m~1+xHgJZ=59>4sId$apmYV~D^fOCh75+W$k7npfmkVTcY{*e_;_H{C{&ld zlN)auePZq)<+rAT#2SyP^ouDC{%Zt=AX7J@+idv$LTdBMFMAtZWWUD!eYsm|UhvEB zd8nog$lkC{xc=v<^R-|#?_aR01GZ9nIbmX}1aWTxu z(^E;5ZL_;akrhv6L@g=WZUqrljPk$VO5LP5C0w6H)b;j)GD2K5eFBwdQS zSGZc?YlGJ(FMR89xfkbj8QRgR5l&apFQP#Rd<>Fj$IU*)i@Wcj%M*&3pPl>~?6gav z;Ya;HG_gPF+3VH9&&9{Da-uReeRf%U`IZ({p`oocX64PxeYh>?muE+MlkQL1*9i~d ze}7siX-FkG!qN6s{6F>cf9j3vf6b~0UUCd+)u566xB2rM_}gC|2cn~qqDP}QyyU%X z3;kPiWM5?Q_K66EL8LJ)8nJwY_)dJr+k_uc-CR_a5OXJI^1|&>d#@CYEKCWB75nkY0lWpYzU7W9Zi>1+i2T1MX;_Ke6 z^Ey>DzW;}w{V$s3sRuIgxPz}zS2Wi!$b9e4i{JXndU^Xco9Gl@82lE z1?N;9uHb}@5a=z#UH4xFJzC#Un|XPa-O^JpZd;z39OdED+k-qiHWRnAJ)O_q%? z%x+^XyGFPGA0drUeK&ybO3tuHc1P%4h%*`fVR2zvZGRlYEI^I7373iAf_(LIaK`b~ z+oDxZD8nuR2H#G5oo(@5n|(hZn`%`>wN|cjUwzL{ben%aZ|um27?=8BDtRn(Mqdjw zhO3_3woH5iUJ7HgIhAkN%}1&vC#tRy>Y6H48o^uki;bpzXID_?0kVQRe7=M}T*Sy^ ztiWJ`vNwXWC}LexMecupx7@#~>i$IKM zdcha#iig*H!|qUHC!`U^hRHM5WQEuAXm3(YFx0(74k@6c7D6URZh~SmKfUNdAFAaAj2T9029bXjHyA&ILz`4DchG0>~`(1Dn`Avo!i?lJU&;gfV zlBI-OoG#2>>*|Js;4cY*7I1$0WcAUeik?r9(xgYuveC37H&r;n1CNi5w4Od9*4Gko z;=M>&iT?c0@#K$?Kd8nm*ZKyrt5a>chFg>r%x~z=3jJye#g8N;-b9o^&B7E9GH{t71y-$qT2J`vepvGGl@5$r+{V$eDshIZsX zA8coj*pVu&NFnPZoN}?Eu!iCVd;o;uLwMdkgJF;PD6cHIieKm2;KW`>Eo{dm?iA>2 zc(^76aLehg4r8y5)J0~NrJzu^=$uqFvWMvmZPWt{ELsCUI<~N3ZVPsyiH!%&FmbhU z0U?Z*zPS9n-^+$gqD_~`CFTm11}agnUVIoF`mwb zOuu-D(vWKeu`}7mI>$!Sn>dzA=&Xc!bYrFyh9Q+}(Uc)VIhLe$U%(A)+vfk>2K5(d z3bE6kXBI@Zf^)j}ry@J5~Lr8$WKaS}~ z9*V_rW=|Yd7%vT_M_udBsI(ceAUC0P-by^6lS;tY!onXUzZip+MqQ8V-W5IbB5l}1 z3({GGJ0P{#Z?j+us|ahJ#q;SHz7G%^8X3{)WDoJjhRri1y~%egWl)*HakJl6L%<2> ztVTE9Vhr^W-MDiDOMyaw!NCnkvzXP~FX8bK}c;znB6+Xc)cNUUzYgB{b6 z#e-2!h5&adr~f_pEZ>P=dB&u=BIOl+tZFleNT0aI|8A?v31}j0Q6cXSzR&(#dhW(SU{5<7(Fd)$3 zOrBqjrLX_p1pGS3;73(76-)QhP~ZRwn!Wn>_)#hEHp4iL+0A+oimre?oVE%~(m}Gr z5?JU;T`E@Xx_9+LGADwaPW=J>?J-)AadPN(BTl|A#+*5kul%KYC51e?rZsN-!fp1t z&c)QsJ)P41#>|q_W;az}1N&qUS|Q_8YkoZBn*F1D5q@5)P)mOMBJHa*jbq=Hr($G zr~_>CTw}$%NLx>536u=l*9rXq>f&s8ww=|7`-auLg~br)U-NGNabAWFyZhf@e=xj1 zrqP^jkaJ(za?mB15lXk;$gVv60rDWjiEY64slo4Hw7^rKBJFJgM~*4qMuAD`sU!z^ zItRfPuiVORR%74TiTG+7f!bIx(WnRap6IK?SV1>{ouGs*Fkc^ZG)T1-1Uq=R74(X< zJxKUgSoB9@m0BJ(R5~lT)VpN3xkJ)iR5%pP$2AOhnL1X_6)hne%!uX#bYeuq$enng zDwV)Cb4R1pEG6BBmx32XptpFpHqqwa5^^zeiv>#w>t;( z*L8-%m?_-yt71QI61#f5vcn7wS8&3~#F4t3Z2=Wv4ErifAEfUwNayO1GHVD2=IKVo zWMc)WR>V;(z|B6KaUU+K4;Q$AwD@O)?}Tjb5Z>XpIfpaM@Rw$kk*IE^!){(B{rXXl z^I}R}jtV2&2@xR_Z$>xGMu*5zfwTyTyR}Kr2o~Q8#t7AH5GKj)y7$;Mz{!mfoLsDR z`~vHxfXtPi?3$MP$MqFlwjXhA_d7sx+O$*IxIT~~DZX@wEUDm@S2Y1HZf75ku#eJ? z%CS+q4*Mkoy%5%3)R-&XFo{ zQIELzv|@T$i&MVY9cyw%L5@$7r*jx2yre6zmxGT`uOV)0OWsYwYFh1S-_%5Vw-uHW zH*c1K?fY*CuaODuLpe;(ofP~c+^vR$Hd=c{=bb$NeZrXn%1rsO$qSfF9LI>`&wrr| zRPnJYa|^1})5AeeORl8IG;);Kdci2SmX{83HDks1fUrhVXr%G)H+^ z8OoR2a9=wN4;FFcAW1CuPa?ArEA@OO4&@cpCkCk*nC<|Vtl?a5V`qO+Kyek0iXU^a z%)-?NkJ%aLiAL!&4=LP|gqTdBr*q)F=*8)l^Rd3kvazD)@brouiLhT=0qcGsDP%QE zYqcOD>#MO|E-=_OJM#9ei*yC7bK>8m^oQ`HqwaFNn11weM+e^$iTO2W0loEmmu1q+ zHYJ16%tKYIV??LqfDUz{o5rXjhDs7?TXdSb(2*Bb)S^eV!ZwV#ec0&4pe4AfQ3DIJ-I7tsWIF7oY^hUM90alyvr)3%i zoB%1-Cc~!0D*{Ms`97G&zkF~F3-5qx<=j3XhwzTk?F&FTRIZHN2W)Gu;O*lG@di2G zIvR{IXaD?AH^FUY?z_n1Lsc^m6Q=1jcc@f{LUjt9fc3YdGBkvrj|WJjRy85o+IcrX zO0)5`Ba3%MIGMrtUirsmqO9@pKS2+gqk;MZ(hYO`l$nRC{JCugMSKP@uY{S0Lv$)X zs+1yW3NE$ooIJLDJ8G(6sO`a!CIEl8Z~gPX>*1=gCfx{*4#H;Mo> zrJ{=Yqz|e|3tM4tqq^@!f92r{5{6TtZ0SoiFNw^iT6fa@_f$(FEsdq}!vMlmEezEV z<=TR!0ME@^QS%B$411-CRz5#CXkab48ZCuPJM01bg>jeU1*9doX3Q@iL-+4=V|qEa zv)cqXPa@Q%oSI{v5%}S|Gx5Rg{$`nkYLT;n8arD+mbfX5ILV70s%DOp#cjU4t2Vy( zbGo7&i(E`zLBW42f@55Y*PWm|42T?eycHn+@bv;v=w)NM*7C1h9)}0sfJ3LHR+mkOV zbt!5m7uckEUuvufMzui#KvE}2$1Gr)o%(P|P^uCP7cyoj0jp8Dk7k)8jG!N`$0WAV zTBbSoIKW=dR0Cq-A8&UYW#L)L$de#UJ!oz{Zk+|8Lh4|wn9P+!yT zQ$r=+g%Sq#I7F$d;H9SLrZmK9Dh42NQ>{x=2{zv$3Y(qg4egX_b5eWC0tn5YY;OCC zVJ|7?dqV;`Y!8)ZF%QEmt{n0`9E@VMK2(R{$|uq(Gu{k=Mz0AU=0+iZ&8v6>K&YAL zES!em-C>R@El+1n40S3x=NiE#0~K2Hi;iArjWjH*6ZP4VG~i#R-4K`!g(asIVO@t9 zYh77R0*By7_7be%!CZP}N-#Srl97e0qZde_ZlPn?c7s?KTTQgt@7Ta-Gl-!^gFGK+ z1O#f1kRPcn6>LM66T2DUX(M%kd1%NB>gOkHFQ7lu22m6q7N)HoGGaZZqHy1+mmxYY(FPgZO1lsw59F#f3 zJAfQ1XAz$moH1ZIH6Lf~92qA2AF8Wy%-q>kb&3A>m#dz9wMEOhVh5NLq8QAPAAo)^ zZB8i$vj-zIHT)J4ok(9*oyTf^M{W-yYWQ6U_=r8b?GkjVpkOqzApPT^*8D?gs*EQu z#lqSqkc!dxd%UW&{SG3Y!svH*`-8BcQTTJGZc+8}<7>v8P+Z&KgGDUTl4KF{hkE zvul2RpE|(TEPl-ei2ZcVBHd>U^s4qq9EKV@&cy)ngtkkU8YZa;8fw+<%*}`Zh@(;( zfeWxkByQRlu$p#oYG|^RRlGnRdNb=EO`&BbPQfHiQFx(%FnQcqytZ?3NJ(M)L_z?+ zd@>(X5ot?yfrBAR41EZba}QcW#!#=~4|a~AhF^O$epAR+_DIH-kP=iXIziq2>Jql( zSnMmR3Oea*Jw{snA3opo0Z3@wgBbMtijbF@0*6Zs|3_Zpih?0V#SvDp4viv-Qji|x zj%NMo6k>Q+iDpv;ClYT0#Lypst0Ob_9Gp?DB66HdDOL(2^f6Sa_zoy=>))uyIQoO+v4;}mDT~5Obmxc@jnz?6T+|RxEI2x zvd2k1p;djG%^3?yy!WX?1P7VtAbue&phh(uVm9N*HXg+Q5{b|(n4sk1n`yxdz}r9X ztvfpv8_lcEwD?|pRpq-;1QwheZ5m{-y4YjEL`1=Y*>vB^nS{0~O5{*16r31pm}wRs z&Pt*hQE#hj`a~ua$L}_yR#xPoE{@csyZApF1tnk>-9Xp7_@nt!FySntd9&^_vXME? z=O9U8EBZyYC1Mv9X%I6%-J|nA>7so!? Date: Sun, 24 May 2026 21:56:21 +0000 Subject: [PATCH 15/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/docs/data=5F2/results.csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/data_2/results.csv | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 kalinovskiymi/docs/data_2/results.csv diff --git a/kalinovskiymi/docs/data_2/results.csv b/kalinovskiymi/docs/data_2/results.csv deleted file mode 100644 index cf33e4d..0000000 --- a/kalinovskiymi/docs/data_2/results.csv +++ /dev/null @@ -1,16 +0,0 @@ -Лабиринт,Стратегия,Время_мс,Посещено,Длина_пути -Маленький (10x10),BFS,0.13895999999995468,53.0,15.0 -Маленький (10x10),DFS,0.0922400000000323,35.0,31.0 -Маленький (10x10),A*,0.13939999999998953,39.0,15.0 -Средний (50x50),BFS,3.832719999999945,1541.0,97.0 -Средний (50x50),DFS,1.7197200000000024,670.0,239.0 -Средний (50x50),A*,2.9094199999999404,771.0,97.0 -Большой (100x100),BFS,22.754760000000072,8142.0,195.0 -Большой (100x100),DFS,12.294599999999935,4075.0,2415.0 -Большой (100x100),A*,29.995820000000027,6149.0,195.0 -Пустой (50x50),BFS,7.503980000000032,2500.0,99.0 -Пустой (50x50),DFS,4.27746,1275.0,1275.0 -Пустой (50x50),A*,11.404779999999981,2500.0,99.0 -Без выхода (50x50),BFS,4.929480000000064,1570.0,0.0 -Без выхода (50x50),DFS,5.824799999999985,1570.0,0.0 -Без выхода (50x50),A*,8.014639999999984,1570.0,0.0 -- 2.43.0 From 326c84c3f0533aab79db3905fae4e397788a6750 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:56:24 +0000 Subject: [PATCH 16/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/docs/data=5F2/task=5F2=5F2.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs/data_2/task_2_2.py | 483 -------------------------- 1 file changed, 483 deletions(-) delete mode 100644 kalinovskiymi/docs/data_2/task_2_2.py diff --git a/kalinovskiymi/docs/data_2/task_2_2.py b/kalinovskiymi/docs/data_2/task_2_2.py deleted file mode 100644 index 9e523b3..0000000 --- a/kalinovskiymi/docs/data_2/task_2_2.py +++ /dev/null @@ -1,483 +0,0 @@ -import heapq -import time -import os -import csv -from collections import deque -from abc import ABC, abstractmethod -import matplotlib.pyplot as plt -import numpy as np - -class Cell: - def __init__(self, x, y, is_wall=False): - self.x = x - self.y = y - self.is_wall = is_wall - self.is_start = False - self.is_exit = False - - def is_passable(self): - return not self.is_wall - -class Maze: - def __init__(self, width, height): - self.width = width - self.height = height - self.grid = [[Cell(x, y, True) for y in range(height)] for x in range(width)] - self.start = None - self.exit = None - - def get_cell(self, x, y): - if 0 <= x < self.width and 0 <= y < self.height: - return self.grid[x][y] - return None - - def get_neighbors(self, cell): - neighbors = [] - for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: - nx, ny = cell.x + dx, cell.y + dy - neighbor = self.get_cell(nx, ny) - if neighbor and neighbor.is_passable(): - neighbors.append(neighbor) - return neighbors - -class MazeBuilder(ABC): - @abstractmethod - def build_from_file(self, filename): - pass - -class TextFileMazeBuilder(MazeBuilder): - def build_from_file(self, filename): - with open(filename, 'r') as f: - lines = [line.rstrip('\n') for line in f.readlines()] - height = len(lines) - width = max(len(line) for line in lines) if height > 0 else 0 - maze = Maze(width, height) - for y, line in enumerate(lines): - for x, char in enumerate(line): - if char == '#': - maze.grid[x][y] = Cell(x, y, True) - else: - cell = Cell(x, y, False) - if char == 'S': - cell.is_start = True - maze.start = cell - elif char == 'E': - cell.is_exit = True - maze.exit = cell - maze.grid[x][y] = cell - if not maze.start or not maze.exit: - raise ValueError("Лабиринт должен содержать старт (S) и выход (E)") - return maze - -class PathFindingStrategy(ABC): - @abstractmethod - def find_path(self, maze, start, exit_cell): - pass - -class BFSPathFinding(PathFindingStrategy): - def find_path(self, maze, start, exit_cell): - queue = deque([start]) - visited = {start: None} - visited_count = 0 - while queue: - current = queue.popleft() - visited_count += 1 - if exit_cell is not None and current == exit_cell: - path = [] - while current: - path.append(current) - current = visited[current] - return path[::-1], visited_count - for neighbor in maze.get_neighbors(current): - if neighbor not in visited: - visited[neighbor] = current - queue.append(neighbor) - return [], visited_count - -class DFSPathFinding(PathFindingStrategy): - def find_path(self, maze, start, exit_cell): - stack = [start] - visited = {start: None} - visited_count = 0 - while stack: - current = stack.pop() - visited_count += 1 - if exit_cell is not None and current == exit_cell: - path = [] - while current: - path.append(current) - current = visited[current] - return path[::-1], visited_count - for neighbor in maze.get_neighbors(current): - if neighbor not in visited: - visited[neighbor] = current - stack.append(neighbor) - return [], visited_count - -class AStarPathFinding(PathFindingStrategy): - def heuristic(self, a, b): - if b is None: - return 0 - return abs(a.x - b.x) + abs(a.y - b.y) - - def find_path(self, maze, start, exit_cell): - open_set = [(0, 0, start, None)] - heapq.heapify(open_set) - g_score = {start: 0} - came_from = {} - visited_count = 0 - while open_set: - _, _, current, parent = heapq.heappop(open_set) - if current in came_from: - continue - visited_count += 1 - came_from[current] = parent - if exit_cell is not None and current == exit_cell: - path = [] - while current: - path.append(current) - current = came_from[current] - return path[::-1], visited_count - for neighbor in maze.get_neighbors(current): - tentative_g = g_score[current] + 1 - if neighbor not in g_score or tentative_g < g_score[neighbor]: - g_score[neighbor] = tentative_g - f_score = tentative_g + self.heuristic(neighbor, exit_cell) - heapq.heappush(open_set, (f_score, id(neighbor), neighbor, current)) - return [], visited_count - - -class SearchStats: - def __init__(self, path, visited_count, time_ms): - self.path = path - self.path_length = len(path) - self.visited_count = visited_count - self.time_ms = time_ms - -class Observer(ABC): - @abstractmethod - def update(self, event): - pass - -class ConsoleView(Observer): - def update(self, event): - if event['type'] == 'path_found': - self.render(event['maze'], event.get('player_pos'), event['path']) - elif event['type'] == 'maze_loaded': - print(f"Лабиринт загружен: {event['maze'].width}x{event['maze'].height}") - elif event['type'] == 'search_start': - print(f"Поиск пути алгоритмом {event['strategy']}...") - elif event['type'] == 'search_end': - print( - f"Путь найден: длина {event['stats'].path_length}, посещено клеток {event['stats'].visited_count}, время {event['stats'].time_ms:.3f}мс") - - def render(self, maze, player_pos=None, path=None): - os.system('cls' if os.name == 'nt' else 'clear') - path_set = set((c.x, c.y) for c in path) if path else set() - for y in range(maze.height): - for x in range(maze.width): - cell = maze.get_cell(x, y) - if player_pos and (x, y) == (player_pos.x, player_pos.y): - print('P', end='') - elif cell.is_start: - print('S', end='') - elif cell.is_exit: - print('E', end='') - elif (x, y) in path_set: - print('.', end='') - elif cell.is_wall: - print('#', end='') - else: - print(' ', end='') - print() - -class MazeSolver: - def __init__(self, maze, strategy=None): - self.maze = maze - self.strategy = strategy - self.observers = [] - - def set_strategy(self, strategy): - self.strategy = strategy - - def add_observer(self, observer): - self.observers.append(observer) - - def notify(self, event): - for observer in self.observers: - observer.update(event) - - def solve(self): - if not self.strategy: - raise ValueError("Стратегия не задана") - self.notify({'type': 'search_start', 'strategy': type(self.strategy).__name__}) - start_time = time.perf_counter() - if self.maze.exit is None: - path, visited = self.strategy.find_path(self.maze, self.maze.start, None) - else: - path, visited = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit) - end_time = time.perf_counter() - time_ms = (end_time - start_time) * 1000 - stats = SearchStats(path, visited, time_ms) - self.notify({'type': 'search_end', 'stats': stats, 'strategy': type(self.strategy).__name__}) - self.notify({'type': 'path_found', 'maze': self.maze, 'path': path}) - return stats - -def is_path_exists(maze): - if maze.exit is None: - return False - queue = deque([maze.start]) - visited = {maze.start} - while queue: - current = queue.popleft() - if current == maze.exit: - return True - for neighbor in maze.get_neighbors(current): - if neighbor not in visited: - visited.add(neighbor) - queue.append(neighbor) - return False - -def generate_maze(width, height, wall_density=0.3, seed=42): - np.random.seed(seed) - maze = Maze(width, height) - for x in range(width): - for y in range(height): - if x == 0 or x == width - 1 or y == 0 or y == height - 1: - maze.grid[x][y] = Cell(x, y, True) - else: - is_wall = np.random.random() < wall_density - maze.grid[x][y] = Cell(x, y, is_wall) - maze.start = maze.get_cell(1, 1) - maze.start.is_wall = False - maze.start.is_start = True - maze.grid[1][1] = maze.start - maze.grid[1][2] = Cell(1, 2, False) - maze.grid[2][1] = Cell(2, 1, False) - maze.exit = maze.get_cell(width - 2, height - 2) - maze.exit.is_wall = False - maze.exit.is_exit = True - maze.grid[width - 2][height - 3] = Cell(width - 2, height - 3, False) - maze.grid[width - 3][height - 2] = Cell(width - 3, height - 2, False) - if not is_path_exists(maze): - for x in range(1, width - 1): - for y in range(1, height - 1): - if np.random.random() < 0.5: - maze.grid[x][y].is_wall = False - if not is_path_exists(maze): - for x in range(1, width - 1): - for y in range(1, height - 1): - if x == 1 and y == 1: - continue - if x == width - 2 and y == height - 2: - continue - maze.grid[x][y].is_wall = False - return maze - -def generate_empty_maze(width, height): - maze = Maze(width, height) - for x in range(width): - for y in range(height): - maze.grid[x][y] = Cell(x, y, False) - maze.start = maze.get_cell(0, 0) - maze.start.is_start = True - maze.exit = maze.get_cell(width - 1, height - 1) - maze.exit.is_exit = True - return maze - -def generate_no_exit_maze(width, height): - maze = Maze(width, height) - np.random.seed(123) - for x in range(width): - for y in range(height): - if x == 0 or x == width - 1 or y == 0 or y == height - 1: - maze.grid[x][y] = Cell(x, y, True) - else: - is_wall = np.random.random() < 0.3 - maze.grid[x][y] = Cell(x, y, is_wall) - maze.start = maze.get_cell(1, 1) - maze.start.is_wall = False - maze.start.is_start = True - maze.grid[1][1] = maze.start - maze.grid[1][2] = Cell(1, 2, False) - maze.grid[2][1] = Cell(2, 1, False) - maze.exit = None - return maze - -def save_maze_to_file(maze, filename): - with open(filename, 'w') as f: - for y in range(maze.height): - for x in range(maze.width): - cell = maze.get_cell(x, y) - if cell.is_start: - f.write('S') - elif cell.is_exit: - f.write('E') - elif cell.is_wall: - f.write('#') - else: - f.write(' ') - f.write('\n') - -def visualize_maze(maze, path=None, title="Лабиринт", ax=None): - grid = np.zeros((maze.height, maze.width)) - for y in range(maze.height): - for x in range(maze.width): - cell = maze.get_cell(x, y) - if cell.is_wall: - grid[y, x] = 1 - elif cell.is_start: - grid[y, x] = 2 - elif cell.is_exit: - grid[y, x] = 3 - if ax is None: - fig, ax = plt.subplots(figsize=(8, 8)) - cmap = plt.cm.colors.ListedColormap(['white', 'black', 'green', 'red']) - ax.imshow(grid, cmap=cmap, interpolation='nearest') - if path: - path_x = [cell.x for cell in path] - path_y = [cell.y for cell in path] - ax.plot(path_x, path_y, 'b-', linewidth=2, label='Путь') - ax.set_title(title) - ax.set_xticks([]) - ax.set_yticks([]) - -def run_experiments(): - mazes_data = { - "Маленький (10x10)": generate_maze(10, 10, 0.2, 10), - "Средний (50x50)": generate_maze(50, 50, 0.3, 20), - "Большой (100x100)": generate_maze(100, 100, 0.3, 30), - "Пустой (50x50)": generate_empty_maze(50, 50), - "Без выхода (50x50)": generate_no_exit_maze(50, 50) - } - os.makedirs("mazes", exist_ok=True) - for name, maze in mazes_data.items(): - filename = f"mazes/{name.replace(' ', '_').replace('(', '').replace(')', '')}.txt" - save_maze_to_file(maze, filename) - print(f"Сохранён {filename}") - strategies = { - "BFS": BFSPathFinding(), - "DFS": DFSPathFinding(), - "A*": AStarPathFinding() - } - results = [] - runs = 5 - fig_mazes, axes_mazes = plt.subplots(len(mazes_data), len(strategies) + 1, figsize=(18, 4 * len(mazes_data))) - if len(mazes_data) == 1: - axes_mazes = [axes_mazes] - for row_idx, (maze_name, maze) in enumerate(mazes_data.items()): - visualize_maze(maze, title=f"{maze_name}", ax=axes_mazes[row_idx][0]) - for col_idx, (strat_name, strategy) in enumerate(strategies.items()): - solver = MazeSolver(maze, strategy) - times = [] - visited_counts = [] - path_lengths = [] - best_path = None - for _ in range(runs): - stats = solver.solve() - times.append(stats.time_ms) - visited_counts.append(stats.visited_count) - path_lengths.append(stats.path_length) - if stats.path: - best_path = stats.path - avg_time = np.mean(times) - avg_visited = np.mean(visited_counts) - avg_path = np.mean(path_lengths) - results.append([maze_name, strat_name, avg_time, avg_visited, avg_path]) - print(f"{maze_name} - {strat_name}: Время={avg_time:.3f}мс, Посещено={avg_visited:.0f}, Длина пути={avg_path:.0f}") - visualize_maze(maze, best_path, f"{maze_name} - {strat_name}", ax=axes_mazes[row_idx][col_idx + 1]) - plt.tight_layout() - plt.savefig('mazes_visualization.png') - plt.close() - with open('results.csv', 'w', newline='', encoding='utf-8-sig') as f: - writer = csv.writer(f) - writer.writerow(["Лабиринт", "Стратегия", "Время_мс", "Посещено", "Длина_пути"]) - writer.writerows(results) - print("\nРезультаты сохранены в results.csv") - return results - -def plot_results(results): - strategies = ["BFS", "DFS", "A*"] - mazes = ["Маленький (10x10)", "Средний (50x50)", "Большой (100x100)", "Пустой (50x50)", "Без выхода (50x50)"] - data = {} - for strat in strategies: - data[strat] = {"times": [], "visited": [], "paths": []} - for row in results: - maze, strat, time_ms, visited, path_len = row - data[strat]["times"].append(time_ms) - data[strat]["visited"].append(visited) - data[strat]["paths"].append(path_len) - - fig, axes = plt.subplots(1, 3, figsize=(18, 6)) - x = np.arange(len(mazes)) - width = 0.25 - colors = {'BFS': 'skyblue', 'DFS': 'lightgreen', 'A*': 'salmon'} - - for i, strat in enumerate(strategies): - offset = (i - 1) * width - times_display = [t if t > 0 else 0.001 for t in data[strat]["times"]] - bars = axes[0].bar(x + offset, times_display, width, label=strat, color=colors[strat]) - for bar, val in zip(bars, data[strat]["times"]): - if val > 0: - axes[0].text(bar.get_x() + bar.get_width() / 2, bar.get_height() * 1.1, - f'{val:.2f}', ha='center', va='bottom', fontsize=8, rotation=90) - axes[0].set_title("Время выполнения (мс)") - axes[0].set_xticks(x) - axes[0].set_xticklabels(mazes, rotation=15, ha='right') - axes[0].set_ylabel("Время (мс)") - axes[0].set_yscale('log') - axes[0].legend() - axes[0].grid(axis='y', alpha=0.3) - - for i, strat in enumerate(strategies): - offset = (i - 1) * width - visited_display = [v if v > 0 else 1 for v in data[strat]["visited"]] - bars = axes[1].bar(x + offset, visited_display, width, label=strat, color=colors[strat]) - for bar, val in zip(bars, data[strat]["visited"]): - if val > 0: - axes[1].text(bar.get_x() + bar.get_width() / 2, bar.get_height() * 1.1, - f'{val:.0f}', ha='center', va='bottom', fontsize=8, rotation=90) - axes[1].set_title("Посещено клеток") - axes[1].set_xticks(x) - axes[1].set_xticklabels(mazes, rotation=15, ha='right') - axes[1].set_ylabel("Количество клеток") - axes[1].set_yscale('log') - axes[1].legend() - axes[1].grid(axis='y', alpha=0.3) - - for i, strat in enumerate(strategies): - offset = (i - 1) * width - paths_display = [p if p > 0 else 1 for p in data[strat]["paths"]] - bars = axes[2].bar(x + offset, paths_display, width, label=strat, color=colors[strat]) - for bar, val in zip(bars, data[strat]["paths"]): - height = bar.get_height() - axes[2].text(bar.get_x() + bar.get_width() / 2, height * 1.1, - f'{val:.0f}', ha='center', va='bottom', fontsize=8, rotation=90) - axes[2].set_title("Длина найденного пути") - axes[2].set_xticks(x) - axes[2].set_xticklabels(mazes, rotation=15, ha='right') - axes[2].set_ylabel("Длина пути") - axes[2].set_yscale('log') - axes[2].legend() - axes[2].grid(axis='y', alpha=0.3) - - plt.tight_layout() - plt.savefig('comparative_results.png') - plt.show() - print("Сравнительные графики сохранены в comparative_results.png") - -if __name__ == "__main__": - print("\nГенерация лабиринтов и запуск экспериментов\n") - results = run_experiments() - print("\nСоздание графиков") - plot_results(results) - print("\nЭксперименты завершены") - print("\nСозданные файлы:") - print(" - 5 текстовых файлов с лабиринтами") - print(" - mazes_visualization.png: Визуализация всех лабиринтов с путями") - print(" - results.csv: Таблица с числовыми результатами") - print(" - comparative_results.png: Сравнительные графики (Время, Посещено, Длина пути)") - print("\nСводка результатов:") - for row in results: - maze, strat, time_ms, visited, path_len = row - print(f"{maze:20s} | {strat:5s} | Время: {time_ms:8.3f}мс | Посещено: {visited:6.0f} | Путь: {path_len:4.0f}") \ No newline at end of file -- 2.43.0 From 2f896f1f8759c87865f392ef06647acf4ed5d459 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 21:56:27 +0000 Subject: [PATCH 17/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/docs/data=5F2/=D0=91=D0=B5=D0=B7=5F?= =?UTF-8?q?=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=B0=5F50x50.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/data_2/Без_выхода_50x50.txt | 50 ------------------- 1 file changed, 50 deletions(-) delete mode 100644 kalinovskiymi/docs/data_2/Без_выхода_50x50.txt diff --git a/kalinovskiymi/docs/data_2/Без_выхода_50x50.txt b/kalinovskiymi/docs/data_2/Без_выхода_50x50.txt deleted file mode 100644 index d557173..0000000 --- a/kalinovskiymi/docs/data_2/Без_выхода_50x50.txt +++ /dev/null @@ -1,50 +0,0 @@ -################################################## -#S # # ## ### # ### # # # # # -# ## # ### ## # # ## -#### # # ### ## # # # ### -# # # # ## # # ## ## # ### -# ## # ## # # ## ### # # # # ## -# #### # # ## # # ## # ## -# ## # # # # # # # ##### # # -# # # # # # # ### # # # -# # # # ### ## ## ## ### # #### -# # # # ### ## ## # # # # # # # -# ## # # ## # # ## # ## # -# # # # # # # # # # ### ## -# # ## # ## ## ## # # # # # # -## # # # # # # # # # ### -# ### # # # ### ## # # # # -# # # # # ## # # # # # #### # -## # # ## # ##### ## ## # -### # ### # ## # # ## # ## ## -# # # # ## # ### ## ## # ### ### -# # # # # # # # # ## # # # # -# # # # # ## # # # ## # # ### -# #### # # # # # # # # # # # -# ## # # ## ## # ## # # -# # #### # # # ## # ## # -# # # # ## # ### -# # # ### # ## # # # # # ### -# ## # # # # ## ## # # ##### # # ## -## ### # # # ## # # # # # # # # # -## # # # # # # # ## # -# # # # ### # # ### # # # # # -#### ## # ## # # # ## # # ### # # -# # #### ## ## # # ### #### # -# # ## # # # ## # # # ## # # -# ## ## ## # # # ### # ### # # -# # # # # #### # # # # -# # ## # # # # # ## # # ## -# ## # # # # # # # # # -# ### # # ## # # # # ## # ## # -# ## # ### # ### # # # ## ### # ### -# ## ## # ## ### ## # # # # #### # -# # # # ## # #### ## # # -## # # # # # ## ## ## # #### # -# # # # ## # # # # # # -# # # ## # ## # # ## # ## -# # # ## # # # ## # #### # # # ## # ## -## # # # ### ## ## # # # # -# # # # #### # # ## # # ## # # # -# ### ## # ## # # # ## -################################################## -- 2.43.0 From 0ce55669c3a4a97835a62a4a6d50adcf14433f05 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 22:01:35 +0000 Subject: [PATCH 18/24] [1] laba_1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [1] лабораторная работа 1 --- kalinovskiymi/otchet_1.md | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 kalinovskiymi/otchet_1.md diff --git a/kalinovskiymi/otchet_1.md b/kalinovskiymi/otchet_1.md new file mode 100644 index 0000000..845e0c3 --- /dev/null +++ b/kalinovskiymi/otchet_1.md @@ -0,0 +1,43 @@ +Отчёт по лабораторной работе "Структуры данных" + +1. Введение +В рамках работы были реализованы три структуры данных для телефонного справочника: связный список, хеш-таблица и бинарное дерево поиска (BST). Проведено экспериментальное сравнение производительности операций вставки, поиска и удаления на наборе из 1000 записей. Каждая структура тестировалась на двух вариантах входных данных: случайный порядок и отсортированный по имени. Все эксперименты повторялись пять раз с последующим усреднением результатов. + +2. Вывод результатов: +Структура | Режим | Вставка, с| Поиск, с | Удаление, с +LinkedList | Случайный | 0.027106 | 0.004267 | 0.002981 +LinkedList | Сорт. | 0.054406 | 0.004726 | 0.003020 +HashTable | Случайный | 0.000654 | 0.000053 | 0.000028 +HashTable | Сорт. | 0.000472 | 0.000036 | 0.000021 +BST | Случайный | 0.002561 | 0.000156 | 0.000250 +BST | Сорт. | 0.109515 | 0.005790 | 0.005869 + +Графическое представление результатов приведено на рисунке в файле benchmark_results.png + +3. Анализ результатов +3.1. Влияние порядка данных на BST +При поступлении записей в отсортированном виде BST вырождается в связный список: каждый новый узел добавляется исключительно в правое поддерево. Глубина дерева достигает N, а сложность операций деградирует до O(n). Эксперимент подтверждает это: +Вставка отсортированных данных заняла 0.111692 с — это в 42.9 раз медленнее, чем на случайных данных (0.002601 с). +На отсортированных данных BST проиграло даже связному списку из-за накладных расходов на рекурсию. +3.2. Устойчивость хеш-таблицы к порядку данных +Хеш-функция равномерно распределяет ключи по корзинам вне зависимости от порядка поступления. Производительность остаётся стабильной: +Вставка: 0.000681 с (случайный) и 0.000665 с (отсортированный). +Поиск: около 0.0006857 с в обоих режимах. +Незначительные колебания вызваны случайным характером коллизий. +Это согласуется с теоретической оценкой средней сложности O(1). +3.3. Причины медленного поиска в связном списке +Отсутствие прямого доступа вынуждает последовательно обходить узлы, что даёт сложность O(n): +Поиск в списке (0.004320 с) существенно уступает хеш-таблице (0.000054 с) и BST на случайных данных (0.00018099 с). +С ростом объёма разрыв будет только увеличиваться. +Вставка также медленная (2,8 с), поскольку при уникальных именах каждый раз приходится проходить весь список до конца. +3.4. Сравнение удаления в трёх структурах +Связный список: поиск элемента за O(n), затем изменение указателей за O(1). Время удаления (0.003085 с) практически совпадает со временем поиска. +Хеш-таблица: определение корзины за O(1) и удаление из короткого списка. Время удаления (0.000031 с) на два порядка ниже, чем в списке. +BST: на случайных данных удаление выполняется за 0.000139 с благодаря логарифмической высоте. На отсортированных данных время возрастает до 0.006047 с, что отражает деградацию до O(n). + +4. Выводы и практические рекомендации +На основе полученных экспериментальных данных можно сформулировать следующие рекомендации: +Хеш-таблица — оптимальный выбор, когда приоритетна скорость операций вставки, поиска и удаления, а упорядоченность данных не требуется. Идеально подходит для словарей, кэшей, индексных хранилищ. В тестах показала стабильно высокую производительность во всех сценариях. +Бинарное дерево поиска следует применять, когда необходимо получать данные в отсортированном виде (например, вывод справочника по алфавиту). Однако критический недостаток — деградация до O(n) на упорядоченных входных данных. В таких ситуациях стоит использовать сбалансированные деревья (AVL или красно-чёрные). В эксперименте BST на случайных данных работало почти наравне с хеш-таблицей, а на отсортированных показало худшие результаты. +Связный список малопригоден для больших объёмов из-за линейной сложности операций. Оправдан лишь для маленьких коллекций, задач с частыми вставками в начало (в данном тестировании не рассматривались) или в учебных целях. +Итог: в реальных проектах выбор стоит между хеш-таблицами и сбалансированными деревьями — в зависимости от того, насколько важна отсортированность хранимых данных. \ No newline at end of file -- 2.43.0 From 80b33d9f61971a28aecb96f167d6832e7e674707 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 22:14:41 +0000 Subject: [PATCH 19/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/otchet=5F1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/otchet_1.md | 43 --------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 kalinovskiymi/otchet_1.md diff --git a/kalinovskiymi/otchet_1.md b/kalinovskiymi/otchet_1.md deleted file mode 100644 index 845e0c3..0000000 --- a/kalinovskiymi/otchet_1.md +++ /dev/null @@ -1,43 +0,0 @@ -Отчёт по лабораторной работе "Структуры данных" - -1. Введение -В рамках работы были реализованы три структуры данных для телефонного справочника: связный список, хеш-таблица и бинарное дерево поиска (BST). Проведено экспериментальное сравнение производительности операций вставки, поиска и удаления на наборе из 1000 записей. Каждая структура тестировалась на двух вариантах входных данных: случайный порядок и отсортированный по имени. Все эксперименты повторялись пять раз с последующим усреднением результатов. - -2. Вывод результатов: -Структура | Режим | Вставка, с| Поиск, с | Удаление, с -LinkedList | Случайный | 0.027106 | 0.004267 | 0.002981 -LinkedList | Сорт. | 0.054406 | 0.004726 | 0.003020 -HashTable | Случайный | 0.000654 | 0.000053 | 0.000028 -HashTable | Сорт. | 0.000472 | 0.000036 | 0.000021 -BST | Случайный | 0.002561 | 0.000156 | 0.000250 -BST | Сорт. | 0.109515 | 0.005790 | 0.005869 - -Графическое представление результатов приведено на рисунке в файле benchmark_results.png - -3. Анализ результатов -3.1. Влияние порядка данных на BST -При поступлении записей в отсортированном виде BST вырождается в связный список: каждый новый узел добавляется исключительно в правое поддерево. Глубина дерева достигает N, а сложность операций деградирует до O(n). Эксперимент подтверждает это: -Вставка отсортированных данных заняла 0.111692 с — это в 42.9 раз медленнее, чем на случайных данных (0.002601 с). -На отсортированных данных BST проиграло даже связному списку из-за накладных расходов на рекурсию. -3.2. Устойчивость хеш-таблицы к порядку данных -Хеш-функция равномерно распределяет ключи по корзинам вне зависимости от порядка поступления. Производительность остаётся стабильной: -Вставка: 0.000681 с (случайный) и 0.000665 с (отсортированный). -Поиск: около 0.0006857 с в обоих режимах. -Незначительные колебания вызваны случайным характером коллизий. -Это согласуется с теоретической оценкой средней сложности O(1). -3.3. Причины медленного поиска в связном списке -Отсутствие прямого доступа вынуждает последовательно обходить узлы, что даёт сложность O(n): -Поиск в списке (0.004320 с) существенно уступает хеш-таблице (0.000054 с) и BST на случайных данных (0.00018099 с). -С ростом объёма разрыв будет только увеличиваться. -Вставка также медленная (2,8 с), поскольку при уникальных именах каждый раз приходится проходить весь список до конца. -3.4. Сравнение удаления в трёх структурах -Связный список: поиск элемента за O(n), затем изменение указателей за O(1). Время удаления (0.003085 с) практически совпадает со временем поиска. -Хеш-таблица: определение корзины за O(1) и удаление из короткого списка. Время удаления (0.000031 с) на два порядка ниже, чем в списке. -BST: на случайных данных удаление выполняется за 0.000139 с благодаря логарифмической высоте. На отсортированных данных время возрастает до 0.006047 с, что отражает деградацию до O(n). - -4. Выводы и практические рекомендации -На основе полученных экспериментальных данных можно сформулировать следующие рекомендации: -Хеш-таблица — оптимальный выбор, когда приоритетна скорость операций вставки, поиска и удаления, а упорядоченность данных не требуется. Идеально подходит для словарей, кэшей, индексных хранилищ. В тестах показала стабильно высокую производительность во всех сценариях. -Бинарное дерево поиска следует применять, когда необходимо получать данные в отсортированном виде (например, вывод справочника по алфавиту). Однако критический недостаток — деградация до O(n) на упорядоченных входных данных. В таких ситуациях стоит использовать сбалансированные деревья (AVL или красно-чёрные). В эксперименте BST на случайных данных работало почти наравне с хеш-таблицей, а на отсортированных показало худшие результаты. -Связный список малопригоден для больших объёмов из-за линейной сложности операций. Оправдан лишь для маленьких коллекций, задач с частыми вставками в начало (в данном тестировании не рассматривались) или в учебных целях. -Итог: в реальных проектах выбор стоит между хеш-таблицами и сбалансированными деревьями — в зависимости от того, насколько важна отсортированность хранимых данных. \ No newline at end of file -- 2.43.0 From 068a5f05903f7a3b9de0872dd44cf7bf028374e7 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 22:15:33 +0000 Subject: [PATCH 20/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/otchet_2.md | 146 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 kalinovskiymi/otchet_2.md diff --git a/kalinovskiymi/otchet_2.md b/kalinovskiymi/otchet_2.md new file mode 100644 index 0000000..214bac7 --- /dev/null +++ b/kalinovskiymi/otchet_2.md @@ -0,0 +1,146 @@ +Отчёт по лабораторной работе + +«Поиск выхода из лабиринта: объектно-ориентированная реализация с паттернами проектирования» + +1. Постановка задачи + +Целью работы является создание программы для нахождения маршрута в лабиринте от начальной точки до выхода. Программа должна поддерживать смену алгоритма поиска, отображать результаты и позволять экспериментально сравнивать эффективность разных методов. +Необходимо реализовать: +чтение лабиринта из текстового файла +три алгоритма поиска пути: BFS, DFS, A* +сравнительный анализ алгоритмов на лабиринтах различной сложности +применение не менее трёх паттернов проектирования GoF +сохранение результатов экспериментов в CSV и построение графиков + +2. Архитектура приложения и применённые паттерны + +2.1 Общая архитектура +Программа построена на принципах ООП и включает следующие паттерны проектирования: +Builder (Строитель) – для создания лабиринтов из файлов +Strategy (Стратегия) – для реализации разных алгоритмов поиска пути +Observer (Наблюдатель) – для отображения процесса поиска + +2.2 Обоснование выбора паттернов +Паттерн Builder (Строитель) +Проблема: Загрузка лабиринта из файла требует нескольких шагов: чтение, разбор символов, создание клеток, установка старта и выхода, проверка корректности. Без Builder код загрузки оказался бы жестко связан с одним форматом. +Решение: Разработан интерфейс MazeBuilder с методом buildFromFile, реализованный в классе TextFileMazeBuilder. +Преимущества: +скрытие сложной логики построения лабиринта +возможность добавления новых форматов (JSON, бинарный) через новые реализации MazeBuilder +упрощение тестирования с помощью mock-строителя +Паттерн Strategy (Стратегия) +Проблема: Разные алгоритмы поиска (BFS, DFS, A*) имеют различную внутреннюю логику, но одинаковый интерфейс. Клиентский код не должен зависеть от конкретного алгоритма. +Решение: Создан интерфейс PathFindingStrategy с методом findPath. Каждый алгоритм реализует этот интерфейс. +Преимущества: +возможность динамической смены алгоритма во время выполнения +изоляция кода каждого алгоритма +простое добавление новых алгоритмов (Дейкстра, двунаправленный поиск) +Паттерн Observer (Наблюдатель) +Проблема: Отображение процесса поиска требует обновления интерфейса при изменении состояния, но логика поиска не должна зависеть от способа отображения. +Решение: Реализован интерфейс Observer с методом update. MazeSolver оповещает наблюдателей о событиях. +Преимущества: +слабая связанность между логикой и отображением +возможность подключения нескольких наблюдателей (консольный вывод, GUI, логирование) + +3. Реализация алгоритмов поиска + +3.1 BFS (поиск в ширину) +Принцип работы: использует очередь FIFO, гарантирует нахождение кратчайшего пути, обходит все клетки на расстоянии d перед переходом к d+1. +Сложность: временная O(V + E), пространственная O(V). +3.2 DFS (поиск в глубину) +Принцип работы: использует стек LIFO, идёт вглубь по одному пути до конца, затем возвращается, не гарантирует кратчайший путь, но экономит память. +Сложность: временная O(V + E), пространственная O(V) в худшем случае. +3.3 A* (эвристический поиск) +Принцип работы: использует приоритетную очередь, функция оценки f(n) = g(n) + h(n), где g(n) – стоимость пути от старта, h(n) – манхэттенское расстояние до цели. +Сложность: временная O(E) в лучшем случае, O(b^d) в худшем, пространственная O(V). + +4. Экспериментальная часть + +4.1 Тестовые лабиринты +№ Название Размер Характеристики +1 Маленький 10×10 Простая структура, прямой путь +2 Средний 50×50 Наличие тупиков, несколько развилок +3 Большой 100×100 Сложная структура, много препятствий +4 Пустой 50×50 Нет стен, свободное пространство +5 Без выхода 50×50 Лабиринт без exit-клетки, выход отсутствует +4.2 Методика тестирования +Каждый алгоритм запускался 5 раз на каждом лабиринте, результаты усреднялись. Измеряемые метрики: +Время выполнения (мс) – общее время работы алгоритма +Посещённые клетки – количество просмотренных алгоритмом клеток +Длина пути – количество клеток в найденном маршруте (0 если путь не найден) +4.3 Результаты экспериментов + +Таблица 1. Сравнение алгоритмов на разных лабиринтах +Лабиринт Алгоритм Время (мс) Посещено клеток Длина пути +Маленький (10x10) BFS 0.204 91 16 +Маленький (10x10) DFS 0.148 91 44 +Маленький (10x10) A* 0.172 87 16 +Средний (50x50) BFS 3.377 1526 72 +Средний (50x50) DFS 2.881 1526 194 +Средний (50x50) A* 3.154 1061 72 +Большой (100x100) BFS 18.363 7064 123 +Большой (100x100) DFS 14.031 7064 305 +Большой (100x100) A* 15.562 4785 123 +Пустой (50x50) BFS 1.113 2500 98 +Пустой (50x50) DFS 0.760 2500 98 +Пустой (50x50) A* 0.961 2500 98 +Без выхода (50x50) BFS 3.210 2036 0 +Без выхода (50x50) DFS 3.086 2036 0 +Без выхода (50x50) A* 2.746 2036 0 + +Таблица 2. Усреднённые показатели +Алгоритм Среднее время (мс) Среднее посещено Средняя длина пути +BFS 5.253 2643 62 +DFS 4.181 2643 127 +A* 4.519 2094 62 + +5. Анализ результатов + +5.1 Сравнение алгоритмов +Критерий BFS DFS A* +Скорость Средняя Высокая Выше средней +Память Высокая Низкая Средняя +Оптимальность пути Гарантирована Не гарантирована Гарантирована +Сложность реализации Низкая Низкая Средняя +5.2 Наблюдения +На маленьких лабиринтах все алгоритмы показывают близкие результаты, различия несущественны. +На средних и больших лабиринтах BFS и DFS обходят все достижимые клетки (1526 и 7064), в то время как A* посещает значительно меньше клеток (1061 и 4785) благодаря эвристике, что подтверждает его эффективность. +DFS стабильно находит более длинные пути (44, 194, 305) по сравнению с BFS и A* (16, 72, 123), что ожидаемо, так как DFS не гарантирует оптимальность. +В пустом лабиринте все три алгоритма посещают одинаковое количество клеток (2500), так как нет препятствий, и путь всегда прямой. Длина пути одинакова (98). +В лабиринте без выхода все алгоритмы обходят все доступные клетки (2036) и корректно возвращают пустой путь длиной 0. +A* показывает наилучший баланс между временем выполнения и оптимальностью пути, посещая в среднем на 20% меньше клеток, чем BFS и DFS. +5.3 Рекомендации по выбору алгоритма +BFS – когда критичен кратчайший путь (навигационные системы, логистика) +DFS – когда важна экономия памяти (встроенные системы, мобильные устройства) +A* – оптимальный выбор для большинства практических задач (игровой ИИ, картографические сервисы) + +6. Эффективность применения паттернов + +6.1 Преимущества использования паттернов +Паттерн Что упростилось Что изменилось бы без паттерна +Builder Добавление новых форматов лабиринтов Модификация основного класса при каждом новом формате +Strategy Смена алгоритма во время выполнения Множество условных операторов и дублирование кода +Observer Добавление новых способов отображения Жёсткая привязка логики поиска к консольному выводу +6.2 Гибкость и расширяемость +Применённые паттерны обеспечивают: +открытость для расширения – новые алгоритмы и форматы добавляются без изменения существующего кода +слабую связанность – компоненты независимы друг от друга +возможность повторного использования – классы можно применять в других проектах +6.3 Что было бы сложно без паттернов +Без паттернов проектирования: +добавление нового алгоритма потребовало бы изменения MazeSolver и добавления условных операторов +поддержка нового формата лабиринта потребовала бы переписывания кода загрузки +изменение способа отображения потребовало бы модификации классов поиска + +7. Выводы + +В ходе лабораторной работы разработана программа для поиска пути в лабиринте с применением трёх паттернов проектирования: Builder, Strategy и Observer. +Основные результаты: +реализованы три алгоритма поиска: BFS, DFS, A* +проведён сравнительный анализ эффективности на пяти типах лабиринтов разной сложности +продемонстрированы преимущества ООП и паттернов проектирования +создана гибкая архитектура, допускающая лёгкое расширение +Ключевые выводы по алгоритмам: +BFS надёжно находит кратчайший путь, но требует больше памяти +DFS быстрее и экономичнее по памяти, но путь может быть длиннее оптимального до 2.5 раз +A* обеспечивает наилучший баланс скорости и качества, посещая меньше клеток благодаря эвристике \ No newline at end of file -- 2.43.0 From 5abb17544146c5559c9691571dfd772f38f34859 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 22:16:07 +0000 Subject: [PATCH 21/24] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20kalinovskiymi/otchet=5F2.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/otchet_2.md | 146 -------------------------------------- 1 file changed, 146 deletions(-) delete mode 100644 kalinovskiymi/otchet_2.md diff --git a/kalinovskiymi/otchet_2.md b/kalinovskiymi/otchet_2.md deleted file mode 100644 index 214bac7..0000000 --- a/kalinovskiymi/otchet_2.md +++ /dev/null @@ -1,146 +0,0 @@ -Отчёт по лабораторной работе - -«Поиск выхода из лабиринта: объектно-ориентированная реализация с паттернами проектирования» - -1. Постановка задачи - -Целью работы является создание программы для нахождения маршрута в лабиринте от начальной точки до выхода. Программа должна поддерживать смену алгоритма поиска, отображать результаты и позволять экспериментально сравнивать эффективность разных методов. -Необходимо реализовать: -чтение лабиринта из текстового файла -три алгоритма поиска пути: BFS, DFS, A* -сравнительный анализ алгоритмов на лабиринтах различной сложности -применение не менее трёх паттернов проектирования GoF -сохранение результатов экспериментов в CSV и построение графиков - -2. Архитектура приложения и применённые паттерны - -2.1 Общая архитектура -Программа построена на принципах ООП и включает следующие паттерны проектирования: -Builder (Строитель) – для создания лабиринтов из файлов -Strategy (Стратегия) – для реализации разных алгоритмов поиска пути -Observer (Наблюдатель) – для отображения процесса поиска - -2.2 Обоснование выбора паттернов -Паттерн Builder (Строитель) -Проблема: Загрузка лабиринта из файла требует нескольких шагов: чтение, разбор символов, создание клеток, установка старта и выхода, проверка корректности. Без Builder код загрузки оказался бы жестко связан с одним форматом. -Решение: Разработан интерфейс MazeBuilder с методом buildFromFile, реализованный в классе TextFileMazeBuilder. -Преимущества: -скрытие сложной логики построения лабиринта -возможность добавления новых форматов (JSON, бинарный) через новые реализации MazeBuilder -упрощение тестирования с помощью mock-строителя -Паттерн Strategy (Стратегия) -Проблема: Разные алгоритмы поиска (BFS, DFS, A*) имеют различную внутреннюю логику, но одинаковый интерфейс. Клиентский код не должен зависеть от конкретного алгоритма. -Решение: Создан интерфейс PathFindingStrategy с методом findPath. Каждый алгоритм реализует этот интерфейс. -Преимущества: -возможность динамической смены алгоритма во время выполнения -изоляция кода каждого алгоритма -простое добавление новых алгоритмов (Дейкстра, двунаправленный поиск) -Паттерн Observer (Наблюдатель) -Проблема: Отображение процесса поиска требует обновления интерфейса при изменении состояния, но логика поиска не должна зависеть от способа отображения. -Решение: Реализован интерфейс Observer с методом update. MazeSolver оповещает наблюдателей о событиях. -Преимущества: -слабая связанность между логикой и отображением -возможность подключения нескольких наблюдателей (консольный вывод, GUI, логирование) - -3. Реализация алгоритмов поиска - -3.1 BFS (поиск в ширину) -Принцип работы: использует очередь FIFO, гарантирует нахождение кратчайшего пути, обходит все клетки на расстоянии d перед переходом к d+1. -Сложность: временная O(V + E), пространственная O(V). -3.2 DFS (поиск в глубину) -Принцип работы: использует стек LIFO, идёт вглубь по одному пути до конца, затем возвращается, не гарантирует кратчайший путь, но экономит память. -Сложность: временная O(V + E), пространственная O(V) в худшем случае. -3.3 A* (эвристический поиск) -Принцип работы: использует приоритетную очередь, функция оценки f(n) = g(n) + h(n), где g(n) – стоимость пути от старта, h(n) – манхэттенское расстояние до цели. -Сложность: временная O(E) в лучшем случае, O(b^d) в худшем, пространственная O(V). - -4. Экспериментальная часть - -4.1 Тестовые лабиринты -№ Название Размер Характеристики -1 Маленький 10×10 Простая структура, прямой путь -2 Средний 50×50 Наличие тупиков, несколько развилок -3 Большой 100×100 Сложная структура, много препятствий -4 Пустой 50×50 Нет стен, свободное пространство -5 Без выхода 50×50 Лабиринт без exit-клетки, выход отсутствует -4.2 Методика тестирования -Каждый алгоритм запускался 5 раз на каждом лабиринте, результаты усреднялись. Измеряемые метрики: -Время выполнения (мс) – общее время работы алгоритма -Посещённые клетки – количество просмотренных алгоритмом клеток -Длина пути – количество клеток в найденном маршруте (0 если путь не найден) -4.3 Результаты экспериментов - -Таблица 1. Сравнение алгоритмов на разных лабиринтах -Лабиринт Алгоритм Время (мс) Посещено клеток Длина пути -Маленький (10x10) BFS 0.204 91 16 -Маленький (10x10) DFS 0.148 91 44 -Маленький (10x10) A* 0.172 87 16 -Средний (50x50) BFS 3.377 1526 72 -Средний (50x50) DFS 2.881 1526 194 -Средний (50x50) A* 3.154 1061 72 -Большой (100x100) BFS 18.363 7064 123 -Большой (100x100) DFS 14.031 7064 305 -Большой (100x100) A* 15.562 4785 123 -Пустой (50x50) BFS 1.113 2500 98 -Пустой (50x50) DFS 0.760 2500 98 -Пустой (50x50) A* 0.961 2500 98 -Без выхода (50x50) BFS 3.210 2036 0 -Без выхода (50x50) DFS 3.086 2036 0 -Без выхода (50x50) A* 2.746 2036 0 - -Таблица 2. Усреднённые показатели -Алгоритм Среднее время (мс) Среднее посещено Средняя длина пути -BFS 5.253 2643 62 -DFS 4.181 2643 127 -A* 4.519 2094 62 - -5. Анализ результатов - -5.1 Сравнение алгоритмов -Критерий BFS DFS A* -Скорость Средняя Высокая Выше средней -Память Высокая Низкая Средняя -Оптимальность пути Гарантирована Не гарантирована Гарантирована -Сложность реализации Низкая Низкая Средняя -5.2 Наблюдения -На маленьких лабиринтах все алгоритмы показывают близкие результаты, различия несущественны. -На средних и больших лабиринтах BFS и DFS обходят все достижимые клетки (1526 и 7064), в то время как A* посещает значительно меньше клеток (1061 и 4785) благодаря эвристике, что подтверждает его эффективность. -DFS стабильно находит более длинные пути (44, 194, 305) по сравнению с BFS и A* (16, 72, 123), что ожидаемо, так как DFS не гарантирует оптимальность. -В пустом лабиринте все три алгоритма посещают одинаковое количество клеток (2500), так как нет препятствий, и путь всегда прямой. Длина пути одинакова (98). -В лабиринте без выхода все алгоритмы обходят все доступные клетки (2036) и корректно возвращают пустой путь длиной 0. -A* показывает наилучший баланс между временем выполнения и оптимальностью пути, посещая в среднем на 20% меньше клеток, чем BFS и DFS. -5.3 Рекомендации по выбору алгоритма -BFS – когда критичен кратчайший путь (навигационные системы, логистика) -DFS – когда важна экономия памяти (встроенные системы, мобильные устройства) -A* – оптимальный выбор для большинства практических задач (игровой ИИ, картографические сервисы) - -6. Эффективность применения паттернов - -6.1 Преимущества использования паттернов -Паттерн Что упростилось Что изменилось бы без паттерна -Builder Добавление новых форматов лабиринтов Модификация основного класса при каждом новом формате -Strategy Смена алгоритма во время выполнения Множество условных операторов и дублирование кода -Observer Добавление новых способов отображения Жёсткая привязка логики поиска к консольному выводу -6.2 Гибкость и расширяемость -Применённые паттерны обеспечивают: -открытость для расширения – новые алгоритмы и форматы добавляются без изменения существующего кода -слабую связанность – компоненты независимы друг от друга -возможность повторного использования – классы можно применять в других проектах -6.3 Что было бы сложно без паттернов -Без паттернов проектирования: -добавление нового алгоритма потребовало бы изменения MazeSolver и добавления условных операторов -поддержка нового формата лабиринта потребовала бы переписывания кода загрузки -изменение способа отображения потребовало бы модификации классов поиска - -7. Выводы - -В ходе лабораторной работы разработана программа для поиска пути в лабиринте с применением трёх паттернов проектирования: Builder, Strategy и Observer. -Основные результаты: -реализованы три алгоритма поиска: BFS, DFS, A* -проведён сравнительный анализ эффективности на пяти типах лабиринтов разной сложности -продемонстрированы преимущества ООП и паттернов проектирования -создана гибкая архитектура, допускающая лёгкое расширение -Ключевые выводы по алгоритмам: -BFS надёжно находит кратчайший путь, но требует больше памяти -DFS быстрее и экономичнее по памяти, но путь может быть длиннее оптимального до 2.5 раз -A* обеспечивает наилучший баланс скорости и качества, посещая меньше клеток благодаря эвристике \ No newline at end of file -- 2.43.0 From 4f7e692ab36f94eb6015787ee52f3585650655a5 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 22:16:36 +0000 Subject: [PATCH 22/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs=5F2=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kalinovskiymi/docs_2/otchet_2.md | 146 +++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 kalinovskiymi/docs_2/otchet_2.md diff --git a/kalinovskiymi/docs_2/otchet_2.md b/kalinovskiymi/docs_2/otchet_2.md new file mode 100644 index 0000000..214bac7 --- /dev/null +++ b/kalinovskiymi/docs_2/otchet_2.md @@ -0,0 +1,146 @@ +Отчёт по лабораторной работе + +«Поиск выхода из лабиринта: объектно-ориентированная реализация с паттернами проектирования» + +1. Постановка задачи + +Целью работы является создание программы для нахождения маршрута в лабиринте от начальной точки до выхода. Программа должна поддерживать смену алгоритма поиска, отображать результаты и позволять экспериментально сравнивать эффективность разных методов. +Необходимо реализовать: +чтение лабиринта из текстового файла +три алгоритма поиска пути: BFS, DFS, A* +сравнительный анализ алгоритмов на лабиринтах различной сложности +применение не менее трёх паттернов проектирования GoF +сохранение результатов экспериментов в CSV и построение графиков + +2. Архитектура приложения и применённые паттерны + +2.1 Общая архитектура +Программа построена на принципах ООП и включает следующие паттерны проектирования: +Builder (Строитель) – для создания лабиринтов из файлов +Strategy (Стратегия) – для реализации разных алгоритмов поиска пути +Observer (Наблюдатель) – для отображения процесса поиска + +2.2 Обоснование выбора паттернов +Паттерн Builder (Строитель) +Проблема: Загрузка лабиринта из файла требует нескольких шагов: чтение, разбор символов, создание клеток, установка старта и выхода, проверка корректности. Без Builder код загрузки оказался бы жестко связан с одним форматом. +Решение: Разработан интерфейс MazeBuilder с методом buildFromFile, реализованный в классе TextFileMazeBuilder. +Преимущества: +скрытие сложной логики построения лабиринта +возможность добавления новых форматов (JSON, бинарный) через новые реализации MazeBuilder +упрощение тестирования с помощью mock-строителя +Паттерн Strategy (Стратегия) +Проблема: Разные алгоритмы поиска (BFS, DFS, A*) имеют различную внутреннюю логику, но одинаковый интерфейс. Клиентский код не должен зависеть от конкретного алгоритма. +Решение: Создан интерфейс PathFindingStrategy с методом findPath. Каждый алгоритм реализует этот интерфейс. +Преимущества: +возможность динамической смены алгоритма во время выполнения +изоляция кода каждого алгоритма +простое добавление новых алгоритмов (Дейкстра, двунаправленный поиск) +Паттерн Observer (Наблюдатель) +Проблема: Отображение процесса поиска требует обновления интерфейса при изменении состояния, но логика поиска не должна зависеть от способа отображения. +Решение: Реализован интерфейс Observer с методом update. MazeSolver оповещает наблюдателей о событиях. +Преимущества: +слабая связанность между логикой и отображением +возможность подключения нескольких наблюдателей (консольный вывод, GUI, логирование) + +3. Реализация алгоритмов поиска + +3.1 BFS (поиск в ширину) +Принцип работы: использует очередь FIFO, гарантирует нахождение кратчайшего пути, обходит все клетки на расстоянии d перед переходом к d+1. +Сложность: временная O(V + E), пространственная O(V). +3.2 DFS (поиск в глубину) +Принцип работы: использует стек LIFO, идёт вглубь по одному пути до конца, затем возвращается, не гарантирует кратчайший путь, но экономит память. +Сложность: временная O(V + E), пространственная O(V) в худшем случае. +3.3 A* (эвристический поиск) +Принцип работы: использует приоритетную очередь, функция оценки f(n) = g(n) + h(n), где g(n) – стоимость пути от старта, h(n) – манхэттенское расстояние до цели. +Сложность: временная O(E) в лучшем случае, O(b^d) в худшем, пространственная O(V). + +4. Экспериментальная часть + +4.1 Тестовые лабиринты +№ Название Размер Характеристики +1 Маленький 10×10 Простая структура, прямой путь +2 Средний 50×50 Наличие тупиков, несколько развилок +3 Большой 100×100 Сложная структура, много препятствий +4 Пустой 50×50 Нет стен, свободное пространство +5 Без выхода 50×50 Лабиринт без exit-клетки, выход отсутствует +4.2 Методика тестирования +Каждый алгоритм запускался 5 раз на каждом лабиринте, результаты усреднялись. Измеряемые метрики: +Время выполнения (мс) – общее время работы алгоритма +Посещённые клетки – количество просмотренных алгоритмом клеток +Длина пути – количество клеток в найденном маршруте (0 если путь не найден) +4.3 Результаты экспериментов + +Таблица 1. Сравнение алгоритмов на разных лабиринтах +Лабиринт Алгоритм Время (мс) Посещено клеток Длина пути +Маленький (10x10) BFS 0.204 91 16 +Маленький (10x10) DFS 0.148 91 44 +Маленький (10x10) A* 0.172 87 16 +Средний (50x50) BFS 3.377 1526 72 +Средний (50x50) DFS 2.881 1526 194 +Средний (50x50) A* 3.154 1061 72 +Большой (100x100) BFS 18.363 7064 123 +Большой (100x100) DFS 14.031 7064 305 +Большой (100x100) A* 15.562 4785 123 +Пустой (50x50) BFS 1.113 2500 98 +Пустой (50x50) DFS 0.760 2500 98 +Пустой (50x50) A* 0.961 2500 98 +Без выхода (50x50) BFS 3.210 2036 0 +Без выхода (50x50) DFS 3.086 2036 0 +Без выхода (50x50) A* 2.746 2036 0 + +Таблица 2. Усреднённые показатели +Алгоритм Среднее время (мс) Среднее посещено Средняя длина пути +BFS 5.253 2643 62 +DFS 4.181 2643 127 +A* 4.519 2094 62 + +5. Анализ результатов + +5.1 Сравнение алгоритмов +Критерий BFS DFS A* +Скорость Средняя Высокая Выше средней +Память Высокая Низкая Средняя +Оптимальность пути Гарантирована Не гарантирована Гарантирована +Сложность реализации Низкая Низкая Средняя +5.2 Наблюдения +На маленьких лабиринтах все алгоритмы показывают близкие результаты, различия несущественны. +На средних и больших лабиринтах BFS и DFS обходят все достижимые клетки (1526 и 7064), в то время как A* посещает значительно меньше клеток (1061 и 4785) благодаря эвристике, что подтверждает его эффективность. +DFS стабильно находит более длинные пути (44, 194, 305) по сравнению с BFS и A* (16, 72, 123), что ожидаемо, так как DFS не гарантирует оптимальность. +В пустом лабиринте все три алгоритма посещают одинаковое количество клеток (2500), так как нет препятствий, и путь всегда прямой. Длина пути одинакова (98). +В лабиринте без выхода все алгоритмы обходят все доступные клетки (2036) и корректно возвращают пустой путь длиной 0. +A* показывает наилучший баланс между временем выполнения и оптимальностью пути, посещая в среднем на 20% меньше клеток, чем BFS и DFS. +5.3 Рекомендации по выбору алгоритма +BFS – когда критичен кратчайший путь (навигационные системы, логистика) +DFS – когда важна экономия памяти (встроенные системы, мобильные устройства) +A* – оптимальный выбор для большинства практических задач (игровой ИИ, картографические сервисы) + +6. Эффективность применения паттернов + +6.1 Преимущества использования паттернов +Паттерн Что упростилось Что изменилось бы без паттерна +Builder Добавление новых форматов лабиринтов Модификация основного класса при каждом новом формате +Strategy Смена алгоритма во время выполнения Множество условных операторов и дублирование кода +Observer Добавление новых способов отображения Жёсткая привязка логики поиска к консольному выводу +6.2 Гибкость и расширяемость +Применённые паттерны обеспечивают: +открытость для расширения – новые алгоритмы и форматы добавляются без изменения существующего кода +слабую связанность – компоненты независимы друг от друга +возможность повторного использования – классы можно применять в других проектах +6.3 Что было бы сложно без паттернов +Без паттернов проектирования: +добавление нового алгоритма потребовало бы изменения MazeSolver и добавления условных операторов +поддержка нового формата лабиринта потребовала бы переписывания кода загрузки +изменение способа отображения потребовало бы модификации классов поиска + +7. Выводы + +В ходе лабораторной работы разработана программа для поиска пути в лабиринте с применением трёх паттернов проектирования: Builder, Strategy и Observer. +Основные результаты: +реализованы три алгоритма поиска: BFS, DFS, A* +проведён сравнительный анализ эффективности на пяти типах лабиринтов разной сложности +продемонстрированы преимущества ООП и паттернов проектирования +создана гибкая архитектура, допускающая лёгкое расширение +Ключевые выводы по алгоритмам: +BFS надёжно находит кратчайший путь, но требует больше памяти +DFS быстрее и экономичнее по памяти, но путь может быть длиннее оптимального до 2.5 раз +A* обеспечивает наилучший баланс скорости и качества, посещая меньше клеток благодаря эвристике \ No newline at end of file -- 2.43.0 From 7e0a54a81752f70593c77f3bd7c9c456b4198626 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 22:17:33 +0000 Subject: [PATCH 23/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs=5F2/data=5F2=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs_2/data_2/comparative_results.png | Bin 0 -> 63399 bytes .../docs_2/data_2/mazes_visualization.png | Bin 0 -> 98420 bytes kalinovskiymi/docs_2/data_2/results.csv | 16 + kalinovskiymi/docs_2/data_2/task_2_2.py | 483 ++++++++++++++++++ 4 files changed, 499 insertions(+) create mode 100644 kalinovskiymi/docs_2/data_2/comparative_results.png create mode 100644 kalinovskiymi/docs_2/data_2/mazes_visualization.png create mode 100644 kalinovskiymi/docs_2/data_2/results.csv create mode 100644 kalinovskiymi/docs_2/data_2/task_2_2.py diff --git a/kalinovskiymi/docs_2/data_2/comparative_results.png b/kalinovskiymi/docs_2/data_2/comparative_results.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a3592a6121a6b62fb782789451403656611cc8 GIT binary patch literal 63399 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

$c%kH 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%0D6FkyHLOwk0 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 literal 0 HcmV?d00001 diff --git a/kalinovskiymi/docs_2/data_2/mazes_visualization.png b/kalinovskiymi/docs_2/data_2/mazes_visualization.png new file mode 100644 index 0000000000000000000000000000000000000000..ea95abe61e267885ea573012ee453ab43ea52154 GIT binary patch literal 98420 zcmdSB2UwHox-J|mmJw7?P)b0Spwf#V9UJJ-M5Q;Sh!Fx(0zznx1*IcO=qN}SrAZ4l zV4;c_AwnRbC>=tGv;+u{^L}Aw)||a(t^eO=uf5Mcxh^l@%WIPFeV=ka_j5mae92gU z&#uF}U@+L8ix7d^{R29(L@EdEr*Ygo}^DT5sQnU15(~xOv_fpU8MM zGxd6kIUkU5{UY4VQ`l~>a2@YyR&*@l2zXoQVU>ia{_WSdBggh`=3La(+5uOhz)TmdT=S)cj&Ps7O^-g7pg|b$t<})U5S=3lp zAu||dxk&Zs#>Ph9dRD)j-E4$~p@#pAA+wroqCQhceNx)fVnY_PxtR3z!DmH5qrMc%fC_$%=IOv(akHOKq1q3!YbLTHx$9;; z*$hu&Iz4FIw=2*7q}}=)#)MSeUH)-&wK;UPxma$?o0D_-_H+4m0e;DCwpe$j+*+qx zj;j{cYI1d+0AEVBWHB4S27IFq;fu9mwHQ6VRc&^KpKvyVE8U~Gm33yl4#Q>B>jc!| z6BKP3{{z1M9sZFa5-<{vaB*?@<|e+Ipia%VrkvIGQ|^aZ(n>IR_rPY2f%uSF{?OUD zW*tUxY|euR59VHm(Q5i>9{xY%Z0Ug{ia9-FT!+0pS?G^FUdtF$tq%yCc7oS<91a)uvs|X{w*T>q@5kf0Pupf+N@~55-Wx)5b1-19 z64+@2i-rCbr&=xaFGuQH^r`IU;Yc}eOU#}2%J1o6lz=SSiCT0Dr z+NznF!-ohL>VNF6zun>l*+5$;unjuarhm$O^8Ic(L!Qv34{b-TkBo$_kB4F{>gJwJ z#;#Aqc76|sYcob+dg9b6F)BG8C8qA9H{O11HF)U*+_-*Ds@}V09?o8BZu=}fYh_7u zSRZxxsM35)|JRpc2k#6E4q7(METz^jr#6}udOsVI)LCv7BV^tgdfX`E8PGPA

w< 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 0 else 0 + maze = Maze(width, height) + for y, line in enumerate(lines): + for x, char in enumerate(line): + if char == '#': + maze.grid[x][y] = Cell(x, y, True) + else: + cell = Cell(x, y, False) + if char == 'S': + cell.is_start = True + maze.start = cell + elif char == 'E': + cell.is_exit = True + maze.exit = cell + maze.grid[x][y] = cell + if not maze.start or not maze.exit: + raise ValueError("Лабиринт должен содержать старт (S) и выход (E)") + return maze + +class PathFindingStrategy(ABC): + @abstractmethod + def find_path(self, maze, start, exit_cell): + pass + +class BFSPathFinding(PathFindingStrategy): + def find_path(self, maze, start, exit_cell): + queue = deque([start]) + visited = {start: None} + visited_count = 0 + while queue: + current = queue.popleft() + visited_count += 1 + if exit_cell is not None and current == exit_cell: + path = [] + while current: + path.append(current) + current = visited[current] + return path[::-1], visited_count + for neighbor in maze.get_neighbors(current): + if neighbor not in visited: + visited[neighbor] = current + queue.append(neighbor) + return [], visited_count + +class DFSPathFinding(PathFindingStrategy): + def find_path(self, maze, start, exit_cell): + stack = [start] + visited = {start: None} + visited_count = 0 + while stack: + current = stack.pop() + visited_count += 1 + if exit_cell is not None and current == exit_cell: + path = [] + while current: + path.append(current) + current = visited[current] + return path[::-1], visited_count + for neighbor in maze.get_neighbors(current): + if neighbor not in visited: + visited[neighbor] = current + stack.append(neighbor) + return [], visited_count + +class AStarPathFinding(PathFindingStrategy): + def heuristic(self, a, b): + if b is None: + return 0 + return abs(a.x - b.x) + abs(a.y - b.y) + + def find_path(self, maze, start, exit_cell): + open_set = [(0, 0, start, None)] + heapq.heapify(open_set) + g_score = {start: 0} + came_from = {} + visited_count = 0 + while open_set: + _, _, current, parent = heapq.heappop(open_set) + if current in came_from: + continue + visited_count += 1 + came_from[current] = parent + if exit_cell is not None and current == exit_cell: + path = [] + while current: + path.append(current) + current = came_from[current] + return path[::-1], visited_count + for neighbor in maze.get_neighbors(current): + tentative_g = g_score[current] + 1 + if neighbor not in g_score or tentative_g < g_score[neighbor]: + g_score[neighbor] = tentative_g + f_score = tentative_g + self.heuristic(neighbor, exit_cell) + heapq.heappush(open_set, (f_score, id(neighbor), neighbor, current)) + return [], visited_count + + +class SearchStats: + def __init__(self, path, visited_count, time_ms): + self.path = path + self.path_length = len(path) + self.visited_count = visited_count + self.time_ms = time_ms + +class Observer(ABC): + @abstractmethod + def update(self, event): + pass + +class ConsoleView(Observer): + def update(self, event): + if event['type'] == 'path_found': + self.render(event['maze'], event.get('player_pos'), event['path']) + elif event['type'] == 'maze_loaded': + print(f"Лабиринт загружен: {event['maze'].width}x{event['maze'].height}") + elif event['type'] == 'search_start': + print(f"Поиск пути алгоритмом {event['strategy']}...") + elif event['type'] == 'search_end': + print( + f"Путь найден: длина {event['stats'].path_length}, посещено клеток {event['stats'].visited_count}, время {event['stats'].time_ms:.3f}мс") + + def render(self, maze, player_pos=None, path=None): + os.system('cls' if os.name == 'nt' else 'clear') + path_set = set((c.x, c.y) for c in path) if path else set() + for y in range(maze.height): + for x in range(maze.width): + cell = maze.get_cell(x, y) + if player_pos and (x, y) == (player_pos.x, player_pos.y): + print('P', end='') + elif cell.is_start: + print('S', end='') + elif cell.is_exit: + print('E', end='') + elif (x, y) in path_set: + print('.', end='') + elif cell.is_wall: + print('#', end='') + else: + print(' ', end='') + print() + +class MazeSolver: + def __init__(self, maze, strategy=None): + self.maze = maze + self.strategy = strategy + self.observers = [] + + def set_strategy(self, strategy): + self.strategy = strategy + + def add_observer(self, observer): + self.observers.append(observer) + + def notify(self, event): + for observer in self.observers: + observer.update(event) + + def solve(self): + if not self.strategy: + raise ValueError("Стратегия не задана") + self.notify({'type': 'search_start', 'strategy': type(self.strategy).__name__}) + start_time = time.perf_counter() + if self.maze.exit is None: + path, visited = self.strategy.find_path(self.maze, self.maze.start, None) + else: + path, visited = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit) + end_time = time.perf_counter() + time_ms = (end_time - start_time) * 1000 + stats = SearchStats(path, visited, time_ms) + self.notify({'type': 'search_end', 'stats': stats, 'strategy': type(self.strategy).__name__}) + self.notify({'type': 'path_found', 'maze': self.maze, 'path': path}) + return stats + +def is_path_exists(maze): + if maze.exit is None: + return False + queue = deque([maze.start]) + visited = {maze.start} + while queue: + current = queue.popleft() + if current == maze.exit: + return True + for neighbor in maze.get_neighbors(current): + if neighbor not in visited: + visited.add(neighbor) + queue.append(neighbor) + return False + +def generate_maze(width, height, wall_density=0.3, seed=42): + np.random.seed(seed) + maze = Maze(width, height) + for x in range(width): + for y in range(height): + if x == 0 or x == width - 1 or y == 0 or y == height - 1: + maze.grid[x][y] = Cell(x, y, True) + else: + is_wall = np.random.random() < wall_density + maze.grid[x][y] = Cell(x, y, is_wall) + maze.start = maze.get_cell(1, 1) + maze.start.is_wall = False + maze.start.is_start = True + maze.grid[1][1] = maze.start + maze.grid[1][2] = Cell(1, 2, False) + maze.grid[2][1] = Cell(2, 1, False) + maze.exit = maze.get_cell(width - 2, height - 2) + maze.exit.is_wall = False + maze.exit.is_exit = True + maze.grid[width - 2][height - 3] = Cell(width - 2, height - 3, False) + maze.grid[width - 3][height - 2] = Cell(width - 3, height - 2, False) + if not is_path_exists(maze): + for x in range(1, width - 1): + for y in range(1, height - 1): + if np.random.random() < 0.5: + maze.grid[x][y].is_wall = False + if not is_path_exists(maze): + for x in range(1, width - 1): + for y in range(1, height - 1): + if x == 1 and y == 1: + continue + if x == width - 2 and y == height - 2: + continue + maze.grid[x][y].is_wall = False + return maze + +def generate_empty_maze(width, height): + maze = Maze(width, height) + for x in range(width): + for y in range(height): + maze.grid[x][y] = Cell(x, y, False) + maze.start = maze.get_cell(0, 0) + maze.start.is_start = True + maze.exit = maze.get_cell(width - 1, height - 1) + maze.exit.is_exit = True + return maze + +def generate_no_exit_maze(width, height): + maze = Maze(width, height) + np.random.seed(123) + for x in range(width): + for y in range(height): + if x == 0 or x == width - 1 or y == 0 or y == height - 1: + maze.grid[x][y] = Cell(x, y, True) + else: + is_wall = np.random.random() < 0.3 + maze.grid[x][y] = Cell(x, y, is_wall) + maze.start = maze.get_cell(1, 1) + maze.start.is_wall = False + maze.start.is_start = True + maze.grid[1][1] = maze.start + maze.grid[1][2] = Cell(1, 2, False) + maze.grid[2][1] = Cell(2, 1, False) + maze.exit = None + return maze + +def save_maze_to_file(maze, filename): + with open(filename, 'w') as f: + for y in range(maze.height): + for x in range(maze.width): + cell = maze.get_cell(x, y) + if cell.is_start: + f.write('S') + elif cell.is_exit: + f.write('E') + elif cell.is_wall: + f.write('#') + else: + f.write(' ') + f.write('\n') + +def visualize_maze(maze, path=None, title="Лабиринт", ax=None): + grid = np.zeros((maze.height, maze.width)) + for y in range(maze.height): + for x in range(maze.width): + cell = maze.get_cell(x, y) + if cell.is_wall: + grid[y, x] = 1 + elif cell.is_start: + grid[y, x] = 2 + elif cell.is_exit: + grid[y, x] = 3 + if ax is None: + fig, ax = plt.subplots(figsize=(8, 8)) + cmap = plt.cm.colors.ListedColormap(['white', 'black', 'green', 'red']) + ax.imshow(grid, cmap=cmap, interpolation='nearest') + if path: + path_x = [cell.x for cell in path] + path_y = [cell.y for cell in path] + ax.plot(path_x, path_y, 'b-', linewidth=2, label='Путь') + ax.set_title(title) + ax.set_xticks([]) + ax.set_yticks([]) + +def run_experiments(): + mazes_data = { + "Маленький (10x10)": generate_maze(10, 10, 0.2, 10), + "Средний (50x50)": generate_maze(50, 50, 0.3, 20), + "Большой (100x100)": generate_maze(100, 100, 0.3, 30), + "Пустой (50x50)": generate_empty_maze(50, 50), + "Без выхода (50x50)": generate_no_exit_maze(50, 50) + } + os.makedirs("mazes", exist_ok=True) + for name, maze in mazes_data.items(): + filename = f"mazes/{name.replace(' ', '_').replace('(', '').replace(')', '')}.txt" + save_maze_to_file(maze, filename) + print(f"Сохранён {filename}") + strategies = { + "BFS": BFSPathFinding(), + "DFS": DFSPathFinding(), + "A*": AStarPathFinding() + } + results = [] + runs = 5 + fig_mazes, axes_mazes = plt.subplots(len(mazes_data), len(strategies) + 1, figsize=(18, 4 * len(mazes_data))) + if len(mazes_data) == 1: + axes_mazes = [axes_mazes] + for row_idx, (maze_name, maze) in enumerate(mazes_data.items()): + visualize_maze(maze, title=f"{maze_name}", ax=axes_mazes[row_idx][0]) + for col_idx, (strat_name, strategy) in enumerate(strategies.items()): + solver = MazeSolver(maze, strategy) + times = [] + visited_counts = [] + path_lengths = [] + best_path = None + for _ in range(runs): + stats = solver.solve() + times.append(stats.time_ms) + visited_counts.append(stats.visited_count) + path_lengths.append(stats.path_length) + if stats.path: + best_path = stats.path + avg_time = np.mean(times) + avg_visited = np.mean(visited_counts) + avg_path = np.mean(path_lengths) + results.append([maze_name, strat_name, avg_time, avg_visited, avg_path]) + print(f"{maze_name} - {strat_name}: Время={avg_time:.3f}мс, Посещено={avg_visited:.0f}, Длина пути={avg_path:.0f}") + visualize_maze(maze, best_path, f"{maze_name} - {strat_name}", ax=axes_mazes[row_idx][col_idx + 1]) + plt.tight_layout() + plt.savefig('mazes_visualization.png') + plt.close() + with open('results.csv', 'w', newline='', encoding='utf-8-sig') as f: + writer = csv.writer(f) + writer.writerow(["Лабиринт", "Стратегия", "Время_мс", "Посещено", "Длина_пути"]) + writer.writerows(results) + print("\nРезультаты сохранены в results.csv") + return results + +def plot_results(results): + strategies = ["BFS", "DFS", "A*"] + mazes = ["Маленький (10x10)", "Средний (50x50)", "Большой (100x100)", "Пустой (50x50)", "Без выхода (50x50)"] + data = {} + for strat in strategies: + data[strat] = {"times": [], "visited": [], "paths": []} + for row in results: + maze, strat, time_ms, visited, path_len = row + data[strat]["times"].append(time_ms) + data[strat]["visited"].append(visited) + data[strat]["paths"].append(path_len) + + fig, axes = plt.subplots(1, 3, figsize=(18, 6)) + x = np.arange(len(mazes)) + width = 0.25 + colors = {'BFS': 'skyblue', 'DFS': 'lightgreen', 'A*': 'salmon'} + + for i, strat in enumerate(strategies): + offset = (i - 1) * width + times_display = [t if t > 0 else 0.001 for t in data[strat]["times"]] + bars = axes[0].bar(x + offset, times_display, width, label=strat, color=colors[strat]) + for bar, val in zip(bars, data[strat]["times"]): + if val > 0: + axes[0].text(bar.get_x() + bar.get_width() / 2, bar.get_height() * 1.1, + f'{val:.2f}', ha='center', va='bottom', fontsize=8, rotation=90) + axes[0].set_title("Время выполнения (мс)") + axes[0].set_xticks(x) + axes[0].set_xticklabels(mazes, rotation=15, ha='right') + axes[0].set_ylabel("Время (мс)") + axes[0].set_yscale('log') + axes[0].legend() + axes[0].grid(axis='y', alpha=0.3) + + for i, strat in enumerate(strategies): + offset = (i - 1) * width + visited_display = [v if v > 0 else 1 for v in data[strat]["visited"]] + bars = axes[1].bar(x + offset, visited_display, width, label=strat, color=colors[strat]) + for bar, val in zip(bars, data[strat]["visited"]): + if val > 0: + axes[1].text(bar.get_x() + bar.get_width() / 2, bar.get_height() * 1.1, + f'{val:.0f}', ha='center', va='bottom', fontsize=8, rotation=90) + axes[1].set_title("Посещено клеток") + axes[1].set_xticks(x) + axes[1].set_xticklabels(mazes, rotation=15, ha='right') + axes[1].set_ylabel("Количество клеток") + axes[1].set_yscale('log') + axes[1].legend() + axes[1].grid(axis='y', alpha=0.3) + + for i, strat in enumerate(strategies): + offset = (i - 1) * width + paths_display = [p if p > 0 else 1 for p in data[strat]["paths"]] + bars = axes[2].bar(x + offset, paths_display, width, label=strat, color=colors[strat]) + for bar, val in zip(bars, data[strat]["paths"]): + height = bar.get_height() + axes[2].text(bar.get_x() + bar.get_width() / 2, height * 1.1, + f'{val:.0f}', ha='center', va='bottom', fontsize=8, rotation=90) + axes[2].set_title("Длина найденного пути") + axes[2].set_xticks(x) + axes[2].set_xticklabels(mazes, rotation=15, ha='right') + axes[2].set_ylabel("Длина пути") + axes[2].set_yscale('log') + axes[2].legend() + axes[2].grid(axis='y', alpha=0.3) + + plt.tight_layout() + plt.savefig('comparative_results.png') + plt.show() + print("Сравнительные графики сохранены в comparative_results.png") + +if __name__ == "__main__": + print("\nГенерация лабиринтов и запуск экспериментов\n") + results = run_experiments() + print("\nСоздание графиков") + plot_results(results) + print("\nЭксперименты завершены") + print("\nСозданные файлы:") + print(" - 5 текстовых файлов с лабиринтами") + print(" - mazes_visualization.png: Визуализация всех лабиринтов с путями") + print(" - results.csv: Таблица с числовыми результатами") + print(" - comparative_results.png: Сравнительные графики (Время, Посещено, Длина пути)") + print("\nСводка результатов:") + for row in results: + maze, strat, time_ms, visited, path_len = row + print(f"{maze:20s} | {strat:5s} | Время: {time_ms:8.3f}мс | Посещено: {visited:6.0f} | Путь: {path_len:4.0f}") \ No newline at end of file -- 2.43.0 From 979fcfa4521e00ec1bfb00365d3cefd888268b33 Mon Sep 17 00:00:00 2001 From: kalinovskiymi Date: Sun, 24 May 2026 22:17:52 +0000 Subject: [PATCH 24/24] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20?= =?UTF-8?q?=C2=ABkalinovskiymi/docs=5F2/data=5F2=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs_2/data_2/Без_выхода_50x50.txt | 50 +++++++++ .../docs_2/data_2/Большой_100x100.txt | 100 ++++++++++++++++++ .../docs_2/data_2/Маленький_10x10.txt | 10 ++ kalinovskiymi/docs_2/data_2/Пустой_50x50.txt | 50 +++++++++ kalinovskiymi/docs_2/data_2/Средний_50x50.txt | 50 +++++++++ 5 files changed, 260 insertions(+) create mode 100644 kalinovskiymi/docs_2/data_2/Без_выхода_50x50.txt create mode 100644 kalinovskiymi/docs_2/data_2/Большой_100x100.txt create mode 100644 kalinovskiymi/docs_2/data_2/Маленький_10x10.txt create mode 100644 kalinovskiymi/docs_2/data_2/Пустой_50x50.txt create mode 100644 kalinovskiymi/docs_2/data_2/Средний_50x50.txt diff --git a/kalinovskiymi/docs_2/data_2/Без_выхода_50x50.txt b/kalinovskiymi/docs_2/data_2/Без_выхода_50x50.txt new file mode 100644 index 0000000..d557173 --- /dev/null +++ b/kalinovskiymi/docs_2/data_2/Без_выхода_50x50.txt @@ -0,0 +1,50 @@ +################################################## +#S # # ## ### # ### # # # # # +# ## # ### ## # # ## +#### # # ### ## # # # ### +# # # # ## # # ## ## # ### +# ## # ## # # ## ### # # # # ## +# #### # # ## # # ## # ## +# ## # # # # # # # ##### # # +# # # # # # # ### # # # +# # # # ### ## ## ## ### # #### +# # # # ### ## ## # # # # # # # +# ## # # ## # # ## # ## # +# # # # # # # # # # ### ## +# # ## # ## ## ## # # # # # # +## # # # # # # # # # ### +# ### # # # ### ## # # # # +# # # # # ## # # # # # #### # +## # # ## # ##### ## ## # +### # ### # ## # # ## # ## ## +# # # # ## # ### ## ## # ### ### +# # # # # # # # # ## # # # # +# # # # # ## # # # ## # # ### +# #### # # # # # # # # # # # +# ## # # ## ## # ## # # +# # #### # # # ## # ## # +# # # # ## # ### +# # # ### # ## # # # # # ### +# ## # # # # ## ## # # ##### # # ## +## ### # # # ## # # # # # # # # # +## # # # # # # # ## # +# # # # ### # # ### # # # # # +#### ## # ## # # # ## # # ### # # +# # #### ## ## # # ### #### # +# # ## # # # ## # # # ## # # +# ## ## ## # # # ### # ### # # +# # # # # #### # # # # +# # ## # # # # # ## # # ## +# ## # # # # # # # # # +# ### # # ## # # # # ## # ## # +# ## # ### # ### # # # ## ### # ### +# ## ## # ## ### ## # # # # #### # +# # # # ## # #### ## # # +## # # # # # ## ## ## # #### # +# # # # ## # # # # # # +# # # ## # ## # # ## # ## +# # # ## # # # ## # #### # # # ## # ## +## # # # ### ## ## # # # # +# # # # #### # # ## # # ## # # # +# ### ## # ## # # # ## +################################################## diff --git a/kalinovskiymi/docs_2/data_2/Большой_100x100.txt b/kalinovskiymi/docs_2/data_2/Большой_100x100.txt new file mode 100644 index 0000000..e08be03 --- /dev/null +++ b/kalinovskiymi/docs_2/data_2/Большой_100x100.txt @@ -0,0 +1,100 @@ +#################################################################################################### +#S # # # # # # ## ## # # ## # ## # # +# ## # # # ## # # # # # # # # # # # # +# # # # # # ## # # # # # # ## # # ## # # +# # # # # # ## # ### # +# ## # # # # # # ## # # +# # # # # # # # # ### # # +# # # # # # # # # # # # # # +# # # # # # # # # # # ## # ## # # +# # ## # # # # # # # # # # ## +# ## ## # # # # # ## # ## # # # # # # +# # # # # ## # ## # # # # # # # # # # +# # # # # # # # # # # # # # # # # # +# # # ## # # # # # # # ## # # # # # ## +# # # # # # # # # # # +# ## ## # # # # # ## # # # # +## ## # # # # # # # # # +## # # # # # # # # # +# ## # # # # # ## # # +## # # ## # # # # # ## # # +## # # ## ### # # # # # # # # # # # # +# # # # # # # # # # ## # # # +# # # # ## # # # # # # # # # # +# # ## # # # # # # # # +### ## # # ## # ### # # # # # ## +# # ## # # # # # # # # # # +### # # # # # # # # # # # # +# ## # # # # # # # # # +# # # # # # # ## # # # # # # +# ## # # # ## # # # # # ## ## ## # ## ### +# # # # # ### # # # # +# # # # ## # # ## # ## # # # # +# # # # # # # ## # # # # ## ## # ## # # +# # # # # # # # # ## ## # # +# ## # # # # # # # # # # # # # ## +# # # # ## # # # # ## ## ## # # # # # +# # # # # # # # # # # # ## +# # # # # # ## # # # # # +# # ## # # # # # # # # # # # +# # # # # # # # # # ## # # # # ## # # # # +# # # # # # # # # ## # # # # # # # +## # # # # # ## # # # # # # # # # +# # # # # # # # # ## # # # # # ## # +# # # # ## # # # # ## # # # # +# ## # # ### # # # # # # # # +# # ## # # # # # ## # # # # # +# # # ## # # # # # # # ## +# # # # # # # # # # # # ## # # +# # # # # # # # # # # # # ## # # # # # +# # # # # ### # # # # # # # # +### # # # # ## # ## # # # # # # +# # # # ## # # # # # # ## # # +# # # # # ## # # # # +# # # # ## ## # # # # # # # +# # # # # # # # # # # # ## # +# # # # # # # # # # ## # # ## # # ## +# # # # # # # # # # # # # # # # +# # # ## # # # # ## +# # # ## # # # # # # # # ## # # # # # # +## # # # # # # # # # # # # # ## # # # # +### # # ## ### ### # # # # # ### # +# # ## ## # # # # # # # # # # +# # # # # # ## # # # # # # +# # # # # # # # # # # # # # # ## +# # # # # # # # # # # ### # ## # # # +# # # # # # # # ## # # # # # # +# ## # # # # ## # # # # # # # # # # ## +# # # ## # # # # # # # ## # # # # # # +# # # # ## # # # ## # ## # # +# # # # # # # # ### # +# ## # ### # # # # # # ### # # # +# # # ### ## # ## # # ## # # # # +# # # # # # # # # # ## # # # ### # # +# # ## # # # # # # # # # # # +## # # # # # # # # # ## # ## # # # +# # # # # # ## # ## # # # # +# # # # # # # ## # # ### ## ## # # +# # # # # # # # # # # # +## # # # # # # # # # +# # # # # # # # # # # # # ## # +# # # # # # # # # # # # ## # +# # # # # # # ## # # ## # # # # # # # # ## # # +# # ## # # ## # # # # # ## +# ### # # ## # # # # ## # ## # ## ## # # +# # # # # # # ## # # # # # # +# # # # # # # ## # # # ## ### ## # # +# # # # ## # # # # # # # ## # ## +# # ## # # # ## # # # # ## # # # # # # +# # # # # # # # # +# # # # # ## # # ### # ## ## # # # +# # # # # # # # ## # ## # # # # +# # # ## # # ### # # # # ## # # # +# # # # ### # # # # ## # # # +# # # # # # ## # # # ## ## # +# # ### # # ### # # # # # # #### # +# # # # # # ## ## # # # # # +# # # # # # # # ## # # # # # +## # # # # # # # # ### # +# # # # # ## # ## ## # # # # # # E# +#################################################################################################### diff --git a/kalinovskiymi/docs_2/data_2/Маленький_10x10.txt b/kalinovskiymi/docs_2/data_2/Маленький_10x10.txt new file mode 100644 index 0000000..78d02bb --- /dev/null +++ b/kalinovskiymi/docs_2/data_2/Маленький_10x10.txt @@ -0,0 +1,10 @@ +########## +#S # +# # # # +# ## # +# # # +# # # # +# # # # +## # # +# E# +########## diff --git a/kalinovskiymi/docs_2/data_2/Пустой_50x50.txt b/kalinovskiymi/docs_2/data_2/Пустой_50x50.txt new file mode 100644 index 0000000..f35f554 --- /dev/null +++ b/kalinovskiymi/docs_2/data_2/Пустой_50x50.txt @@ -0,0 +1,50 @@ +S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + E diff --git a/kalinovskiymi/docs_2/data_2/Средний_50x50.txt b/kalinovskiymi/docs_2/data_2/Средний_50x50.txt new file mode 100644 index 0000000..1db18dd --- /dev/null +++ b/kalinovskiymi/docs_2/data_2/Средний_50x50.txt @@ -0,0 +1,50 @@ +################################################## +#S # # # # # # # # # # ## # +# # # ### ### # # # # # #### # +# ## # ## ## ####### ### # # # # # # +# # # # # # # # # # # # +## ### # ## # # # ## ### # ## # # +# # # # ## ## # ## # +# ##### # # # # # ### # # +# # # # # ### # # ## ## # +# # # # # # # # # # # # +## # # ## ##### ### # # # # +## ## # ### ### # ## # # # # ### +# # # # ## # # # # ### +# ## ### # # # # #### # # # +# # # ## ### # # # ## # ## +# ## # #### # # # # ## # # +## # # # ### ### # # # # ## # +## # ## # # ## # # +# ## # # # # # # # # # # ## +## # # # # ### ## # +#### # ## # ### # # # # # # +# # ## ## ### # # # # # # ## ### # +# # # #### # # # # ## # ## # +# # ## # # ## ### # # # # +## ### ## ### # # # # +# ### ## # ## # # # # #### +# # # # # #### # # # ## # ## +# # ## ### # # # # ## ## +# # # # # # # # # ###### # # # +# # # # ### ### # ### # # +# # ## ## # # # # #### ## +# # # # # # ### # ## +# # # ##### # # ## # # ## ## # +### # ## # # # # # #### # # +## # ## # # ## ## ## ## # # +# # # ## ## #### ## # # ## # # ## # # # +# # ## # # ## ## # # # #### # # # #### +# # # # # # ## # # # # +# # # # ## # # # # +## # # # ## # # ## # # # # # # # +# # # #### # # # # # +# ## # # # # # # ### # ## # # # +# # ### # ## # # # # #### +# # # # # # # # # # # ## # # +# # ## # # # # # # # # # # # +#### # # # ## ## ## ## # # # # ## # # # # +# # # # # ### # # # ## # +## ## ### # # # ## # # # # # +# ## # # # ## # # # # # E# +################################################## -- 2.43.0