Анализ комбинаторных
алгоритмов
Лекция №11
Приближенные
алгоритмы
Приближенные алгоритмы
 Часто, возникшая на практике NP-полная
задача настолько важна, что нельзя отказаться
от ее решения.
 Если реальные данные позволяют, можно
построить неполиномиальный алгоритм для
данной задачи.
 В случае, если неполиномиальный алгоритм
не работает в приемлемое время, можно
попытаться (применительно к задачам
оптимизации) найти не точное решение, а
некоторое приближенное к нему.
Приближенные алгоритмы
 Алгоритмы, выдающие приближенные к
оптимальному решения, называются
приближенными.
 Говорят, что алгоритм решает задачу с
ошибкой не более чем в раз, если
стоимость найденного им решения (С)
отличается от стоимости оптимального (С*)
не более чем в раз.
)(nρ
)(nρ
)()/,/max( **
nCCCC ρ≤
Приближенные алгоритмы
 Иногда, для оценки качества алгоритма
используют относительную ошибку. Говорят,
что алгоритм имеет относительную ошибку не
более , если:
 Зная легко можно оценить относительную
ошибку.
)(*
*
n
C
CC
ε≤
−
)(nε
)(nρ
1)()( −≤ nn ρε
Приближенные алгоритмы
 Для некоторых алгоритмов можно улучшать
качество приближения, за счет увеличения
времени их работы.
 Схемой приближения для данной
оптимизационной задачи называется
алгоритм, который, помимо условия задачи
получает положительное число и выдает
решение с относительной ошибкой не более
)(nε
)(nε
Приближенные алгоритмы
 Схема приближения называется полиномиаль-
ной, если для некоторого фиксированного ε
время ее работы не превосходит некоторого
полинома от размера входа (n).
 Схема приближения называется полностью
полиномиальной, если время ее работы
ограничено некоторым полиномом от n и от 1/ε,
где n-размер входа, а ε – оценка относительной
ошибки.
Задача о вершинном покрытии
 Вершинное покрытие – такое множество
вершин графа, что хотя бы один из концов
любого ребра соединен с вершиной входящей
в это множество.
 Размер вершинного покрытия – количество
входящих в него вершин.
 Задача требует нахождения минимально
возможного вершинного покрытия графа.
Задача о вершинном покрытии
void ApproxVertexCover(G){
C = {}; //пустое множество
E = G->E; // множество ребер графа
while (E != {}){
Edge uv = ExctractRandom(E);
//Берем произвольное ребро графа
C->Include(uv->node1);
C->Include(uv->node2);
//Вносим вершины, которое соединяет это ребро
//во множество C
E->RemoveEdges(uv->node1);
E->RemoveEdges(uv->node2);
//Удаляем все ребра инцидентные с вершинами
}
}
Задача о вершинном покрытии
Оптимальное
решение
Приближенное
решение
Задача о вершинном покрытии
Теорема
Алгоритм ApproxVertexCover работает с ошибкой не
чем в два раза.
Доказательство
Результатом работы алгоритма действительно является вершинное
покрытие, поскольку работа продолжается пока множество
непокрытых ребер не останется пустым.
Никакие два ребра, рассматриваемые в ходе работы алгоритма, не
имеют общей вершины, т.е. количество рассмотренных вершин
ровно в два раза больше количества рассмотренных ребер.
Кроме того, оптимальное покрытие содержит хотя бы одну
вершину инцидентную рассматриваемому ребру, т.е. количество
вершин в оптимальном решение больше либо равно количеству
рассмотренных ребер.
Задача коммивояжера
 Задача коммивояжера состоит в нахождении
во взвешенном графе гамильтонова цикла
минимальной стоимости (с минимальной
суммой весов ребер).
 На практике функция стоимости ребер обычно
удовлетворяет неравенству треугольника,
т.е. промежуточная «остановка» в вершине v
на пути из u в w не уменьшает его стоимости:
с(u,w)<= c(u,v) + c(v,w)
Задача коммивояжера
u
v
w
Задача коммивояжера
void ApproxTSPTour(G,c){
//выбираем произвольную вершину
root = GetRandomVertex(G);
//строим минимальное покрывающее дерево
mintree = MSTPrim(G,root);
//результатом является обход дерева с
// исключенными повторениями
path = TreeWalk(mintree);
DeleteRepetition( path);
}
Задача коммивояжера
a
b
c h
d
e
f g
a
b
c h
d
e
f g
Исходные данные Минимальное
покрывающее дерево
a
b
c h
d
e
f g
a b c b h b a d e f e g e d a
a b c h d e f g
Задача коммивояжера
a
b
c h
d
e
f g
a
b
c h
d
e
f g
Задача коммивояжера
Теорема
Алгоритм ApproxTSPTour решает задачу
коммивояжера с ошибкой не более чем в два
разе, если выполнено неравенство
треугольника.
Теорема
Если P≠NP и ρ>1, то не существует поли-
номиального приближенного алгоритма,
решающего общую задачу коммивояжера с
ошибкой не более чем в ρ раз.
Задача о суммах подмножеств
 Пусть дано некоторое множество S, состоящее
из целых чисел, и целое число t. Требуется
выяснить существует ли в S подмножество
сумма элементов которого равна t.
 Задачу можно поставить как задачу
оптимизации, требуя отыскать среди
подмножеств сумма которых не превосходит
t, наиболее близкое к t.
Задача о суммах подмножеств
 Для задачи можно построить алгоритм
работающий за экспоненциальное время.
 Для его реализации нужны две процедуры:
 MergeList(L1,L2) – сливает два отсортированных
списка в один отсортированный список.
 AddList(L,x) – создает список с элементами
равными сумме соответствующего элемента списка
L и числа x. Например, AddList({1,2,3,5,9},2)
выдаст результат {3,4,5,7,11}
Задача о суммах подмножеств
void EXPSubSetSum(S,t){
n = Length(S);
L[0] = {0};
for(i=1; i<=n; i++){
L[i] = MergeList(L[i-1],AddList(L[i-1],S[i]));
//Удаляем из L[i] элементы больше t
DeleteMoreThanT(L[i],t);
}
//возвращаем максимальный элемент из L[n]
return Maximum(L[n]);
}
Задача о суммах подмножеств
L[0] 0
L[1] 0 101
L[2] 0 101 102 203
L[3] 0 101 102 203 201 302 303 404
S = {101,102,201} t=308
Задача о суммах подмножеств
 Из приведенного алгоритма можно получить
полностью полиномиальную схему приближения,
если хранить списки не полностью, а в сокращенном
варианте.
 Степень сокращения определяется параметром δ: чем
он меньше, тем «полнее» список.
 Список L` называется δ-сокращением списка L, если
для любого элемента y из L в списке L` найдется не
превосходящий его элемент z для которого выполнено
неравенство:
δ≤
−
y
zy
Задача о суммах подмножеств
L = {10,11,12,15,20,21,22,23,24,29}, δ = 0.1
L`= {10,12,15,20,23,29}
void ListTrim(L,delta)
{
m = Length(L);
Ls = {L[1]};
last = L[1];
for(i=2; i<=m; i++)
if (last < (1-delta)/y[i]){
L->Add(y[i]);
last = y[i]
}
}
Задача о суммах подмножеств
void ApproxSubSetSum(S,t,epsilon){
n = Length(S);
L[0] = {0};
for(i=1; i<=n; i++){
L[i] = MergeList(L[i-1],AddList(L[i-1],S[i]));
L[i] = ListTrim(L[i], e);
//Удаляем из L[i] элементы больше t
DeleteMoreThanT(L[i],epsilon/n);
}
//возвращаем максимальный элемент из L[n]
return Maximum(L[n]);
}
Задача о суммах подмножеств
Теорема
Алгоритм AppeoxSubSetSum является
полностью полиномиальной схемой
приближения для задачи о суммах
подмножеств.
Число элементов в любом из списков не
превосходит 2
log
+
ε
tn

Лекция 11 Приближенные алгоритмы

  • 1.
  • 2.
    Приближенные алгоритмы  Часто,возникшая на практике NP-полная задача настолько важна, что нельзя отказаться от ее решения.  Если реальные данные позволяют, можно построить неполиномиальный алгоритм для данной задачи.  В случае, если неполиномиальный алгоритм не работает в приемлемое время, можно попытаться (применительно к задачам оптимизации) найти не точное решение, а некоторое приближенное к нему.
  • 3.
    Приближенные алгоритмы  Алгоритмы,выдающие приближенные к оптимальному решения, называются приближенными.  Говорят, что алгоритм решает задачу с ошибкой не более чем в раз, если стоимость найденного им решения (С) отличается от стоимости оптимального (С*) не более чем в раз. )(nρ )(nρ )()/,/max( ** nCCCC ρ≤
  • 4.
    Приближенные алгоритмы  Иногда,для оценки качества алгоритма используют относительную ошибку. Говорят, что алгоритм имеет относительную ошибку не более , если:  Зная легко можно оценить относительную ошибку. )(* * n C CC ε≤ − )(nε )(nρ 1)()( −≤ nn ρε
  • 5.
    Приближенные алгоритмы  Длянекоторых алгоритмов можно улучшать качество приближения, за счет увеличения времени их работы.  Схемой приближения для данной оптимизационной задачи называется алгоритм, который, помимо условия задачи получает положительное число и выдает решение с относительной ошибкой не более )(nε )(nε
  • 6.
    Приближенные алгоритмы  Схемаприближения называется полиномиаль- ной, если для некоторого фиксированного ε время ее работы не превосходит некоторого полинома от размера входа (n).  Схема приближения называется полностью полиномиальной, если время ее работы ограничено некоторым полиномом от n и от 1/ε, где n-размер входа, а ε – оценка относительной ошибки.
  • 7.
    Задача о вершинномпокрытии  Вершинное покрытие – такое множество вершин графа, что хотя бы один из концов любого ребра соединен с вершиной входящей в это множество.  Размер вершинного покрытия – количество входящих в него вершин.  Задача требует нахождения минимально возможного вершинного покрытия графа.
  • 8.
    Задача о вершинномпокрытии void ApproxVertexCover(G){ C = {}; //пустое множество E = G->E; // множество ребер графа while (E != {}){ Edge uv = ExctractRandom(E); //Берем произвольное ребро графа C->Include(uv->node1); C->Include(uv->node2); //Вносим вершины, которое соединяет это ребро //во множество C E->RemoveEdges(uv->node1); E->RemoveEdges(uv->node2); //Удаляем все ребра инцидентные с вершинами } }
  • 9.
    Задача о вершинномпокрытии Оптимальное решение Приближенное решение
  • 10.
    Задача о вершинномпокрытии Теорема Алгоритм ApproxVertexCover работает с ошибкой не чем в два раза. Доказательство Результатом работы алгоритма действительно является вершинное покрытие, поскольку работа продолжается пока множество непокрытых ребер не останется пустым. Никакие два ребра, рассматриваемые в ходе работы алгоритма, не имеют общей вершины, т.е. количество рассмотренных вершин ровно в два раза больше количества рассмотренных ребер. Кроме того, оптимальное покрытие содержит хотя бы одну вершину инцидентную рассматриваемому ребру, т.е. количество вершин в оптимальном решение больше либо равно количеству рассмотренных ребер.
  • 11.
    Задача коммивояжера  Задачакоммивояжера состоит в нахождении во взвешенном графе гамильтонова цикла минимальной стоимости (с минимальной суммой весов ребер).  На практике функция стоимости ребер обычно удовлетворяет неравенству треугольника, т.е. промежуточная «остановка» в вершине v на пути из u в w не уменьшает его стоимости: с(u,w)<= c(u,v) + c(v,w)
  • 12.
  • 13.
    Задача коммивояжера void ApproxTSPTour(G,c){ //выбираемпроизвольную вершину root = GetRandomVertex(G); //строим минимальное покрывающее дерево mintree = MSTPrim(G,root); //результатом является обход дерева с // исключенными повторениями path = TreeWalk(mintree); DeleteRepetition( path); }
  • 14.
    Задача коммивояжера a b c h d e fg a b c h d e f g Исходные данные Минимальное покрывающее дерево a b c h d e f g a b c b h b a d e f e g e d a a b c h d e f g
  • 15.
  • 16.
    Задача коммивояжера Теорема Алгоритм ApproxTSPTourрешает задачу коммивояжера с ошибкой не более чем в два разе, если выполнено неравенство треугольника. Теорема Если P≠NP и ρ>1, то не существует поли- номиального приближенного алгоритма, решающего общую задачу коммивояжера с ошибкой не более чем в ρ раз.
  • 17.
    Задача о суммахподмножеств  Пусть дано некоторое множество S, состоящее из целых чисел, и целое число t. Требуется выяснить существует ли в S подмножество сумма элементов которого равна t.  Задачу можно поставить как задачу оптимизации, требуя отыскать среди подмножеств сумма которых не превосходит t, наиболее близкое к t.
  • 18.
    Задача о суммахподмножеств  Для задачи можно построить алгоритм работающий за экспоненциальное время.  Для его реализации нужны две процедуры:  MergeList(L1,L2) – сливает два отсортированных списка в один отсортированный список.  AddList(L,x) – создает список с элементами равными сумме соответствующего элемента списка L и числа x. Например, AddList({1,2,3,5,9},2) выдаст результат {3,4,5,7,11}
  • 19.
    Задача о суммахподмножеств void EXPSubSetSum(S,t){ n = Length(S); L[0] = {0}; for(i=1; i<=n; i++){ L[i] = MergeList(L[i-1],AddList(L[i-1],S[i])); //Удаляем из L[i] элементы больше t DeleteMoreThanT(L[i],t); } //возвращаем максимальный элемент из L[n] return Maximum(L[n]); }
  • 20.
    Задача о суммахподмножеств L[0] 0 L[1] 0 101 L[2] 0 101 102 203 L[3] 0 101 102 203 201 302 303 404 S = {101,102,201} t=308
  • 21.
    Задача о суммахподмножеств  Из приведенного алгоритма можно получить полностью полиномиальную схему приближения, если хранить списки не полностью, а в сокращенном варианте.  Степень сокращения определяется параметром δ: чем он меньше, тем «полнее» список.  Список L` называется δ-сокращением списка L, если для любого элемента y из L в списке L` найдется не превосходящий его элемент z для которого выполнено неравенство: δ≤ − y zy
  • 22.
    Задача о суммахподмножеств L = {10,11,12,15,20,21,22,23,24,29}, δ = 0.1 L`= {10,12,15,20,23,29} void ListTrim(L,delta) { m = Length(L); Ls = {L[1]}; last = L[1]; for(i=2; i<=m; i++) if (last < (1-delta)/y[i]){ L->Add(y[i]); last = y[i] } }
  • 23.
    Задача о суммахподмножеств void ApproxSubSetSum(S,t,epsilon){ n = Length(S); L[0] = {0}; for(i=1; i<=n; i++){ L[i] = MergeList(L[i-1],AddList(L[i-1],S[i])); L[i] = ListTrim(L[i], e); //Удаляем из L[i] элементы больше t DeleteMoreThanT(L[i],epsilon/n); } //возвращаем максимальный элемент из L[n] return Maximum(L[n]); }
  • 24.
    Задача о суммахподмножеств Теорема Алгоритм AppeoxSubSetSum является полностью полиномиальной схемой приближения для задачи о суммах подмножеств. Число элементов в любом из списков не превосходит 2 log + ε tn