Научная статья на тему 'Адаптивный алгоритм распределения заказов на обслуживание автомобилями такси'

Адаптивный алгоритм распределения заказов на обслуживание автомобилями такси Текст научной статьи по специальности «Математика»

CC BY
2078
198
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
адаптивный алгоритм / распределение / паросочетание / автоматизация / adaptive algorithm / distribution / matching / automation

Аннотация научной статьи по математике, автор научной работы — Сонькин Дмитрий Михайлович

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

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

On the basis of known algorithms of determining maximum matching the adaptive algorithm of distributing orders for taxi service has been developed. The proposed methods of adapting the Kun algorithm and Hungarian method allowed reducing computational complexity of software implementation.

Текст научной работы на тему «Адаптивный алгоритм распределения заказов на обслуживание автомобилями такси»

УДК 004.02.21

АДАПТИВНЫЙ АЛГОРИТМ РАСПРЕДЕЛЕНИЯ ЗАКАЗОВ НА ОБСЛУЖИВАНИЕ АВТОМОБИЛЯМИ ТАКСИ

Д.М.Сонькин

Томский политехнический университет E-mail: sonkin_d@sibmail.com

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

Ключевые слова:

Адаптивный алгоритм, распределение, паросочетание, автоматизация. Key words:

Аdaptive algorithm, distribution, matching, automation.

Введение

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

Такой подход обеспечивает «прозрачность» распределения заказов между автомобилями такси, а также упрощает задачу принятия решения. Однако говорить об эффективности, а тем более оптимальности такого распределения заказов не приходится. Разделение города на стоянки носит виртуальный характер - местоположение автомобиля внутри района неизвестно. Водители заинтересованы быть в центре, т. к. там выше вероятность получить заказ. Зачастую водитель отмечается на стоянке заранее, чтобы занять очередь. В результате большинство машин оказывается в очереди в центре, и отсутствие автомобилей в ряде других районов. При этом физически автомобиль может находиться в районе, где на стоянке никто не отмечен, а заказ имеется. Растут перепробеги автомобилей, увеличивая себестоимость заказа и время на его обслуживание. В случае, если к заказанному автомобилю предъявляются дополнительные требования (наличие кондиционера, логотипа, детского сидения и др.), диспетчер тратит время на поиск подходящего варианта. Также не учитывается фактор выполнения «дневного плана» - одни водители успевают его перевыполнить, а другие закрывают смену с недостачей.

Формализация и математическая постановка задачи оптимального распределения заказов между водителями такси

Задачу автоматизации процесса распределения заказов на обслуживание заказов клиентов такси между автомобилями таксопарка целесообразно представить в виде двудольного графа G=(Z,A), где

Z={z1,...,z„} - множество поступающих заказов и А={а1,...,ат} - множество автомобилей такси, готовых их выполнить, а У={у}; /=1,п; ]=1,ш - множество ребер, связывающих вершины из множества Z с вершинами множества А.

