Аноним

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

Материал из WEGA
м
Строка 57: Строка 57:


== Алгоритмы ==
== Алгоритмы ==
Мекке и Вагнер [ ] представили алгоритм, который решает задачу SET COVER, перечисляя все допустимые решения.
Мекке и Вагнер [7] представили алгоритм, который решает задачу SET COVER, перечисляя все допустимые решения.




Мекке и Вагнер [ ] представили алгоритм, который решает задачу SET COVER, перечисляя все допустимые решения.
Пусть дана строка <math>r_i</math> матрицы A. ''Частичное решение для строк'' <math>r_1, ..., r_i</math> представляет собой подмножество <math>C' \subseteq C</math> столбцов A, такое, что для каждой строки <math>r_j, j \in \{1, ..., i\}</math> существует столбец в C', покрывающий строку <math>r_j</math>.




Пусть дан ряд ri матрицы A. Частичное решение для строк r 1.. ri представляет собой подмножество C'CC столбцов A, такое, что для каждой строки rj с j 2 f1.. ig существует столбец в C0, покрывающий строку rj.
Основная идея алгоритма заключается в том, чтобы найти оптимальное решение путем итерации по строкам матрицы A и обновления на каждом шаге структуры данных S, которая сохраняет ''все'' частичные решения для рассмотренных до этого момента строк. Точнее, на каждом шаге итерации алгоритм рассматривает первую строку A и обновляет структуру данных S соответственно. После этого первая строка A удаляется. Алгоритм выглядит следующим образом.




Основная идея алгоритма заключается в том, чтобы найти оптимальное решение путем итерации по строкам матрицы A и обновления на каждом шаге структуры данных S, которая сохраняет все частичные решения для рассмотренных до этого момента строк. Точнее, на каждом шаге итерации алгоритм рассматривает первую строку A и обновляет структуру данных S соответственно. После этого первая строка A удаляется. Алгоритм выглядит следующим образом.
  1 Повторить m раз: {
  2 '''for''' каждого частичного решения C' в S, не покрывающего первую строку матрицы A: {
  3 '''for''' каждого столбца c матрицы A, покрывающего первую строку A:{
  4 Добавить <math> \{ c \} \cup C'</math> к S; }
  5 Удалить С' из S;}
  6 Удалить первую строку A;}




1 Повторить m раз: {
Этот простой алгоритм перечисления способен создать множество S экспоненциального размера. Поэтому при помощи приведенных выше правил редукции данных после каждого шага итерации выполняется удаление ненужных более частичных решений. С этой целью матрица B ассоциируется с множеством S, где каждая строка соответствует строке матрицы A, а каждый столбец – частичному решению в S: значение ячейки <math>b_{i, j}</math> матрицы B равно 1 в том и только том случае, если j-ое частичное решение B содержит столбец A, покрывающий строку <math>r_i</math>. Алгоритм использует матрицу <math>C := </math>, которая обновляется вместе с S на каждом шаге итерации.  
2 for каждого частичного решения C0 в S, не покрывающего первую строку матрицы A: {
3 for каждого столбца c матрицы A, покрывающего первую строку A:{
4 Добавить fcg[ C 0 в S; }
5 Удалить С из S;}
6 Удалить первую строку A;}
 
 
Этот простой алгоритм перечисления способен создать множество S экспоненциального размера. Поэтому при помощи приведенных выше правил редукции данных после каждого шага итерации выполняется удаление ненужных более частичных решений. С этой целью матрица B ассоциируется с множеством S, где каждая строка соответствует строке матрицы A, а каждый столбец – частичному решению в S: значение ячейки bi;j матрицы B равно 1 в том и только том случае, если j-ое частичное решение B содержит столбец A, покрывающий строку ri. Алгоритм использует матрицу
A A в 0...0 С :=
, которая обновляется вместе с S на каждом шаге итерации.  
2 Последняя строка C позволяет отличить столбцы, принадлежащие матрице A, от принадлежащих B.
2 Последняя строка C позволяет отличить столбцы, принадлежащие матрице A, от принадлежащих B.
Строка 6 вышеприведенного алгоритма заменяется двумя следующими строками:
Строка 6 вышеприведенного алгоритма заменяется двумя следующими строками:
4430

правок