From 0c55d4912a35dfdc37ca7f2c7409d653e4b1c27a Mon Sep 17 00:00:00 2001 From: maksim Date: Sun, 2 Jun 2024 21:58:30 +0400 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B1=D0=B5=D1=81=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=86=D0=B8=D0=BA=D0=BB=20=D0=B8=20=D1=81=D0=B5?= =?UTF-8?q?=D0=B9=D0=B2=D0=BB=D1=8E=20=D1=8D=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- genetic_algorithm/data_ga.json | 240 ------------------------- genetic_algorithm/genetic_algorithm.py | 47 +++-- router_class.py | 20 +-- 3 files changed, 31 insertions(+), 276 deletions(-) delete mode 100644 genetic_algorithm/data_ga.json diff --git a/genetic_algorithm/data_ga.json b/genetic_algorithm/data_ga.json deleted file mode 100644 index 0141687..0000000 --- a/genetic_algorithm/data_ga.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "from": "Барнаул, Михайловка, BAX", - "to": "Анапа, Витязево, AAQ", - "countBusiness": 2, - "countEconomic": 2, - "departureDate": "2024-06-14", - "returnDate": "2024-09-04", - "flights": [ - { - "id": 61, - "departurePoint": "Казань, Казань, KZN", - "destinationPoint": "Санкт-Петербург, Пулково, LED", - "destinationTime": "2024-08-20T13:07:00", - "departureTime": "2024-08-20T10:24:00", - "distance": 1220.6400474973418, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 62, - "departurePoint": "Иркутск, Иркутск, IKT", - "destinationPoint": "Братск, Братск, BTK", - "destinationTime": "2024-07-11T10:28:00", - "departureTime": "2024-07-11T09:23:00", - "distance": 487.9816774502034, - "countEconomic": 120, - "countBusiness": 20 - }, - { - "id": 63, - "departurePoint": "Краснодар, Пашковский, KRR", - "destinationPoint": "Махачкала, Уйташ, MCX", - "destinationTime": "2024-08-13T00:14:00", - "departureTime": "2024-08-12T22:38:00", - "distance": 722.9657315613899, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 64, - "departurePoint": "Нарьян-Мар, Нарьян-Мар, NNM", - "destinationPoint": "Ульяновск, Баратаевка, ULY", - "destinationTime": "2024-08-26T13:27:00", - "departureTime": "2024-08-26T09:06:00", - "distance": 1507.5398828540344, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 65, - "departurePoint": "Сургут, Сургут, SGC", - "destinationPoint": "Оренбург, Оренбург, REN", - "destinationTime": "2024-06-26T19:15:00", - "departureTime": "2024-06-26T15:52:00", - "distance": 1519.299200422927, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 66, - "departurePoint": "Махачкала, Уйташ, MCX", - "destinationPoint": "Норильск, Алыкель, NSK", - "destinationTime": "2024-07-21T06:10:00", - "departureTime": "2024-07-20T17:56:00", - "distance": 3703.9000546114958, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 67, - "departurePoint": "Барнаул, Михайловка, BAX", - "destinationPoint": "Белгород, им. В.Г. Шухова, EGO", - "destinationTime": "2024-06-14T10:24:00", - "departureTime": "2024-06-14T07:14:00", - "distance": 3228.5554208976832, - "countEconomic": 120, - "countBusiness": 20 - }, - { - "id": 68, - "departurePoint": "Краснодар, Пашковский, KRR", - "destinationPoint": "Норильск, Алыкель, NSK", - "destinationTime": "2024-09-09T11:24:00", - "departureTime": "2024-09-08T22:57:00", - "distance": 3801.082681475355, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 69, - "departurePoint": "Нижний Новгород, Стригино, GOJ", - "destinationPoint": "Казань, Казань, KZN", - "destinationTime": "2024-06-18T12:06:00", - "departureTime": "2024-06-18T11:19:00", - "distance": 349.6277459879821, - "countEconomic": 120, - "countBusiness": 20 - }, - { - "id": 70, - "departurePoint": "Благовещенск, Игнатьево, BQS", - "destinationPoint": "Набережные Челны, Бегишево, NBC", - "destinationTime": "2024-07-22T18:59:00", - "departureTime": "2024-07-22T13:44:00", - "distance": 5063.878359107013, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 71, - "departurePoint": "Иркутск, Иркутск, IKT", - "destinationPoint": "Барнаул, Михайловка, BAX", - "destinationTime": "2024-06-15T09:29:00", - "departureTime": "2024-06-15T07:21:00", - "distance": 1407.5882508285608, - "countEconomic": 120, - "countBusiness": 20 - }, - { - "id": 1, - "departurePoint": "Ноябрьск, Ноябрьск, NOJ", - "destinationPoint": "Челябинск, Баландино, CEK", - "destinationTime": "2024-09-16T06:17:00", - "departureTime": "2024-09-16T03:42:00", - "distance": 1160.5033298370313, - "countEconomic": 65, - "countBusiness": 10 - }, - { - "id": 5, - "departurePoint": "Москва, Внуково, VKO", - "destinationPoint": "Ростов-на-Дону, Платов, ROV", - "destinationTime": "2024-09-12T18:07:00", - "departureTime": "2024-09-12T16:05:00", - "distance": 918.091611352077, - "countEconomic": 74, - "countBusiness": 11 - }, - { - "id": 3, - "departurePoint": "Владивосток, Кневичи, VVO", - "destinationPoint": "Барнаул, Михайловка, BAX", - "destinationTime": "2024-08-15T16:18:00", - "departureTime": "2024-08-15T11:01:00", - "distance": 3730.5081332082163, - "countEconomic": 79, - "countBusiness": 12 - }, - { - "id": 4, - "departurePoint": "Петрозаводск, Бесовец, PES", - "destinationPoint": "Сургут, Сургут, SGC", - "destinationTime": "2024-09-01T11:50:00", - "departureTime": "2024-09-01T05:13:00", - "distance": 2077.379976088868, - "countEconomic": 169, - "countBusiness": 18 - }, - { - "id": 53, - "departurePoint": "Уфа, Уфа, UFA", - "destinationPoint": "Москва, Домодедово, DME", - "destinationTime": "2024-09-20T09:46:00", - "departureTime": "2024-09-20T09:12:00", - "distance": 1151.602690782937, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 54, - "departurePoint": "Нижний Новгород, Стригино, GOJ", - "destinationPoint": "Красноярск, Емельяново, KJA", - "destinationTime": "2024-08-04T23:35:00", - "departureTime": "2024-08-04T12:53:00", - "distance": 3015.7580421346734, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 55, - "departurePoint": "Краснодар, Пашковский, KRR", - "destinationPoint": "Омск, Центральный, OMS", - "destinationTime": "2024-07-28T19:22:00", - "departureTime": "2024-07-28T10:27:00", - "distance": 2659.8366524460557, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 56, - "departurePoint": "Полярный, Полярный, PYJ", - "destinationPoint": "Благовещенск, Игнатьево, BQS", - "destinationTime": "2024-09-04T06:44:00", - "departureTime": "2024-09-04T02:21:00", - "distance": 1974.1571330162965, - "countEconomic": 120, - "countBusiness": 20 - }, - { - "id": 57, - "departurePoint": "Братск, Братск, BTK", - "destinationPoint": "Тюмень, Рощино, THX", - "destinationTime": "2024-07-21T18:08:00", - "departureTime": "2024-07-21T16:12:00", - "distance": 2219.622819604269, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 58, - "departurePoint": "Белгород, им. В.Г. Шухова, EGO", - "destinationPoint": "Анапа, Витязево, AAQ", - "destinationTime": "2024-08-15T13:44:00", - "departureTime": "2024-08-15T12:20:00", - "distance": 629.2506997536557, - "countEconomic": 120, - "countBusiness": 20 - }, - { - "id": 59, - "departurePoint": "Белгород, им. В.Г. Шухова, EGO", - "destinationPoint": "Казань, Казань, KZN", - "destinationTime": "2024-08-24T22:45:00", - "departureTime": "2024-08-24T20:30:00", - "distance": 1009.1424941120106, - "countEconomic": 265, - "countBusiness": 36 - }, - { - "id": 60, - "departurePoint": "Москва, Внуково, VKO", - "destinationPoint": "Нижний Новгород, Стригино, GOJ", - "destinationTime": "2024-09-04T19:53:00", - "departureTime": "2024-09-04T18:58:00", - "distance": 413.0044473319829, - "countEconomic": 120, - "countBusiness": 20 - } - ] -} \ No newline at end of file diff --git a/genetic_algorithm/genetic_algorithm.py b/genetic_algorithm/genetic_algorithm.py index d8a60ed..cbe5c56 100644 --- a/genetic_algorithm/genetic_algorithm.py +++ b/genetic_algorithm/genetic_algorithm.py @@ -4,8 +4,6 @@ import random from typing import Dict, List from fastapi import FastAPI, HTTPException, Request -app = FastAPI() - def load_graph_from_request(request) -> Dict[str, Dict[str, List]]: graph = {} @@ -35,8 +33,12 @@ def load_graph_from_request(request) -> Dict[str, Dict[str, List]]: # Функция для вычисления длины и времени пути с учетом минимального интервала времени def path_length_and_time(path, graph): length = 0 + if path[0] not in graph or path[1] not in graph[path[0]]: + return float('inf'), None, None + start_time = graph[path[0]][path[1]][1] end_time = start_time + for i in range(len(path) - 1): if path[i] not in graph or path[i + 1] not in graph[path[i]]: return float('inf'), start_time, end_time @@ -48,29 +50,35 @@ def path_length_and_time(path, graph): return length, start_time, end_time # Функция для генерации начальной популяции -def generate_population(size, start, end, graph): +def generate_population(size, start, end, graph, max_attempts=100): population = [] - for _ in range(size): - path = [start] - while path[-1] != end: - if path[-1] not in graph or not graph[path[-1]]: - break - next_node = random.choice(list(graph[path[-1]].keys())) - if next_node not in path: + for i in range(size): + attempts = 0 + while attempts < max_attempts: + path = [start] + visited = set(path) + while path[-1] != end: + if path[-1] not in graph or not graph[path[-1]]: + break + next_node = random.choice(list(graph[path[-1]].keys())) + if next_node in visited: + break path.append(next_node) - if path[-1] == end: - population.append(path) - if not population: - raise ValueError("Не удалось сгенерировать начальную популяцию с валидными путями.") + visited.add(next_node) + # Если длина пути превышает количество узлов в графе, выйти из цикла + if len(path) > len(graph): + break + if path[-1] == end: + population.append(path) + break + attempts += 1 return population # Функция для селекции родителей def select_parents(population, graph): sorted_population = sorted(population, key=lambda p: path_length_and_time(p, graph)[0]) - parents = sorted_population[:len(sorted_population) // 2] - if not parents: - raise ValueError("Популяция не содержит валидных путей для селекции родителей.") - return parents + return sorted_population[:len(sorted_population) // 2] + # Функция для скрещивания (кроссинговера) def crossover(parent1, parent2): @@ -81,6 +89,7 @@ def crossover(parent1, parent2): child.append(gene) return child + # Функция для мутации def mutate(child): if len(child) <= 2: @@ -90,11 +99,11 @@ def mutate(child): child[index1], child[index2] = child[index2], child[index1] return child + # Главная функция генетического алгоритма def genetic_algorithm(start, end, graph, population_size=100, generations=100): population = generate_population(population_size, start, end, graph) for generation in range(generations): - print(f"Поколение {generation + 1}: {len(population)} путей") parents = select_parents(population, graph) new_population = parents[:] while len(new_population) < population_size: diff --git a/router_class.py b/router_class.py index 9e9f925..3c715ba 100644 --- a/router_class.py +++ b/router_class.py @@ -17,23 +17,9 @@ router = APIRouter( @router.post("/get_flight/") async def get_flight(request: TripRequest): - try: - graph, start_point, end_point = load_graph_from_request(request) - best_path, best_length, start_time, end_time = genetic_algorithm(start_point, end_point, graph) - return { - "best_path": best_path, - "best_length": best_length, - "start_time": start_time.isoformat(), - "end_time": end_time.isoformat() - } - except ValueError as e: - # Возвращаем значения по умолчанию - return { - "best_path": [], - "best_length": 0, - "start_time": None, - "end_time": None - } + graph, start_point, end_point = load_graph_from_request(request) + best_path, best_length, start_time, end_time = genetic_algorithm(start_point, end_point, graph) + return best_path, best_length, start_time, end_time @router.get("/negative") async def get_class_names() -> List[str]: