Алгоритм схематизации (metro) карт
Это длинный выстрел, но я подумал, что могу попробовать, прежде чем начать грязную работу.
У меня есть проект для создания приложения, которое для определенных входных станций (вершин) и линий (ребер), то есть реальной карты некоторого общественного транспорта, схематизирует данную карту в карту метро. Я провел некоторые исследования по этой проблеме, и это NP-полная проблема, эквивалентная проблеме 3-SAT. У меня также есть некоторые теоретические идеи о том, как создать такую карту, но они не достаточно подробно.
то, что я ищу,-это любое другое существующее решение этой проблемы, какой-то псевдокод, какой-то реальный код в (почти) любом другом языке программирования и т. д., Все, что уменьшит время, которое мне нужно потратить на работу над самим алгоритмом, что взамен даст мне больше времени для работы над другими аспектами приложения.
Если кто-нибудь видел что-нибудь, что может мне помочь, я буду вам очень признателен.
4 ответов
Если вы google для "Metro Map layout problem" и "metro map line crossing" вы найдете много ссылок, так как он был исследован очень активно в последние 10 лет.
проблема не кажется тривиальной вообще, и перевод "художественных" функций в математические ограничения, по-видимому, является одной из самых сложных задач.
во всяком случае, вот три публикации, которые я нашел интересными для начала (среди многих, многих других):
Макет Карты Метро С Использованием Многокритериальной Оптимизации
минимизация пересечения линий на картах метро
Проблема Компоновки Карты Метро
HTH!
исследования, похожие на вашу тему:http://graphics.stanford.edu/papers/routemaps/
Это просто какое - то предложение с маханием рукой-возьмите с щепоткой соли.
мое представление о карте" метро " - это карта, где линии имеют тенденцию к одному из восьми кардинальных направлений, а станции регулярно разнесены.
Я предполагаю, что вы пытаетесь преобразовать набор реальных координат в координаты "метро".
Я бы начал с вашего основного маршрута (например, городского цикла), а затем постепенно добавить другие маршруты в порядке важности.
для каждого маршрута вы хотите найти ближайшее приближение, которое использует наименьшее количество прямых, движущихся в восьми направлениях. Вы можете сделать это, начав с ограничивающей рамки для реальных координат, разбив ее на сетку, затем найдя маршрут "метро" от квадрата сетки до квадрата сетки, затем последовательно уточняя этот маршрут, чтобы уменьшить количество изгибов без искажения карты слишком много и без введения пересечений с другими маршрутами, если вообще вероятный.
сделав это, масштабируйте каждую линию так, чтобы последовательные станции были на одинаковом расстоянии друг от друга в представлении "метро".
Я предполагаю, что вы все равно захотите поддержать ручную настройку результата.
удачи!
похоже на проблему планирования. Похоже, ваши жесткие ограничения:
каждая станция должна быть на точке. Точки находятся на сетке с расстоянием X между точками (я бы сделал это статическим на 2 см)
не должно быть 2 станций на одном месте
должно быть достаточно места, чтобы нарисовать метку станции. Обратите внимание, что метке могут быть присвоены различные направления от точки, до которой находится станция назначенный.
должно быть достаточно места, чтобы нарисовать линии метро.
похоже, что ваши мягкие ограничения:
- для каждой станции минимизируйте фактическое географическое расстояние до точки, назначенной станции.
затем бросьте на него что-то вроде Drools Planner, вот пример жестких и мягких ограничений для медсестры rostering.