- •Передмова
- •Лабораторна робота № 1 Множини. Генерація елементів множини та виконання операцій над множинами
- •1. Теоретичні відомості.
- •2. Завдання для самостійної роботи.
- •Варіанти завдань
- •Контрольні питання
- •Лабораторна робота № 2 Мінімізація зображення множин
- •1. Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 3 Знаходження гамільтонового циклу графа
- •1. Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 4 Побудова мінімального остовного дерева
- •Теоретичні відомості.
- •«Жадібний» алгоритм побудови мінімального остовного дерева
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 5 Знаходження максимального потоку транспортної мережі
- •Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота № 6 Визначення найкоротшого шляху в графі
- •Теоретичні відомості.
- •2. Завдання до самостійної роботи.
- •Контрольні питання
- •Лабораторна робота №7 Використання графів в мережі планування.
- •1. Теоретичні відомості.
- •Завдання до самостійної роботи.
- •Контрольні питання
- •Література
2. Завдання до самостійної роботи.
-
Представити десятковий еквівалент множини (у форматі ХХХ - тризначне число, яке задається викладачем) у вигляді двійкового вектора, побудувати двійкову таблицю, отримат аналітичний вираз множини.
-
Відобразити множину за допомогою діаграм Ейлера.
-
Зобразити гіперкуб для множини, яка розглядається.
-
Мінімізувати множину за допомогою методу Квайна.
-
Побудувати діаграму Ейлера для мінімізованої множини. Порівняти з попередньою діаграмою.
Звіт
-
Постановка задачі.
-
Хід роботи.
-
Результати роботи.
-
Висновки.
Контрольні питання
-
Назвати основні аксіоми теорії множин.
-
,Пояснити поняття конституенти та гіперкуба.
-
Пояснити поняття нормальної форми Кантора множини.
-
В чому полягає метод Квайна мінімізації множин?
Лабораторна робота № 3 Знаходження гамільтонового циклу графа
Мета роботи: знайти мінімальний гамільтоновий цикл заданого повного графа методом повного перебору, знайти всі гамільтонові шляхи довільного графа методом повного перебору,
1. Теоретичні відомості.
Гамільтоновим називається такий шлях у графі, який проходить по кожній вершині лише один раз. На жаль, до сьогодні не існує необхідних і достатніх умов існування гамільтонового шляху в графі. Це питання вивчається вже понад сто років, і відповідь досить не знайдена. Але це говорить лише про те, що не існує оптимальних методів пошуку гамільтонового шляху в графі, однак метод повного перебору завжди дасть правильну відповідь.
Нехай граф заданий матрицею суміжностей. Для визначення існування чи відсутності гамільтонового шляху в заданому графі необхідно переглянути всі варіанти перестановок вершин цього графа. Одночасно з отриманням чергової перестановки цих вершин необхідно перевірити наявність ребер між сусідніми вершинами у ній. У разі розв’язанні задачі про наявність хоча б одного з таких шляхів на цьому можна завершити виконання алгоритму. Якщо треба всі можливі шляхи, необхідно виконати алгоритм перегляду всіх можливих перестановок вершин графа до кінця.
Отже алгоритм пошуку гамільтонового шляху в заданому графі можна сформулювати так.
-
Згенерувати поточну перестановку вершин заданого графа.
-
Розглянути першу пару послідовних вершин у перестановці.
-
Якщо ребро між поточною парою вершин перестановок відсутнє, то перейти до пункту 6.
-
Якщо існує наступна пара послідовних вершин у графі, то перейти до пункту 3.
-
Якщо для всіх пар послідовних вершин існують ребра у графі, то перейти до пункту 7.
-
Якщо існує наступна перестановка вершин заданого графа, то перейти до пункту 1.
-
Вивести вміст перестановок вершин заданого графа, для якого існують усі ребра.
-
Завершити алгоритм.
Нижче наведена реалізація даного алгоритму у вигляді фрагмента Pascal-програми:
flag:=false; {ініціалізація початку роботи алгоритму}
i:=1;
repeat
j:=1; {визначення існування всіх ребер}
while (d[a[j], a[j+1]] = 1) and (j<n) do inc(j); {поточної перестановки вершин}
if j=n then {Якщо така перестановка існує, то}
begin
for j:=1 to n do
write(f_out, a[j], ‘ ‘); {виводимо послідовність вершин.}
{Встановлюємо ознаку існування}
writeln(f_out); {гамільтонового шляху}
flag:=true;
end;
inc(i); {Перехід до наступної перестановки.}
perm; {Визначення наступної перестановки вершин графа}
until (i>=f) or flag; {Завершення пошуку в разі, коли відповідь знайдена або відсутня}
Зауважемо, що змінна f містить значення кількості всіх можливих перестановок вершин графа n! і саме за допомогою лічильника і, який змінюється в межах від 1 до f, ми можемо визначити, чи існує в ньому хоча б один гамільтоновий шлях. Окрім цього, у наведеному фрагменті використано звернення до процедури генерування перестановок.
x5 x1 x3
● ● ●
● ● ●
x6 x4 x2
|
X1 |
X2 |
X3 |
X4 |
X5 |
X6 |
X1 |
0 |
1 |
1 |
1 |
1 |
1 |
X2 |
1 |
0 |
1 |
1 |
0 |
0 |
X3 |
1 |
1 |
0 |
0 |
0 |
0 |
X4 |
1 |
1 |
0 |
0 |
0 |
0 |
X5 |
1 |
0 |
0 |
0 |
0 |
1 |
X6 |
1 |
0 |
0 |
0 |
1 |
0 |
Мал.. 1
Виконавши описаний вище алгоритм для графа, зображеного на малюнку 1, отримаємо результат:
3 2 4 1 5 6
Якщо дещо модифікувати наведений фрагмент програми і визначити всі можливі гамільтонові шляхи розглянутому прикладі графа, то отримаємо таку відповідь:
3 2 4 1 5 6
3 2 4 1 6 5
4 2 3 1 5 6
4 2 3 1 6 5
5 6 1 3 2 4
5 6 1 4 2 3
6 5 1 3 2 4
6 5 1 4 2 3
Розглянемо частинний випадок задачі знаходження гамільтонового шляху, а саме, задачу знаходження мінімального гамільтонового циклу у повному зваженому графі методом повного перебору. Постановка задачі передбачає існування гамільтонового циклу, але необхідно знайти мінімальний цикл, тобто вибрати такий цикл, сумарне значення вагових коефіцієнтів ребер якого - мінімальне число.
Нижче наведена реалізація даного алгоритму у вигляді фрагмента Pascal-програми:
min:=100;
mi:=1; mj:=1; mk:=1; ms:=1; mt:=1;
for i:=1 to 5 do
for j:=1 to 5 do
for k:=1 to 5 do
for s:=1 to 5 do
for ti:=1 to 5 do
begin
if (i< >j) and (i< >k) and (i< >s) and (i< >t) and (j< >k) and
(j< >s) and (j< >t) and (k< >s) and (k< >t) and (s< >t) then
begin
p:=a[i,j]+a[j,k]+a[k,s]+a[s,t]+a[t,i];
if p < min then
begin
min:=p;
mi:=i; mj:=j; mk:=k; ms:=s; mt:=t;
end;
end;
end;