1.3 Решении задачи с помощью метода покрытия булевой матрицы.
Точный метод нахождения кратчайшего покрытия представляет собой обход дерева поиска. Данный метод разработал Закревский Аркадий Дмитриевич, он предложил довольно эффективный и простой способ нахождения малой величины покрытия булевой матрицы (так называемое разложение по минимальному столбцу и минимальной строке).
У данного метода экспоненциальная
сложность
,
тогда как у «жадного» алгоритма
полиномиальная
.
Текущая
ситуация, соответствующая некоторой
вершине дерева
поиска, представляется переменной
матрицей Х,
которая
показывает, какие
столбцы еще не покрыты и какие строки
можно использовать для их
покрытия. В
этой ситуации выбирается первая
из строк
с минимальным числом
единиц – так минимизируется число
вариантов продолжения поиска.
Очередной
шаг процесса состоит в выборе покрывающего
столбца для
этой строки
и пробном
включении ее в получаемое решение. Таким
образом, вершины
дерева поиска соответствуют некоторым
строкам исходной
матрицы, а
дуги – выбираемым для их покрытия
столбцам.
Начальное значение матрицы Х совпадает с исходной матрицей. Последующие значения получаются удалением строк, включаемых в решение, и столбцов, покрытых этими строками. Кроме того, выполняются следующие правила редукции.
1. Если столбец k имеет единицы везде, где имеет единицы столбец l, то столбец k можно удалить. Любая строка, покрывающая столбец l, покрывает также столбец k. Поэтому при поиске покрытия столбец k можно не рассматривать. Достаточно, чтобы в покрытие была включена какая-либо из строк, покрывающих столбец l.
2. Если строка i имеет единицы везде, где имеет единицы строка j, то строку j можно удалить. Действительно, пусть в некотором кратчайшем покрытии имеется строка j. Очевидно, данное покрытие останется кратчайшим, если в нем строку j заменить строкой i.
-
Дано:

,

,


-
Введем булевы переменные
-
Задаем матрицу
,
– i-ая строка
-
j-ый столбец

Данный столбец и все покрытые им строки исключаются из таблицы

Рисунок 3
Получаем матрицу:
|
|
|
|
|
|
|
|
|
|
1 |
1 |
0 |
0 |
1 |
1 |
|
|
1 |
1 |
1 |
0 |
1 |
1 |
|
|
0 |
1 |
1 |
1 |
0 |
1 |
|
|
0 |
0 |
1 |
1 |
0 |
0 |
|
|
1 |
1 |
0 |
0 |
1 |
1 |
|
|
1 |
1 |
1 |
0 |
1 |
1 |
-
1) Проводим редукцию строк и столбцов:




|
|
|
|
|
|
|
|
1 |
1 |
0 |
0 |
|
|
1 |
1 |
1 |
0 |
|
|
0 |
1 |
1 |
1 |
|
|
0 |
0 |
1 |
1 |
2)





выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:

|
|
|
|
|
|
|
1 |
1 |
1 |
|
|
0 |
1 |
1 |
3) Проводим редукцию строк и столбцов:

|
|
|
|
|
|
1 |
1 |
|
|
0 |
1 |
4)



выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:

В итоге получилась полностью покрытая таблица.
-
Мы получаем оптимальное покрытие (рисунок 3):


Рисунок 4.
-
1) Проводим редукцию строк и столбцов:




|
|
|
|
|
|
|
|
1 |
1 |
0 |
0 |
|
|
1 |
1 |
1 |
0 |
|
|
0 |
1 |
1 |
1 |
|
|
0 |
0 |
1 |
1 |
2)





выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:

|
|
|
|
|
|
|
0 |
1 |
1 |
3) Проводим редукцию строк и столбцов:

|
|
|
|
|
|
0 |
1 |
4)


выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:

В итоге получилась полностью покрытая таблица.
-
Мы получаем оптимальное покрытие (рисунок 3):


Рисунок 5.
-
1) Проводим редукцию строк и столбцов:




|
|
|
|
|
|
|
|
1 |
1 |
0 |
0 |
|
|
1 |
1 |
1 |
0 |
|
|
0 |
1 |
1 |
1 |
|
|
0 |
0 |
1 |
1 |
2)





выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:

|
|
|
|
|
|
|
1 |
1 |
0 |
3) Проводим редукцию строк и столбцов:

|
|
|
|
|
|
1 |
0 |
4)


выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:

В итоге получилась полностью покрытая таблица.
-
Мы получаем оптимальное покрытие (рисунок 3):


Рисунок 6.
-
1) Проводим редукцию строк и столбцов:




|
|
|
|
|
|
|
|
1 |
1 |
0 |
0 |
|
|
1 |
1 |
1 |
0 |
|
|
0 |
1 |
1 |
1 |
|
|
0 |
0 |
1 |
1 |
2)





выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:

|
|
|
|
|
|
|
1 |
1 |
0 |
|
|
1 |
1 |
1 |
3) Проводим редукцию строк и столбцов:

|
|
|
|
|
|
1 |
0 |
|
|
1 |
1 |
4)



выбираем
покрываем данную строку, любой столбец,
где есть 1 в этой строке, данный столбец
и все покрытые им строки исключаются
из таблицы:


В итоге получилась полностью покрытая таблица.
-
Мы получаем оптимальное покрытие (рисунок 3):


Рисунок 7.













































































