Дано: клиентская база, содержащая адреса доставки первичных бухгалтерских документов, которые нужно ежемесячно развозить поездом-самолетом-курьером. Клиенты — все организации, работающие на территории Самарской области.

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

Как распределить адреса доставки, чтобы не гонять курьера с одной части города до другой? Нужно сгруппировать адреса по районам!

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

Варианты решения: 

1. Вомьмем выборку самых крупных клиентов с адресами и загрузим данные о них на gooogle-карту. Визуально сгруппируем адреса по районам и составим путевые листы. Недостаткок метода: трудоемкость — каждый раз приходится загружать на карту большое количество адресов, и вручную определять район (вернее, зону доставки).

2. Каждый адрес содержит в себе индекс почтового отделения. Предположим, что каждый адрес можно пропустить через сервис определения района города (например, dadata.ru) и записать результат в отдельном атрибуте клиентской базы («район») для каждого контрагента. Тогда путевой лист можно составлять по выбранному району. Недостаток метода: через сервис нужнопропустить каждый из адресов (как правило, это стоит денег). Далее каждый новый адрес так же необходимо будет соотностить с районом (это дополнительная операция, требующая времени).

3. Предположим, что можно определить район города с помощью сопоставления адреса с почтовым отделением. Выделим из каждого адреса почтовый индекс, и сопоставим его с районом почтового отделения. Назовем этот метод «Группировкой с производной».

Подготовительная работа — найти адреса почтовых отделений в Самаре. Воспользуемся поиском «почтовые отделения Самары» переходим на сайт naitiko.ru/companies/pochta_rossii/samara содержащий список отделений с адресами в одной таблице. Для каждого почтового отделения определяем район города (спасибо dadata.ru). Дальше — дело техники: сопоставляем почтовый индекс каждого контрагента с индексом почтового отделения. Используя функцию Excel «ВПР», получаем район города для каждого клиента.

Деление на районы доставки

PS
В процесс определения районов узнал, что почтовое отделение 443006 обслуживает только один дом — тот, в котором оно находится. Но это не обычный дом. Это здание правительства Самарской области («Белый дом») по адресу Молодогвардейская 210.

3 адреса почтовых отделений dadata не смог правильно распознать. Это стало понятно после сравнения исходного почтового индекса в адресе отделения с индексом, определенным dadata. Вот эти адреса:
443072 г. Самара Московское шоссе д.13/43 (в 2ГИС указывается так: Московское шоссе 18 км, 13)
443085 г. Самара Центральная улица д.11 (в 2ГИС адрес указывается так: Центральная (Совхоз Кряж), 11)
443961 г. Самара Льва Толстого — д.135 (в этом здании располагается Самарский МСЦ — магистральный сортировочный центр — то есть не обычное почтовое отделение; при этом само здание, в котором находятся и другие организации, относится к почтовому отделению 443030). В адресах организаций этот индекс фигурировать не будет.

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


  1. SuharkovMP
    27.05.2024 10:57
    +3

    Вы ошиблись в 3-м предложении.

    Дано: клиентская база, содержащая адреса доставки первичных бухгалтерских документов, которые нужно ежемесячно развозить поездом-самолетом-курьером. Клиенты — все организации, работающие на территории Самарской области.

    Необходимо прорекламировать сервис определения районов города, да ещё в короткий срок.


    1. gorlanovnn Автор
      27.05.2024 10:57

      ) Нет, на момент написания статьи стояла именно задача доставки документов, никакой сервис не использовался


  1. DvoiNic
    27.05.2024 10:57
    +1

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

    ну и замечание по тэгам - все-таки на MapsAPI это не тянет...


    1. gorlanovnn Автор
      27.05.2024 10:57

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


  1. konst90
    27.05.2024 10:57
    +1

    да ещё в короткий срок

    сегодня курьер едет в Куйбышевский район, завтра в Промышленный, а послезавтра — в Красноглинский

    Как-то не сходится.

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


    1. DvoiNic
      27.05.2024 10:57

      в таком виде задача разбиения на "группы, каждую из которых можно объехать за день" следует за (в смысле, после) "постоением оптимального маршрута".


    1. gorlanovnn Автор
      27.05.2024 10:57

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

      Добавил картинку в статью.


  1. brodroid
    27.05.2024 10:57
    +1

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


    1. gorlanovnn Автор
      27.05.2024 10:57

      Спасибо за комментарий! Цель статьи: показать как можно решить задачу без использования дополнительного продукта. Так что энтропия не увеличилась )