Недавно в Яндекс Картах появились комбинированные маршруты — теперь при планировании поездок на общественном транспорте мы предлагаем вариант маршрута с заказом такси до метро. Функция будет полезна тем, кто основную часть пути проезжает на метро и хочет добраться до станции быстро, без ожидания, дополнительных пересадок и необходимости долго идти пешком.

Меня зовут Антон Овчинкин, я руководитель группы разработки пешеходной и транспортной навигации. Возможно, вы уже читали мой рассказ о том, откуда Карты знают, когда приедет автобус. Сегодня я расскажу, что такое комбинированные маршруты, как они строятся и при чём тут машинное обучение.

Для чего нужны комбинированные маршруты

Большая часть маршрутов в крупных городах, в первую очередь в Москве и Санкт‑Петербурге, включает в себя поездку на метро. Так, в Москве подземкой ежедневно пользуется больше 6 миллионов человек. Это легко объяснить: в метро понятное расписание, минимальные интервалы и нет пробок. Кроме того, многие популярные городские объекты находятся недалеко от станций.

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

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

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

Ближайшая станция не всегда самая подходящая

На первый взгляд задача кажется простой: достаточно найти на карте ближайшую станцию метро и доехать до неё на такси. Но есть сложности.

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

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

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

Сравнение обычного и комбинированного маршрутов из одних и тех же точек А и Б. Экономим 10 минут
Сравнение обычного и комбинированного маршрутов из одних и тех же точек А и Б. Экономим 10 минут

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

Варианты проезда и точки высадки

Когда пользователь строит маршрут из точки А в точку Б, прежде всего нужно понять, какие есть варианты проезда на метро и есть ли они вообще. Для этого наш алгоритм проверяет все станции в радиусе нескольких километров. В нашей структуре данных хранится информация обо всех станциях метро, и алгоритм может быстро найти станции неподалёку. Из них нужно удалить те случаи, когда до метро можно дойти пешком и это будет быстрее, чем ждать такси, — тогда мы не будем предлагать комбинированный маршрут.

Но и это ещё не всё. Дело в том, что у большинства станций метро несколько входов. Поэтому порой довольно сложно определить точку высадки. Рассмотрим несколько примеров.

Представим, что мы определили место высадки из такси как ближайшую к метро точку вдоль автомобильной дороги. Но остановка там может быть запрещена и водитель не сможет высадить пассажира.

У входа в метро не остановиться — здесь висит запрещающий знак
У входа в метро не остановиться — здесь висит запрещающий знак

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

Здесь выйти из такси помешает ограда
Здесь выйти из такси помешает ограда

Третий, самый показательный пример — проекция входа на станцию попадает на дорогу на другом уровне высоты. Такое часто бывает в случае с многоуровневыми развязками, например вблизи станций МЦК.

По карте метро близко, но на деле до станции сложно добраться
По карте метро близко, но на деле до станции сложно добраться

Четвёртая категория — многополосные дороги. Часто водителю приходится делать большой разворот на развязке. При этом пассажиру быстрее и проще выйти у подземного перехода и за пару минут дойти до метро.

Здесь проще построить маршрут через подземный переход
Здесь проще построить маршрут через подземный переход

С учётом того, что специфика определения оптимальных точек высадки довольно сложная, а количество станций метро ограничено, наиболее эффективное решение — полностью ручная разметка данных. Наши картографы определяют, где поставить такие точки у каждой станции. Усилиями наших коллег мы уже разметили более 700 точек в Москве и более 200 — в Санкт‑Петербурге.

На следующем этапе алгоритм строит привычный всем маршрут на общественном транспорте, который начинается с метро. Затем для всех станций нужно выбрать точку высадки: для каждой точки рассчитывается суммарное время на подъезд к ней, добавляется время на проход пешком от точки высадки до входа в метро, а затем — от входа до нужной платформы. Алгоритм предпочтёт точку, для которой сумма минимальна.

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

Факторы выбора лучшего маршрута

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

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

Но что именно может влиять на выбор пользователя? Самое очевидное — суммарное время поездки. Мысль, что поездка на такси — это в первую очередь экономия времени, лежит в основе идеи, над которой мы изначально начинали работать.