Следует отметить, что в общем случае каждый из заказов может быть принят и выполнен любым автомобилем такси. Это соответствует случаю, когда каждая вершина может быть связана со всеми вершинами множества А, т. е. коэффициент инцидентности у{ каждой вершины находится в диапазоне 0<у[<т. Аналогично, каждый автомобиль такси может обслужить любой поступивший заказ, т. е. каждая вершина а;сА может быть связана со всеми вершинами множества Z, и соответственно коэффициент инцидентности уА каждой вершины а находится в диапазоне 0<у/<п.

Таким образом, при распределении заказов необходимо из всего множества возможных зака-

п т

зов у = или у = , выбрать такую сово-,=1 j=l купность паросочетаний (заказ-автомобиль), которая в наилучшей степени удовлетворяла бы заданному интегральному критерию эффективности К.

Каждому ребру из множества У может быть поставлен в соответствие интегральный критерий эффективности кцс£. При этом к=/(к/,к;,2,...,к/), где р - число локальных весовых коэффициентов, таких как: удаленность от места назначения, тип автомобиля, процент выполнения дневного плана, тип клиента и др.

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

На основе формализованного представления задачу оптимального распределения заказов целесообразно свести к классической задаче о назначениях с аддитивным критерием эффективности [5].

Необходимо распределить полученные заказы (множество 7) между автомобилями такси таким образом, что бы достичь максимальной эффективности ¥ при их выполнении:

п т

р = А 1 ^ тах

1=1 1=1

при ограничениях на количество:

• заказов, назначенных к исполнению водителям такси

п

XX1 < 1, / = 1,2,...,т;

1=1

• водителей такси, получивших к исполнению заказ

т

X х, 1 < 1, 1 = 1,2,..., п;

I=1

{1, если водителю с номером / будет назначен заказ с номером у;

2, в противном случае,

где к,у - интегральный критерий эффективности, учитывающий р весовых локальных коэффициентов для /-го водителя при выполнении у-го заказа; х,у - элемент искомой матрицы назначений (матрицы неизвестных).

Разработка алгоритма оптимального назначения заказов автомобилям такси

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

Из литературы [4-7] известны алгоритмы поиска оптимального паросочетания, к которому сводится задача распределения заказов между автомобилями такси. Рассмотрим наиболее известные из них: алгоритм Куна и венгерский метод.

Модернизация алгоритма Куна для определения максимального паросочетания «автомобиль - заказ»

Главная цель функционирования таксопарка, как коммерческой организации, является получение максимальной прибыли при обслуживании максимального количества клиентов. Однако, в ряде случаев, при обслуживании клиентов на первый план может выходить не критерий экономической эффективности, а критерий обслуживания максимального количества заявок клиентов. В таком случае интегральные критерии эффективности ку^К во внимание не принимаются, и двудольный граф G=(7,A) перестает быть взвешенным. Для поиска максимального паросочетания в этом случае целесообразно воспользоваться алгоритмом Куна.

В теории графов принято цепью длины к именовать некоторый простой путь (т. е. не содержа-

щий повторяющихся вершин или рёбер), содержащий k рёбер. Чередующейся цепью (в двудольном графе, относительно некоторого паросочетания) назовём цепь, в которой рёбра поочередно принадлежат/не принадлежат паросочетанию. Увеличивающей цепью (в двудольном графе, относительно некоторого паросочетания) назовём цепь, у которой начальная и конечная вершины не принадлежат паросочетанию.

Из теоремы Бержа [7] известно, что паросочета-ние является максимальным тогда и только тогда, когда не существует увеличивающих относительно него цепей.

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

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

Оценим вычислительную сложность алгоритма. Поскольку каждая увеличивающая цепь будет найдена за O(n+m), а всего цепей понадобится найти не более n/2, то итоговая асимптотика алгоритма равна O(n/2+nm), т. е. количество условных вычислительных операций составит O(nm).

Рассмотрим подробнее алгоритм поиска увеличивающей цепи (пусть, для определённости, это поиск в глубину). Поиск начинает идти из вершины первой доли. Из первой доли во вторую он ходит только по рёбрам, не принадлежащим паросо-четанию, а из второй доли в первую - наоборот, только по принадлежащим. С точки зрения реализации, поиск в глубину всегда находится в вершине первой доли, и он возвращает булево значение -найдена цепь или не найдена. Из текущей вершины V поиск в глубину пытается пойти по всем смежным рёбрам (кроме принадлежащего паросо-четанию), и если он может пойти в вершину T0 второй доли, не принадлежащей паросочетанию, то возвращает True и добавляет ребро (V,T0) в паросочетание. Если же он пытается пойти в вершину T0, уже принадлежащую паросочетанию, то он вызывает себя из вершины M[T0] (соседа T0 в паросоче-тании), и если цепь была найдена, то добавляет ребро (V,T0) в паросочетание.

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

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

Следует обратить внимание на то, что алгоритм придётся немного модифицировать: поскольку предполагается, что текущая вершина ещё не входит в паросочетание, то нужно добавить соответствующую проверку.

Поиск оптимального распределения заказов

венгерским методом

Значительно более сложной представляется задача о паросочетании, в котором задан граф G=(Z,A,K) и каждому ребру У={у!}; /=1,и; ]=1,ш -сопоставлено число кр называемое весом ребра у. Предлагается найти паросочетание в G с наибольшей возможной суммой весов. Очевидно, что задача о невзвешенном паросочетании, которую мы рассматривали выше (называемая иногда задачей о мощности паросочетания), - это частный случай задачи о взвешенном паросочетании: достаточно положить к=1 для всех у ¡¡е У.

Нетрудно увидеть, что в формулировке задачи о взвешенном паросочетании можно убрать граф ^ приняв соглашение, что этот граф всегда полный, и полагая веса всех ребер, которых нет в ^ равными нулю. Кроме того, всегда можно считать, что число вершин четно - в противном случае можно добавить новую вершину и положить веса всех ребер, инцидентных этой вершине, равными нулю. Если рассматривается двудольный случай этой задачи, так же можно считать, что граф представляет собой полный двудольный граф с двумя множествами вершин одинаковой мощности. Отметим также, что оптимальные решения обязательно будут полными паросочетаниями (т. к. к>0), и, следовательно, можно формулировать эти задачи как задачи минимизации, рассматривая стоимости е=Ж-кр где Ж больше, чем все кг Далее будем рассматривать именно такой вариант задачи

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

элементы которой соответственно будут равны: кгЖ-к,.

Если матрица К не квадратная, дополняем ее нужным числом нулевых рядов. (Под рядом будем понимать строку или столбец).

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

Этап 2. Ищем решение с нулевым значением. Для этого берем 1-ю строку; отметим один из нулей, остальные нули зачеркиваем и зачеркиваем нули в том столбце, где отметили ноль. То же делаем со всеми последующими строками.

Этап 3. Находим максимальное паросочетание следующим образом. Отмечаем всякую строку и всякий столбец с отмеченными нулями. В каждом из непомеченных столбцов найдем зачеркнутый ноль. В этой строке переходим к отмеченному нулю; в столбце отмеченного нуля ищем неотмеченный ноль в неотмеченной строке (если не нашли, проводим подобную рекурсивную процедуру для каждого зачеркнутого нуля в рассматриваемом столбце). Если нашли, то увеличиваем число паро-сочетаний: зачеркнутые нули отмечаем, отмеченные - зачеркиваем.

Если максимальное паросочетание дает насыщенную матрицу назначений, то решение найдено: номер строки каждого из отмеченных нулей соответствуют номеру претендента, а номер строки - номеру должности, на которое следует его назначить.

В противном случае переходим к Этапу 4.

Этап 4. Нахождение минимальной опоры - минимального множества рядов, содержащего все ее нули.

Помечаем всякую строку, которая не содержит отмеченных нулей (метки в Этапах 4, 5 и в Этапе 3 -разные). Помечаем всякий столбец, содержащий зачеркнутый ноль в каждой из отмеченных строк. Помечаем всякую строку, содержащую отмеченный ноль в каждом из помеченных столбцов. Повторяем эти две операции, пока процедура не исчерпает себя.

Строки берем помеченные, а столбцы - непомеченные, и выбранное отмечаем пунктиром. «Пунктирные» ряды и составляют минимальную опору.

Этап 5. Перестановка нулей.

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

Этап 6. Переходим к Этапу 2.

Рассмотрим применение метода на примере. Пусть имеется 5 автомобилей такси и 5 заказов (рис. 1).

А-fa,.....а5) | | /-(/......уе5)

Рис. 1. Граф соответствия «Автомобили - Заказы»

Составим исходную таблицу (матрицу), табл. 1.

Таблица 1. Исходная таблица соответствия

Автомобиль Заказ 1 Заказ 2 Заказ 3 Заказ 4 Заказ 5

1 2 4 1 3 3

2 1 5 4 1 2

3 3 5 2 2 4

4 1 4 3 1 4

5 3 2 5 3 5

Строкам соответствуют автомобили такси, а колонкам - заказы. Элементы матрицы показывают отдаленность автомобиля от места заказа в км.

После работы алгоритма, описанного выше, получим оптимальную матрицу назначений (табл. 2).

Таблица 2. Оптимальная матрица назначений

Автомобиль Заказ 1 Заказ 2 Заказ 3 Заказ 4 Заказ 5

1 1

2 1

3 1

4 1

5 1

Таким образом получаем оптимальное распределение «Автомобиль - Заказ», рис. 2.

Минимальное значение целевой функции: 1+2+2+1+2=8, т. е. минимальный суммарный пробег автомобилей до мест заказов составит 8 км.

Разработка адаптивного алгоритма

распределения заказов

Эффективным способом решения задачи о назначениях является венгерский метод [4-7] при котором осуществляется поиск максимального паро-сочетания в двудольном взвешенном графе, однако в общем случае и^ш, и для поиска максимального паросочетания придется прямоугольную матрицу смежности размерности н*ш приводить к квадратной для выравнивания размерности, путем добавления пустых строк/столбцов, так чтобы н=ш.

Рис. 2. Оптимальное распределение «Автомобиль - Заказ»

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

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

Адаптивный алгоритм распределения заказов между автомобилями такси приведен на рис. 3.

Этап 1. Формирование двудольного графа G=(Z,A), где Z={z1,...,z„} - множество поступающих заказов и А={а1,...,аш} - множество автомобилей такси, готовых их выполнить.

Этап 2. Определение стратегии распределения заказов в соответствии с оперативной ситуацией: где факторы s¡ определяют текущую загрузку, соотношение между количеством автомобилей и количеством заказов, общую размерность графа G и др. Если выбрана Стратегия 1, то выполняется Этап 3, в противном случае Этап 6.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Этап 3. Расчет локальных критериев эффективности, соответствующих ребрам графа G.

Этап 4. Преобразование графа G в граф G'. Целью преобразования является уменьшение мощности множества вершин Z или вершин множества А по критерию шт(ш,и).

Если в исходном графе G количество заказов превышает количество автомобилей, готовых их выполнить, т. е. н>ш, то необходимо удалить из рассмотрения (ш-н) вершин множества Z.

Рис. 3. Адаптивный алгоритм распределения заказов такси

Если в исходном графе G количество заказов меньше количества автомобилей, готовых их выпол-

нить, т. е. п<т, то необходимо удалить из рассмотрения п-т вершин множества А.

Этап 5. Решение задачи оптимального распределения заказов (множество вершин Z) между водителями такси (множество вершин А) венгерским методом.

Этап 6. Решение задачи максимального распределения заказов (множество вершин Z) между водителями такси (множество вершин А) алгоритмом Куна.

Этап 7. Формирование двудольного графа G"=(Z",A") по критерию отказа водителей от выполнения заказа, где А"еА - множество водителей, отказавшихся от выполнения заказа, а Z"eZ - заказы, на выполнение которых пришел отказ от водителей.

Этап 8. Формирование нового графа G с учетом ограничений, накладываемых графом (Этап 1), или прекращение работы.

В результате выполнения предложенного алгоритма в каждый дискретный момент времени ¡1 формируется искомое множество паросочетаний Р. Множества А' и Z', а также множества А" (нераспределенные автомобили) и (нераспределенные заказы) переходят для рассмотрения в момент времени ¡т.

На основе адаптивного алгоритма распределения заказов на обслуживание автомобилями такси разработано программное обеспечение на языке С#, используемое в работе информационно-телекоммуникационного комплекса «АГАТ». Это позволило сократить время на распределение заказов между автомобилями такси таксопарка от 10 до 25 %.

Выводы

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

СПИСОК ЛИТЕРАТУРЫ

1. Перегудов Ф.И., Тарасенко Ф.П. Основы системного анализа. - Томск: Изд-во НТЛ, 1997. - 396 с.

2. Белов В.В., Сонькин Д.М. Некоторые задачи автоматизации городского такси с использованием микропроцессорных терминалов // Молодежь и современные информационные технологии: Сб. трудов VI Всеросс. научно-практ. конф. студентов, аспирантов и молодых ученых. - Томск, 26-28 февраля 2008. -Томск: СПб Графикс, 2008. - С. 18-19.

3. Колесников Л.А. Основы теории системного подхода. - Киев: Наукова думка, 1988. - 174 с.

4. Ахо А., Хопкрофт Дж., Ульман Дж. Построение и анализ вычислительных алгоритмов. - М.: Мир, 1979. - 536 с.

5. Свами М., Тхуласираман К. Графы, сети и алгоритмы. - М.: Мир, 1984. - 454 с.

6. Кристофидес Н. Теория графов. Алгоритмический подход. -М.: Мир, 1978. - 432 с.

7. Пападимитриу Х., Стайглиц К. Комбинаторная оптимизация. Алгоритмы и сложность. - М.: Мир, 1985. - 512 с.

Поступила 05.11.2009 г.

i Надоели баннеры? Вы всегда можете отключить рекламу.