Отобразим производимый перебор последовательностью значений, принимаемых переменным множеством В*. Представим номер старшего элемента в этом подмножестве из В значением индекса j. Например, если В* ={b1 , b3 , b6}, то j=6. Другой индекс i, значениями которого также служат номера элементов из В, используем для выбора подмножества Bi = {bi , bi+1 , … , bm} из множества B = { b1 , b2 , … , bi , bi+1 , … , bm}. Представляя формулой i:=j операцию присвоении индексу i значения индекса j, сформулируем алгоритм перебора.
1. i:= 0. Множество В* приравниваем пустому множеству ф.
2. Добавляем в В* младший из тех элементов множества Bi+1 , которые не покрываются множеством В*, i := j Если В* не покрывает множество А, переходим к началу п. 2. В противном случае текущее значение множества В* включаем в результативное множество Q.
3. i := j. Удаляем из В* элемент bj . Если В*UBi+1 покрывает множество А, переходим к п. 2. Иначе, если В* не пустое множество, переходим к началу п. 3, в противном случае реализация алгоритма завершается.
Заметим, что в получаемом с помощью описанного алгоритма множестве Q будут содержаться все простые покрытия множества A, но, может быть, не только они. Поэтому требуется дополнительный анализ покрытий на простоту.
(знаком + отмечены те из найденных покрытий, которые оказываются простыми).
Большую роль при решении многих комбинаторных задач играют покрытия с минимальным числом элементов, называемые кратчайшими. Очевидно, что любое кратчайшее покрытие является простым, однако не все простые покрытия кратчайшие. В рассмотренном примере кратчайшими оказались три первых покрытия.
Нахождение кратчайших покрытий можно свести к поиску всех простых покрытий и последующему выделению из них кратчайших. Однако этот путь может привести к слишком громоздким вычислениям, особенно когда нужно найти только одно из кратчайших покрытий. В этом случае целесообразно прибегнуть к специальным методам.
Каждый столбец cj этой матрицы задает элемент bj , множества В = {а, Ь, с, .., i}, т. е. некоторое подмножество из множества А = {a1 , a2 , … , a10}, которое можно использовать в качестве элемента покрытия. Каждая строка сi задает аналогичным образом некоторое подмножество Bi из множества В и представляет одно из предъявляемых к покрытию требований:в покрытие должен войти по крайней мере один из элементов подмножества Bi . Если это подмножество содержит лишь один элемент (в строке только одна единица), включение этого элемента становится обязательным, в противном случае допустим выбор, тем более ограниченный, чем меньше единиц в рассматриваемой строке.
Эти соображения учитываются в следующем простейшем алгоритме конструирования подмножества столбцов, которое может служить достаточно хорошим приближением к кратчайшему покрытию: найти минимальную (по числу единиц) строку, выбрать максимальный среди столбцов, содержащих в ней единицу, и включить его в конструируемое подмножество (вначале оно пустое), затем удалить из матрицы выбранный столбец и все строки, содержащие в нем единицу, и повторить эту процедуру уже для остатка матрицы, и так до тех пор, пока растущее подмножество не станет покрытием. Оно и будет представлять решение задачи.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.