Вычислительные технологии
Том 12, № 6, 2007
РЕАЛИЗАЦИЯ АЛГОРИТМОВ РЕШЕНИЯ ЗАДАЧИ О ПОКРЫТИИ МНОЖЕСТВ И АНАЛИЗ ИХ ЭФФЕКТИВНОСТИ
Г. И. ЗАБИНЯКО Институт вычислительной математики и математической геофизики СО РАН, Новосибирск, Россия
e-mail:[email protected]
Consecutive and parallel algorithms for the solution of a set of the covering problems, based on the method of branches and borders are considered. Efficiency analysis for both consecutive and parallel algorithms and the comparison of the results they produce against other known algorithms of branches and borders is presented.
Введение
Задача о покрытии множеств формулируется следующим образом. Пусть A = {aij} — матрица размера m х n с элементами aij, равными 0 или 1. Обозначим множество индексов строк через M = {1,... , m} и множество индексов столбцов — N = {1,... , n}. Считается, что столбец j покрывает строку i, если aij = 1. Каждому столбцу j ставится в соответствие положительное число Cj, называемое весом столбца. Требуется найти подмножество S С N, которое покрывает все строки из M и имеет минимальный суммарный вес. Вводя переменные Xj = 1, если j Е S, и Xj = 0 в противном случае, получим постановку задачи целочисленного линейного программирования (ЦЛП):
n
найти min zx = ^^ Cj Xj, AX > e, Xj = 0 или 1 для j Е N, j=i
где e — m-мерный вектор, у которого все ei = 1.
Задачи о покрытии относятся к числу NP-трудных. Задача о покрытии множеств на практике возникает при размещении пунктов обслуживания, в системах информационного поиска, в проектировании интегральных схем и конвейерных линий и в других областях [1]. Обзор методов решения приведен в [1, 2], при этом обзор [2] содержит большой объем экспериментального материала.
Нами дальше рассматриваются последовательный и параллельный алгоритмы, основанные на методе ветвей и границ для задач о покрытии, предложенном в [3]. С использованием тестовых задач из библиотеки тестов OR-Library [4] проводится анализ эффективности последовательного и параллельного алгоритмов и сопоставление с результатами по методу ветвей и границ для решения задач о покрытии из [5, 6]. Программы
© Институт вычислительных технологий Сибирского отделения Российской академии наук, 2007.
выполнены на языке FORTRAN, а для распараллеливания используется система параллельного программирования MPI.
1. Последовательный алгоритм
Для решения задач о покрытии разрабатываются методы ветвей и границ, в которых нижние границы zu (значение целевой функции в двойственных задачах) и верхние zx (значение целевой функции по исходным переменным для Xj = 0 или 1) определяются на основе приближенного решения двойственных задач с помощью субградиентного метода.
Если в исходной постановке ЦЛП требования Xj = 0 или 1 для j £ N заменить на условие Xj > 0, j £ N, то двойственная задача будет иметь вид
найти максимум zu = У ^ щ, при условиях У ^ щ < Cj, ui > 0, i £ M,
ieM ieij
где Ij = {i £ M | aij = 1}, j £ J.
Для сокращения размерности по исходным и двойственным переменным применяются логические процедуры. Логическое тестирование проводят в каждом узле дерева ветвей и границ [3]. Определим множества Ji = {j £ N | aij = 1}.
1. Если | Ji| = 0 для некоторого i £ M, то задача несовместна.
2. Если | Ji| = 1 для некоторого i £ M, то устанавливаются Xj = 1 и соответствующие строки удаляются из рассмотрения, т. е. M := M \ {i}.
3. Пусть существуют k £ N и j £ N такие, что Ik С Ij и Cj < Ck, тогда Xk присваивается 0 и индекс k удаляется из N.
4. Для каждого i £ M определим si = min Cj. Положим Xk = 0 и N = N \ {k}, если
ie Ji
Ck > si. Этот тест не используется, если в исходной постановке все Cj равны между ieifc
собой, например, все Cj = 1 .
Перед первым обращением к процедурам тестирования в корневом узле проводится упорядочение по возрастанию Cj с учетом заполненности столбцов, т. е. для Cj = Ck вначале следует Ck, если заполненность k-го столбца больше заполненности j-го. Для быстрого просмотра индексов ненулей по столбцам и строкам используются разреженные строчный и столбцовый форматы [7, с. 33]. При этом создаются только массивы индексов, а для элементов aij нет необходимости отводить память.
Субградиентный метод. Приближенное решение двойственных задач основывается на модификации варианта субградиентного метода, предложеннного в [8]. Пусть
f (щ) — выпуклая функция, возможно, негладкая, f * = min f (щ), Q — достаточно просто
UeQ
устроенное допустимое множество, например, параллелипипед, тогда в [8] для итерационного процесса
*н _ P Л* At(f' - f (Й*))
' _ PQ I" [f'(Й*)]2 ■
установлена геометрическая скорость сходимости для е < Ак < 2 — е, е > 0; PQ — оператор проектирования на допустимое множество; f '(ик) — градиент в точке ик либо субградиент в случае негладких f. В [8] даются также рекомендации, как приспособить
процесс к случаю, когда оптимум по целевой функции f неизвестен. Однако эти рекомендации в большей степени подходят для решения некоторой индивидуальной задачи в диалоговом режиме, а в нашем случае требуется решение последовательности задач. Для получения двойственных оценок максимизируется функция Лагранжа
L(U) = У2 u + У2 min Cj - V Ui
*—' *—' Xj=0или 1 1 *—'
ieM jew \ ieij
с помощью итерационного процесса
Ufc+1 = max^ 0, uk + ak 11 - ^ x) I >
V jeJi J )
к Ак(¿х - Ь(ик)) „
где ак = —-——. Вместо неизвестного оптимального значения целевой функ-
(1 - Е хк)2
ieJ¿
ции по двойственным переменным выбирают ¿х — значение рекорда (минимального значения гх, полученного к настоящему времени), а начальное значение А < 2. Если в течение последовательности итераций заданной длины I не происходит увеличения Ь(ик), то дробится множитель А к, а именно Ак+1 := А к/2. Для завершения процесса используют разные критерии, например, в [5] процесс завершается, если параметр А к становится меньше заданной величины а в [6] аналогично контролируется величина ак.
В рассматриваемых нами алгоритмах для завершения субградиентного процесса контролируется сходимость по целевой функции. Проверка на завершение субградиентной оптимизации проводится только после выполнения к очередных итераций. Проверяется сходимость последовательности ¿(г?1),... , Ь(п%к), при этом для г1,... , г к определя-
Ь - Ь •
т т ^тах ^тт
ются максимальное и минимальное значения Ьтах и Ьт;п, и если величина---
Ьтах
меньше заданного значения, выполнение итерационного процесса завершается.
В методе ветвей и границ в качестве нижней границы можно использовать значение Ь(и), полученное субградиентной максимизацией. Вектор и не является допустимым, так как не все приведенные стоимости dj = с^ — Е иг положительны. С помощью
простой процедуры [6] можно за счет уменьшения отдельных иг получить допустимое решение двойственной задачи и, причем обычно = Е иг > Ь(и). В рассматривае-
геМ
мых здесь алгоритмах в качестве нижних оценок используются допустимые решения двойственных задач.
Если начальное значение и0 для субградиентной оптимизации не подготовлено на предшествующих шагах алгоритма, то допустимые значения и0 задаются следующей
с -
формулой: и0 = т!п -——, г € М.
зеЛг 11^ |
Алгоритм определения гх. Вычисление значения целевой функции по исходным переменным X проводится после выполнения процедур логического тестирования и определения двойственных оценок и.
Переменные X подразделяются на фиксированные х^ = 1 или Хк = 0 и свободные, которые могут принимать допустимые значения 0 или 1. Пусть М* обозначает набор непокрытых к настоящему времени строк, а Б — набор столбцов, для которых уже определены значения х^-. Тогда алгоритм можно представить следующей схемой.
1. Для всех ] £ N \ Б вычислить О] = 7г/^, где 7г = С] — иг, а ^ = | /] П М
Здесь и далее 131 — число элементов в множестве 3.
2. Среди о] определить минимальное значение о]*. Если индекс ]* определяется не единственным образом, то среди ]* выбирается индекс, которому соответствует минимальное значение с] .
3. Для всех г £ /]* П М* и всех ] £ 3г модифицировать 7г = 7г + иг, ^ = — 1.
4. Положить 5 = 5 и О*}, М* = М* \ /.,•». Проверить, если М* = 0, то перейти к 1, иначе остановиться.
Дальше рассмотрим действия, выполняемые в корневом узле. В самом начале обращаемся к процедурам логического тестирования. Пусть М* — набор непокрытых строк, а Б — набор фиксированных столбцов после выполнения этих процедур. Определим
с -
= шт-], г £ М*, ] £ N \ Б. Исходя из Щ0, определим X и Используя обратимся к процедуре субградиентной максимизации со значением параметра А0 = 2 для определения двойственных оценок и и ги. На основе новых оценок и определим X и Если оказывается, что гх < ги} то задача решена. В противном случае делается попытка исключить некоторые переменные X], для которых гх — ги < ^. Если эта попытка оказывается удачной, в корневом узле повторяются вычисления с вызова процедуры субградиентной максимизации с начальным значением А0 = 0.1 и поиска X.
Если в корневом узле не удается найти оптимального решения, то обращаемся к процедуре ветвления.
Процедура ветвления. При первом обращении к процедуре ветвления в качестве входных данных используется вектор двойственных оценок и, полученный в корневом узле. Для ветвления выбирается строка г, соответствующая максимальной компоненте иг. Элементы ] £ 3г упорядочиваются по возрастанию приведенной стоимости ^ для
... , Упорядоченный список номеров переменных записывается в целочисленный массив и используется для порождения узлов для каждого ] £ 3г. В к-м, создан-
ном согласно упорядочению, узле полагаются х]к = 1 и X],... ,х]к-1 = 0, а переменные Х]к+1,... — свободные.
Кроме массива Ыв^^ для описания дерева решений вводится главный массив дерева решений — целочисленный массив, в котором для описания каждого узла отводится восемь элементов. В этом массиве запоминается строка ветвления для данного шага ветвления. (Шаг ветвления отвечает списку переменных, полученных при одном обращении к процедуре ветвления.) Далее запоминаются следующие величины: номер переменной по порядку в списке Ь^^; начальный и конечный адреса в списке для данного шага ветвления; номер предшествующего узла и др. Кроме того, для каждого узла в вещественном массиве сохраняются значения ги, , соответствующие данному узлу.
После анализа всех узлов шага ветвления производится поиск открытого узла (узел открытый, если > ги и узел еще не использовался для порождения новых узлов) с минимальным значением гх. Предположим, что найден необходимый открытый узел, в котором в качестве строки ветвления использовалась строка г. С использованием перечисленных выше массивов восстанавливаются фиксированные и свободные переменные, вычисляются оценки двойственных переменных и, соответствующие данному узлу. Узел полагается закрытым, производится обращение к процедуре ветвления. В качестве строки ветвления выбирается строка к, которой отвечает максимальная компонента ик
и к = г. Список дополняется упорядоченным списком номеров переменных дан-
ного шага ветвления. Процесс продолжается, пока не будут исчерпаны все открытые узлы.
2. Параллельный алгоритм
В параллельном режиме среди процессорных элементов выделяется нулевой процессор. Данные о задаче считываются этим процессором с дисковой памяти и передаются всем остальным процессорам. Далее все вычисления до получения решения производятся в асинхронном режиме. После получения решения для межпроцессорных обменов используются блокирующие функции. Вначале на всех процессорах выполняются операции, предусмотренные для корневого узла.
После выполнения первого шага ветвления на каждом из процессоров выбирается подмножество узлов из упорядоченного списка, которые обрабатываются на данном процессоре. На к-м процессоре выбираются из списка номера по правилу: ^ = к, = ji+ пишр для < /, где I — общее число элементов в списке, а пишр — количество используемых процессоров. Если для некоторых процессоров к > /, то эти процессоры посылают сообщение об ожидании загрузки на нулевой процессор. Это правило используется только для первого шага ветвления.
Для того чтобы произвести загрузку, нулевой процессор опрашивает задействованные процессоры о количестве открытых узлов. Для определения процессора, с которого будет производиться загрузка, данные о количестве открытых узлов на процессорных элементах упорядочиваются по убыванию. Если на каком-то из процессоров имеется более чем К открытых узлов, то нулевой процессор посылает ему команду на загрузку простаивающего процессора. На процессоре, с которого производится загрузка, определяется К1 = К/3 для передачи простаивающему процессору массивов, описывающих первые по порядку К1 открытых узлов. При этом передаются массивы: список переменных Ыв^^ сформированный на шагах ветвления; главный массив, описывающий дерево решений; вещественный массив значений гх. На передающем процессоре помечаются первые К1 открытых узлов как закрытые, а на принимающем процессоре, после приема данных, решение продолжается с поиска порождающего узла.
При получении на каком-либо из процессоров нового рекорда ¿х значение ¿х передается всем остальным процессорам. Сообщение о рекорде имеет более высокий приоритет, нежели другие сообщения. Поступление сообщений контролируется после решения всех задач шага ветвления, а для рекорда такая проверка делается после решения каждой задачи. Процесс решения завершается, когда на всех процессорах нет открытых узлов. Решение х передается на нулевой процессор в блокирующем режиме, кроме того, на нулевой процессор передаются с каждого процессора статистические данные о количестве обращений к субградиентной максимизации, о количестве проанализированных узлов.
3. Решение тестовых задач
Все задачи решаются при одном и том же выборе управляющих параметров. Пороговое значение параметра е, используемое для завершения субградиентной максимизации
/ Ьтах Ьтт ^ | ..с
I --- < е , принималось в корневом узле равным 10 , а в остальных узлах оно
Ьтах
составляло 10-4. Перед обращением к процедуре ветвления (кроме первого обращения, в котором используются оценки и, полученные в корневом узле) с помощью жадного алгоритма определялось начальное и0 для субградиентной максимизации. При решении задач, соответствующих одному шагу ветвления, в качестве начального и0 принимались скорректированные оценки и из предыдущей задачи. При этом компоненты щ полагались равными 0, если соответствующая i-я строка оказалась покрытой.
Для численных экспериментов использовались те же тестовые задачи, что ив [5, 6]. Это задачи из OR-библиотеки, которые получены с помощью генератора псевдослучайных чисел. Задачи различаются размерностью и заполненностью матриц ограничений, но во всех задачах в качестве значений весов Cj выбираются целые числа из [1,100].
Рассматриваемые нами алгоритмы наиболее близки к алгоритму [3]. К сожалению, в [3] рассматривается решение простых наборов задач, поименованных в OR-библиотеке целыми числами 3, 4, 5 и 6. Рассмотрим результаты решения наиболее трудного набора 6. Набор 6 состоит из пяти задач: 6.1, 6.2, 6.3, 6.4 и 6.5. В них m = 200, n = 1000, заполненность матриц ненулевыми элементами составляет 5 %. Результаты решения сведены в табл. 1, при этом здесь и далее в таблицах kn обозначает число исследованных узлов (найдены значения целевых функций по двойственным и исходным переменным), zxo — значение целевой функции по исходным переменным, полученное в корневом узле. Рассматриваемый нами алгоритм обозначим в таблицах через P. Во второй и в третьей колонках таблицы приведены значения zUo, zX, — соответственно оптимум целевой функции по двойственным переменным в корневом узле, оптимум целочисленного решения по исходным переменным, полученные пакетом ЦЛП [9]. В пакете ЦЛП оценочные задачи линейного программирования решаются симплекс-методом. В больших задачах о покрытии множеств базисные решения сильно вырождены, что затрудняет применение симплекс-метода. Таких трудностей не возникает при решении задач из набора 6. Результаты из [6] даются в двух вариантах расчетов, различающихся выбором числа итерации, после выполнения которых возможно дробление параметра А& в процедуре субградиентной максимизации. В числителе данные для l = 7, а в знаменателе — для l = 30. В нашем случае l = 14. Время в секундах указано для PC CELERON 850.
Рассмотрим основные различия нашего алгоритма и алгоритма из [3]. В нашем случае делаются дополнительные вычисления в корневом узле, чтобы исключить большее число переменных. Например, в задаче 6.4 после логического тестирования из 1000 переменных остаются 224 переменные, а за счет дополнительных вычислений, на основе анализа приведенных стоимостей, исключаются еще 122 переменные. Кроме исключения переменных, дополнительные вычисления позволяют улучшить двойственные оценки, получаемые в корневом узле.
В [3] начальные приближения и вычисляются с помощью "жадного" алгоритма, полу-
Таблица 1.
Имя ЦЛП Алгоритм [3] Алгоритм P Алгоритм [5] Алгоритм [6]
Z* zuo z* zx zu0 kn zuo kn zxo t,c kn zxo kn zxo
6.1 133.14 138 132.13 439 132.79 41 145 11 195 141 77/15 142/140
6.2 140.46 146 140.14 451 140.16 86 153 21 171 146 45/23 156/147
6.3 140.13 145 138.96 136 139.23 56 148 12 15 145 7/3 145/145
6.4 129.00 131 128.76 36 128.85 11 132 2 3 131 4/1 132/131
6.5 153.35 161 152.43 369 152.38 93 168 21 271 162 53/20 170/163
ченное u уточняется 3-opt процедурой. В процедуре рассматриваются тройки Uji, ui2, ui3 и делается попытка за счет уменьшения одной из переменных увеличить на ту же положительную величину две другие. Затем применяется не более 100 итераций субградиентной максимизации.
В алгоритме ветвления из [3] строка ветвления выбирается из максимума
U Е xj — 1 , где Xj — компоненты исходных переменных, отвечающие рекорду. В
yej J
нашем случае строка i соответствует максимальной компоненте Uj. Использование информации о рекорде может приводить к выбору строки i с малым значением компоненты Ui, кроме того, использование рекорда в процедуре ветвления затрудняет процесс распараллеливания.
При определении решения по исходным переменным в [3] отдается предпочтение тем непокрытым строкам, для которых достигается максимум Uj| Jj|. В нашем же случае на каждом шаге просматриваются все непокрытые строки, и алгоритм определения zx в точности такой, как в [10].
Далее для численных экспериментов использовалась кластерная система HKC—160, вычислительные модули которой состоят из двух процессоров Intel Itanium 2 с тактовой частотой 1.6 ГГц. Вычислительные модули связаны между собой при помощи коммутатора Infini Band с производительностью 10 Гбит/с, который обеспечивает обмен данными между параллельными процессами.
Таблица 2.
Алгоритм [5] Алгоритм [6] Алгоритм P CPLEX MINTO
Имя 2* zx z* kn zxo kn zxo kn kopt zxo t,c kn kn
A.1 253 246.8 515 255 95/74 261/258 107 13 258 7 44 55
A.2 252 247.5 809 256 28/25 257/254 426 117 257 24 18 85
A.3 232 228.0 857 234 41/29 243/237 398 344 239 23 37 71
A.4 234 231.4 63 235 10/5 241/235 22 8 237 1 10 13
A.5 236 234.9 79 237 3/1 237/236 135 133 245 8 10 13
B.1 69 64.5 411 70 81/24 72/69 132 86 70 19 40 67
B.2 76 69.3 3273 77 939/483 78/76 358 23 77 94 173 301
B.3 80 74.2 1383 80 288/181 81/81 519 162 85 117 66 261
B.4 79 71.2 4381 80 1508/974 83/79 978 175 83 238 301 1403
B.5 72 67.7 661 72 69/47 75/72 172 44 73 29 56 93
C.1 227 223.8 1265 230 34/22 235/230 616 549 230 34 38 39
C.2 219 212.8 275 223 145/104 224/220 412 352 223 42 61 91
C.3 243 234.6 15757 251 291/458 249/248 3775 718 254 384 129 489
C.4 219 213.8 493 224 116/55 233/224 377 377 229 33 38 27
C.5 215 211.6 375 217 91/38 219/217 107 57 220 11 13 47
D.1 60 55.3 3393 61 337/328 64/61 253 143 61 122 210 324
D.2 66 59.3 6739 68 2771/1498 70/67 967 176 67 487 575 2791
D.3 72 65.1 19707 75 5120/2219 76/74 2017 390 74 774 324 2055
D.4 62 55.8 12389 64 2931/1631 67/63 669 305 65 288 315 1957
D.5 61 58.6 147 62 18/14 61/61 32 25 62 9 43 13
Примечание. Заполненность матриц ненулевыми элементами в задачах наборов А, С составляет 2 %, а в задачах наборов В и Б — 5 %.
Таблица 3.
Имя 2* 2«0 Последовательный алгоритм Параллельный алгоритм
2«0 2Х кв кп кор1 ¿1,с кв кп ¿10, с ¿1Д10
Е.1 21.4 21.2 29 254186 36809 2 63000 254193 36810 7114 8.9
Е.2 22.4 22.1 30 493746 75533 12982 145986 648328 107915 19501 7.5
Е.3 20.15 20.3 27 68796 10250 952 21882 68938 11186 3131 7.0
Е.4 21.4 21.2 28 249012 37260 3198 68516 287999 45457 8774 7.8
Е.5 21.3 21.1 28 72572 10618 0 21736 72586 10618 2862 7.6
Р.1 8.8 8.6 14 49660 6775 0 21160 44427 6009 3023 7.0
Р.2 10.0 9.6 15 29073 4002 0 13798 26248 3676 1703 8.1
Р.3 9.5 9.0 14 8456 1152 79 5688 9534 1463 932 6.2
Р.4 8.5 8.3 14 103874 14077 696 39416 107311 14683 5496 7.2
Р.5 7.8 7.6 13 113074 16629 4356 41645 108789 17852 6009 6.9
Примечание. В задачах т = 500, п = 5000. Заполненность ненулевыми элементами
в задачах набора Е составляет 10%, а в задачах набора Р — 20%.
В табл. 2, в колонке г*, приводится оптимальное значение целевой функции по исходным переменным, а в колонке г«0 — оптимальное значение по двойственным переменным в корневом узле. Для наборов задач А, В, С и Б, используемых далее, известны оптимальные решения. Значения величин г** и г«0 взяты из обзора [2]. В табл. 2 используются те же обозначения, что и в табл. 1. Дополнительно для результатов по нашему алгоритму приводится номер узла по порядку кор, в котором было найдено оптимальное решение. В табл. 2 приводится также количество исследованных узлов при решении задач с помощью ЛП программ СРЬЕХ и МШТО [2]. В задачах наборов А, В т х п = 300 х 3000, а в С и Б — т х п = 400 х 4000.
Сравнение величин кп и кор позволяет сделать вывод, что в нашем случае основные затраты алгоритма приходятся на обоснование оптимальности.
В табл. 3 содержатся данные для сравнения алгоритмов в последовательном и параллельном режимах. Численные эксперименты приведены с использованием наборов Е и Р из ОИ,-библиотеки. Поскольку в этих задачах не найдены строго обоснованные оптимальные решения, в [2] приводятся минимальные из полученных решений. В колонке г«0 даны оптимальные значения целевой функции по двойственным переменным в корневом узле, которые получены с помощью линейного программирования [2]. В табл. 3 дается величина кв — число обращений к субградиентной максимизации. В параллельном режиме использовалось 10 процессорных элементов.
Из табл. 3 видно, что кп ^ кор и число обращений к субградиентной максимизации может в несколько раз превосходить кп. Полученные у нас значения гх совпадают с приведенными в [2].
Заключение
Разработаны последовательный и параллельный алгоритмы для решения задач о покрытии множеств. Последовательный алгоритм позволяет эффективно решать задачи
небольшой и средней размерностей. Для больших задач с высокой заполненностью матриц целесообразно использовать параллельный алгоритм.
Автор выражает благодарность Ю.А. Кочетову за полезные обсуждения.
Список литературы
[1] Еремеев А.В., Заозерская Л.А., Колоколов А.А. Задача о покрытии множества: сложность, алгоритмы, экспериментальные исследования // Дискрет. анализ и исслед. операций. Сер. 2. 2000. Т. 7, № 2. С. 22-46.
[2] Caprara A., Toth P., Fischetti M. Algorithms for the set covering problem // Anals of Oper. Res. 2000. Vol. 98. P. 353-371.
[3] Fisher M.L., Kedia P. Optimal solutions of set covering/partitioning problems using dual heuristics // Management Sci. 1990. Vol. 36. P. 674-688.
[4] Beasley J.E. OR-Library: distributing test problems by electronic mail //J. Oper. Res. Soc. 1990. Vol. 41. P. 1069-1072.
[5] Beasley J.E. An algorithm for set covering problems // European J. Oper. Res. 1987. Vol. 31. P. 85-93.
[6] Balas E., Carrera M.C. A dynamic subgradient-based branch-and-bound procedure for set covering // Oper. Res. 1996. Vol. 44, N 6. P. 875-890.
[7] Писсанецки С. Технология разложенных матриц. Пер. с англ. М.: Мир. 1988.
[8] Поляк Б.Т. Минимизация негладких функционалов // Журн. вычисл. мат. и математической физ. 1969. Т. 9, № 3. С. 509-521.
[9] Забиняко Г.И. Пакет программ целочисленного линейного программирования // Дискрет. анализ и исслед. операций. Сер. 2. 1999. Т. 6, № 2. С. 32-41.
[10] Caprara A., Fishetti M., Toth P. A heuristic method for the set covering problem // Oper. Res. 1999. Vol. 47, № 5. P. 730-743.
Поступила в редакцию 7 февраля 2007 г., в переработанном виде — 1 августа 2007 г.