Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kurs.docx
Скачиваний:
26
Добавлен:
10.02.2016
Размер:
1.13 Mб
Скачать
  1. Алгоритм покриття за методом «мінімальний стовпець - максимальний рядок»

    1. Постановка задачі.

Розфарбування представляє собою маркування вершин графа таким чином, щоб у суміжних вершин маркери не співпадали. Замість фарб використовуються числа 0, 1, 2… Умова оптимальності розфарбування – використання мінімальної кількості красок . Це число називається хроматичним числом графа.

Помітимо, що проблема розфарбування – алгоритмічно нерозв’язна.

В загальному випадку будуємо таблицю для визначення максимальних внутрішньо-стійких підмножин множини вершин графа, тобто множин несуміжних вершин графа. Рядки таблиці – внутрішньо-стійкі множини. Стовпці таблиці – номера вершин графа.

Несуміжні вершини відзначені в таблиці одиницями. Далі вирішується задача побудови одного найкоротшого покриття (методом мінімального стовпця – максимального рядка). Вершини, що належать кожній підмножині, що входить в знайдене найкоротше покриття, забарвлюються одним кольором. Якщо деяка вершина належить декільком потрапивши до покриття підмножинам, то вона в одній залишається, а з інших видаляється.

Нехай В={b1,…,bn} – опорна множина. Є множина А, яка складається из m пiдмножин Аi (А=(А1, …, Аm}) множини В таких, що

Термін покриття означає , що сукупність множин містить всі елементи множини В, тобто " покриває" множину В. Покриття називаєтьсянайкоротшим , якщо перше покриття - найменше серед всіх покриттів даної задачі. Покриття , близьке до найкоротшому , дає з алгоритмом перетворення таблиці покриттів , засноване на методі «мінімальний стовпець - максимальний рядок».

    1. Словесний опис алгоритму 0. Вхідна таблиця вважається поточною перетворюваною таблицею покриття; масив строк покриття пустий. 1. В поточній таблиці визначається стовпець з найменшим числом одиниць. Серед рядків, які містять одиниці у цьому стовпці визначається один рядок, який містить найбільше число одиниць. Цей рядок включається у покриття, поточна таблиця покриття зменшується завдяки викресленню усіх стовпців, в котрих визначений рядок має одиницю. 2. Якщо в таблиці є не викреслені стовпці, то знов виконується п.1, інакше – покриття побудовано. Примітка. Під час підрахунку одиниць в рядку враховуються тільки одиниці в активних стовпцях.

    2. Вибір структур даних 1. A[m][n] – двомірний масив, який містить у собі таблицю покриття. 2. m – кількість рядків. 3. n – кількість стовпців. 4. pokr[m] – одномірний масив рядків покриття. 5. стр[m] – скалярний вектор активних рядків – одномірний масив цілих чисел ([i]=1 – рядок активний, [i]=0 – рядок неактивний). 6. стб[n] – скалярний вектор активних стовпців – одномірний масив цілих чисел ([j]=1 – стовпець активний, [j]=0 – стовпець неактивний). 7. Sстр[m] – скалярний вектор суми елементів рядка – одномірний масив цілих чисел. 8. ismax – номер(індекс) максимального рядка. 9. Smax – кількість елементів в рядку з індексом ismax 10. Sстб[n] – скалярний вектор суми елементів стовпця – одномірний масив цілих чисел. 11 . ismin – номер(індекс) мінімального стовпця. 12. Smin – кількість елементів в рядку з індексом ismin. 13. i, j, z – індекси.

    3. Опис блоків алгоритму (Малюнок 1.1). Блок 1. Вводиться таблиця покриття A[m][n], де m – це кількість рядків, а n – кількість стовпців. Блок 2. Робиться ініціалізація необхідних змінних вказаних у п.1.3. Блок 3. Процедура «min стовпець», яка знаходить стовпець з найменшою кількістю одиниць. Блок 4. Процедура «max рядок», яка знаходить рядок з найбільшою кількістю одиниць. Блок 5. Процедура «запис та виключення», яка записує максимальний рядок у покриття та виключає її і потрібні стовпці з таблиця покриття. Блок 6. Перевірка таблиці покриття на наявність активних стовбців. Блок 7. Якщо такі стовпці існують – повернення у блок 3, якщо ні – вивести покриття.

    4. Опис процедур Процедура «min стовпець» (Малюнок 1.2). Блок 1. Обнуляємо ismin та весь масив Sстб, встановлюємо Smin=m+1. Блок 2. Запускаємо цикл, який проходить по стовпцях з Кроком дорівнюючим 1, починаючи з першого. Блок 3. Перевіряємо, чи активний поточний стовпець. Якщо так, то виконуємо блок 4, якщо ні – блок 9. Блок 4. Запускаємо цикл, який проходить по рядках з кроком дорівнюючим 1, починаючи з першого. Блок 5. До значення змінної суми одиниць стовпця і додаємо значення поточної ячійки. Блок 6. Завершуємо цикл по рядкам. Блок 7. Перевіряємо, чи поточне значення змінної мінімального стовпця більше, ніж значення змінної суми одиниць стовпця і. Якщо так, виконуємо дії блока 8, якщо ні – блока 9. Блок 8. Присвоювання змінної мінімального стовпця значення змінної суми одиниць стовпця і. Також присвоюємо значення індексу стовпця і змінній індексу мінімального стовпця. Блок 9. Завершення циклу по стовпцях. Блок 10. Перевіряємо, чи індекс мінімального стовпця дорівнює 0. Якщо так, повертаємо помилку, якщо ні – значення індексу мінімального стовпця. Процедура «mах рядок» (Малюнок 1.3). Блок 1. Обнуляємо масив Sстр, Smax та ismax. Блок 2. Запускаємо цикл, який проходить по рядках з Кроком дорівнюючим 1, починаючи з першого. Блок 3. Перевіряємо, чи активний поточний рядок. Якщо так, то виконуємо блок 4, якщо ні – блок 5. Блок 4. Перевіряємо умову наявності нуля на перетині поточного рядка та мінімального стовпця. Якщо умова виконується, ідемо до блоку 5, якщо ні – до блоку 7. Блок 5. Завершення циклу по рядках. Блок 6. Перевіряємо, чи індекс максимального рядка дорівнює 0. Якщо так, повертаємо помилку, якщо ні – значення індексу максимального рядка. Блок 7. Запускаємо цикл, який проходить по стовпцях з Кроком дорівнюючим 1, починаючи з першого. Блок 8. До значення змінної суми одиниць рядка і додаємо значення поточної ячійки. Блок 9. Завершення циклу по стовпцях. Блок 10. Перевіряємо, чи поточне значення змінної максимального рядка менше, ніж значення змінної суми одиниць рядка j. Якщо так, виконуємо дії блока11, якщо ні – блока 5. Блок 11. Присвоювання змінної максимального рядка значення змінної суми одиниць рядка j. Також присвоюємо значення індексу рядка j змінній індексу максимального рядка. Процедура «запис та виключення» (малюнок 1.4). Блок 1. Запис в покриття номеру рядка, який викреслюємо. Збільшення поточного індексу у масиві покриття на одиницю. Блок 2. Деактивуємо цей рядок у векторі активності. Блок 3. Починаємо цикл, який проходить по стовпцях з Кроком дорівнюючим 1, починаючи з першого. Блок.4. Деактивуємо стовпці, які на перетині з максимальним рядком мають одиницю. Для цього потрібно скласти значення цієї ячійки зі значенням індикатора активності по модулю 2. Блок 5. Завершення циклу по стовпцях.

    1. Схема алгоритму

