|
Сортировка списка на основе неполных данных | ☑ | ||
---|---|---|---|---|
0
ildary
12.08.14
✎
14:06
|
Уважаемые специалисты, подскажите пожалуйста по каким ключевым словам лучше погуглить вот такую задачу:
Дан список контрагентов, необходимо его расположить в правильном порядке для доставки, при этом у нас нет строго порядка для этого списка, но есть предыдущие доставки, из которых надо извлечь этот порядок, например вот так (слева исходные список, справа - результат): А -> А В -> Б Б -> В а получено это, потому что ранее мы запомнили предыдующую поездку: А Д Б В Очень не хочется изобретать велосипед, наверняка умные люди уже решали эту задачу и описали теоретическое решение. |
|||
1
Килограмм
12.08.14
✎
14:09
|
Это задача с собеседования?
|
|||
2
ildary
12.08.14
✎
14:10
|
(1) нет, потребовалось прикрутить в ТиС порядок поездок.
|
|||
3
ildary
12.08.14
✎
14:12
|
+(2) возможно это очень простая задача, но хочется решить её по готовой науке а не собирать шишки с помощью самопридуманной системы.
|
|||
4
Molinor
12.08.14
✎
14:13
|
А если есть две предыдущие поездки
1. А Д Б В 2. А Д В Б Что делать? Или клиент новый и в предыдущих поездках не фигурировал, куда его девать? |
|||
5
HeroShima
12.08.14
✎
14:14
|
(3) Но свои мысли на этот счет есть?
|
|||
6
ildary
12.08.14
✎
14:18
|
(4) новый клиент будет выведен отдельно (как и клиенты, ранее не замеченные в сортировке). После этого (или перед этим) логист руками поместит его в нужное место, внутри документа будет установлен флаг "Отсортировано" и в будущем порядок из этого документа будет использоваться для последующих упорядочений. Для начала документы с правильной сортировкой упорядчены логистом вручную (по данным водителей).
(5) мысли есть - исходные данные дробятся на пары (кто за кем), у пар будет вычисляться количество повторений (чтобы более частые пары имели преимущество), после чего делается перебор иходного несортированного списка с присвоением порядкового номера. |
|||
7
HeroShima
12.08.14
✎
14:36
|
Лучше, наверно, вести обновляемую и дополняемую единую карту упорядоченности.
|
|||
8
Михаил Козлов
12.08.14
✎
15:00
|
Не уверен, что прав, но попробую.
На основании предыдущих перевозок определим ориентированный граф, в котором вершинами будут пункты доставки (контрагенты) + сама контора. Дуги могут идти между контрагентами и от конторы к контрагентам. Вес дуги - частота соответствующего развоза. Если есть список контрагентов, то, дополнив его конторой получаем из этого графа подграф. Задача состоит с том, чтобы в этом подграфе выбрать цикл максимального веса. Эта задача очень похожа на задачу коммивояжера. В теории это NP-трудная задача, но можно попробовать "жадный" алгоритм: выбирать следующим вершину максимального веса. (7) Единая карта может оказаться не всегда "правильной": пример построить несложно, но лень. |
|||
9
ildary
12.08.14
✎
15:04
|
(8) прошу прощения, но ИМХО это не совсем задача коммивояжера - в ней нет расстояний (только порядок) и стоит задача на основании известного порядка составить текущий вариант последовательности с учетом транзитивности. Если я не прав - прошу прощения.
|
|||
10
HeroShima
12.08.14
✎
15:06
|
(8) Зато она не такая громоздкая.
|
|||
11
Михаил Козлов
12.08.14
✎
15:15
|
(9) Я так понял, что не на основании известного порядка, а с учетом статистики предыдущих развозов.
По поводу коммивояжера: на практике, вряд ли в развозе будет больше 10 точек, а в этом случае и переборные алгоритмы не страшны. |
|||
12
ildary
12.08.14
✎
15:19
|
(11) известный порядок - это предыдущие отсортированные развозы (сначала вручную). Значит только коммивояжер?
|
|||
13
HeroShima
12.08.14
✎
15:19
|
(11) При сборе статистики будет более 10-ти точек.
|
|||
14
Михаил Козлов
12.08.14
✎
15:24
|
(12) Подозреваю, что задача в постановке (8) эквивалента коммивояжеру (т.е. сводятся друг к другу).
(13) Речь о числе точек в развозе. Я плохо себе представляю машину, которая идет более чем по 10 адресам. |
|||
15
Соло
12.08.14
✎
15:27
|
сама по себе задача не имеет однозначного решения, т.к. при разном "весе" доставки до контрагента, при одном и том же списке оптимальный путь будет различный, особенно если речь идет о тяжелых грузах и учитывать нужно тоннокилометры и километры.
|
|||
16
Соло
12.08.14
✎
15:37
|
(12) опираться на уже извесный порядок не совсем разумно. Например: контрагенты А и В находстся в одном здании, но никогда не были в одной отправке вместе, но при этом часто встречались пути контора -> А -> С и контора -> С -> В.
Опираясь на историю программа выдаст путь А-С-В, что в корне неверно. |
|||
17
Михаил Козлов
12.08.14
✎
15:38
|
(15) Речь не о содержательном смысле задачи, а о ее математической постановке.
|
|||
18
HeroShima
12.08.14
✎
15:44
|
(14) В исторических данных может быть связь через отсутствующих в текущем списке контрагентов.
|
|||
19
Михаил Козлов
12.08.14
✎
15:46
|
(18) Значит в подграфе этих связей не будет (как я понял ехать-то к ним нельзя).
|
|||
20
Соло
12.08.14
✎
15:46
|
(17) ну так как определиться с параметрами "оптимальности" маршрута? Для "матаматики" и нужен критерий оптимальности.
|
|||
21
HeroShima
12.08.14
✎
15:48
|
(19) Тогда получается совсем оторванная от реальности ерунда.
|
|||
22
ildary
12.08.14
✎
15:50
|
Хочу обратить внимание уважаемых специалистов, что все Ваши замечания о неполном решении задачи (при неполных входных данных) - верны, но лучше получить 3/4 решенной задачи, чем не решать её совсем. Неправильные (или неполные) результаты будут вручную откорректированы задним числом. Почему так: часть грузов поставляется своим автопарком и для них проблема "в каком порядке везти" - не существует, большая часть маршрутов привычна. Но регулярно приходится часть грузов развозить внешними водителями (по обьявлению), которые нужные нам адреса не знают и в случае неупорядоченного маршрута - ездят как попало, требуя почасовую оплату. Вот для них пригодится хоть какая сортировка.
|
|||
23
acsent
12.08.14
✎
15:54
|
Задача комивояжера в чистом виде. Наличие истории только усложняет поиск пути
|
|||
24
Михаил Козлов
12.08.14
✎
16:00
|
(23)+ Вроде как и API есть для поиска кратчайшего пути (с учетом пробок).
|
|||
25
Garykom
гуру
12.08.14
✎
16:05
|
(23) нифига не задача коммивояжера (особенно в чистом виде)
потому что нету заранее точек доставки )) с расстояниями )) есть только последовательности старые, причем не факт что верные а если например всегда из А ездили в В и потом в Г, и из Г ездили в Б, но это Б находится рядом с А и что? Вместо А Б В Г будем ехать А В Г Б ? |
|||
26
HeroShima
12.08.14
✎
16:06
|
Хоть задача и связана с маршрутами, но речь идёт о сортировке по образцу, а не оптимизации маршрута. Частное решение: комивояжер для статистики связей между ближайшими узлами.
|
|||
27
acsent
12.08.14
✎
16:08
|
(25) как это нет точек с расстояниями? или это не поездка клиентам последовательно?
|
|||
28
Garykom
гуру
12.08.14
✎
16:09
|
(0) вообщем уходите от этих пар и последовательностей к маршрутам, по адресам...
Т.е. вам пофиг на контрагента, главное же адрес, ну и забейте в табличку маршруты удобные. Для построения маршрутов нужны координаты точек на карте и время пути между ними, это можно по статистике накопить... |
|||
29
Garykom
гуру
12.08.14
✎
16:09
|
(27) а так нету не сказано в (0) про расстояния
|
|||
30
Garykom
гуру
12.08.14
✎
16:10
|
(29) про это и речь что без расстояний никак, только пар контрагентов для построения оптимального маршрута не хватит...
|
|||
31
HeroShima
12.08.14
✎
16:11
|
(29) тут расстояние = 1/частота
|
|||
32
HeroShima
12.08.14
✎
16:11
|
(30) +1
|
|||
33
HeroShima
12.08.14
✎
16:31
|
Можно искать в исторических данных расстановку, максимально покрывающую текущий набор конрагентов, потом так же уточнять детали для оставшихся. Да много чего ещё можно.
|
|||
34
ildary
12.08.14
✎
16:40
|
Точек с расстояниями нет, есть только списки предыдущих доставок кто за кем должен быть обслужен. Чтобы в системе появились эти расстояния - их надо откуда-то взять. Вариантов ровно два - купить готовые api (денег не дадут, мы - мелкий ларек), либо забивать самим (нет человеко-ресурсов).
|
|||
35
Garykom
гуру
12.08.14
✎
16:43
|
(34) ? не понял
у вас нет адресов контрагентов? и нет карты? |
|||
36
Garykom
гуру
12.08.14
✎
16:44
|
(35) это простейший вариант, гораздо лучше взять смарт с нафигатором и просто поездить, потом треки обработать...
|
|||
37
Garykom
гуру
12.08.14
✎
16:45
|
Да порядок цифр узнать можно?
Т.е. сколько у Вас всего контрагентов и из них постоянных которые хотя бы раз в неделю-две? |
|||
38
HeroShima
12.08.14
✎
16:45
|
(34) Там факторов, кроме расстояния, вагон с тележкой. Лучше не заморачиваться.
|
|||
39
Garykom
гуру
12.08.14
✎
16:45
|
(37)+ и сколько в среднем одна поездка контрагентов охватывает?
|
|||
40
Garykom
гуру
12.08.14
✎
16:47
|
(38) да пробки это такая вещь не одного коммивояжёра сгубила ))
|
|||
41
Garykom
гуру
12.08.14
✎
16:57
|
да почему бы не заюзать нечто вроде http://api.yandex.ru/maps/doc/jsapi/2.0/ref/reference/route.xml
|
|||
42
ildary
12.08.14
✎
17:09
|
(35) адреса есть, но они к карте не привязаны. В неделю на доставке от 100 до 200 клиентов, четверть из них - от 2 до 10 раз (тоже в неделю - разные адреса).
Со смартом никто ездить не будет - сотрудники со смартами не могут не забыть взять в поездку зарядку, не то что снять координаты. Насчет api яндекса - ему на вход нужны координаты, которых у меня нет. |
|||
43
Garykom
гуру
12.08.14
✎
17:14
|
(42) 200 клиентов привязать адреса это 3-4 часа работы...
получаются адреса для яндекса их в прогу засунуть да можно по адресу автоматом через api яндекса координаты получить, человек только проверит что правильно и все... |
|||
44
Garykom
гуру
12.08.14
✎
17:15
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |