1294
правки
Irina (обсуждение | вклад) |
KVN (обсуждение | вклад) |
||
(не показано 10 промежуточных версий 1 участника) | |||
Строка 3: | Строка 3: | ||
== Постановка задачи == | == Постановка задачи == | ||
Пусть дано семейство S множеств над совокупностью U. ''Покрытие множества'' <math>C \subseteq S \;</math> представляет собой подсемейство множеств, объединением которых является U. ''Задача о покрытии множества'' заключается в нахождении покрытия множествами с минимальной мощностью для заданного S. В ''задаче о взвешенном покрытии множества'' для каждого множества <math>s \in S \;</math> задается вес <math>w_s \ge 0 \;</math>, и цель заключается в нахождении покрытия | Пусть дано семейство S множеств над совокупностью U. ''Покрытие множества'' <math>C \subseteq S \;</math> представляет собой подсемейство множеств, объединением которых является U. ''Задача о покрытии множества'' заключается в нахождении покрытия множествами с минимальной мощностью для заданного S. В ''задаче о взвешенном покрытии множества'' для каждого множества <math>s \in S \;</math> задается вес <math>w_s \ge 0 \;</math>, и цель заключается в нахождении покрытия C с минимальным совокупным весом <math>\sum_{s \in C} w_s \;</math>. | ||
Взвешенное покрытие множества представляет собой специальный случай ''минимизации линейной функции относительно субмодулярных ограничений'', определяемый следующим образом. Пусть дано семейство S объектов, каждый | Взвешенное покрытие множества представляет собой специальный случай задачи ''минимизации линейной функции относительно субмодулярных ограничений'', определяемый следующим образом. Пусть дано семейство S объектов, каждый объект s в котором имеет неотрицательный вес <math>w_s \;</math>, и неубывающая субмодулярная функция <math>f: 2^S \to \mathbb{R}</math>. Задача заключается в нахождении подсемейства <math>C \subseteq S \;</math>, такого, что <math>f(C) = f(S) \;</math> минимизирует <math>\sum_{s \in C} w_s \;</math>. (Если положить <math>f(C) = |\cup_{s \in C} s|</math>, получим задачу о взвешенном покрытии множества). | ||
== Основные результаты == | == Основные результаты == | ||
[[Жадный алгоритм]] решения задачи о взвешенном покрытии множества строит покрытие путем | [[Жадный алгоритм]] решения задачи о взвешенном покрытии множества строит покрытие путем последовательного выбора множества s, минимизирующего отношение веса <math>w_s \;</math> к количеству элементов в s, еще не покрытых выбранными множествами. Алгоритм останавливает работу и возвращает выбранные множества, как только они образуют покрытие: | ||
'''greedy-set-cover(S, w)''' | '''greedy-set-cover(S, w)''' | ||
1. Инициализировать <math>C \gets \empty \;</math>. Определить <math>f(C) \; \dot= \; |\cup_{s \in C} s|</math>. | 1. Инициализировать <math>C \gets \empty \;</math>. Определить <math>f(C) \; \dot= \; |\cup_{s \in C} s|</math>. | ||
2. Повторять, пока не будет достигнуто <math>f(C) = f(S) \;</math>: | 2. Повторять, пока не будет достигнуто <math>f(C) = f(S) \;</math>: | ||
3. Выбрать <math>s \in S \;</math>, минимизирующий стоимость на элемент <math>w_s / [f(C \cup \{ s \}) - f(C)]</math>. | 3. Выбрать элемент <math>s \in S \;</math>, минимизирующий стоимость на элемент <math>w_s / [f(C \cup \{ s \}) - f(C)]</math>. | ||
4. Положить <math>C \gets C \cup \{ s \}</math>. | 4. Положить <math>C \gets C \cup \{ s \}</math>. | ||
5. Вернуть C | 5. Вернуть C | ||
Строка 24: | Строка 24: | ||
''Доказательство''. Когда жадный алгоритм выбирает множество s, предположим, что он назначает цену за элемент | ''Доказательство''. Когда жадный алгоритм выбирает множество s, предположим, что он назначает на этой итерации цену за каждый элемент, впервые покрытый множеством s. Тогда совокупный вес множеств, выбранных алгоритмом, равен общей сумме назначенных цен, при этом каждому элементу цена назначается только один раз. | ||
Рассмотрим любое множество <math>s = \{ x_k, x_{k - 1}, ... , x_1 \} \;</math> в оптимальном покрытии множества C*. Без потери общности предположим, что жадный алгоритм покрывает элементы s в следующем порядке: <math>x_k, x_{k - 1}, ..., x_1 \;</math>. К началу итерации, на которой алгоритм покрывает элемент <math>x_i \;</math> множества s, не менее i элементов s остаются без покрытия. Таким образом, если на этой итерации жадный алгоритм собирается выбрать s, он выплатит | Рассмотрим любое множество <math>s = \{ x_k, x_{k - 1}, ... , x_1 \} \;</math> в оптимальном покрытии множества C*. Без потери общности предположим, что жадный алгоритм покрывает элементы s в следующем порядке: <math>x_k, x_{k - 1}, ..., x_1 \;</math>. К началу итерации, на которой алгоритм покрывает элемент <math>x_i \;</math> множества s, не менее i элементов s остаются без покрытия. Таким образом, если на этой итерации жадный алгоритм собирается выбрать s, он выплатит цену за каждый элемент, не превышающую <math>w_s/i \;</math>. Таким образом, за покрытие элемента <math>x_i \;</math> он назначает не более <math>w_s/i \;</math>. Выполнив суммирование по i, получим, что общая сумма, назначенная за элементы s, не превышает <math>w_s H_k \;</math>. Выполнив суммирование по <math>s \in C^* \;</math> и заметив, что каждый элемент принадлежит к некоторому множеству в C*, получим, что общая сумма, назначенная за все элементы, не превышает <math>\sum_{s \in C^*} w_s H_k = H_k OPT \;</math>. □ | ||
Эту теорему для невзвешенного случая (<math>w_s = 1 \;</math> для всех s) | Эту теорему вначале доказали Джонсон [6], Ловас [9] и Стейн [14] для невзвешенного случая (<math>w_s = 1 \;</math> для всех s), после чего Хватал [2] расширил ее для взвешенного случая. | ||
Строка 42: | Строка 42: | ||
Вспомним схему назначения стоимости из доказательства теоремы 1. Согласно предыдущему наблюдению, элементу <math>x_i \;</math> назначается стоимость не более OPT/i. Таким образом, общая стоимость элементов <math>x_n, ..., x_i \;</math> не превышает <math>(H_n - H_{i - | Вспомним схему назначения стоимости из доказательства теоремы 1. Согласно предыдущему наблюдению, элементу <math>x_i \;</math> назначается стоимость не более OPT/i. Таким образом, общая стоимость элементов <math>x_n, ..., x_i \;</math> не превышает <math>(H_n - H_{i - 1})OPT \;</math>. В силу предположения о том, что каждый вес <math>w_s \le 1 \;</math>, стоимость каждого из оставшихся элементов не превышает 1 за элемент. Таким образом, совокупная стоимость всех элементов не превышает <math>i - 1 + (H_n - H_{i - 1})OPT \;</math>. Приняв <math>i = 1 + \lceil OPT \rceil</math>, получаем, что совокупная стоимость не превышает <math>\lceil OPT \rceil + (H_n - H_{ \lceil OPT \rceil })OPT \le 1 + OPT(1 + ln(n/OPT))</math>. □ | ||
Строка 48: | Строка 48: | ||
== Другие результаты == | == Другие результаты == | ||
Было показано, что коэффициент аппроксимации жадного алгоритма составляет ln n | Было показано, что коэффициент аппроксимации жадного алгоритма составляет ln n - ln ln n + O(1) [12]. Для специального случая систем множеств, дополнения которых имеют конечную [https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%92%D0%B0%D0%BF%D0%BD%D0%B8%D0%BA%D0%B0_%E2%80%94_%D0%A7%D0%B5%D1%80%D0%B2%D0%BE%D0%BD%D0%B5%D0%BD%D0%BA%D0%B8%D1%81%D0%B0 размерность Вапника - Червоненкиса] (VC-размерность), другие алгоритмы демонстрируют заметно лучший коэффициент аппроксимации [1]. Известны аппроксимационные алгоритмы с постоянным коэффициентом для геометрических вариантов таких родственных задач, как метод k-медиан и задача о размещении объектов. | ||
Жадный алгоритм можно естественным образом обобщить на множество задач. Например, для определенной выше задачи минимизации линейной функции относительно субмодулярных ограничений естественное расширение жадного алгоритма дает решение с | Жадный алгоритм можно естественным образом обобщить на множество задач. Например, для определенной выше задачи минимизации линейной функции относительно субмодулярных ограничений естественное расширение жадного алгоритма дает решение с <math>H_k \;</math>-аппроксимацией, где <math>k = max_{s \in S} f( \{s \}) - f(\empty) \;</math>, в предположении, что f является целочисленной функцией [10]. | ||
Обобщая задачу о покрытии множества, можно потребовать, чтобы каждый элемент x содержался в произвольном числе множеств | Обобщая задачу о покрытии множества, можно потребовать, чтобы каждый элемент x содержался в произвольном числе множеств <math>r_x \;</math>; только в этом случае он будет считаться элементом покрытия. Для этого обобщения существует алгоритм O(log n)-аппроксимации с полиномиальным временем выполнения [8]. | ||
Для специального случая, когда каждый элемент принадлежит не более чем к r множествам, имеется более простой алгоритм r-аппроксимации ([15] § 15.2). Если множества имеют однородные веса ( | Для специального случая, когда каждый элемент принадлежит не более чем к r множествам, имеется более простой алгоритм r-аппроксимации ([15] § 15.2). Если множества имеют однородные веса (<math>w_s = 1 \;</math>), алгоритм сводится к следующему: выбрать любой максимальный набор элементов, никакие два из которых не содержатся в одном множестве; вернуть все множества, содержащие выбранный элемент. | ||
В варианте «Максимальное k-покрытие» требуется, чтобы набор множеств, суммарный вес которых не превышает k, покрывал максимально возможное количество элементов. Для этого варианта существует алгоритм (1 | В варианте «Максимальное k-покрытие» требуется, чтобы набор множеств, суммарный вес которых не превышает k, покрывал максимально возможное количество элементов. Для этого варианта существует алгоритм (1 - 1/e)-аппроксимации ([15], задача 2.18) (см. [7] для варианта множеств с неоднородными весами). | ||
Широкое обсуждение применения жадных методов для аппроксимации задачи комбинаторной оптимизации можно найти в главе 4 работы [5] | Широкое обсуждение применения жадных методов для аппроксимации задачи комбинаторной оптимизации можно найти в главе 4 работы [5]. | ||
Наконец, в свете весьма правдоподобных теоретико-сложностных допущений, коэффициент аппроксимации ln n является практически лучшим для любого алгоритма с полиномиальным временем выполнения [3, 4]. | Наконец, в свете весьма правдоподобных теоретико-сложностных допущений, коэффициент аппроксимации ln n является практически лучшим возможным для любого алгоритма с полиномиальным временем выполнения [3, 4]. | ||
== Применение == | == Применение == | ||
Задача о покрытии множествами и ее обобщения и варианты являются фундаментальными для | Задача о покрытии множествами и ее обобщения и варианты являются фундаментальными для самых разных областей применения. Несколько примеров: | ||
• выбор небольшого количества узлов сети для хранения файла таким образом, чтобы у всех узлов сети поблизости имелась его копия; | • выбор небольшого количества узлов сети для хранения файла таким образом, чтобы у всех узлов сети поблизости имелась его копия; | ||
Строка 80: | Строка 80: | ||
== См. также == | == См. также == | ||
* [[Локальный поиск для | * [[Локальный поиск для задачи о k-медианах и задачи о размещении объектов]] | ||
== Литература == | == Литература == | ||
Строка 112: | Строка 112: | ||
15. Vazirani, V.V.: Approximation Algorithms. Springer, Berlin Heidelberg (2001) | 15. Vazirani, V.V.: Approximation Algorithms. Springer, Berlin Heidelberg (2001) | ||
[[Категория: Совместное определение связанных терминов]] |