Малюнок 1.1.1 Схема алгоритму пошуку найкоротшого покриття за методом «мінімальний стовпець - максимальний рядок»

Малюнок 1.2 Процедура "min стовпець"

Малюнок 1.3 Процедура "max рядок"

Малюнок 1.4 Процедура "запис та виключення"

1.7 Контрольний приклад Крок 1. Введемо таблиця покриття

1

2

3

4

5

6

7

8

1

1

1

1

2

1

1

3

1

1

4

1

1

5

1

1

6

1

1

7

1

1

8

1

1

1

Крок 2. Ініціалізуємо потрібні змінні: m=8; n=8; стр={1,1,1,1,1,1,1,1};стб={1,1,1,1,1,1,1,1};z:=1; Крок 3. Знаходження мінімального стовпця. 1) Sстб:={0,0,0,0,0,0,0,0}; Smin:=9; ismin:=0; 2) i=1; Sстб:={2,0,0,0,0,0,0,0}; Smin:=2; ismin:=1; 3) i=2; Sстб:={2,2,0,0,0,0,0,0}; Smin:=2; ismin:=1; 4) i=3; Sстб:={2,2,2,0,0,0,0,0}; Smin:=2; ismin:=1; 5) i=4; Sстб:={2,2,2,2,0,0,0,0}; Smin:=2; ismin:=1; 6) i=5; Sстб:={2,2,2,2,3,0,0,0}; Smin:=2; ismin:=1; 7) i=6; Sстб:={2,2,2,2,3,2,0,0}; Smin:=2; ismin:=1; 8) i=7; Sстб:={2,2,2,2,3,2,2,0}; Smin:=2; ismin:=1; 9) i=8; Sстб:={2,2,2,2,3,2,2,3}; Smin:=2; ismin:=1; Крок 4. Знаходження максимального рядка. 1) Sстр:={0,0,0,0,0,0,0,0}; Smax:=0; ismax:=0; ismin=1; 2) j=2; Sстр:={0,2,0,0,0,0,0,0}; Smax:=2; ismax:=2; 3) j=3; Sстр:={0,2,2,0,0,0,0,0}; Smax:=2; ismax:=2; Крок 5. Запис рядка у покриття та виключення його і стовпців з таблиця покриття. 1)z=1; стр:={1,0,1,1,1,1,1,1};стб:={0,1,1,1,0,1,1,1};pokr={A2}; z:=2; Крок 6. Перевірка активності хоча б одного стовпця. стб=0? Якщо так, виведення покриття та завершення роботи, якщо ні – шаг 3. Тепер наша таблиця покриття виглядає так:

