From 268c4cf4a147860623ec0801b4a2a7755d63a962 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Thu, 16 Oct 2025 11:22:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=B0=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab3/csv_to_tex.py | 15 +-- lab3/expirements.py | 12 +- lab3/report/report.tex | 257 ++++++++++++----------------------------- 3 files changed, 85 insertions(+), 199 deletions(-) diff --git a/lab3/csv_to_tex.py b/lab3/csv_to_tex.py index 8d19df8..1427185 100644 --- a/lab3/csv_to_tex.py +++ b/lab3/csv_to_tex.py @@ -49,7 +49,7 @@ def parse_csv_file(csv_path: str) -> tuple[str, list[list[str]]]: data_rows = [] for line in data_lines: parts = line.split(",") - if len(parts) >= 6: # Pc + 5 значений Pm + if len(parts) >= 2: # Pc + как минимум одно значение Pm data_rows.append(parts) return header, data_rows @@ -113,7 +113,7 @@ def find_best_time(data_rows: list[list[str]]) -> float | None: min_time = None for row in data_rows: - for i in range(1, min(6, len(row))): # Пропускаем первую колонку (Pc) + for i in range(1, len(row)): # Пропускаем первую колонку (Pc) time_value = extract_time_value(row[i]) if time_value is not None: if min_time is None or time_value < min_time: @@ -135,7 +135,7 @@ def find_best_fitness(data_rows: list[list[str]]) -> float | None: min_fitness = None for row in data_rows: - for i in range(1, min(6, len(row))): # Пропускаем первую колонку (Pc) + for i in range(1, len(row)): # Пропускаем первую колонку (Pc) fitness_value = extract_fitness_value(row[i]) if fitness_value is not None: if min_fitness is None or fitness_value < min_fitness: @@ -229,12 +229,13 @@ def generate_latex_table(n: str, header: str, data_rows: list[list[str]]) -> str # Извлекаем заголовки колонок из header header_parts = header.split(",") pm_values = header_parts[1:] # Пропускаем "Pc \ Pm" + num_pm_columns = len(pm_values) # Динамически определяем количество колонок latex_code = f""" \\begin{{table}}[h!] \\centering \\small \\caption{{Результаты для $N = {n}$}} - \\begin{{tabularx}}{{\\linewidth}}{{l *{{5}}{{Y}}}} + \\begin{{tabularx}}{{\\linewidth}}{{l *{{{num_pm_columns}}}{{Y}}}} \\toprule $\\mathbf{{P_c \\;\\backslash\\; P_m}}$""" @@ -250,12 +251,12 @@ def generate_latex_table(n: str, header: str, data_rows: list[list[str]]) -> str latex_code += f" \\textbf{{{pc_value}}}" # Добавляем значения для каждого Pm - for i in range(1, min(6, len(row))): # Максимум 5 колонок Pm + for i in range(1, min(num_pm_columns + 1, len(row))): value = format_value(row[i], best_time, best_fitness) latex_code += f" & {value}" - # Заполняем недостающие колонки если их меньше 5 - for i in range(len(row) - 1, 5): + # Заполняем недостающие колонки если их меньше чем num_pm_columns + for i in range(len(row) - 1, num_pm_columns): latex_code += " & —" latex_code += " \\\\\n" diff --git a/lab3/expirements.py b/lab3/expirements.py index 7824636..4b69403 100644 --- a/lab3/expirements.py +++ b/lab3/expirements.py @@ -42,13 +42,13 @@ def build_fitness_function(cities): BASE_DIR = "experiments" # Параметры для экспериментов -POPULATION_SIZES = [10, 50, 100, 500] -PC_VALUES = [0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 1.0] # вероятности кроссинговера -PM_VALUES = [0.05, 0.2, 0.3, 0.4, 0.5, 0.8] # вероятности мутации +POPULATION_SIZES = [10, 25, 50, 100] +PC_VALUES = [0.5, 0.6, 0.7, 0.8, 0.9] # вероятности кроссинговера +PM_VALUES = [0.2, 0.3, 0.4, 0.5, 0.8] # вероятности мутации SAVE_AVG_BEST_FITNESS = True # Количество запусков для усреднения результатов -NUM_RUNS = 1 +NUM_RUNS = 3 # Базовые параметры (как в main.py) BASE_CONFIG = { @@ -149,10 +149,10 @@ def run_experiments_for_population(pop_size: int) -> PrettyTable: # Форматируем результат: среднее_время±стд_отклонение (среднее_поколения±стд_отклонение) # cell_value = f"{avg_time:.1f}±{std_time:.1f} ({avg_generations:.1f}±{std_generations:.1f})" - cell_value = f"{avg_time:.1f} ({avg_generations:.0f})" + cell_value = f"{avg_time:.0f} ({avg_generations:.0f})" if SAVE_AVG_BEST_FITNESS: - cell_value += f" {avg_best_fitness:.5f}" + cell_value += f" {avg_best_fitness:.0f}" if avg_generations == BASE_CONFIG["max_generations"]: cell_value = "—" diff --git a/lab3/report/report.tex b/lab3/report/report.tex index 30b2c39..b7efffb 100644 --- a/lab3/report/report.tex +++ b/lab3/report/report.tex @@ -512,10 +512,6 @@ \end{figure} - \newpage - \phantom{text} - \newpage - \phantom{text} \newpage \phantom{text} @@ -526,115 +522,18 @@ Для исследования были выбраны следующие значения параметров: \begin{itemize} - \item $N = 10, 25, 50, 100$ -- размер популяции. - \item $p_c = 0.3, 0.4, 0.5, 0.6, 0.7, 0.8$ -- вероятность кроссинговера. - \item $p_m = 0.001, 0.01, 0.05, 0.1, 0.2$ -- вероятность мутации. + \item $N = 10, 50, 100, 500$ -- размер популяции. + \item $p_c = 0.5, 0.6, 0.7, 0.8, 0.9$ -- вероятность кроссинговера. + \item $p_m = 0.05, 0.2, 0.3, 0.4, 0.5, 0.8$ -- вероятность мутации. + \item $3$ -- количество "элитных" особей, переносимых без изменения в следующее поколение. + \item Partially mapped crossover - кроссовер. + \item Inversion mutation - мутация + \item 7000 - пороговое значение фитнеса для остановки алгоритма. \end{itemize} - Измерения были проведены для двух критериев остановки: - \begin{itemize} - \item Лучшее значение фитнеса не изменялось 10 поколений. - \item Лучшее значение фитнеса достигло заданного значения $0.005$. - \end{itemize} - - \subsubsection*{Результаты для первого критерия остановки} - - Результаты измерений представлены в таблицах \ref{tab:pc_pm_results_10}--\ref{tab:pc_pm_results_100}. В ячейках указано время в миллисекундах нахождения минимума функции. В скобках указано количество поколений, за которое было найдено решение. Во второй строке указано усреднённое по всем запускам лучшее значение фитнеса. Если в ячейке стоит прочерк, то это означает, что решение не было найдено за 200 поколений. Лучшее значение по времени выполнения и по значению фитнеса для каждого размера популяции выделено цветом и жирным шрифтом. + Результаты измерений представлены в таблицах \ref{tab:pc_pm_results_10}--\ref{tab:pc_pm_results_500}. В ячейках указано время в миллисекундах нахождения минимума функции. В скобках указано количество поколений, за которое было найдено решение. Во второй строке указано усреднённое по всем запускам лучшее значение фитнеса. Если в ячейке стоит прочерк, то это означает, что решение не было найдено за 2500 поколений. Лучшее значение по времени выполнения и по значению фитнеса для каждого размера популяции выделено цветом и жирным шрифтом. \newcolumntype{Y}{>{\centering\arraybackslash}X} - % Автоматически сгенерированные LaTeX таблицы -% Лучший результат по времени и по фитнесу выделены жирным отдельно -% Убедитесь, что подключен \usepackage{tabularx} -% ВНИМАНИЕ: Убедитесь, что подключен \usepackage{xcolor} для цветового выделения -% Используйте \newcolumntype{Y}{>{\centering\arraybackslash}X} перед таблицами - -\begin{table}[h!] - \centering - \small - \caption{Результаты для $N = 10$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} - \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ - \midrule - \textbf{0.3} & 1.3 (13) 0.36281 & 1.7 (18) 7.55685 & 1.2 (13) 1.55537 & \textcolor{magenta}{\textbf{1.0 (11)}} 1.78411 & 9.4 (87) 0.04271 \\ - \textbf{0.4} & 1.3 (14) 0.03913 & 1.6 (17) 0.02868 & 1.3 (13) 0.36232 & 2.1 (20) 0.10641 & — \\ - \textbf{0.5} & 1.4 (15) 0.87081 & 1.7 (18) 1.71634 & 2.3 (21) 0.10401 & 3.4 (25) 0.00461 & — \\ - \textbf{0.6} & 2.8 (19) 0.06375 & 1.8 (13) 0.72202 & 2.9 (22) 0.01473 & 3.4 (25) 0.01162 & 29.4 (184) \textcolor{magenta}{\textbf{0.00033}} \\ - \textbf{0.7} & 1.5 (15) 1.25409 & 2.3 (22) 8.67464 & 1.9 (18) 0.13319 & 8.6 (66) 0.00078 & 8.9 (48) 0.11136 \\ - \textbf{0.8} & 1.9 (15) 3.10415 & 1.4 (13) 1.09275 & 2.1 (19) 0.43094 & 6.4 (54) 0.00191 & — \\ - \bottomrule - \end{tabularx} - \label{tab:pc_pm_results_10} -\end{table} - - -\begin{table}[h!] - \centering - \small - \caption{Результаты для $N = 25$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} - \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ - \midrule - \textbf{0.3} & 3.0 (18) 0.16836 & \textcolor{magenta}{\textbf{2.2 (13)}} 0.04190 & 4.7 (27) 0.00544 & — & — \\ - \textbf{0.4} & 4.1 (24) 0.00808 & 4.6 (26) 0.01101 & 5.8 (31) 0.02330 & 3.8 (19) 0.05414 & — \\ - \textbf{0.5} & 3.1 (17) 0.05259 & 5.0 (26) 0.47018 & 27.8 (138) \textcolor{magenta}{\textbf{0.00024}} & 14.5 (67) 0.00312 & — \\ - \textbf{0.6} & 6.1 (31) 0.01033 & 6.8 (34) 0.00148 & — & — & — \\ - \textbf{0.7} & 4.1 (21) 0.00107 & 3.2 (16) 0.32522 & — & — & — \\ - \textbf{0.8} & 23.9 (109) 0.00352 & 15.8 (72) 0.11662 & 28.3 (123) 0.00038 & — & — \\ - \bottomrule - \end{tabularx} - \label{tab:pc_pm_results_25} -\end{table} - - -\begin{table}[h!] - \centering - \small - \caption{Результаты для $N = 50$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} - \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ - \midrule - \textbf{0.3} & 14.9 (51) 0.05874 & 19.3 (59) \textcolor{magenta}{\textbf{0.00003}} & 36.7 (113) 0.00190 & — & — \\ - \textbf{0.4} & 12.5 (40) 0.01955 & \textcolor{magenta}{\textbf{5.6 (18)}} 0.00022 & — & — & — \\ - \textbf{0.5} & 65.0 (195) 0.04790 & 26.4 (78) 0.01673 & — & — & — \\ - \textbf{0.6} & 16.4 (47) 0.00329 & 18.5 (50) 0.00065 & — & — & — \\ - \textbf{0.7} & 51.0 (137) 0.00120 & 59.3 (158) 0.00010 & — & — & — \\ - \textbf{0.8} & 48.8 (126) 0.01393 & 67.6 (172) 0.00650 & — & — & — \\ - \bottomrule - \end{tabularx} - \label{tab:pc_pm_results_50} -\end{table} - - -\begin{table}[h!] - \centering - \small - \caption{Результаты для $N = 100$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} - \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ - \midrule - \textbf{0.3} & 24.2 (44) 0.00110 & 17.9 (32) 0.00113 & \textcolor{magenta}{\textbf{17.6 (29)}} 0.00193 & — & — \\ - \textbf{0.4} & 30.7 (51) 0.00173 & — & — & — & — \\ - \textbf{0.5} & 27.4 (43) 0.00016 & — & — & — & — \\ - \textbf{0.6} & 20.4 (31) 0.00115 & 129.8 (186) 0.00025 & — & — & — \\ - \textbf{0.7} & 115.4 (162) 0.00002 & — & — & — & — \\ - \textbf{0.8} & 106.5 (143) \textcolor{magenta}{\textbf{0.00001}} & — & — & — & — \\ - \bottomrule - \end{tabularx} - \label{tab:pc_pm_results_100} -\end{table} - - \newpage - \phantom{text} - \newpage - \subsubsection*{Результаты для второго критерия остановки} - -Результаты измерений представлены в таблицах \ref{tab:1_pc_pm_results_10}--\ref{tab:1_pc_pm_results_100}. - - % Автоматически сгенерированные LaTeX таблицы % Лучший результат по времени и по фитнесу выделены жирным отдельно % Убедитесь, что подключен \usepackage{tabularx} @@ -645,39 +544,19 @@ \centering \small \caption{Результаты для $N = 10$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} + \begin{tabularx}{\linewidth}{l *{6}{Y}} \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ + $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.050} & \textbf{0.200} & \textbf{0.300} & \textbf{0.400} & \textbf{0.500} & \textbf{0.800} \\ \midrule - \textbf{0.3} & — & — & — & 15.6 (155) 0.00063 & 7.8 (69) 0.00409 \\ - \textbf{0.4} & — & — & — & 8.9 (81) \textcolor{magenta}{\textbf{0.00038}} & \textcolor{magenta}{\textbf{4.6 (40)}} 0.00317 \\ - \textbf{0.5} & — & — & 8.7 (85) 0.00199 & — & 16.5 (140) 0.00453 \\ - \textbf{0.6} & — & — & — & 8.9 (77) 0.00310 & 14.3 (117) 0.00082 \\ - \textbf{0.7} & — & — & 8.2 (70) 0.00089 & 5.6 (49) 0.00431 & 7.1 (58) 0.00047 \\ - \textbf{0.8} & — & 19.7 (180) 0.00397 & — & 5.0 (42) 0.00494 & 5.5 (44) 0.00357 \\ + \textbf{0.5} & — & — & 674.4 (1783) 6943.28027 & 715.1 (1856) 6925.47290 & — & 225.5 (567) 6984.75016 \\ + \textbf{0.6} & — & — & 550.6 (1427) 6899.82219 & 649.4 (1653) 6897.01699 & — & — \\ + \textbf{0.7} & — & — & 476.7 (1216) 6796.98342 & 287.4 (724) 6977.43028 & \textcolor{magenta}{\textbf{201.0 (503)}} 6794.32839 & — \\ + \textbf{0.8} & — & — & — & 767.2 (1852) 6810.96744 & 253.3 (623) 6905.36866 & — \\ + \textbf{0.9} & — & — & — & — & — & — \\ + \textbf{1.0} & — & 750.9 (1847) 6988.52746 & 415.7 (1016) 6897.99266 & 465.7 (1126) \textcolor{magenta}{\textbf{6762.96572}} & 275.9 (662) 6997.70453 & — \\ \bottomrule \end{tabularx} - \label{tab:1_pc_pm_results_10} -\end{table} - - -\begin{table}[h!] - \centering - \small - \caption{Результаты для $N = 25$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} - \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ - \midrule - \textbf{0.3} & 1.1 (7) 0.00277 & 30.0 (173) \textcolor{magenta}{\textbf{0.00059}} & — & 2.2 (12) 0.00191 & 30.2 (139) 0.00200 \\ - \textbf{0.4} & 1.8 (10) 0.00384 & — & 12.2 (63) 0.00164 & 6.6 (33) 0.00354 & 18.5 (82) 0.00224 \\ - \textbf{0.5} & — & — & 12.5 (58) 0.00233 & 2.3 (11) 0.00196 & 17.1 (73) 0.00116 \\ - \textbf{0.6} & — & 30.9 (151) 0.00265 & 36.7 (175) 0.00146 & 10.0 (46) 0.00449 & 5.7 (23) 0.00281 \\ - \textbf{0.7} & 1.1 (6) 0.00472 & — & 0.8 (4) 0.00233 & 3.9 (17) 0.00112 & \textcolor{magenta}{\textbf{0.3 (2)}} 0.00371 \\ - \textbf{0.8} & — & — & 10.3 (43) 0.00137 & 7.7 (32) 0.00379 & 10.5 (41) 0.00155 \\ - \bottomrule - \end{tabularx} - \label{tab:1_pc_pm_results_25} + \label{tab:pc_pm_results_10} \end{table} @@ -685,19 +564,19 @@ \centering \small \caption{Результаты для $N = 50$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} + \begin{tabularx}{\linewidth}{l *{6}{Y}} \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ + $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.050} & \textbf{0.200} & \textbf{0.300} & \textbf{0.400} & \textbf{0.500} & \textbf{0.800} \\ \midrule - \textbf{0.3} & 3.7 (12) 0.00354 & 3.4 (9) 0.00075 & 23.7 (73) 0.00467 & 4.9 (14) 0.00043 & 2.1 (6) 0.00029 \\ - \textbf{0.4} & 3.6 (12) 0.00270 & 4.2 (13) 0.00061 & 9.2 (25) 0.00251 & 18.2 (51) 0.00490 & 6.6 (16) 0.00063 \\ - \textbf{0.5} & 4.0 (10) 0.00099 & 48.8 (141) 0.00324 & 3.8 (11) 0.00087 & 14.7 (39) \textcolor{magenta}{\textbf{0.00017}} & 1.2 (3) 0.00115 \\ - \textbf{0.6} & 1.6 (5) 0.00070 & 51.6 (139) 0.00217 & 4.7 (13) 0.00294 & 2.6 (7) 0.00397 & 11.5 (27) 0.00053 \\ - \textbf{0.7} & — & — & 2.6 (7) 0.00144 & 3.5 (9) 0.00182 & \textcolor{magenta}{\textbf{1.1 (3)}} 0.00072 \\ - \textbf{0.8} & 4.1 (11) 0.00240 & 3.5 (8) 0.00380 & 2.5 (6) 0.00422 & 2.7 (7) 0.00126 & 4.3 (10) 0.00060 \\ + \textbf{0.5} & 1711.4 (1083) 6927.73356 & — & 1642.7 (1015) 6894.10066 & 1355.6 (809) 6938.12550 & — & 936.3 (544) 6925.57274 \\ + \textbf{0.6} & 1338.4 (828) 6952.02461 & 889.1 (552) 6951.40489 & 1142.5 (687) 6963.17379 & 1446.9 (864) 6992.95281 & — & 2646.2 (1509) 6932.85788 \\ + \textbf{0.7} & 1860.8 (1146) 6996.63686 & — & 2387.8 (1378) 6999.00110 & — & \textcolor{magenta}{\textbf{809.9 (474)}} 6965.83938 & 1614.7 (918) 6990.50067 \\ + \textbf{0.8} & — & — & 1244.4 (713) \textcolor{magenta}{\textbf{6704.60011}} & 1500.5 (859) 6970.42362 & 1013.5 (581) 6998.68282 & — \\ + \textbf{0.9} & — & — & — & — & — & — \\ + \textbf{1.0} & — & 891.6 (503) 6952.80522 & — & — & 1489.6 (824) 6735.40661 & 3685.9 (1978) 6989.21247 \\ \bottomrule \end{tabularx} - \label{tab:1_pc_pm_results_50} + \label{tab:pc_pm_results_50} \end{table} @@ -705,21 +584,43 @@ \centering \small \caption{Результаты для $N = 100$} - \begin{tabularx}{\linewidth}{l *{5}{Y}} + \begin{tabularx}{\linewidth}{l *{6}{Y}} \toprule - $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.001} & \textbf{0.010} & \textbf{0.050} & \textbf{0.100} & \textbf{0.200} \\ + $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.050} & \textbf{0.200} & \textbf{0.300} & \textbf{0.400} & \textbf{0.500} & \textbf{0.800} \\ \midrule - \textbf{0.3} & 9.3 (17) 0.00451 & 6.0 (11) 0.00344 & 10.0 (17) 0.00343 & 5.3 (8) 0.00046 & 9.8 (14) 0.00412 \\ - \textbf{0.4} & 5.7 (9) \textcolor{magenta}{\textbf{0.00005}} & 8.4 (14) 0.00108 & 3.5 (6) 0.00254 & 4.0 (6) 0.00186 & 6.5 (9) 0.00283 \\ - \textbf{0.5} & 3.8 (6) 0.00019 & 4.9 (8) 0.00103 & 3.6 (6) 0.00260 & 11.1 (16) 0.00204 & 7.5 (10) 0.00374 \\ - \textbf{0.6} & — & 6.5 (10) 0.00107 & 3.6 (5) 0.00079 & \textcolor{magenta}{\textbf{0.9 (2)}} 0.00324 & 10.1 (13) 0.00044 \\ - \textbf{0.7} & 1.7 (3) 0.00106 & 6.6 (10) 0.00489 & 4.1 (6) 0.00031 & 12.4 (16) 0.00240 & 4.8 (6) 0.00276 \\ - \textbf{0.8} & 5.0 (7) 0.00387 & 58.4 (77) 0.00453 & 7.8 (10) 0.00259 & 11.2 (13) 0.00210 & 6.1 (7) 0.00493 \\ + \textbf{0.5} & 1342.3 (441) 6988.26353 & 1467.7 (459) 6958.81642 & 4041.3 (1269) \textcolor{magenta}{\textbf{6839.94363}} & — & — & 3635.1 (1046) 6966.14098 \\ + \textbf{0.6} & 2460.6 (763) 6872.20321 & \textcolor{magenta}{\textbf{1316.5 (409)}} 6861.65860 & — & 2310.7 (691) 6912.50054 & 2220.9 (663) 6907.57533 & — \\ + \textbf{0.7} & — & 1934.1 (591) 6933.87982 & — & 1966.0 (587) 6943.09435 & 2872.9 (840) 6998.39699 & — \\ + \textbf{0.8} & 3227.9 (969) 6990.28735 & 1754.4 (523) 6996.67018 & — & 2152.8 (621) 6988.30495 & 8057.2 (2236) 6899.21400 & — \\ + \textbf{0.9} & — & — & 3794.4 (1079) 6963.79199 & 2549.3 (721) 6975.22091 & 4469.6 (1249) 6945.46938 & 8919.4 (2375) 6858.03529 \\ + \textbf{1.0} & 4164.4 (1215) 6927.53288 & — & — & — & 3618.7 (1019) 6898.56773 & — \\ \bottomrule \end{tabularx} - \label{tab:1_pc_pm_results_100} + \label{tab:pc_pm_results_100} \end{table} + +\begin{table}[h!] + \centering + \small + \caption{Результаты для $N = 500$} + \begin{tabularx}{\linewidth}{l *{6}{Y}} + \toprule + $\mathbf{P_c \;\backslash\; P_m}$ & \textbf{0.050} & \textbf{0.200} & \textbf{0.300} & \textbf{0.400} & \textbf{0.500} & \textbf{0.800} \\ + \midrule + \textbf{0.5} & 11709.8 (782) 6994.15844 & \textcolor{magenta}{\textbf{5232.3 (341)}} 6957.38204 & 10676.9 (674) 6980.66167 & 6849.7 (430) 6782.99526 & — & 13051.6 (775) 6880.72481 \\ + \textbf{0.6} & 7193.3 (461) 6960.64487 & — & — & 14856.5 (866) 6941.77959 & 12944.9 (776) 6958.57319 & 19051.6 (1102) 6951.30787 \\ + \textbf{0.7} & 18611.7 (1150) 6810.96744 & 23286.9 (1413) 6895.65139 & — & 14141.6 (830) 6976.37927 & — & — \\ + \textbf{0.8} & 25456.0 (1556) 6962.40902 & — & 20592.3 (1223) 6998.71555 & — & — & 38979.2 (2097) 6842.54074 \\ + \textbf{0.9} & 14260.1 (825) 6967.60134 & 26692.6 (1551) 6922.32909 & — & — & 29235.4 (1644) \textcolor{magenta}{\textbf{6667.02991}} & 41352.0 (2252) 6765.87009 \\ + \textbf{1.0} & 34026.1 (1996) 6953.24255 & — & — & — & — & — \\ + \bottomrule + \end{tabularx} + \label{tab:pc_pm_results_500} +\end{table} + + + \newpage \phantom{text} @@ -728,58 +629,42 @@ \newpage \phantom{text} \subsection{Анализ результатов} - - \subsubsection*{Обоснование применения двух критериев остановки} - - В исследовании использовались два различных критерия остановки алгоритма, поскольку критерий по количеству поколений (отсутствие улучшения в течение 10 поколений) не всегда обеспечивал достижение достаточно хороших значений фитнеса, особенно для малых популяций. Это делало некорректным сравнение эффективности различных комбинаций параметров только по времени выполнения. Введение второго критерия (достижение фитнеса 0.005) позволило получить более объективную оценку скорости нахождении качественных решений. - \subsubsection*{Первый критерий остановки (отсутствие улучшения в течение 10 поколений)} + Наилучшее найденное решение составило \textbf{6667.03} при параметрах $N=500$, $P_c=0.9$, $P_m=0.5$ за 1644 поколения. Это всего на \textbf{0.12\%} хуже оптимального значения 6659, что демонстрирует высокую эффективность алгоритма. Наихудшие результаты показала конфигурация с $N=10$, $P_c=0.7$, $P_m=0.3$ (лучший фитнес 6796.98), что на 2.07\% хуже оптимума. Малый размер популяции в 10 особей оказался недостаточным для стабильного поиска качественных решений — более половины конфигураций при $N=10$ вообще не нашли решение за 2500 поколений. - При использовании первого критерия остановки наблюдаются следующие закономерности: + Наиболее быстрая конфигурация — $N=10$, $P_c=0.7$, $P_m=0.5$ — нашла решение за \textbf{201 мс} (503 поколения). Однако качество решения при таких параметрах нестабильно. Среди конфигураций с большой популяцией лучшее время показала $N=500$, $P_c=0.5$, $P_m=0.2$ — \textbf{5232 мс} (341 поколение), что является оптимальным балансом скорости и качества для больших популяций. - \begin{itemize} - \item \textbf{Малые популяции ($N=10$):} Оптимальный баланс достигается при умеренных значениях параметров. Лучший результат по времени показывает комбинация $p_c=0.3$, $p_m=0.1$ (1.0 мс, 11 поколений), однако лучшее значение фитнеса достигается при $p_c=0.6$, $p_m=0.2$ (0.00033). Качество решений существенно варьируется. - - \item \textbf{Средние популяции ($N=25$):} Демонстрируют высокую эффективность при низких значениях мутации. Минимальное время выполнения достигается при $p_c=0.3$, $p_m=0.01$ (2.2 мс, 13 поколений), а наилучший фитнес — при $p_c=0.5$, $p_m=0.05$ (0.00024). - - \item \textbf{Большие популяции ($N=50, 100$):} Характеризуются критической чувствительностью к высоким значениям мутации и демонстрируют заметное улучшение качества фитнеса. Для $N=50$ лучшие результаты при $p_c=0.4$, $p_m=0.01$ (5.6 мс по времени) и $p_c=0.3$, $p_m=0.01$ (фитнес 0.00003). Для $N=100$ работают только комбинации с очень низкой мутацией, но обеспечивают отличное качество (фитнес до 0.00001). - - \item \textbf{Проблема сходимости:} С увеличением размера популяции значительно возрастает количество комбинаций параметров, не обеспечивающих сходимость за 200 поколений, особенно при $p_m \geq 0.05$. - \end{itemize} + С ростом размера популяции наблюдается явное улучшение качества решений: при $N=10$ лучший результат 6762.97, при $N=500$ — 6667.03. Одновременно количество необходимых поколений снижается (с 503 до 341), но общее время выполнения растет линейно из-за увеличения числа особей в каждом поколении. Этот эффект объясняется тем, что большая популяция обеспечивает большее генетическое разнообразие, позволяя алгоритму быстрее находить оптимальные решения. - \subsubsection*{Второй критерий остановки (достижение фитнеса 0.005)} + Что касается вероятности кроссовера, средние значения $P_c=0.6$--$0.8$ показывают стабильные результаты для всех размеров популяций. Экстремальные значения ($P_c=0.9$ или $1.0$) работают хорошо только при больших популяциях ($N \geq 100$), при малых — часто приводят к преждевременной сходимости (наблюдается много прочерков в таблицах). Это связано с тем, что высокая вероятность кроссовера при малой популяции быстро приводит к гомогенизации генофонда. - Использование фиксированного порога фитнеса демонстрирует принципиально иную картину и подтверждает правильность введения альтернативного критерия: - - \begin{itemize} - \item \textbf{Инверсия требований к мутации:} В отличие от первого критерия, здесь малые популяции требуют более высоких значений мутации для достижения целевого фитнеса. Для $N=10$ большинство комбинаций с $p_m \leq 0.01$ вообще не достигают порога, что подтверждает проблему качества при первом критерии. - - \item \textbf{Лучшие результаты больших популяций:} Популяции $N=50$ и $N=100$ показывают отличные результаты — достижение высокого качества за минимальное время: $N=50$ при $p_c=0.7$, $p_m=0.2$ (1.1 мс, 3 поколения) и $N=100$ при $p_c=0.6$, $p_m=0.1$ (0.9 мс, 2 поколения). - \end{itemize} + Анализ влияния вероятности мутации показал, что низкие значения $P_m=0.05$ неэффективны для малых популяций — недостаточно разнообразия для выхода из локальных минимумов. Умеренные значения $P_m=0.2$--$0.5$ демонстрируют лучшие результаты, обеспечивая баланс между эксплуатацией найденных решений и исследованием нового пространства поиска. Высокое значение $P_m=0.8$ часто приводит к расхождению алгоритма, так как слишком сильные изменения разрушают хорошие решения быстрее, чем алгоритм успевает их найти (многие конфигурации не нашли решение за отведенное время). \newpage \section{Ответ на контрольный вопрос} - \textbf{Вопрос}: Опишите понятие «оптимизационная задача». + \textbf{Вопрос}: Тур в порядковом представлении, используемые кроссинговеры. - \textbf{Ответ}: Оптимизационная задача — это математическая задача, в которой требуется найти такие значения переменных, при которых некоторая функция, называемая целевой, принимает наибольшее или наименьшее значение. При этом искомые значения должны удовлетворять определённым условиям или ограничениям, задающим допустимую область решений. Цель оптимизации заключается в выборе наилучшего варианта среди множества возможных с точки зрения заданного критерия эффективности. + \textbf{Ответ}: Тур представляется списком из $N$ позиций; $i$-й элемент равен индексу города в текущем упорядоченном списке доступных городов. Например, при опорном списке $C=(1\;2\;3\;4\;5\;6\;7\;8\;9)$ тур $1\!\to\!2\!\to\!4\!\to\!3\!\to\!8\!\to\!5\!\to\!9\!\to\!6\!\to\!7$ кодируется как $l=(1\;1\;2\;1\;4\;1\;3\;1\;1)$, последовательно «выбирая» элементы из $C$. - Такие задачи широко применяются в науке, технике, экономике и управлении для рационального распределения ресурсов, минимизации затрат или максимизации прибыли. В зависимости от формы целевой функции и ограничений оптимизационные задачи могут быть линейными, нелинейными, дискретными или непрерывными. Их решение позволяет принимать обоснованные решения и повышать эффективность различных процессов и систем. + Для порядкового представления корректность потомков обеспечивает классический одноточечный кроссовер: любые два родителя, разрезанные в одной позиции и склеенные, порождают допустимых потомков (поскольку выбор «по индексу» в оставшемся списке городов остаётся корректным). \newpage \section*{Заключение} \addcontentsline{toc}{section}{Заключение} - В ходе второй лабораторной работы была успешно решена задача оптимизации функции Axis parallel hyper-ellipsoid function с использованием генетических алгоритмов: + В ходе третьей лабораторной работы была успешно решена задача коммивояжера с использованием генетических алгоритмов для 38 городов Джибути: \begin{enumerate} - \item Изучен теоретический материал о real-coded генетических алгоритмах и различных операторах кроссинговера и мутации; - \item Создана программная библиотека на языке Python с реализацией арифметического и геометрического кроссоверов, случайной мутации и селекции методом рулетки; - \item Проведено исследование влияния параметров ГА на эффективность поиска для популяций размером 10, 25, 50 и 100 особей; + \item Изучен теоретический материал о представлениях туров (соседское, порядковое, путевое) и специализированных операторах кроссинговера и мутации для задачи коммивояжера; + \item Создана программная библиотека на языке Python с реализацией путевого представления хромосом, операторов PMX, OX и CX для кроссинговера, операторов swap, inversion и insertion для мутации, а также селекции методом рулетки с поддержкой элитизма; + \item Проведено исследование влияния параметров генетического алгоритма на качество и скорость нахождения решения для популяций размером 10, 50, 100 и 500 особей с различными значениями вероятностей кроссинговера и мутации; + \item Получено решение с длиной маршрута 6667.03, отклоняющееся от оптимального значения 6659 всего на 0.12\%. \end{enumerate} + \newpage \section*{Список литературы} \addcontentsline{toc}{section}{Список литературы}