Задача про покриття множини

Матеріал з testwiki
Версія від 21:57, 21 жовтня 2023, створена imported>JuliaNoRoberts (growthexperiments-addlink-summary-summary:2|0|0)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Задача про покриття множини є класичним питанням інформатики і теорії складності. Ця задача узагальнює NP-повну задачу про вершинне покриття (і тому є NP-складною). Попри те, що задача про вершинне покриття подібна до цієї, підхід, використаний у наближеному алгоритмі, тут не працює. Замість цього ми розглянемо жадібний алгоритм. Отриманий за ним розв'язок буде гіршим від оптимального в логарифмічне число разів. Із зростанням розміру задачі якість розв'язку погіршується, але все ж досить повільно, тому такий підхід можна вважати корисним.

Формулювання задачі

Вхідними даними задачі про покриття множини є скінченна множина 𝒰 і сімейство 𝒮 її підмножин. Покриттям називають сімейство 𝒞𝒮 найменшої потужності, об'єднанням яких є 𝒰. В разі постановки питання про дозвіл на вхід подається пара (𝒰,𝒮) і ціле число k; питанням є існування покривної множини з потужністю k (або менше).

Приклад

Прикладом задачі про покриття множини є така задача: уявімо собі, що для виконання якогось завдання потрібен певний набір навичок S. Також є група людей, кожен з яких володіє деякими з цих навичок. Необхідно сформувати найменшу підгрупу, достатню для виконання завдання, тобто таку, що включає носіїв усіх необхідних навичок.

Методи розв'язування

Жадібний наближений алгоритм

Жадібний алгоритм вибирає множини керуючись таким правилом: на кожному етапі вибирається множина, що покриває найбільше число ще не покритих елементів.

Greedy-Set-Cover(U,F), де U — задана множина всіх елементів, F — сімейство підмножин U

  1. XU
  2. C
  3. while X= do
    1. вибираємо SF з найбільшим XS
    2. XXS
    3. CC{S}
  4. return C

Можна показати, що цей алгоритм працює з точністю O(H(s)), де s — потужність найбільшої множини, а H(n) — сума перших n членів гармонійного ряду.

H(n)=k=1n1klnn+1

Іншими словами, алгоритм знаходить покриття, розмір якого не більше ніж вH(s) разів перевищує розмір мінімального покриття.

Спрощений приклад роботи жадібного алгоритму для k = 3

Існує стандартний приклад, на якому жадібний алгоритм працює з точністю log2(n)/2.

Універсуум складається з n=2(k+1)2 елементів. Набір множин складається з k попарно не перетинних множин S1,,Sk, потужності яких 2,4,8,,2k відповідно. Також є дві неперетинних підмножини T0,T1, кожна з яких містить половину елементів з кожного Si. На такому наборі жадібний алгоритм вибирає множини Sk,,S1, тоді як оптимальним розв'язком є вибір множин T0 і T1. Приклад таких вхідних даних k=3 можна побачити на малюнку праворуч.

Генетичний алгоритм

Генетичний алгоритм являє собою евристичний метод випадкового пошуку, заснований на принципі імітації еволюції біологічної популяції.

У загальному випадку в процесі роботи алгоритму відбувається послідовна зміна популяцій, кожна з яких є сімейством покриттів, званих особинами популяції. Покриття початкової популяції будуються випадковим чином. Найпоширенішою є стаціонарна схема генетичного алгоритму, в якій чергова популяція відрізняється від попередньої лише однією або двома новими особинами. Під час побудови нової особини з поточної популяції з урахуванням ваг покриттів вибирається «батьківська» пара особин J,J, і на їх основі у процедурі кросинговеру (випадково або детерміновано) формується певний набір покривних множин Jx. Далі піддається мутації, після чого з нього будується особина, яка заміняє в новій популяції покриття з найбільшою вагою. Оновлення популяції виконується деяке (задане) число разів, і результатом роботи алгоритму є найкраще зі знайдених покриттів.

Точний розв'язок

Часто задача про покриття множини формулюється як задача цілочисельного програмування[1]:

Потрібно знайти f*(c,A)=min{(c,x)|Axe,x{0,1}n}.

де A — (m×n) матриця, причому aij = 1, якщо iSj і aij = 0 в іншому випадку; e позначає m — вектор з одиниць; c=(c1,c2,,cn)T; x=(x1,x2,,xn)T — вектор, де xj=1, якщо Sj входить у покриття, інакше xj=0.

Точний розв'язок можна отримати за поліноміальний час, у випадку, коли матриця A цілком унімодулярна. Сюди можна віднести і задачу про вершинне покриття на двочастковому графі та дереві. Зокрема, коли кожен стовпець матриці A містить рівно дві одиниці, задачу можна розглядати як задачу реберного покриття графу, яка ефективно зводиться до пошуку максимального парування. На класах задач, де n або m обмежені константою, задача за поліноміальний час розв'язується методами повного перебору.

Схожі задачі

Примітки

Шаблон:Reflist

Література

  • А. В. Еремеев, Л. А. Заозерская, А. А. Колоколов. Задача о покрытии множества: сложность, алгоритмы, экспериментальные исследования. Дискретный анализ и исследование операций. Сер. 2. 2000. Т. 7, N 2. С.22-46.
  • Шаблон:Книга

Посилання