- •Предисловие
- •Введение
- •Алгоритмы и их сложность
- •Примеры задач и алгоритмов
- •Задачи на графах: «Коммивояжер», «Кратчайшие пути», «Остовные деревья»
- •Приближенные алгоритмы: «Составление расписаний»
- •«Сортировка слиянием»
- •«Быстрая сортировка»
- •Формально об алгоритмах. Несложно о сложности
- •«RAM»: машины с произвольным доступом
- •Сложность в худшем случае
- •Сложность в среднем
- •Полиномиальные алгоритмы
- •Полиномиальность и эффективность
- •Аппроксимация с гарантированной точностью
- •Алгоритмы с оценками точности
- •Жадные алгоритмы для «Покрытия множеств»
- •Приближенные алгоритмы для «Вершинного покрытия»
- •Жадный алгоритм для «Рюкзака»
- •Алгоритм Кристофидеса
- •Аппроксимация с заданной точностью
- •«Рюкзак»: динамическое программирование
- •Полностью полиномиальная приближенная схема для «Рюкзака»
- •Вероятностный анализ детерминированных алгоритмов
- •Сложность и полиномиальность в среднем
- •Задача упаковки
- •Выполнимость КНФ
- •Точность алгоритма для почти всех входов
- •«Рюкзак»: полиномиальность в среднем
- •Вероятностные алгоритмы и их анализ
- •Вероятностная проверка тождеств
- •Максимальное по включению независимое множество в графе
- •Протокол византийского соглашения
- •Вероятностное округление
- •Максимальный разрез в графе
- •Методы дерандомизации
- •Метод условных вероятностей
- •Метод малых вероятностных пространств
- •Полиномиальная проверка простоты
- •Основы теории сложности вычислений
- •Сложность вычислений
- •Машины Тьюринга и вычислимость
- •Сводимость по Куку
- •Недетерминированные алгоритмы
- •Сводимость по Карпу
- •Вероятностные вычисления
- •Вероятностно проверяемые доказательства
- •Схемы и схемная сложность
- •Коммуникационная сложность
- •Диаграмма классов сложности
- •Приложения
- •Введение в Python
- •Глоссарий
- •Предметный указатель
- •Список алгоритмов
Глава 3
Вероятностный анализ детерминированных алгоритмов
3.1Сложность и полиномиальность в среднем
Среди подходов к решению NP-трудных задач можно выделить два основных. Первый заключается в построении приближенных алгоритмов с гарантированными оценками точности получаемого решения (этот подход уже был рассмотрен нами в главе 2), а второй — в отказе от анализа сложности алгоритмов по наихудшему случаю и переходе к анализу сложности в среднем. Настоящая глава посвящена изучению второго подхода (анализу сложности в среднем).
Известно, что большинство задач дискретной оптимизации является NP-трудным, и для них существование полиномиальных алгоритмов маловероятно. Несмотря на это, для многих исходных данных
118
3.1. СЛОЖНОСТЬ И ПОЛИНОМИАЛЬНОСТЬ В СРЕДНЕМ |
119 |
(входов) такие задачи бывают легко разрешимы на практике. Дело в том, что вся трудность задачи может заключаться в небольшом подмножестве входов. Проблема нахождения таких входов важна для экспериментальной оценки эффективности алгоритмов и в то же время играет заметную роль в математической криптографии. Концепция сложности в среднем для таких задач представляется более адекватной, чем концепция сложности в худшем случае.
Имеется еще одно соображение в пользу перехода от анализа по худшему случаю к анализу сложности в среднем. Оно состоит в том, что некоторые практически эффективные алгоритмы не являются эффективными при анализе по худшему случаю. Пожалуй, наиболее известным примером такого алгоритма является симплекс-метод решения задач линейного программирования, который, не являясь полиномиальным алгоритмом, поразительно хорошо зарекомендовал себя при решении практических задач.
Таким образом, естественные попытки ослабить требования в определении эффективности привели к понятию сложности в среднем (average case complexity), под которым, грубо говоря, понимается математическое ожидание времени работы алгоритма при заданном вероятностном распределении на исходных данных. С середины 80-х годов начала развиваться теория сложности в среднем, в некотором смысле аналогичная теории полиномиальной сводимости для NP-трудных задач. Кроме того, для ряда NP-полных задач удалось построить полиномиальные в среднем алгоритмы. Однако достигнутые здесь успехи оказались гораздо скромнее результатов в теории сложности при анализе по худшему случаю.
В последнее время получен ряд интересных результатов для задач типа рюкзака с константным числом ограничений, введено новое понятие «сглаженной сложности» (smoothed complexity) и доказано, что некоторые варианты симплекс-метода имеют полиномиальную сглаженную сложность. Построены приближенные полиномиальные в среднем алгоритмы нахождения максимальной клики в графе с гарантируемыми оценками точности, существенно лучшими аналогичных оценок для худшего случая.
Перейдем к конкретизации сказанного выше. Пусть для данного алгоритма A время его работы на входе I обозначается через TA(I). Пусть также для каждого натурального n задано распределение вероятно-
120 |
Глава 3. ВЕРОЯТНОСТНЫЙ АНАЛИЗ ДЕТЕРМИНИРОВАННЫХ АЛГОРИТМОВ |
стей на входах I длины n, обозначаемое Pn(I). Поскольку T является случайной величиной, естественным кажется определить среднее время работы алгоритма A как математическое ожидание времени работы алгоритма En TA на входах длины n.
Определение 3.1.1. «Полиномиальный в среднем (точно)»
Алгоритм A называется полиномиальным в среднем, если среднее время его работы ограничено полиномом от длины входа, т. е.
9C > 0 : En TA = O(nC):
Однако в теоретических работах, касающихся теории сводимости и сложности в среднем, полиномиальность в среднем принято определять по-другому. Причина состоит в том, что приведенное выше определение слишком чувствительно: изменение T на T 2 (типичная оценка при симуляции одной вычислительной модели на другой) может привести к тому, что алгоритм, полиномиальный в среднем, скажем, на модели RAM, не является полиномиальным в среднем на машине Тьюринга.
Упражнение 3.1.1. Приведите пример функции TA (времени работы некоторого алгоритма A) и распределения исходных данных Pn(I), для которых TA является полиномиальной в среднем (En TA = O(nc)), а TA2 — нет.
Эту ситуацию нельзя признать удовлетворительной, поскольку ничего подобного не происходит при анализе сложности по худшему случаю: определение полиномиального алгоритма не зависит от выбранной модели вычислений.
Поэтому в теоретических работах, касающихся теории сводимости и сложности в среднем, используют обычно другое определение.
Определение 3.1.2. «Полиномиальный в среднем»
3.2. ЗАДАЧА УПАКОВКИ |
121 |
Алгоритм называется полиномиальным в среднем, если для времени работы алгоритма T выполняется:
9" > 0 : En T " = O(n):
Тем не менее, в исследовании сложности в среднем конкретных алгоритмов обычно используется определение 3.1.1 «Полиномиальный в среднем (точно)» с указанием конкретной вычислительной модели, для которой проводится анализ (обычно это машины с произвольным доступом к памяти — RAM). Мы в следующих разделах также будем следовать этому определению.
3.2Задача упаковки
Алгоритм динамического программирования для задачи упаковки подмножеств. Полиномиальность алгоритма «в среднем».
Задача 15. «Упаковка» (Packing)
Дано конечное множество L из m элементов и система его подмножеств S1, …, Sn. Требуется найти максимальную по числу подмножеств подсистему попарно непересекающихся подмножеств.
При реализации и анализе алгоритмов гораздо удобней формализовать представление отношений между элементами и подмножествами в виде матрицы инцидентности.
122 |
Глава 3. ВЕРОЯТНОСТНЫЙ АНАЛИЗ ДЕТЕРМИНИРОВАННЫХ АЛГОРИТМОВ |
Определение 3.2.1. Пусть
L = fl1; : : : ; lmg — m-элементное множество; fS1; : : : ; Sng — семейство подмножеств L;
Тогда
•Элемент li и подмножество Sj инцидентны, если li 2 Sj.
•Матрицей инцидентности называется f0;1g-матрица A = (aij) размером m n, для которой: aij = 1 , элемент li и подмножество Sj инцидентны.
Таким образом, задача 15 «Packing» будет эквивалентна следующей 0–1 целочисленной линейной программе:
n |
|
|
∑ xj ! max; |
|
|
j=1 |
|
|
xj 2 f0; 1g |
8j : 1 j n; |
(3.1) |
n |
|
|
∑ aijxj 1 |
8i : 1 i m: |
|
j=1
В этой целочисленной линейной программе n столбцов и переменных x1; : : : ; xn соответствуют подмножествам S1; : : : ; Sn и их включению в решение, а 0–1-матрица инцидентности A = (aij) размера
3.2. ЗАДАЧА УПАКОВКИ |
123 |
m n описывает состав каждого подмножества (см. определение 3.2.1 «Инцидентность»). Таким образом, m строк-ограничений, соответствующих m предметам, очевидным образом выражают ограничение на попарную непересекаемость выбранных подмножеств ни по одному предмету, а целевая функция равна числу таких подмножеств.
Заметим, что в литературе «Упаковкой подмножеств» называется иногда и более общая постановка ЦЛП, где c1; : : : ; cn и b1; : : : ; bm — произвольные положительные целые числа:
|
∑j |
|
|
|
n |
|
|
|
cjxj ! max; |
|
|
|
=1 |
|
|
8j : 1 j n xj 2 f0; 1g; |
|
|
|
|
∑j |
|
|
|
n |
|
|
8i : 1 i m |
aijxj bi: |
|
|
|
=1 |
|
|
Известно, что задача 15 «Packing» NP-полна [Joh90]. |
n |
наборов подмно- |
|
Тривиальный метод решения задачи 15 «Packing» — полный перебор всех N = 2 |
|
||
жеств с проверкой на совместность и выбором набора, содержащего наибольшее число подмножеств. Более перспективный подход — ограничить перебор по допустимым решениям задачи, применив
метод динамического программирования.
Обозначим через Xj множество всех допустимых булевых векторов для системы с n j нулевыми последними компонентами и через ej — вектор размерности n с единичной j-й компонентой и остальными нулевыми компонентами. Тогда можно строить множество допустимых решений Xj на основе множества Xj 1, пытаясь добавить вектор ej ко всем допустимым решениям из Xj 1. Более формально это описано в алгоритме 28.
124 |
Глава 3. ВЕРОЯТНОСТНЫЙ АНАЛИЗ ДЕТЕРМИНИРОВАННЫХ АЛГОРИТМОВ |
Алгоритм 28 «Упаковка»: динамическое программирование
def PackingDynP(A):
m, n = A.shape
X=[( zeros(n, int), #решение zeros(m, int), #покрытие
0 )] #размер покрытия for j in xrange(n):
Sj = get_column(j)
for sol, cov, size in X[:]: newcov = cov+Sj
if max(newcov) <= 1: newsol = copy(sol) newsol[j] = 1 X.append( (
newsol,
newcov, size + 1) )
return get_optimal_set(X)
Работа алгоритма показана на рис. 3.2.
3.2. |
ЗАДАЧА УПАКОВКИ |
125 |
|||||||
[[0 1 |
0 1] |
|
|
|
|
|
|
|
|
[1 0 |
1 |
0] |
|
|
|
|
|
|
|
[0 1 |
1 0]] |
--> 3x4-matrix |
|
A |
|
||||
column(0)+< |
[0 0 |
0 |
0], [0 |
|
0 |
0]> |
|
||
=> [0 1 0]+[0 |
0 |
0]=[0 |
1 |
|
0] => [1 0 0 0] |
|
|||
column(1)+< [0 0 |
0 |
0], [0 |
|
0 |
0]> |
|
|||
=> [1 0 1]+[0 |
0 |
0]=[1 |
0 |
|
1] => [0 1 0 0] |
|
|||
column(1)+< [1 0 |
0 |
0], [0 |
|
1 |
0]> |
|
|||
=> [1 0 1]+[0 |
1 |
0]=[1 |
1 |
|
1] => [1 1 0 0] |
|
|||
column(2)+< [0 0 |
0 |
0], [0 |
|
0 |
0]> |
|
|||
=> [0 1 1]+[0 |
0 |
0]=[0 |
1 |
|
1] => [0 0 1 0] |
|
|||
column(3)+< [0 0 |
0 |
0], [0 |
|
0 |
0]> |
|
|||
=> [1 0 0]+[0 |
0 |
0]=[1 |
0 |
|
0] => [0 0 0 1] |
|
|||
column(3)+< [1 0 |
0 |
0], [0 |
|
1 |
0]> |
|
|||
=> [1 0 0]+[0 |
1 |
0]=[1 |
1 |
|
0] => [1 0 0 1] |
|
|||
column(3)+< [0 0 |
1 |
0], [0 |
|
1 |
1]> |
|
|||
=> [1 0 0]+[0 |
1 |
1]=[1 |
1 |
|
1] => [0 0 1 1] |
|
|||
Выбран набор [1 |
1 |
0 0] |
размером 2 |
|
|||||
Рис. 3.1: Работа алгоритма 28 «Упаковка-ДинПрог»
Нетрудно убедиться, что сложность алгоритма 28 «Упаковка-ДинПрог» составляет O((m + n)njXnj). Действительно, внешний цикл — O(n), внутренний — O(jXnj), проверка на допустимость и добавление нового решения — O(m + n).
Таким образом, сложность алгоритма существенно зависит от размера множества допустимых решений, возникающих при выполнении алгоритма.
Упражнение 3.2.1. Какие входные данные для алгоритма 28 «Упаковка-ДинПрог» заставят его работать
126 |
Глава 3. ВЕРОЯТНОСТНЫЙ АНАЛИЗ ДЕТЕРМИНИРОВАННЫХ АЛГОРИТМОВ |
экспоненциально долго? А какие — за O(n3)?
Но можно показать, что алгоритм 28 «Упаковка-ДинПрог» может быть полиномиальным в среднем¹, т. е. работать эффективно на случайных входных данных.
Теорема 9. Пусть aij в (3.1) являются независимыми случайными величинами, принимающими значения f0; 1g, причем выполняется:
Pfaij = 1g = p; |
|
Pfaij = 0g = 1 p; |
(3.2) |
mp2 ln n: |
|
Тогда алгоритм 28 «Упаковка-ДинПрог» является полиномиальным в среднем.
Доказательство. Математическое ожидание времени работы алгоритма есть O(nm E jXnj). Поэтому для доказательства теоремы 9 достаточно будет оценить сверху математическое ожидание размера множества Xn. Пусть k > 0,
xk — вектор с k единицами (на позициях fj1; : : : ; jkg) и n k нулями;
pki — вероятность выполнения i-го неравенства для xk;
Pk — вероятность того, что xk — допустимое решение.
Упражнение 3.2.2. Чему будет равны xk, pki и Pk при k = 0?
¹Причем в более строгом варианте, в смысле определения 3.1.1 «Полиномиальный в среднем (точно)».
3.2. ЗАДАЧА УПАКОВКИ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
Сначала оценим сверху pki: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pki P { |
n |
aijxj(k) 1} = P |
8 |
|
|
|
|
|
|
|
19 |
|
|
|
|||||||||
|
|
|
|
|
|
aij |
= |
|
|
||||||||||||||
|
j=1 |
|
|
|
|
|
|
|
: |
|
j1 |
; :::;jk |
|
|
; |
|
|
|
|||||
|
|
|
|
|
|
|
|
<j |
2f |
g |
|
= |
|
|
|
||||||||
|
∑ |
|
|
|
aij = 09 |
|
|
|
|
|
∑ |
aij = 19 |
|
|
|||||||||
= P |
8 |
|
|
|
|
|
+ P |
8 |
|
|
|
|
|
= |
|
||||||||
|
<j |
2f |
j1 |
; :::;jk |
g |
|
= |
|
|
|
<j |
2f |
j1; :::;jk |
g |
|
= |
|
|
|||||
|
|
∑ |
|
|
p)k |
|
|
|
|
|
|
∑ |
|
; |
|
|
|||||||
= (1 |
p |
k |
+ |
kp |
(1 |
1 |
= |
(1 |
|
|
p)k 1(1 + p(k |
1)) |
|
||||||||||
|
: |
) |
|
|
; |
|
: |
|
|
|
|
|
|
|
|
||||||||
(1 p)k 1(1 + p)k 1 = (1 p2)k 1 e p2(k 1):
Теперь оценим собственно вероятность попадания xk в допустимые решения:
m |
m |
Pk = pki e p2(k 1) = e mp2(k 1): |
|
=1 |
i=1 |
∏i |
∏ |
n |
n |
∑ ( )
Упражнение 3.2.3. Докажите, что E jXnj = k=0 k Pk.
Следовательно, мы можем оценить математическое ожидание мощности Xn следующим образом:
