Как мы восстанавливали расписание автобусов

zq0qcbx7jnixdqezvc2pwx3doqs.jpeg

Как на всех нормальных рынках, билеты на автобусы уже пару лет как продаются онлайн. Не обязательно стоять в очереди в кассу автовокзала, чтобы получить квиток. По России до 60% маршрутов (в лучшие дни, оценка несколько размыта с учётом «серых» рейсов) можно купить онлайн. В том числе у нас, Туту.

Первое, что мы захотели, — это вынести расписание тоже в онлайн и сделать так, чтобы можно было за пару кликов купить себе билет. Мы такие задачи привыкли решать и как-то собаку съели на железнодорожных перевозках. Автобусы на первый взгляд не выглядели сильно сложными. Всего-то делов — договориться с системами автоматизации автовокзалов, выгрузить по API их рейсы и немного причесать.

Лёгкая работа, говорили они. Проект на пару дней, говорили они.

Наши заблуждения:
1. Все автовокзалы в стране автоматизированы.
2. Ладно, большинство автоматизировано.
3. Учёт в тетрадке больше нигде не ведётся.
4. Ладно, но всегда есть какой-то способ узнать расписание удалённо.
5. Те, которые автоматизированы, одинаково показывают один и тот же маршрут.
6. Ладно, хотя бы те, которые автоматизированы одной и той же системой, одинаково показывают один и тот же маршрут.
7. Ладно, где автоматизации нет, хотя бы есть расписание.
8. Ну должно же быть расписание, ведь без него только нелегальные перевозки!
9. Нелегальных перевозок мало.
10. Ладно, их меньше 10% рынка.
11. Билет можно купить сразу туда и обратно.
12. Не бывает маршрутов в один конец.
13. Ну хотя бы автобусы-то возвращаются назад! Когда-то…
14. Не может за год 300 автобусов уехать в другой город и не вернуться.
15. Остановки имеют разные уникальные названия.
16. Не будет проблем с остановкой с названием «Поворот» или «Заправка».
17. Остановки в пределах региона имеют разные названия.
18. Не будет проблем с остановкой с названием «Трасса».
19. Остановки в пределах города имеют разные названия.
20. У остановки может быть только одно название.
21. Ладно, не больше пяти названий-алиасов.
22. Эти алиасы тоже достаточно уникальны.
23. Во всяком случае, у остановок в официальных документах есть координаты.
24. Ладно, остановка, по крайней мере, указывается с городом/областью.
25. Когда есть расписание по остановке, то известно, откуда прибыл и куда отправится автобус.
26. Ладно, это всегда можно узнать по документам.
27. Чёрт побери, хотя бы есть расписание конкретной остановки!
28. Маршрут город А — город Б — это от центра до центра.
29. Ладно, он хотя бы ведёт в город Б.
30. Ладно, он хотя бы когда-то вёл в город Б.
31. Автобусы не могут брать и исчезать посреди маршрута.
32. Один рейс в одно конкретное время = один автобус.
33. Автобус не может двигаться быстрее 120 километров в час.
34. Центр города — это понятная точка.
35. Ладно, это хотя бы главный автовокзал.
36. Ладно, это хотя бы какая-то автостанция.
37. Ладно, это, по крайней мере, на территории города.
38. Не может такого быть, что расписание одно, а ответ системы вокзала по конкретному рейсу другой.
39. Если можно купить билет туда, то по приезде можно будет купить обратный.
40. Билеты туда и обратно стоят одинаково.
41. Ладно, они не могут отличаться по цене в два раза.

Это основное. Каждый день мы дополняем этот список новыми мелочами. Теперь давайте расскажу чуть подробнее. Сначала — про основу основ, официальные рейсы.

Что такое «серый рейс»?


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

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

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

И самое весёлое: если на железных дорогах и в авиа нет нелегальных перевозок, то рынок автобусов ещё во многом «серый». Я говорю про «остановку у столба близ автовокзала», чтобы набрать ещё пассажиров, и про маршрутки на сервисах попутчиков, например.

