Написание алгоритма маршрутизации авиакомпании эффективно - PullRequest
4 голосов
/ 24 июня 2009

Дано:

  • База данных рейсов (город вылета, город прибытия, время вылета, время прибытия).

Вопросы:

  • Какой был бы наиболее эффективный алгоритм листинга услуг между двумя городами, если время отправления неважно? Учтите, что мы хотим минимизировать время простоя (но все же выше номинального минимума, то есть 20 минут) и минимизировать количество остановок (если есть маршрут без остановок, это тривиально, но если нет, поиск маршрутов с одним соединением в течение двух -соединение и т. д. с разумным временем остановки, менее тривиальным).
  • Если это вообще возможно, я не хочу специально обозначать какие-либо аэропорты как хабы, чтобы оставить открытой возможность создания сети маршрутов "точка-точка".
  • Должна быть возможность указать желаемое (приблизительное) время отправления. Это нормально, если у этого есть свой собственный алгоритм, отдельный от первого.

Язык кода для этого проекта еще не выбран (возможно, язык .NET, поскольку быстрые формы пригодятся), поэтому предпочтительны алгоритмы псевдокодов. Я буду следить за последующими вопросами, если добавленная информация может помочь.

Ответы [ 3 ]

4 голосов
/ 24 июня 2009

Dijkstra или A *, где веса являются своего рода штрафом за длительное время ожидания и много остановок.

3 голосов
/ 24 июня 2009

На базе вы будете рассматривать свою городскую сеть в виде дерева, в котором вылетающий город является корневым, а каждый вылетающий рейс - указателем на ребенка. Вы будете выполнять рекурсивный поиск в глубине по дереву, чтобы найти все пути к месту назначения, но при этом проверяете цикл по ходу и прерываете любой путь, который приводит к циклу.

По мере того как вы находите возможные пути, вы можете либо просто оставить кратчайшее, но найденное единственное решение; или оставьте большее подмножество найденных путей, рассортированных по некоторым критериям во времени отправления, если вы хотите выбрать на этой основе.

В зависимости от специфики базы данных и узлов, вы также можете добавить другие правила для сокращения ваших путей поиска, например, если вы знаете, что отправление и пункт назначения находятся на расстоянии 1000 миль, и ваш путь, который отслеживается до сих пор ты пролетел 3000 миль, а тебя все еще нет, прикрути его, иди к следующему поиску пути.

0 голосов
/ 24 июня 2009

После разбивки ответов я пробую алгоритм, основанный на разметке вручную аэропортов, которые «соединяют» аэропорты. Это избавляет от необходимости просматривать сотни аэропортов, которые нигде не могут соединиться (когда вы в последний раз соединялись из Нью-Йорка с Токио через Сидар-Рапидс?). Это покрывает до 2-х слоев, после 2-х слоев я буду использовать алгоритмы специального случая, полный поиск по дереву или отмечу маршрут «не обслуживается» (что делают многие реальные авиакомпании, но для игры это должно быть настраиваемым игроком в любом случае.

Текущая модель выглядит так:

Найти нон-стоп!

  • Существует ли прямой маршрут из аэропорта отправления в аэропорт назначения? Отлично! Вернуть список без остановок (запрашивающий алгоритм может решить, что с ним делать).

Нет непрерывного соединения?

  • Соберите все рейсы из аэропорта отправления в «соединяющие» аэропорты (все хабы и целевые города).
  • Соберите все рейсы, прибывающие в аэропорт назначения из этих «соединяющих» аэропортов (все хабы и целевые города).
  • Создать все возможные пути (Origin-Connection-Destination)
  • Обрезать этот список для всех "возможных" путей (исключить соединения, которые не являются последовательными, исключить все пути с задержками до 20 минут).
  • Сортировать этот список по общему времени в пути (время полета + время ожидания).

Нет единого соединения?

  • Соберите все рейсы из аэропорта отправления в «соединяющие» аэропорты (все хабы и целевые города).
  • Соберите все рейсы, прибывающие в аэропорт назначения из ЛЮБЫХ «соединяющих» аэропортов (все хабы и целевые города).
  • Соберите все рейсы между «соединяющими» аэропортами, в которые летит аэропорт происхождения, и «соединяющими» аэропортами, которые летят в пункт назначения. (Hub-концентраторов)
  • Создание всех возможных путей (Origin-Connection-Connection-Destination)
  • Обрезать этот список для всех "возможных" путей (исключить соединения, которые не являются последовательными, исключить все пути с задержками до 20 минут).
  • Сортировать этот список по общему времени в пути.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...