- У вас есть набор улицы
адреса, каждый из которых геокодирован.
- Вы хотите сгруппировать адреса так, чтобы каждый кластер был
назначен курьеру.
- Количество лиц, осуществляющих доставку, или кластеров не фиксировано. Если нужно,
Я всегда могу нанять больше доставки
человек, или уволить их.
- Каждый кластер должен иметь примерно одинаковое количество адресов. Тем не мение,
кластер может иметь меньше адресов, если
адреса кластера более распространены
из. (Адрес по-другому: минимум
количество кластеров, где каждый кластер
содержит максимальное количество
адреса, и любой адрес в пределах
кластер должен быть отделен максимум
расстояние.)
- Для бонусных баллов, когда набор данных изменяется (адрес добавлен или
удаляется), и алгоритм перезапускается,
было бы хорошо, если кластеры
остался неизменным, насколько это возможно (т.е.
это исключает простые K-средства
кластеризация, которая носит случайный характер).
В противном случае доставщики отправятся
сумасшедший.
Как уже упоминалось, проблема маршрутизации транспортных средств, вероятно, лучше подходит ... Хотя она строго не разработана с учетом кластеризации, она будет оптимизирована для назначения на основе ближайших адресов. Поэтому ваши кластеры на самом деле будут рекомендуемыми маршрутами.
Если вы предоставите максимальное количество поставщиков, а затем попытаетесь найти оптимальное решение, вам должно быть указано, какое минимальное количество вам требуется. Это касается пункта 2.
Такое же количество адресов можно получить, установив ограничение на количество посещаемых адресов, в основном присваивая стоимость запаса (теперь это проблема, связанная с маршрутизацией транспортных средств).
Добавление временных окон или часов, в которые работают работники службы доставки, помогает снизить нагрузку, если адреса распределены более широко (теперь проблема маршрутизации транспортных средств из-за заглавных букв в временных окнах).
Если вы используете алгоритм ближайшего соседа, то вы можете получать идентичные результаты каждый раз, удаление одного адреса не должно иметь слишком большого влияния на ваш конечный результат, поэтому должно иметь дело с последним пунктом.
На самом деле я работаю над библиотекой классов C #, чтобы достичь чего-то подобного, и думаю, что это, вероятно, лучший путь для спуска, хотя его не всегда легко реализовать.