Если проводник вагона поезда наберёт со станции пассажиров за наличные и посадит их в своё купе — это, конечно, серая перевозка. Но сам по себе рейс не «серый». А в автобусных перевозках важен маршрут и расписание. Если вы берёте свой автобус и везёте куда-то в нём пассажиров, то это либо заказной коммерческий разовый рейс (фрахтование автобуса, что-то вроде чартера, где заранее известен список пассажиров), либо некоммерческая перевозка (автобусы до торговых центров или автобусы до офисов от метро).

Набрали друзей в «Газель» и повезли до дачи — не имеете права продавать билеты. Или платите штраф около 200 тысяч рублей с юрлица-перевозчика.

«Серый» рейс — это либо что-то, что выглядит как заказной, но им не является (незаконная продажа билетов), либо же просто никак не документированная поездка с пассажирами, которая по логике должна быть бесплатной, но на деле водитель собирает деньги за билеты и не выдаёт никаких подтверждающих документов.

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

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

Что такое «покупка билета онлайн»?


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

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

Три крупнейших игрока по автоматизации в России — это Е-трафик, КВЦ и Авибус. Они автоматизируют автовокзал и позволяют раскрыть API для агрегаторов, если автовокзал или перевозчик не против. Через их системы можно достучаться к билетам автовокзала или перевозчика. Например, Автобусы Большой Страны предоставляет нам напрямую доступ к своим маршрутам — так строится работа напрямую с крупнейшими игроками. А вот с теми ИП, кто купил автобус в 80-х и ездит, так не выйдет. Или есть перевозчики, которые 40 лет хорошо работали без вашего интернета и не понимают, зачем он вообще нужен. При любых попытках собрать их всех в одну ассоциацию (напомню, это десятки тысяч юрлиц и ИП) они все дружно и искренне недоумевают, зачем это нужно.

С мелкими перевозчиками конкретно мы работаем через агрегатор, который собирает их рейсы на уровне автовокзалов отправления.

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

Теперь кровь и слёзы


Системы автоматизации, даже самые крупные, работают очень локально. То есть автоматизируют город, в лучшем случае регион. Потом по возможности идут в соседние.
Поэтому все системы используют очень простую (или совсем не используют) структуру геоданных. Такого параметра у остановки, как координаты, может не быть совсем, район/область/край тоже чаще всего отсутствуют.

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

В итоге нам пришлось писать собственную геобазу с правильной структурой и набором данных. В качестве основы взяли OpenStreetMap.

Геообъекты из интегрируемых систем уже сравниваются с геообъектами из основной базы и пытаются к ним привязаться. В интегрируемых системах очень много остановок типа «Трасса», «Поворот» и т. д., которые, по сути, часть маршрута. Названия вроде Александровка, Михайловка и пр. — это всегда сюрприз, потому что таких сёл в России десятки и даже сотни.

Но мы ж математики! Решение: приладить движок, который будет строить гипотезу о том, куда автобус успеет попасть между уже известными (привязанными) пунктами своего маршрута — в какую из Михайловок? Может оказаться, что ни в какую. Кстати, это значит, что либо там спряталась неучтённая, либо это была Михайловка 20 лет назад, либо что-то ещё. Надо позвонить и спросить у местных.

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

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

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

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

Ещё надо склеивать рейсы. Потому что в разных системах один и тот же рейс тоже может учитываться по-разному. И даже уходить в немного отличающееся время. В результате в расписание может попасть четыре рейса в 20:00, например. Нам пришлось писать механику чего-то вроде перцептивного кэша — сравнения рейсов из разных систем на основе 4‒5 параметров. Примерно похожая схема понадобилась для сцепки рейсов А — Б — В — иногда это один фактический рейс, но два в информационных системах.

Изменения расписания


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

Что получилось


Сейчас у нас есть возможность показать пользователям информацию о рейсах и возможность купить билет на автобус где-то на 40‒50% автобусных рейсов, которые ездят по России. В 50‒60% пользователи не находят никакой информации о доступных рейсах (хотя они на самом деле ходят, и нам пишут, что они ходят). Поэтому мы решили пойти по пути того, чтобы закрыть хотя бы базовую потребность в информации, параллельно расширяя ассортимент для покупки билетов.

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

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

© Geektimes