Опубликован: 06.09.2012 | Уровень: для всех | Доступ: платный | ВУЗ: Московский государственный университет путей сообщения
Лекция 32:

Жадный алгоритм поиска индивидуальных масок

< Лекция 31 || Лекция 32: 123 || Лекция 33 >
Аннотация: В лекции описан жадный алгоритм поиска индивидуальных (для каждого технического состояния ЦУ в отдельности) масок ДИ. Его работа проиллюстрирована на конкретном примере. Приведены оценки объема получаемой по описанному алгоритму маски и вычислительная сложность алгоритма.

Покажем, что поиск одной индивидуальной маски можно свести к задаче о покрытии множества.

Пусть задана диагностическая информация в виде СПР и требуется найти индивидуальную маску для технического состояния s_k. Для каждой возможной точки проверки i:j построим подмножество S_{i:j} множества S, в которое внесем все технические состояния, отличающиеся от состояния s_k при использовании точки проверки i:j. Таким образом, получим покрытие


\tilde{S}=\{S_{1:1}, S_{1:2},\ldots, S_{1:m},\ldots, S_{|\tau|:m}\}

множества S. Очевидно, что минимальному подпокрытию \tilde{S'}\subseteq\tilde{S}


\tilde{S'}=\{S_{i_1:j_1}, S_{i_1:j_2},\ldots, S_{i_l:j_l}\}

будет соответствовать минимальная индивидуальная маска

h=\{i_1:j_1, i_2:j_2,\ldots, i_l:j_l\}

Задача нахождения минимального подпокрытия множества является NP-полной. В [1] предлагается жадный алгоритм ее решения. Идея алгоритма состоит в следующем: строим \tilde{S'}_i\subseteq\tilde{S}, причем \tilde{S'}_0=\varnothing, а \tilde{S'}_{k+1} строится из \tilde{S'}_{k} добавлением элемента из \tilde{S}, который покрывает наибольшее количество элементов множества S, непокрытых элементами из \tilde{S'}_{k}. Временная сложность данного алгоритма составляет O(|S|-1)^2m|\tau|), емкостная сложность - O(|S|-1), а решение (количество элементов в искомом подпокрытии) не превосходит минимальное более чем в 1+ln(|S|-1) раз.

Так как поиск маски должен быть произведен для каждого технического состояния, общая временная сложность поиска всего множества индивидуальных масок составит O(|S|^3m|\tau|). В целях обеспечения необходимого объема памяти для сохранения результатов потребуется O(|S|^2) бит, что и является оценкой емкостной сложности поиска множества индивидуальных масок.

Ниже описывается алгоритм, предложенный в [2], который улучшит приведенную временную характеристику.

При описании алгоритма будем использовать следующие обозначения. Пусть S' - некоторое подмножество множества технических состояний, i:j - точка проверки, а b - высказывание, истинность которого равна нулю (ложь) или единице (истина). Тогда через amt(S',i:j,b) обозначим количество технических состояний из множества S', для которых значение в точке проверки i:j равно значению истинности b. Обозначение \overline{b} будет соответствовать логической операции отрицания высказывания b.

Алгоритм 2 ( Жадный алгоритм поиска множества индивидуальных масок ).

Вход: Словарь полной реакции; S - множество технических состояний.

Выход: H - множество индивидуальных масок.

  1. Положить H=\{h_k=\varnothing | 0\le k\le |S|\}.
  2. Выполненить рекурсивный алгоритм MaskSet(S,\varnothing,|S|), описанный ниже.
  3. Вернуть множество H в качестве результата.

Алгоритм MaskSet(S_1,S_2,J) функционирует следующим образом:

  1. Если S_1=\varnothing или |S_1\cup S_2|\le 1 - закончить вызов, иначе перейти к шагу 2.
  2. Найти такую точку проверки i:j и такое значение b\in\{0,1\}, для которых величина
    J'=amt(S_1\cup S_2,i:j,\overline{b})- amt(S_1\cup S_2,i:j,b)
    достигает наибольшего значения, не превышающего J, при условии amt(S_1,i:j,b)\ne 0. Если такой точки проверки не найдено - завершить вызов, иначе перейти к п. 3.
  3. Составить множества
    
S'_1=\{s_k\in S_1|R_{k i:j}=b\},\\
S'_2=\{s_k\in S_2|R_{k i:j}=b\},
  4. Включить точку проверки i:j в маски h_k\in H для всех технических состояний S_k\in S'_1.
  5. Выполнить последовательно два обращения
    
MaskSet(S'_1,S'_2,|S'_1\cup S'_2|),\\
MaskSet(S'_1,S'_2,S'_2\cup S'_1,J'),
    после чего закончить вызов.

Формирование индивидуальной маски с помощью алгоритма 2 для каждого конкретного технического состояния s_k повторяет работу жадного алгоритма для поиска минимального покрытия. Действительно, шаг 2 алгоритма MaskSet повторяет шаг исходного жадного алгоритма, на котором выбирается подмножество исходного множества, покрывающего максимальное количество элементов. Первый рекурсивный вызов на шаге 5 алгоритма соответствует повторению алгоритма для подмножества непокрытых элементов.

Суть алгоритма 2 состоит в поиске индивидуальных масок одновременно для всех технических состояний. Основная идея, направленная на ускорение данного поиска, заключается в следующем. Часто индивидуальные маски для разных технических состояний имеют одинаковые элементы. Например, когда на шаге 2 алгоритм MaskSet находит точку проверки, по значению которой можно отличить все состояния из S'_1 от всех состояний из (S_1\cup S_2)\setminus(S'_1\cup S'_2), то эта точка проверки должна быть включена во все маски, соответствующие состояниям из S'_1 (что и делается на шаге 4). После этого необходимо дополнить эти маски так, чтобы они отличали друг от друга состояния из S'_1\cup S'_2 (первый рекурсивный вызов на шаге 5). Так как в результате этих действий сформированные на текущий момент маски для состояний из S_1\setminus S'_1 еще не могут различать эти состояния между собой и отличать их от состояний из S'_1\cup S_2, то алгоритм повторяется с дальнейшим анализом всего множества состояний, но с учетом того, что маски для множества состояний S'_1 уже сформированы (второй рекурсивный вызов на шаге 5).

Аргумент S_1 алгоритма MaskSet определяет набор технических состояний, для которых необходимо провести поиск индивидуальной маски. Объединение S_1\cup S_2 задает множество состояний, для которых должно быть введено отличие в масках для состояний из S_1. Аргумент S_2 определяет множество технических состояний, для которых маски уже были найдены. Последний аргумент алгоритма MaskSet введен для упорядочения поиска точек проверки.

< Лекция 31 || Лекция 32: 123 || Лекция 33 >
Дмитрий Медведевских
Дмитрий Медведевских

Добрый день  можно поинтересоваться где брать литературу предложенную в курсе ?Большинство книг я не могу найти  в известных источниках

Андрей Баранов
Андрей Баранов
Донецк, Донецкий национальный технический университет, 2019
Андрей Чернов
Андрей Чернов
Россия, Ростов-на-Дону, Ростовский институт инженеров железнодорожного транспорта, 1993