Другая важная причина воспользоваться такси — комфорт. Например, так удобнее, если на улице плохая погода, в руках тяжёлые сумки или просто нет настроения идти пешком. Однако в противовес комфорту выступает более важный с точки зрения ранжирования фактор — стоимость поездки. Именно он ограничивает нас от выбора маршрута, ведущего на такси сразу к точке Б.

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

Когда мы определились со всеми факторами, осталось обучить модель. Мы попробовали разные алгоритмы машинного обучения и остановились на том, точность которого составила порядка 60%. Это значит, что в 60% случаев наш алгоритм ранжирования корректно определил, какой именно маршрут понравится пользователю. У нас получился, безусловно, хороший результат, но мы верим, что его можно улучшить.

Немного о будущем

В сентябре мы раскатили возможность строить комбинированные маршруты на всех пользователей Android‑приложения Карт в Москве и Санкт‑Петербурге, а в ноябре всё заработало и на iOS.

Мы уже получили фидбек, что было бы здорово научиться строить маршрут на такси ещё и до железнодорожных станций и МЦД. Другой популярный запрос — предлагать проехать на такси так называемую «последнюю милю» — путь от выхода из метро до точки Б. А некоторые пользователи предложили использовать в маршруте арендные самокаты как альтернативу такси. Какие‑то идеи мы уже взяли в план, а какие‑то собираемся продумать более детально. В любом случае мы следим за результатами работы наших алгоритмов и постоянно работаем над их улучшением.

Комментарии (11)


  1. Suharkov
    20.12.2023 07:15

    Спасибо, идея классная! Даже с учетом того, что цены на услуги такси растут. И задачу вы решили интересную. А вот на один из комментариев в прошлой статье (про автобусы) так и не ответили. Это касалось "фантомных" ТС. Скажите, подобную задачу решить вообще возможно?


  1. vladvul
    20.12.2023 07:15

    пользователь должен иметь возможность настроить "я готов/нет много ходить" "я готов/нет заплатить больше" "мне критично/нет добраться быстро" "минимизировать число пересадок"


  1. DarkWolf13
    20.12.2023 07:15

    а как алгоритм научить использовать неочевидные маршруты по "народным тропам", когда официально построеный маршрут может занимать 20-30 минут, а показанный коллегами, причем без нарушений пдд, и пересечения закрытых территорий, может уменьшить время пешего отрезка до 5-10 минут?


    1. ganzmavag
      20.12.2023 07:15

      Только рисовать всё это на карте. Зависит от активности народных картографов в этом районе. У нас город небольшой и такие тропы обычно указаны.


  1. roman_deev
    20.12.2023 07:15

    Фича может и полезная, но реализация отстой.

    Например, я езжу только на общественном транспорте (ОТ). Выбираю пункт назначения, прокладываю маршрут, среди вариантов вижу хорошее время на ОТ. Открываю, а там первым такси + метро. Нужное мне время на ОТ немного больше. Что ж, спасибо за дополнительный клик.

    Но это ещё не всё.

    Время на такси + метро не учитывает время ожидания такси

    И вот уже такси становится не лучше ОТ


    1. eaa
      20.12.2023 07:15

      Насильно запиханная фича без возможности отключения - шедевр! Отключить электрички или метро в настройках можно, а такси - фиг. Больше денег несите в яндекс-такси, товарищи! Браво! Пора в 2гис переходить походу


    1. AlexEx70
      20.12.2023 07:15

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


      1. eaa
        20.12.2023 07:15

        Хуже, там, где я живу, такси даже когда надо не дождешься вообще, а тут на первом месте маршрут на такси. Жесть.


  1. ganzmavag
    20.12.2023 07:15

    Есть вопрос. У вас сейчас появился тариф "Подождать", когда машина едет к клиенту дольше, но поездка дешевле. Я понимаю почти всю вашу логику ценообразования, кроме этого тарифа. За счёт чего он выходит дешевле? Ведь дальняя подача - наоборот лишние расходы для водителя.


    1. Williams_Wolfram
      20.12.2023 07:15

      Скорее всего какой-то таксист уже выполняет заказ, где конечная точка недалеко от вас и в этом случае, подождав завершение заказа, вы получаете более короткую подачу => дешевле, чем если мы будем искать таксиста на далекую подачу.


      1. ganzmavag
        20.12.2023 07:15

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