№ 6 (42) 2012
А. А. Бабаев, канд. техн. наук, доцент Санкт-Петербургского государственного университета
Вариативные процедуры в алгоритмах оптимизации прикладных комбинаторных задач
Задачи поиска решения, наилучшего из возможных, весьма распространены. К одной из наиболее многочисленных групп относятся задачи целочисленной оптимизации.
Введение
Комбинаторная задача в наиболее общей форме может быть сформулирована следующим образом. Требуется определить такую комбинацию из n альтернатив X = (x1, x2,..., xn), которая оптимизирует (минимизирует или максимизирует) значение некоторой целевой функции F = f (X) при заданном ограничении на допустимую совокупность этих альтернатив. Комбинации альтернатив можно попытаться перечислить, т. е. в каждом случае проверить принадлежность рассматриваемого решения заданному ограничению и по значению целевой функции среди допустимых решений выбрать наилучшее X * = (x*, x2,..., x'n), для которого F' = f (X') = opt f (X).
Под алгоритмами оптимизации будем понимать алгоритмы, предназначенные для решения прикладных комбинаторных задач. Их постановка и формализация осуществляется с использованием тех или иных комбинаторных аналогов, наиболее характерными среди которых являются кортежи (векторы), перестановки, сочетания и размещения [1, 2]. Основная проблема в комбинаторной оптимизации при решении прикладных задач сводится к разработке методов (алгоритмов), направленных на максимально возможное сужение полного перебора вариантов комбинаций и замене его направленным или сокращенным перебором [3]. Соответствующие алгоритмы адаптируются к используемому комбинатор-
ному объекту с помощью тех или иных вариативных процедур, разработанных применительно к его комбинаторному аналогу: вектор, перестановка, сочетание, размещение.
Понятие комбинации как совокупности переменных является фундаментальным понятием комбинаторики и используется при описании математических моделей задач оптимизации для практических приложений [4, 5]. Решение комбинаторных задач сводится к нахождению такой совокупности переменных, которая оптимизирует значение некоторой целевой функции. При программной реализации алгоритмов возникает ряд трудностей, связанных со способами перечисления комбинаций и организацией их хранения в оперативной памяти. Элементами комбинаций могут быть различные объекты: названия предметов, фамилии людей, действительные и целые числа, наборы алфавитно-цифровых символов и т. п. Однако предварительно рассматриваемые объекты всегда можно пронумеровать натуральными числами и в последующем оперировать с ними как с элементами комбинации.
При конечном числе значений каждого элемента комбинации того или иного типа конечно и количество возможных комбинаций этих элементов. Следовательно, каждой комбинации можно поставить в соответствие код или номер, выражающийся целым неотрицательным числом г, 0 < г < N. Представление комбинации в виде одного числа г позволяет более экономно расходовать
86 у
№ 6 (42) 2012
оперативную и внешнюю память при организации вычислительного процесса в различных алгоритмах оптимизации. Вместе с тем далее появляется необходимость по коду г декодировать некоторую комбинацию или восстановить последовательность составляющих ее элементов.
Целью настоящей статьи является рассмотрение способов перебора, кодирования и декодирования комбинаций на примере таких комбинаторных структур, как вектор, перестановка, сочетание, размещение.
Формирование, кодирование и декодирование вектора
Вектор как комбинаторная структура представляет собой совокупность элементов комбинации V = V., ..., V,), где vj е {1, 2, ..., т},у = 1, ..., п. Понятие вектора в этом толковании идентично понятию кортежа, употребляемого в работе Д. Кнута [6]. С использованием понятия вектора может быть формализована следующая прикладная задача [7].
Задача 1. Каждая у-я из п последовательных работ проекта может выполняться по одному из ту вариантов, обеспечиваемых не возобновляемыми иу и возобновляемыми wjj ресурсами, I = 1, ..., ту, у = 1, ..., п. В этой ситуации можно сформулировать задачу минимизации издержек используемых ресурсов:
в = тт
v
У и, + тах wv,
V, е{1.....т1 }.(1)
В целевой функции (1) требуется найти вектор V = V v2, ..., V,) вариантов выполнения работ, который минимизирует стоимость выделяемых на проект ресурсов. Число возможных значений векторов определяется выражением
N = Пт.
i=1
Можно указать вычислительную процедуру, которая позволяет при каждом обраще-
нии к ней получать новое состояние вектора в лексикографическом порядке.
Процедура ЛВК (д, п, М, V).
Вход: Если q = 1, то выполнить: V1 = 1, I = 1, ., п и перейти на выход. Положить I = п.
Л: Если V < т,, то вычислить v¡ = V-! + 1 и перейти на выход. Вычислить V = 1.
Если I > 1, то вычислить I = I - 1 и перейти к Л.
Выход.
Перед первым обращением к процедуре ЛВК переменной q должно быть присвоено значение 1, которое является признаком для установления начального состояния вектора, для формирования последующих состояний вектора переменной q присваивается нулевое значение. Кроме того должен быть задан целочисленный массив М = (т^ т2, ..., тп), где т1 — наибольшее допустимое значение элемента V;, I = 1, ..., п. В результате N обращений к процедуре будет осуществлен полный перебор возможных состояний вектора V = V.,, ..., vn). В процессе перебора некоторые состояния вектора по соответствующим значениям целевой функции (в частности, для задачи 1) могут представлять определенный интерес и требовать их запоминания. В целях экономии памяти при запоминании вектор может быть свернут (закодирован) в одно число г, 0 < г < N. Представляется, что такое кодирование актуально при организации поиска решений в целочисленной оптимизации, динамическом программировании, методе ветвей и границ, генетических алгоритмах.
Для свертки вектора предлагается следующая процедура [8].
Процедура СВВ (п, М, V, z)
Вход: Положить I = 1; г = V 1 - 1.
С: Если I = п, то перейти на выход.
Вычислить I = I + 1; г = гхт1 + V - 1.
Перейти к С.
Выход.
87
-ч ПРИКЛАДНАЯ ИНФОРМАТИКА
№ 6 (42) 2012 ' -
t
«о
I Л
Si
I
=
s
t=
0
1 I
6
о &
Рассмотрим пример работы этой процедуры.
Пусть n = 4, M = (3, 2, 4, 2), V = (1, 2, 3, 1). Определить z.
При обращении к процедуре СВВ последовательность вычислений в ней будет следующей.
Вход: i = 1; z = 0.
i Ф 4, i = 2, z = 1; i ф 4, i = 3, z = 6; i ф 4, i = 4, z = 12; i = 4.
Выход.
Таким образом, вектору (1, 2, 3, 1) соответствует его свертка z = 12.
Для развертки (декодирования)вектора можно воспользоваться предлагаемой ниже процедурой.
Процедура РЗВ (n, M, z, V)
Вход: Положить i = n.
Р: Вычислить v = 1 + z mod m. Если i =1, то перейти на выход. Вычислить z = [z / m] Вычислить i = i- 1 и перейти к Р.
Выход.
Рассмотрим работу процедуры при восстановлении вектора по его свертке z = 12.
Вход: i = 4;
v„ = 1;
Ф 1, z = 6; i = 3; v3 = 3;
Ф 1, z = 1; i = 2; V2 = 2;
Ф 1, z = 0; i = 1; V1 = 1;
= 1.
Выход.
Таким образом, путем декодирования свертки г = 12 получаем искомый вектор V = (1, 2, 3, 1).
Программная реализация рассмотренных процедур ЛКВ, СВВ и РЗВ осуществлена в работе [9].
Организация перебора, кодирования и декодирования перестановок
Под перестановкой будем понимать комбинацию неповторяющихся п чисел натурального ряда Р = р р2, ..., рп), где
р1 е {1, 2, ..., п}, i = 1, ..., п. Как известно, возможное число перестановок из п элементов равно N = п!. Для примера сформулируем одну из прикладных задач на перестановках [10].
Задача 2. На транспортном средстве от пункта сбора осуществляется доставка п бригад на п объектов. Численность у-й бригады, у = 1, ..., п составляет Ь] человек. Известна матрица времени переезда от одного объекта к другому объекту у I = 0, ..., п, у = 1, ..., п (пункт сбора принят за нулевой объект, i = 0). Требуется указать такую последовательность доставки бригад на объекты, которая минимизирует суммарные потери L времени нахождения рабочих на транспортном средстве.
Анализ физической сущности задачи показывает, что можно дать ее математическую формализацию на перестановках:
L=т ЬР,ЛьР,, (2)
1=1 у=I
где Р = (рь р2, ..., рп) — номера пунктов в очередности доставки бригад.
Наиболее простым точным методом решения задач выбора маршрута является метод полного перебора перестановок. Вычисляя для каждой перестановки значение целевой функции, найдем ту перестановку, которая доставляет ей минимум. Это и будет оптимальный маршрут транспортного средства. Однако количество возможных перестановок с увеличением числа пунктов назначения п возрастает очень быстро (факториально) и соответственно резко увеличивается время поиска оптимального варианта при решении задачи методом перебора. Поэтому возникает необходимость исследования процессов перебора комбинаторных объектов, выбора эффективных алгоритмов порождения перестановок и способов их хранения в памяти компьютера при организации вычислительного процесса.
Рассмотрим следующие алгоритмы перебора перестановок:
88j
ПРИКЛАДНАЯ ИНФОРМАТИКА /-
' № 6 (42) 2012
• порождение в лексикографическом порядке;
• на основе вектора инверсий;
• циклического сдвига;
• транспозиции смежных элементов;
• переноса крайних элементов.
Алгоритм лексикографического перебора
Последовательность перестановок на множестве {1, 2, ., п} представлена в лексикографическом порядке, если она записана в очередности возрастания п-разрядных чисел п-ичной системы счисления, являющихся элементами перестановок. Лексикографическая последовательность перестановок четырех элементов имеет вид, показанный в гра-
фе 2 табл. 1. Например, видно, что перестановка элементов (2, 1, 3, 4) в лексикографиче- ц§ ской последовательности расположена выше перестановки (4, 1, 2, 3). Согласно определе- ^ нию отношения лексикографического порядка перестановка Р = (рь p2, ., pn) лексикографически предшествует перестановке Q = q2, ., qn), если для некоторого к, 1 < k < п выполняются два условия pk < qk и р1 = q¡, I = 1, 2, ., к- 1. Взяв за основу определение, можно сформулировать алгоритм порождения перестановок в лексикографическом порядке, начиная с некоторой исходной перестановки, например, Р = (1, 2, ..., п).
Переход от исходной перестановки к последующей осуществляем путем просмотра
Таблица 1
Последовательности перестановок
Используемый алгоритм
п/п Лексикографический Циклического сдвига Вектора инверсий Факториальный Транспозиции
1 2 3 4 5 6
1 1234 1234 1234 1234 1234
2 1243 2341 1243 2134 2134
3 1324 3412 1342 3124 2314
4 1342 4123 2341 4123 2341
5 1423 1342 1324 1324 3241
6 1432 3421 1423 2314 3214
7 2134 4213 1432 3214 3124
8 2143 2134 2431 4213 1324
9 2314 1423 2314 1423 1342
10 2341 4231 2413 2413 3142
11 2413 2314 3412 3412 3412
12 2431 3142 3421 4312 3421
13 3124 1243 2134 1243 4321
14 3142 2431 21 43 2143 4312
15 3214 4312 3142 3142 4132
16 3241 3124 3241 4132 1432
17 3412 1432 3124 1342 1423
18 3421 4321 4123 2341 4123
19 4123 3214 4132 3241 4213
20 4132 2143 4231 4231 4231
21 4213 1324 3214 1432 2431
22 4231 3241 4213 2431 2413
23 4312 2413 4312 3421 2143
24 4321 4132 4321 4321 1243
89
№ 6 (42) 2012
I
«о
*
]
§
I
=
1=
0
1 1
I
о &
ее элементов р справа налево в поисках самой правой позиции, где р1 < р1 + 1. Найдя такую позицию I, ищем наименьший элемент р, расположенный справа от р, и больший его. Затем осуществляем транспозицию р, о р, (меняем местами элементы перестановки р, и р) и транспозиции элементов р,+к о рп_к + 1 для к = 1, 2, ... до тех пор, пока \ + к < п - к +I (переворачиваем правую часть перестановки, т. е. упорядочиваем элементы хвоста перестановки в порядке их возрастания). Таким образом, получена новая перестановка. Далее, приняв ее за исходную, повторяем вышеописанную процедуру.
Работа алгоритма по формированию лексикографической последовательности перестановок заканчивается, когда будет получена последняя лексикографически максимальная перестановка Р = (п, п- 1, ..., 1).
Формальное изложение процедуры, реализующей этот алгоритм, может быть представлено следующим образом.
Процедура ЛП (ц, п, Р).
Вход:
Если q = 1, то вычислить: q = 0; р1=, } = 1, 2, ., п и перейти на выход. Вычислить: I = п - 1.
М1: Если р1 > р1 + 1, то вычислить: , = , - 1.
Если I = 0, то вычислить: q = 1 и перейти на выход. Вычислить} = п.
М2: Если р1 > р,, то вычислить: \ = \ - 1 и перейти к М2.
Вычислить к = р,; р, = р, р, = к,, = п, , = , + 1.
МЗ: Если , >I, то вычислить: к = р, р, = р; р = к, ] = ] - 1; I = , + 1 и перейти к МЗ.
Выход.
Алгоритм циклического сдвига
Одним из простейших алгоритмов перебора перестановок является алгоритм циклического сдвига. На первом шаге алгоритм формирует исходную перестановку Р = (1, 2,., п), затем осуществляет последо-
вательный сдвиг по циклу на одну позицию, например, влево все п элементов (первый слева элемент становится первым справа). В результате получаем новую перестановку. После выполнения п циклов сдвига п элементов перемещаем первые п- 1 элементов (первый слева элемент становится вторым справа) и возвращаемся к циклу сдвига на п элементов.
После выполнения (п - 1) -го цикла сдвига (п - 1)-го элемента осуществляем цикл сдвига (п - 2)-х элементов и снова возвращаемся к циклу сдвига на п элементов. Аналогично отрабатываются и последующие вложенные циклы сдвига с уменьшением на единицу числа элементов. Алгоритм заканчивает свою работу, когда будет осуществлен переход к последнему п-му циклу сдвига одного первого элемента. Последовательность циклических перестановок из четырех элементов показана в графе 3 табл. 1.
Приведем формальное представление рассмотренного алгоритма в виде следующей процедуры.
Процедура ЦП (ц, п, Р).
Вход:
Если q = 1, то вычислить: q = 0; р, =,,
= п - ¡,, = 1, 2, ., п и перейти на выход. Вычислить: к = 1.
М1: Если sk = 0, то вычислить: \ = рк, р- 1 = р,, , = к + 1, к = 2, ..., п; рп= , вычислить: sk = п- к, к = к + 1 и перейти к М1.
Если к = п, то вычислить: q = 1. Вычислить:, = рк, ри = р, I = к + 1, к + 2, ..., п; рп = ]; Sk = Sk- 1.
Выход.
Алгоритм вектора инверсий
Вектор инверсий V = vг, ..., V,) перестановки Р = р р2, ..., рп) есть последовательность целых чисел 0 < v¡ < I, равных числу элементов перестановки, больших элемента р, и расположенных слева от него, I = 1, 2, ..., п. Первый элемент вектора инверсий v1 всегда равен нулю, поскольку
90
№ 6 (42) 2012
в перестановке Р левее р^ нет элементов. Второй элемент может принимать два значения 0 или 1, т. д. Последний элемент vn может принимать п значений 0, 1, ..., п - 1.
Исходя из определения вектора инверсий, можно предложить алгоритм формирования перестановок, основанный на переборе вероятных состояний элементов вектора инверсий. Последовательность перестановок, полученных с помощью этого алгоритма, дана в графе 4 табл. 1.
Вычислительную процедуру алгоритма вектора инверсий представим следующим образом.
в следующем. Предварительно зададимся последовательностью натуральных чисел Я = (г1, г2, ..., гп), г( = I, I = 1, 2, ..., п. Возьмем последний разряд счетчика fn, исключим из последовательности Я элемент гПп и поставим его на первое место в перестановке р1 = гПп. Возьмем второй справа разряд счетчика fn- 1, исключим из Я элемент гпп_ 1 и поставим его на второе место слева в перестановке Р. Такая процедура повторяется п раз, последнему элементу перестановки рп присваивается значение гп.
Формализованная схема алгоритма имеет вид.
Процедура ВП (ц, п, Р).
Вход:
Если q = 1, то вычислить: q = 0; sI = р1 = I, I= 1, 2, п; s0 = -1 и перейти на выход.
Вычислить: h¡ = I, I= 1, 2, ..., п; к = п;
^ = ^- 1
М1: Если sk = 0, то вычислить: sk = к; к = к - 1, sk = sk - 1 и перейти к М1. Если k < 1, то вычислить: q = 1. Вычислить: I= п.
М2: Вычислить: р1 = hSi; h| = h|+1, \ = sI,
^+1, (- 1 (=(- 1.
Если I > 0, то перейти к М2.
Выход.
Алгоритм факториального счетчика
Общее количество возможных перестановок определяется факториалом числа составляющих ее элементов. Представим п! как произведение 1 • 2 • . • (п - 1) • п. Возьмем элементы этого произведения в качестве оснований разрядов факториальной системы счисления. За начальные установки всех разрядов примем единичные значения. Тогда конечными установками разрядов будут являться принятые факториальные основания. Таким образом, создан факториаль-ный счетчик F = f2, ..., fn), по текущим состояниям которого можно однозначно формировать соответствующую перестановку.
Алгоритм формирования перестановки по состоянию счетчика заключается
Процедура ФП (ц, п, Р).
Вход:
Если q = 1, то вычислить: q = 0; s¡ = 1, р( = I, I = 1, 2, ., п; s0 = -1 и перейти на выход.
Вычислить: h¡ = I, I = 1, 2, ..., п; k = п;
^ = ^ + 1
М1: Если sk > k, то вычислить: sk = 1; k = k - 1, sk = sk + 1 и перейти к М1. Если k < 1, то вычислить: q = 1. Вычислить: I = п.
М2: Вычислить: Рп -,+, = hs¡; ^ = ^+1, \ = si, s¡ + 1, ., I - 1; I = I - 1. Если I > 0, то перейти к М2.
Выход.
Последовательность перестановок, полученных с помощью этого алгоритма, приведена в графе 5 табл. 1.
Алгоритм транспозиции соседних элементов
Для тестирования комбинаторных задач предлагается использовать алгоритм «быстрых перестановок», основанный на принципе транспозиции смежных элементов. Смысл этого алгоритма состоит в следующем.
Предварительно формируется исходная перестановка Р, устанавливаются в единичные состояния п разрядов счетчика S и задаются положительные направления элементов указателя счета Н. Затем самый левый элемент перестановки последовательно меняется местами с рядом стоящими правыми элементами, при этом счетчик фиксирует ко-
91
№ 6 (42) 2012
I
«о
*
]
§
I
=
1=
0
1 1
I
о &
личество таких замен своим самым левым разрядом. После того, как самый левый элемент исходной перестановки достиг правого края, смену позиции производит очередной элемент перестановки, а указатель движения левого разряда меняет свой знак на противоположный. После чего младший элемент перестановки последовательно возвращается на самое левое место, притом показания счетчика в левом разряде с каждой сменой позиции уменьшаются на единицу.
В идейном плане счетчик является как бы позиционной системой счисления с основаниями разрядов п, п - 1, ..., 1, при этом показания разрядов сначала увеличиваются на единицу, достигая своего основания, а затем уменьшаются до 1. В момент достижения своего наибольшего или наименьшего значения младшим разрядом изменяется на единицу состояние старшего разряда.
Вычислительную процедуру алгоритма транспозиции формализуем следующим образом.
Процедура ТП (ц, п, Р).
Вход:
Если q = 1, то дать исходные значения: q = 0; V, = s¡ = р1 = I, I = 1, 2, ..., п; 1 = 1, I = 1, 2, ..., п и перейти на выход. Вычислить: к = 1; s1=s1 +
М1: Если sk < п или sk > к, то перейти к М2.
Вычислить: sk = sk - 1к; hk = - 1к; к = к + ^ ^ = ¿¡к + 11к. Если к = п, то вычислить: q = 1 и перейти на выход. Перейти к М2.
М2: Вычислить: \ = рк + р; = рк; vpk = V;
Рк=;'; V = к.
Выход.
Последовательность состояний и транспозиции соседних элементов перестановки Р показана в графе 6 табл. 1.
Алгоритм переноса крайнего элемента
Имеется возможность существенно сократить количество пересылочных опера-
ций при переборе перестановок с помощью предлагаемого алгоритма «плавающих» перестановок [11]. Это достигается увеличением вдвое массива для хранения элементов формируемых перестановок и, в общем случае, получением каждой новой перестановки за счет переноса последнего элемента с одного края перестановки на другой (слева направо или справа налево).
Формальное изложение процедуры на основе алгоритма плавающих перестановок приводится ниже.
Процедура ПП (ц, п, Р).
Вход:
Если q = 0, то перейти к М.
Вычислить: q = 0; 1 = 1; т = п + п;
р; = I, I = 1,., п; = п -1, I = 1,...,п.
Перейти на выход. М: Вычислить: к = 1. М1: Если sk ф 0, то перейти к М2.
Вычислить: ¡к = п - к; к = к + 1.
Перейти к М1. М2: Если к = п - 1, то вычислить: q = 1.
Если к ф 1, то перейти к МЗ.
Если 1 = 1, то вычислить: рт-Зк = рп-Зк.
Если 1 = -1, то вычислить:
р8к = рп+Зк.
Вычислить: ¡к = ¡к- 1.
Перейти на выход. МЗ: Если 1 = 1, то вычислить:
; = п + к - 1; I = I - 1.
Если 1 = - 1, то вычислить:; = I - к;
I = } + 1.
Вычислить: г = р; р; = 1(; р( = г;
¡к = ¡к - 1; 1 = - 1 Выход.
В рассматриваемой процедуре использованные переменные и элементы массивов имеют следующий смысл:
п — длина перестановки (число составляющих ее элементов);
т — удвоенная длина перестановки; р1 — элемент перестановки, I = 1,., п;
— указатель адресов пересылаемых элементов, I = 1,., п;
— указатель направления осуществляемых пересылок;
92
№ 6 (42) 2012
I, ¡, к, /, г — индексные или рабочие переменные;
q — указатель признака начального, q = 1 или последующих, q = 0 обращений к процедуре перебора перестановок.
Следует обратить внимание на одну примечательную особенность алгоритма «плавающих» перестановок, которая заключается в том, что из всей последовательности п! перестановок достаточно получить ее первую половину, а вторая половина является зеркальным отображением первой. Будем считать, что перестановка Q = q2, ., qn) зеркальна по отношению к перестановке Р = (р1, р2, ..., рп), если для элементов этих перестановок выполняется условие зеркальности: q1 = рп, q2 = рп_ь ..., qn = р,.
Работа алгоритма поясняется в табл. 2 последовательностью формируемых перестановок и процессом нахождения оптимального значения целевой функции (2) для задачи служебной развозки.
Таблица 2
Поиск маршрута методом плавающих перестановок
№ п/п Значение функции L(P) Формируемая перестановка р Лучшее значение l" Зеркальная перестановка q Значение функции L(Q)
1 2 3 4 5 6
1 1951 12 34___ 1359 ___4 32 1 1359
2 1962 _ 23 41__ _ _ 1432_ 1453
3 1415 __3 412 _ _ 214 3__ 1535
4 1106 ___412 3 1106 3214___ 2089
5 1156 ___142 3 32 41___ 1607
6 1369 __3142_ 961 _ 2 413__ 961
7 2018 _ 2 314__ _ _ 4132_ 1183
8 1023 4231___ ___132 4 1593
9 905 4 213___ 905 ___312 4 1389
10 1640 _ 213 4__ _ _ 4 312 _ 1194
11 1285 _ _ 1342_ _ 24 31__ 1017
12 1300 ___3 42 1 12 4 3___ 1108
Демонстрация сопровождается нахождением оптимального маршрута доставки бригад из исходного пункта в четыре пункта назначения. Численности бригад — 1, 3, 1 и 5 человек, соответственно. Время следования между пунктами в минутах задано матрицей:
U =
При этом в графе 2 приводятся вычисляемые для порождаемых перестановок значения целевой функции L (Р), а в графе 6 — значения целевой функции для зеркально отображаемых перестановок L (Q). Процедура обновления лучшего решения
L'k = min {L (Р), L (Q), L*k.J, k = 1, 2, ..., n показывается в графе 4.
0 39 56 48 52
33 0 46 29 53
56 83 0 137 38
40 39 94 0 65
43 53 38 76 0
со <u
£
№ 6 (42) 2012
Данный алгоритм предлагается использовать для случаев, когда количество пунктов назначения в задаче служебной развозки не превосходит 15, а также для оценки точности приближенных методов и тестирования более сложных точных методов решения задач, сводящихся к поиску оптимального варианта на перестановках.
Алгоритм отсекающей схемы перебора
Рассмотренные алгоритмы формирования перестановок, отличаясь друг от друга принципами построения вычислительных схем, имеют один общий существенный недостаток, проявляющийся при их использовании в задачах комбинаторной оптимизации и, в частности, для поиска оптимального маршрута задачи служебной развозки. Он состоит в том, что для каждой новой перестановки, порождаемой тем или иным
алгоритмом, нужно заново производить вычисление целевой функции, сравнивать полученное значение с отобранным среди предыдущих с наилучшим значением, при необходимости обновлять это значение и вновь формировать следующую перестановку до полного их исчерпания из множества возможных перестановок. При этом каждый алгоритм формирует свою последовательность перестановок, и общей закономерности в данных последовательностях, как показывает проведенный анализ, не проявляется.
Однако такая возможность сокращения полного перебора перестановок существует при использовании лексикографического алгоритма. Принимая во внимание его основной принцип построения, заключающийся в том, что переход от исходной перестановки к последующей осуществляет-
Таблица 3
Поиск маршрута методом отсекающего перебора
№ п/п Формируемые маршруты Текущее значение целевой функции Лучшее значение целевой функции
1 2 3 4
1 0, 1 2, 3, 4, 0 1951
2 0, 1 2, 4, 3, 0 1108
3 0, 1 3, 2 1403
4 0, 1 3, 4 1171
5 0, 1 4, 2, 3 1156
6 0, 1 4, 3 1171
7 0, 2, 1 1141
8 0, 2, 3 1519
9 0, 2, 4,1, 3, 0 961 1951
10 0, 2 4, 3 978 1108
11 0, 3 1, 2 1199 961
12 0, 3, 1, 4 1255 905
13 0, 3, 2 1326
14 0, 3, 4 1065
15 0, 4, 1, 2 969
16 0, 4, 1, 3, 2 1183
17 0, 4, 2,1, 3, 0 905
18 0, 4, 2, 3 984
19 0, 4, 3, 1 1056
20 0, 4, 3, 2 1276
I
«О
*
1
§
I
=
1=
0
1 1
I
о &
№ 6 (42) 2012
ся путем просмотра ее элементов р1 справа налево в поисках самой правой позиции, где р1 < р1 + 1, нахождении наименьшего элемента р, расположенного справа от р1 и большего его, осуществлении транспозиции элементов р, о р, и упорядочении расположенных справа от них элементов хвоста перестановки в порядке возрастания.
Эта возможность демонстрируется в табл. 3 на примере поиска оптимального маршрута служебной развозки, осуществляемого с помощью метода отсечения.
Предлагаемый метод сокращения полного перебора заключается в том, что параллельно с просмотром элементов перестановки осуществляется последовательное суммирование человеко-минут L1, С2, ..., Ln на маршруте задачи служебной развозки М = (0, р^ р2, ..., рп, 0) и сравнение получаемой суммы с имеющимся значением целевой функции С(М *) для наилучшего из просмотренных маршрутов.
При этом имеется возможность не анализировать все элементы перестановки, а, следовательно, и все участки маршрута в том случае, когда частная сумма Ls, вычисленная для некоторого пути, приводящего в s-й пункт, будет превосходить имеющееся значение С(М). Целесообразно осуществить пропуск в лексикографической последовательности той части исследуемых перестановок р р2, ..., р3, ..., рп) - р р2, ., р8+1, ..., рп), включение которых в маршрут служебной развозки будет заведомо бесперспективным. Так, например, в табл. 3 при анализе 3-го частного пути маршрута М2 = (0, 1, 3, 2) оказывается, что частная сумма L2 = 1403 оказывается большей, чем С (0, 1, 2, 4, 3, 0) = 1108.
Следует отметить, что значение целевой функции С последовательно уточнено на маршруте М = (0, 2, 4, 1, 3, 0), и на маршруте М = (0, 4, 2, 1, 3, 0) соответственно, достигнув своего минимального значения С* = 905. Таким образом, оптимальное решение определено на основе анализа всего 4 маршрутов. Что касается рассмотрения частных путей, приведенных в табл. 3, заме-
тим, что, с одной стороны, уже и здесь существенно сокращаем вычисления на хвостах перестановок, а с другой — гарантируем получение оптимума.
Работа алгоритма, построенного на основе отсекающей схемы перебора, заканчивается, когда будет осуществлена попытка получить новый маршрут с меньшим значением целевой функции на последней лексикографически максимальной перестановке Р = (п, п - 1, ..., 1).
Каждой перестановке можно поставить в соответствие ее свертку или некоторый код г, 0 < г < N. Кодирование перестановки Р или преобразование составляющих ее элементов р1, р2, ., рп в одно число г предлагается осуществлять с помощью следующей процедуры свертки [12].
Процедура СВП (п, Р, z).
Вход: Вычислить г = 0; к = 1; 3 = {, I , = I, I = 1, ..., п}.
С: Вычислить т = I - 1,
где I — порядковый номер элемента, е 3 и такого, что , = рк. Вычислить г = г (п - к + 1) + т. Если к < п, то вычислить 3 = J \ рк, к = к + 1 и перейти к С.
Выход.
Рассмотрим пример.
Пусть необходимо закодировать перестановку Р = (2, 1, 5, 3, 4). Тогда в соответствии с рассмотренной процедурой при п = 5 последовательность действий будет следующей:
Вход: г = 0; к = 1, 3 = {1, 2, 3, 4, 5}.
т = 1, г = 1, к < 5, 3 = {1, 3, 4, 5}; к = 2.
т = 0, г = 4, к < 5, 3 = {3, 4, 5}; к = 3.
т = 2, г = 14, к < 5, 3 = {3, 4}; к = 4. т = 0, г = 28, к < 5, 3 = {4}; к = 5. т = 0, г = 28, к > 5.
Выход.
Таким образом, перестановке (2, 1, 5, 3, 4) будет соответствовать свертка или код г = 28.
Далее возникает вопрос, как по коду г декодировать перестановку или восстано-
95
№ 6 (42) 2012
вить последовательность элементов Р = (р1, р2, ..., рп), составляющих перестановку. Это можно сделать с использованием следующей процедуры развертки перестановки.
Если организовать последовательное обращение к процедуре РЗП с числами г = 0, 1, ., N - 1, то получим полное множество лексикографически отличающихся друг от друга перестановок. Так, при п = 4 будем иметь:
3
4
1
4
3
Процедура РЗП (n, P, z)
Вход: Вычислить k = n; J = {1, P1:
2, ..., n}.
t
I Л
Si
I
S
w
s
t=
0
1 i
6
о &
Р2:
Вычислить m = n - k +1; Pk = z mod m.
Если k = 1, то перейти к Р2. Вычислить z = [z / m]; k = k - 1 и перейти к Р1.
Вычислить i = pk + 1; pk = j,, jj e J. Если k < n, то вычислить J = J\j; k = k + 1 и перейти к Р2.
Выход.
Используя процедуру РЗП для восстановления элементов перестановки P по коду z = 28, получим следующую последовательность операций:
Вход: k = 5, J = {1, 2, 3, 4, 5},
m = 1 Р5 = 0 z = 28; k = 4;
m = 2 Ра = 0 z = 14; k = 3;
m = 3 Рз = 2 z = 4; k = 2;
m = 4 Р2 = 0 z = 1; k = 1;
m = 5 Р1 = 1
i = 2 Pi = 2; J = {1, 3, 4, 5}; k =
i = 1 p 2 = 1; J = {3, 4, 5}; k = 3;
i = 3 Рз = 5; J = {3, 4}; k = 4;
i = 1 Ра = 3; J = {4}; k = 5;
i = 1 Р5 = 4.
Кодирование и декодирование сочетаний
Предварительно рассматриваемые объекты пронумеруем натуральными числами, и в последующем будем оперировать с ними как с элементами. Тогда под сочетанием С =
= (С1, с2
сг) можно понимать упорядочен-
Выход.
В итоге получим, что коду z = 28 соответствуют следующие элементы перестановки Р = (2, 1, 5, 3, 4).
ную по возрастанию комбинацию п чисел, выбранных из т чисел натурального ряда, т. е. комбинацию, удовлетворяющую условию с( е {1, 2, ..., т}, I = 1, ..., п; с1 < с2 < ... < сп. Приведем пример постановки и формализации одной из прикладных задач с использованием понятия сочетания [7, 13].
Задача 3. Заданы потребности в изделиях некоторых типов по группам объектов применения а, , = 1, ..., п, затраты на изготовление д1 каждого изделия /-го типа, I = 1, ..., т и указано число возможных типов изделий М, которые могут быть включены в программу производства.
При эксплуатации допускается применение изделий !'-го типа (более высокого приоритета) на объектах I - 1, I - 2, ., 1 групп и не допускается применение изделий !-го типа (более низкого приоритета) на объектах I +1,1 + 2, ., п групп объектов. Требуется определить, какие типы изделий и в каком количестве необходимо включить в инновационную программу, которая позволила бы
96
№ 6 (42) 2012
полностью обеспечить потребности сферы применения при минимальных расходах на их изготовление:
в = т1пТ
с Р
9а
=СМ+1 /
(3)
Решение задачи заключается в определении сочетания С = (с1, с2, ... см), включающего не более М элементов, минимизирующего суммарные расходы G инновационного проекта целевой функции (3).
Как известно, возможное число всех сочетаний из т элементов по п определяется формулой
N =
т!
п(т - п)!
Каждому сочетанию можно поставить в соответствие код или номер, выражающийся целым неотрицательным числом г, 0 < г < N. Свертку сочетания С или преобразование последовательности составляющих это сочетание элементов с1, с2, ..., сп в одно число г предлагается осуществлять с помощью следующей вычислительной процедуры [14].
Процедура СВС (т, п, С, z).
Вход: Положить г = 0; р = т; i = 1. Если п = 0, то положить d = 0, иначе вычислить d = с - 1.
С1: Если i > п - 1, то перейти на выход.
Вычислить р = р - 1; q = п - 1;I = 1.
С2: ЕслиI > d, то перейти к С5. Положить в = 1; к = 1.
С3: Если к > р - q, то перейти к С4.
Вычислить в = в (ц + к) / к; к = к +1. Перейти к С3.
С4: Вычислить г = г + в; р = р - 1; I = I + 1. Перейти к С2.
С5: Вычислить d = с1 + 1 - с - 1; i = / + 1. Перейти к С1. Вычислить г = г + d.
Выход.
Работу процедуры СВС поясним на примере. Пусть т = 6, п = 3 и необходимо закодировать сочетание С = (2, 4, 5). Тогда в соответствии с логической схемой вычислительного процесса последовательность действий будет следующей.
Вход: г = 0; р = 6; / = 1; d = 1;
С1: / < п - 1, р = 5; q = 2; | = 1;
С2: I = d, в = 1; к = 1;
С3: к < р - ц, в = 3, 6, 10; к = 2, 3, 4;
С4: г = 10; р = 4; | = 2;
С2: I > d;
С5: d = 1; / = 2;
С1: / = п - 1, р = 3; ц = 1; | = 1;
С2: I = d, в = 1; к = 1;
С3: к < р - ц, в = 2, 3; к = 2, 3;
С4: г = 13; р = 2; I = 2;
С2: I > d;
С5: d = 0; / = 3;
С1: / > п - 1;
г = 13.
Выход.
Итак, сочетанию С = (2, 4, 5) соответствует код г = 13.
Однако теперь возникает вопрос, как по коду г декодировать сочетание или восстановить последовательность составляющих сочетание элементов с1, с2, ..., сп. Это можно сделать с помощью предлагаемой ниже процедуры развертки сочетания.
Процедура РЗС (т, п, z, О).
Вход: Положить d = 0; р = т; ц = п; / = 1.
Р1: Если / > п, то перейти на выход.
Вычислить р = р -1; ц = ц - 1; г = 0;
с, = 0.
Р2: Положить в = 1; к = 1.
Р3: Если к > р - ц, то перейти к Р4.
Вычислить в = в (ц + к) /к; к = к +1.
Перейти к Р3.
Р4: Если г < в + г, то перейти к Р5.
Вычислить р = р - 1; г = г + в;
С = с, + 1
Перейти к Р2.
Р5: Вычислить г = г - г; d = d + с1 + 1;
с( = d; / = / + 1.
Перейти к Р1.
Выход.
97
со <и
£
£
№ 6 (42) 2012
Работу процедуры развертки покажем на примере восстановления сочетания из 6 элементов по 3 при г = 13. Вход: d = 0; р = 6; ц = 3; / = 1.
I
«О
*
1
§
I
=
■
1=
0
1 1
I
о &
Р1 Р2 Р3 Р4 Р2 Р3 Р4 Р5 Р1 Р2 Р3 Р4 Р2 Р3 Р4 Р5 Р1 Р2 Р3 Р4 Р5
/ < п, р = 5; ц = 2; г = 0; с = 0. в = 1; к = 1.
к < р - ц, в = 3, 6, 10; к = 2, 3, 4. г > в + г, р = 4; г = 10; с1 = 1. в = 1; к = 1.
к < р - ц, в = 3, 6; к = 2, 3. г < в + г.
г = 3; d = 2; с = 2; / = 2. / < п; р = 3; ц = 1; г = 0; с2 = 0. в = 1; к = 1.
к < р - ц, в = 2, 3; к = 2, 3. г = в + г, р = 2; г = 3; с2 = 1. в = 1; к = 1. к = р - ц, в = 2; к = 2. г < в + г.
г = 0; d = 4; с2 = 4; / = 3. / = п, р = 1; ц = 0; г = 0; с3 = 0. в = 1; к = 1. к = р - ц, в = 1; к = 2. г < в + г.
г = 0; d = 5; с3 = 5; / = 4. / > п.
Требуется указать такой план привлечения бригад на объекты или размещение Я = (г1, гг, ., гт), при котором общее (не суммарное!) время завершения ремонтно-вос-становительных работ будет минимальным
Т = тттахt¡Г.
я 1</<т ///
(4)
Возможное число всех размещений из т элементов по п определяется формулой
N = ■
т!
Р1:
Выход.
Таким образом, коду г = 13 соответствует сочетание С = (2, 4, 5).
Кодирование и декодирование размещений
Под размещением Я = (г1, г2, ..., гп) будем понимать произвольную комбинацию п чисел, выбранных из т чисел натурального ряда 1, 2, ., т. Одной из комбинаторных задач с использованием понятия размещения может быть следующая прикладная задача [7, 10].
Задача 4. Для проведения ремонтно-восстановительных работ на т объектах могут быть привлечены п ремонтных бригад, т < п. Известна матрица математического ожидания времени выполнения восстановительных работ каждой из бригад на каждом из объектов t/|, / = 1, 2, ..., т; I = 1, 2, ..., п.
п(т - п)!
Преобразование размещения Я в его развертку г, 0 < г < N можно осуществить с помощью следующей процедуры [15].
Процедура СВР (т, п, Я, z).
Вход: Вычислить ш = п!; I = 0; к = 1. С1: Положить ц = т + 1; I = 1. С2: Если (г] < ц) л (г] > I), то положить
ц = г; / = I.
Если I = п, то вычислить I = I + 1 и перейти к С2. Положить ск = ц; Р1 = к; I = ц. Если к < п, то вычислить к = к + 1 и перейти к С1. Произвести свертку Р с использованием процедуры СВП (п, Р, г). Положить ц = г. Произвести свертку С с использованием процедуры СВС (т, п, С, г). Вычислить г = г х ш + ц.
Выход.
Рассмотрим пример. Пусть т = 5, п = 3, Я = (2, 5, 1).
Тогда процесс кодирования будет вестись в следующей последовательности. Вход: ш = 6; I = 0; к = 1. С1: ц = 6; I = 1.
С2: < ц) л > I), ц = 2; / = 1, I < п,
I = 2.
(г2 > ц), I < п, I = 2. г < ц) л г > I), ц = 1; / =3, I = п. с1 = 1; р3 = 1; I = 1; к < п, к = 2. С1: ц = 6; I = 1.
98
№ 6 (42) 2012
С2: (г, < q) л (г, > /), q = 2; I = 1,, < п,, = 2. (г2 > q), \ <п, \ = 3. (г3 < q) л (г= /),} = п; с2 = 2; р, = 2; / = 2; к < п, к = 2. С1: q = 6; \ = 1. С2: (г, < q) л (г, = /), \ < п, \ = 2.
(г2 < q) л (г2 > /), q = 5; I = 2,, < п, , =2 3. 2
(Г3 < q) л (Г3 < /),, = п; с3 = 5; р2 = 3; / = 5; к = п. Свертка Р = (2, 3, 1) есть г = 3; q = 3.
Свертка С = (1, 2, 5) есть г = 2. г = 15. Выход.
Таким образом, в результате проведенных вычислений получим, что размещению Я = (2, 5, 1) соответствует код г = 15.
Восстановление элементов размещения по его коду предлагается осуществлять с помощью следующей процедуры развертки размещения.
Процедура РЗР (т, п, г, Я).
Вход: Вычислить м = п!; q = г. Вычислить г = [г/м]; / = г. По коду г произвести развертку сочетания С с использованием процедуры РЗС (т, п, г, С). Вычислить г = q - / х №. По коду z произвести развертку перестановки Рс использованием процедуры РЗП (п, г, Р). Определить: к = Р; г1 = ск, I = 1, 2,., п.
Выход.
Для нашего примера по коду г = 15 развертка размещения производится следующим образом.
Вход: м = 6; q = 15; г = 2; / = 2.
C = (1, z = 3. P = (2,
2, 5);
3, 1).
i = 1 i = 2 i = 3
k = 2 k = 3 k = 1
Выход.
= 2; r2 = 5;
r23 = 1 .
Таким образом, в соответствии с выпол- ^g
ненной процедурой РЗР получим, что ко- ц§
ду z = 15 соответствует размещение R = (2, ^
5, 1). В свою очередь, найденное размеще- ^ ние позволяет определить значение целевой функции (4).
Заключение
Укажем на следующие возможности практического приложения процедур кодирования и декодирования комбинаций различных типов (вектор, перестановка, сочетание, размещение) при решении сформулированных комбинаторных задач 1-4.
Если организовать последовательное обращение к процедуре декодирования с числами z = 0, 1,., N - 1, получим полное множество лексикографически отличающихся друг от друга комбинаций того или иного типа. Этот способ получения комбинаций может быть использован в методе лексикографического перебора. Если организовать формирование случайного числа z в диапазоне от 0 до N - 1, после обращения к процедуре декодирования получим случайную комбинацию. Данный прием может быть использован в методе случайного поиска.
Использование процедур кодирования и декодирования комбинаций может дать большой эффект в методе динамического программирования. В общепринятом виде алгоритм динамического программирования состоит из двух этапов — прямого и обратного хода. В процессе прямого хода, состоящего из n шагов, с помощью функционального уравнения определяются последовательности членов рекуррентных соотношений f(X), где X = (x1, x2, ..., x), i = 1, ..., n, и на n-м шаге выявляется оптимальное значение искомой целевой функции F(X *) = opt fn(Xn) = opt F(X) (максимум или минимум). В процессе обратного хода восстанавливается цепочка оптимальной последовательности членов fn(X'n) ^ fn-1(X'n-1) ^ ••• ^ f(Xj), которая и определяет оптимальную комбинацию X* = (x*, x*,... x'n).
99
№ 6 (42) 2012
Наличие двух этапов в алгоритме динамического программирования предполагает организацию табулирования в памяти компьютера членов рекуррентных соотношений для всех п шагов прямого хода, что обусловливает емкостную сложность. Для ее снижения предлагается отказаться от табулирования и хранения членов функционального уравнения для всех п шагов прямого хода, оставляя в памяти значения членов (X) и соответствующих им кодов (сверток) формируемых комбинаций только для текущего /-го шага, I = 1, ..., п. Тогда на п-м шаге оптимальному значению целевой функции (Хп*) будет соответствовать полученный с помощью процедуры кодирования код комбинации г*. После чего обратный ход алгоритма для восстановления элементов комбинации X * = (х*, х*,..., хп) заменяется обращением к процедуре декодирования, что исключает необходимость последовательного просмотра членов рекуррентных соотношений Е| п-го, (п - 1)-го, .. ,,1-го шагов, а следователь-£ но, отпадает надобность их табулирования Ц и хранения в памяти компьютера при пря-£ мом ходе [16].
Л В методе ветвей и границ процедуру ко-| дирования комбинаций можно использовать ^ для нумерации вершин дерева вариантов, =| а процедуру декодирования — для опреде-| ления ветви, соединяющей корень дерева с концевой вершиной, в которой получено ■§ оптимальное значение целевой функции. Ц При этом отпадает необходимость хране-! ния в памяти компьютера ранее разветвлен-Ё ных вершин и указателей связи между ними £ в дереве вариантов, что существенно сни-| жает емкостную сложность реализуемого <э алгоритма [17].
<3 Процедуры кодирования и декодиро-з вания комбинаций могут найти применение при передаче информации по каналам §■ связи в компьютерных сетях и при обмене & данными в многопроцессорных вычислила тельных структурах и многомашинных ком-§ плексах. Изложенный материал исполь-¡1 зован в учебном процессе специальности 5 «Прикладная информатика в экономике»
при чтении лекций, проведении практических занятий, компьютерного собеседования и электронного экзамена [18-20]. Для студентов бакалавриата по направлению «Экономика» используется технология генерирования вариантов контрольных работ по дисциплине «Инструментальные средства анализа экономических данных», а для студентов магистратуры по направлению «Бизнес-информатика» — моделирование проблемных ситуаций по курсу «Теория принятия решений».
Теоретические разработки представленных материалов, положенных в основу ряда изобретений по перестановкам и подтвержденных патентами и авторскими свидетельствами, например [21-23], могут служить прототипом для оформления заявок на полезные модели и изобретения по другим рассмотренным в статье комбинаторным структурам: кортежам, сочетаниям, размещениям. Полезным также является программная реализация рассмотренных процедур на основе современных инструментальных средств с последующей государственной регистрацией и получением соответствующих свидетельств на программные продукты [24, 25].
В заключение отметим, что проведение дальнейших исследований по тематике статьи в рамках представленной профессором А. А. Емельяновым [26] парадигмы имитационного моделирования экономических процессов c использованием инструментальной среды «Actor Pilgrim» является актуальным.
Список литературы
1. Рейнгольд Э, Нивергельт Ю., Део Н. Комбинаторные алгоритмы. Теория и практика. М.: Мир, 1980. — 478 с.
2. Романовский И. В. Дискретный анализ. СПб.: Невский диалект, 2000. — 240 с.
3. Кнут Д. Искусство программирования для ЭВМ. Основные алгоритмы. М.: Мир, 1976. — 736 с.
4. Айгнер М. Комбинаторная теория. М.: Мир, 1982. — 556 с.
5. Кофман А. Введение в прикладную комбинаторику. М.: Наука, 1975. — 256 с.
№ 6 (42) 2012
6. Кнут Д. Искусство программирования. Т. 4. Вып. 2. Генерация всех кортежей и перестановок. М.: ИД Вильямс, 2008. — 160 с.
7. Бабаев А. А. Прикладные модели ресурсно-временной оптимизации: монография. СПб.: Изд-во МБИ, 2012. — 252 с.
8. Бабаев А. А. Процедуры кодирования и декодирования кортежей // Материалы Международной научно-практической конференции «Актуальные задачи математического моделирования и информационных технологий», г. Сочи, 3-9 мая 2012 г. Сочи: РИЦ ФГБОУ ВПО «СГУ», 2012. С. 12-14.
9. Бабаев А. А., Иосса А. Н. Ресурсно-временная оптимизация последовательных этапов инновационного проекта // Современные информационные технологии и ИТ-образование. Сб. избранных трудов: учебно-методическое пособие. Под ред. проф. В. А. Сухомлина. М.: ИНТУИТ. РУ, 2011. С. 628-633.
10. Бабаев А. А. Модели административного управления. Методы и алгоритмы оптимизации. Saarbrücken: LAP LAMBERT Academic Publishing, 2012. — 340 с.
11. Бабаев А. А., Хитёв А. Ю. Программа порождения объектов для поиска решений в задачах комбинаторной оптимизации // Актуальные проблемы экономики и новые технологии преподавания. Материалы IX Международной научно-практической конференции. Т. 3. СПб.: МБИ, 2010. С. 120-123.
12. Бабаев А. А. Процедуры кодирования и декодирования перестановок // Кибернетика. 1984. № 6. С. 75-76.
13. Бабаев А. А., Ледков Е. А. Унификация сферы гостеприимства для проведения Сочинской олимпиады // Европейский исследователь. Мультидисциплинарный научный журнал. 2011, № 5. С. 687-689.
14. Бабаев А. А. Процедуры кодирования и декодирования сочетаний // Кибернетика. 1989. № 5. С. 120-122.
15. Бабаев А. А. Процедуры кодирования и декодирования размещений // Европейский исследователь. Мультидисциплинарный научный журнал. 2012. № 5-1. С. 426-428.
16. Бабаев А. А, Огнев В. Н. Свёртка членов функционального уравнения при оптимизации пока-
зателя надёжности // Надёжность и контроль ^g качества. № 6. 1979. С. 3-9.
17. Бабаев А. А. Формализация и метод решения задачи инкассатора // Вестник С.-Петерб. ун-та. Сер. 5: Экономика. 2010. Вып. 1. С. 134-142.
18. Халин В. Г., Юрков А. В., Бабаев А. А. [и др.]. Прикладная информатика в экономике // Сборник программ учебных дисциплин по специальности 080801 (351400). СПб.: ОЦЭиМ, 2008. — 260 с.
19. Бабаев А. А. Информационные технологии и методы принятия решений: учебно-метод. пособие. СПб.: ОЦЭиМ, 2008. — 198 с.
20. Бабаев А. А. Электронное сопровождение обучения и контроля знаний студентов // Мастер-класс IV Международной научно-практической конференции «Современные информационные технологии и ИТ-образование». 14-16 декабря 2009 г. М.: МГУ. видеозапись. URL: http://www.intuit.ru/ video/97/ (Опубликовано 17.09.2010).
21. Бабаев А. А., Кашин С. М, Поляков А. А,, Ячку-ла Н. И. Устройство для перебора перестановок. Патент № 2012054 на изобретение от 30.04.94.
22. Алексеев О. Г., Бабаев А. А, Ячкула Н. И.Устрой-ство для кодирования и декодирования перестановок // Авторское свидетельство № 1615732 на изобретение от 12.08.90.
23. Бабаев А. А., Киселёв В. Д., Мировицкий Г. П., Русанов Н. А. Устройство для перебора перестановок // Авторское свидетельство № 1517038 на изобретение от 22.06.89.
24. Бабаев А. А, Васенёва Н. Ю., Хитёв А. Ю. Программа для поиска оптимальной стратегии реализации инновационного проекта развития городской инфраструктуры (ОСРГИ) // Свидетельство РФ № 2012618720 о государственной регистрации программы для ЭВМ от 24.09.2012.
25. Бабаев А. А., Ледков Е. А. Программный комплекс управления электронными экзаменами в вузах (EcExam) // Свидетельство РФ № 2012617798 о государственной регистрации программы для ЭВМ от 29.08.2012.
26. Емельянов А. А. Системный анализ и имитационное моделирование пространственно-распределенных экономических процессов // Мастер-класс международной школы-семинара «Бизнес-информатика». 29-30 октября 2012 г. СПб.: СПбГУ, видеозапись. URL: http://spbu-bi.ru/ru/science/ school-seminar (Опубликовано 18.11.2012).
л 101