1

2

3

4

5

6

7

8

1

1

1

1

2

1

1

3

1

1

4

1

1

5

1

1

6

1

1

7

1

1

8

1

1

1

Крок 3.1 Знаходження мінімального стовпця. 1) Sстб:={0,0,0,0,0,0,0,0}; Smin:=9; ismin:=0; 2) i=2; Sстб:={0,2,0,0,0,0,0,0}; Smin:=2; ismin:=2; 3) i=3; Sстб:={0,2,2,0,0,0,0,0}; Smin:=2; ismin:=2; 4) i=4; Sстб:={0,2,2,2,0,0,0,0}; Smin:=2; ismin:=2; 5) i=6; Sстб:={0,2,2,2,0,2,0,0}; Smin:=2; ismin:=2; 6) i=7; Sстб:={0,2,2,2,0,2,2,0}; Smin:=2; ismin:=2; 7) i=8; Sстб:={0,2,2,2,0,2,2,3}; Smin:=2; ismin:=2; Крок 4.1 Знаходження максимального рядка. 1) Sстр:={0,0,0,0,0,0,0,0}; Smax:=0; ismax:=0; ismin=2; 2) j=1; Sстр:={3,0,0,0,0,0,0,0}; Smax:=3; ismax:=1; 3) j=4; Sстр:={3,0,0,2,0,0,0,0}; Smax:=3; ismax:=1; Крок 5.1 Запис рядка у покриття та виключення його і стовпців з таблиця покриття. 1)z=2; стр:={0,0,1,1,1,1,1,1};стб:={0,0,1,1,0,0,0,1};pokr={A2, А1}; z:=3; Крок 6.1 Перевірка активності хоча б одного стовпця. стб=0? Якщо так, виведення покриття та завершення роботи, якщо ні – шаг 3. Тепер наша таблиця покриття виглядає так:

1

2

3

4

5

6

7

8

1

1

1

1

2

1

1

3

1

1

4

1

1

5

1

1

6

1

1

7

1

1

8

1

1

1

Крок 3.2 Знаходження мінімального стовпця. 1) Sстб:={0,0,0,0,0,0,0,0}; Smin:=9; ismin:=0; 2) i=3; Sстб:={0,0,2,0,0,0,0,0}; Smin:=2; ismin:=3; 3) i=4; Sстб:={0,0,2,2,0,0,0,0}; Smin:=2; ismin:=3; 4) i=8; Sстб:={0,0,2,2,0,0,0,3}; Smin:=2; ismin:=3; Крок 4.2 Знаходження максимального рядка. 1) Sстр:={0,0,0,0,0,0,0,0}; Smax:=0; ismax:=0; ismin=3; 2) j=5; Sстр:={0,0,0,0,1,0,0,0}; Smax:=1; ismax:=5; 3) j=6; Sстр:={0,0,0,0,1,1,0,0}; Smax:=1; ismax:=5; Крок 5.2 Запис рядка у покриття та виключення його і стовпців з таблиця покриття. 1)z=3; стр:={0,0,1,1,0,1,1,1};стб:={0,0,0,1,0,0,0,1};pokr={A2, А1, А5}; z:=4; Крок 6.2 Перевірка активності хоча б одного стовпця. стб=0? Якщо так, виведення покриття та завершення роботи, якщо ні – шаг 3. Тепер наша таблиця покриття виглядає так:

1

2

3

4

5

6

7

8

1

1

1

1

2

1

1

3

1

1

4

1

1

5

1

1

6

1

1

7

1

1

8

1

1

1

Крок 3.3 Знаходження мінімального стовпця. 1) Sстб:={0,0,0,0,0,0,0,0}; Smin:=9; ismin:=0; 2) i=4; Sстб:={0,0,0,2,0,0,0,0}; Smin:=2; ismin:=4; 3) i=8; Sстб:={0,0,0,2,0,0,0,3}; Smin:=2; ismin:=4; Крок 4.3 Знаходження максимального рядка. 1) Sстр:={0,0,0,0,0,0,0,0}; Smax:=0; ismax:=0; ismin=4; 2) j=7; Sстр:={0,0,0,0,0,0,2,0}; Smax:=2; ismax:=7; 3) j=8; Sстр:={0,0,0,0,0,0,2,1}; Smax:=2; ismax:=7; Крок 5.3 Запис рядка у покриття та виключення його і стовпців з таблиця покриття. 1)z=4; стр:={0,0,1,1,0,1,0,1};стб:={0,0,0,0,0,0,0,0};pokr={A2, А1, А5, А7}; z:=5; Крок 6.3 Перевірка активності хоча б одного стовпця. стб=0? Якщо так, виведення покриття та завершення роботи, якщо ні – шаг 3. Крок 7. Виведення результату, тобто покриття. Таким чином, у цьому випадку покриттям є строки 1, 2, 5, 7. Можемо побачити це у таблиці нижче.

1

2

3

4

5

6

7

8

1

1

1

1

2

1

1

5

1

1

7

1

1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]