
- •Глава 3. Спеціальні задачі лінійного програмування та методи їх розв’язування
- •3.1. Транспортна задача
- •3.1.1. Постановка та математична модель транспортної задачі
- •3.1.2. Розв’язування транспортної задачі
- •3.2. Задача про призначення
- •3.3. Динамічне програмування
- •3.3.1. Вступ до динамічного програмування
- •3.3.2. Рекурентні співвідношення динамічного програмування
- •3.3.3. Обчислювальний алгоритм
- •3.3.4. Метод динамічного програмування за наявності двох обмежень
- •3.3.5. Задача про заміну обладнання
- •3.4. Задачі лінійного програмування великої розмірності
- •3.4.1. Характеристика підходів до розв’язування задач великої розмірності
- •3.4.2. Метод декомпозиції Данцига-Вульфа
- •3.5. Перевір себе
- •3.5.1. Контрольні запитання
- •3.5.2 Завдання та приклади для самостійної роботи
3.2. Задача про призначення
Окремим
випадком транспортної задачі є задача
про призначення. Розглянемо постановку
задачі про призначення. Керівництву
підприємства необхідно призначити
працівників на
посад так, щоб забезпечити виконання
всіх робіт за мінімальну вартість. При
цьому відомі числа
—
вартість виконання
–м
працівником
–ї
роботи,
.
Для
побудови математичної моделі цієї
задачі введемо змінні
:
-
якщо –ий працівник призначається на -ту посаду;
якщо –ий працівник не призначається на -ту посаду.
Слід відзначити, що в цій задачі кількість працівників співпадає з кількістю посад, тому план призначення повинен враховувати такі умови:
,
тобто, кожний працівник призначається лише на одну посаду;
,
тобто, на кожну посаду призначається лише один працівник.
Загальна
вартість виконання робіт визначається
формулою
.
Таким чином, математична модель задачі про призначення є лінійною моделлю з булевими змінними:
|
(3.2.1) |
, |
(3.2.2) |
, |
(3.2.3) |
|
(3.2.4) |
Якщо
замінити умову (3.2.4) умовою невід’ємності
змінних, то задача (3.2.1)-(3.2.4) перетвориться
у транспортну задачу з
і
,
.
Але опорний план задачі про призначення
містить лише
ненульових компонент, тому вона є
виродженим аналогом транспортної задачі
(оскільки
і умова невиродженості не виконується).
Особливості задачі (3.2.1)-(3.2.4) дозволяють розв’язувати її за допомогою більш простих методів, ніж методи розв’язування транспортної задачі.
У відповідності із постановкою задачі про призначення необхідно з матриці
вибрати елементів по одному з кожного рядка (працівники) і кожного стовпчика (посади) так, щоб сума цих елементів (вартість виконання всіх робіт) була мінімальною.
Цю задачу можна звести до вибору нульових елементів з деякої матриці з невід’ємними елементами, яка має нулі в кожному рядку і кожному стовпчику.
Дві
матриці
та
називаються еквівалентними,
якщо
,
— деякі числа.
Еквівалентність матриць означає, що якщо від елементів кожного рядка або кожного стовпчика однієї матриці відняти або додати одне і те ж саме число (можливо, різні для різних рядків і стовпчиків), то отримаємо еквівалентну матрицю.
Теорема 3.2.1. Оптимальні розв’язки задач з еквівалентними матрицями співпадають.
Дійсно,
якщо
- оптимальний розв’язок задачі
(3.2.1)-(3.2.4), то
- мінімальне значення цільової функції
з матрицею
.
Тоді
для задачі про призначення з еквівалентною
матрицею
:
.
Отже,
,
де
та
не залежать від
,
тому
досягає мінімуму тоді, коли мінімізується
.
Властивість еквівалентності матриць взаємна, тому будь-який оптимальний розв’язок задачі з матрицею буде оптимальним розв’язком задачі з матрицею .
Теорема
3.2.2.
Якщо
всі
і знайдено
так, що
,
то
— оптимальний розв’язок задачі
(3.2.1)-(3.2.4).
Угорський метод, який вперше запропонував угорський математик Егерварі у 1931 р. для розв’язування задачі про призначення, ґрунтується на теоремах 3.2.1 та 3.2.2. Протягом тривалого часу його робота залишалась маловідомою. У 1953 р. математик Т.Кун переклав цю роботу англійською мовою, заново відкрив її для фахівців, розвинув ідеї Егерварі та вдосконалив метод, який на честь першого автора було названо угорським [32], [50], [53].
Алгоритм
угорського методу
складається з підготовчого етапу і не
більше ніж (
)-х
ітерацій.
Підготовчий етап:
1. В
кожному рядку матриці
знаходимо мінімальний елемент та
віднімаємо його від елементів відповідного
рядка. В результаті отримуємо матрицю
,
в кожному рядку якої є хоча б один нуль.
2. В кожному стовпчику матриці знаходимо мінімальний елемент та віднімаємо його від відповідного стовпчика. В результаті отримаємо матрицю , в кожному рядку і стовпчику якої є хоча б один нуль.
Основний етап:
1.
Відмічаємо знаком „ * ” нулі в стовпчиках
матриці
так, щоб в кожному рядку був тільки один
такий знак. Якщо кількість нулів із „*
” дорівнює
,
то знайдено оптимальний розв’язок:
місця нулів із „* ” відповідають
,
всі інші
.
Якщо кількість нулів із „ * ” менше , то позначаємо знаком „ + ” стовпчики матриці, в яких є 0* і вважаємо ці стовпчики зайнятими. У процесі розв’язування задачі будуть з’являтися зайняті рядки. Елементи матриці, які стоять на перехресті незайнятих стовпчиків та рядків, будемо називати незайнятими, решту елементів матриці – зайнятими.
2. Переглядаємо рядки матриці зліва направо: якщо незайнятих нулів немає, то переходимо до п.4.
Якщо незайнятий нуль є, то відмічаємо його знаком „ ' ”. Якщо в цьому ж рядку немає 0*, то переходимо до п.3. Якщо ж в цьому рядку є 0*, то знімаємо позначку „ + ” зі стовпчика з 0* і позначаємо знаком „ + ” рядок з 0', після чого повертаємось на початок п.2, поки не переглянемо всі рядки матриці.
3. Будуємо ланцюг: від 0' по стовпчику до 0*, від нього по рядку до 0' і т.д., доки це можливо. Ланцюг може складатись навіть з одного 0'. Знімаємо знаки „ * ” і замінюємо „ ' ” на „ * ” у нулів з ланцюга. Таким чином, кількість 0* зростає принаймні на один. Повертаємось до п.1, знявши всі позначки з матриці, і залишивши тільки 0*.
4. Знаходимо мінімальний елемент матриці серед незайнятих. Віднімаємо цей елемент від всіх незайнятих рядків та додаємо до всіх зайнятих стовпчиків.
Позначки нулів та всіх зайнятих стовпчиків та рядків залишаємо без змін. Таким чином отримаємо нові незайняті нулі і повертаємось до п.2.
Якщо в задачі (3.2.1)-(3.2.4) цільова функція (3.2.1) максимізується, то на першому кроці підготовчого етапу потрібно вибрати максимальний елемент з кожного рядка матриці і відняти від нього елементи відповідного рядка, а далі діяти за тими ж самими правилами.
Приклад 3.2. Естафета на Олімпійських іграх складається з чотирьох дистанцій, довжина яких 100 м, 200 м, 500 м та 800 м. У команді чотири спортсмени, результати кожного з яких на кожній дистанції наведено у таблиці 3.8.
Таблиця 3.8.
Спортсмени |
Результати спортсменів (сек.) |
|||
100 м |
200 м |
500 м |
800 м |
|
Іванов |
10 |
21 |
54 |
86 |
Петров |
10 |
20 |
55 |
88 |
Коваленко |
9 |
22 |
55 |
87 |
Шевченко |
9 |
21 |
56 |
89 |
Один спортсмен може бути призначеним тільки на одну дистанцію і на кожну дистанцію має бути призначений тільки один спортсмен. Як розподілити спортсменів по дистанціям, щоб загальний результат естафети був найкращим?
Побудуємо модель задачі. Змінні означають результат призначення - го спортсмена на - ту дистанцію, тобто
Час, за який команда пробіжить естафету, буде визначатись як
Кожний спортсмен може бути призначений тільки на одну дистанцію, що виражається як
,
,
та на кожну дистанцію має бути призначений тільки один спортсмен:
,
.
Математична модель задачі має вигляд:
,
.
Для розв’язування цієї задачі застосуємо угорський метод. Етапи розв’язування задачі представимо у вигляді таблиць 3.9 – 3.15.
Підготовчий етап. Виявимо мінімальний елемент у рядках (табл. 3.9).
Таблиця 3.9.
№ |
Спортсмени |
Результати спортсменів (сек.) |
Мінімальний елемент рядка |
|||
100 м |
200 м |
500 м |
800 м |
|||
1. |
Іванов |
10 |
21 |
54 |
86 |
10 |
2. |
Петров |
10 |
20 |
55 |
88 |
10 |
3. |
Коваленко |
9 |
22 |
55 |
87 |
9 |
4. |
Шевченко |
9 |
21 |
56 |
89 |
9 |
Віднімаємо мінімальний елемент від елементів відповідного рядка та знаходимо мінімальний елемент у кожному стовпчику нової таблиці 3.10.
Таблиця 3.10.
№ |
Спортсмени |
Результати спортсменів (сек.) |
|||
100 м |
200 м |
500 м |
800 м |
||
1. |
Іванов |
0 |
11 |
44 |
76 |
2. |
Петров |
0 |
10 |
45 |
78 |
3. |
Коваленко |
0 |
13 |
46 |
78 |
4. |
Шевченко |
0 |
12 |
47 |
80 |
5. |
Мінімальний елемент стовпчика |
0 |
10 |
44 |
76 |
Віднімаємо мінімальний елемент від елементів відповідного стовпчика (табл. 3.11).
Таблиця 3.11.
№ |
Спортсмени |
Результати спортсменів (сек.) |
|
|||
100 м |
200 м |
500 м |
800 м |
|||
1. |
Іванов |
0 |
1 |
0* |
|
+ |
2. |
Петров |
0 |
0* |
1 |
2 |
|
3. |
Коваленко |
0 |
3 |
2 |
2 |
|
4. |
Шевченко |
0* |
2 |
3 |
4 |
|
5. |
|
+ |
+ |
|
|
|
Основний етап. Згідно п.1 основного етапу алгоритму спробуємо зробити призначення по даним таблиці 3.11.
На даному
етапі ми можемо зробити тільки три
призначення, а необхідно чотири. Згідно
п.1. позначаємо у табл. 3.11. знаком „+”
зайняті стовпчики. Переходимо до п.2. У
першому рядку табл. 3.11 є один незайнятий
нуль (
),
який позначаємо „ ' ”
і 0* (
),
тому знімаємо позначку „+” з третього
стовпчика (позначки, які знімаємо
обводимо квадратом) та позначаємо перший
рядок таблиці знаком „+”. Більш незайнятих
нулів у таблиці не має, тому переходимо
до п.4.
Серед незайнятих елементів таблиці знаходимо мінімальний
Віднімаємо це число від всіх незайнятих рядків (табл. 3.12) та додаємо до всіх зайнятих стовпчиків (табл. 3.13).
Таблиця 3.12.
№ |
Спортсмени |
Результати спортсменів (сек.) |
|
|||
100 м |
200 м |
500 м |
800 м |
|||
1. |
Іванов |
0 |
1 |
0* |
|
+ |
2. |
Петров |
-1 |
-1* |
0 |
1 |
|
3. |
Коваленко |
-1 |
2 |
1 |
1 |
|
4. |
Шевченко |
-1* |
1 |
2 |
3 |
|
5. |
|
+ |
+ |
|
|
|
Таблиця 3.13.
№ |
Спортсмени |
Результати спортсменів (сек.) |
|
|||
100 м |
200 м |
500 м |
800 м |
|||
1. |
Іванов |
1 |
2 |
0+ |
|
+ |
2. |
Петров |
0 |
0* |
|
1 |
+ |
3. |
Коваленко |
0 |
3 |
1 |
1 |
|
4. |
Шевченко |
0* |
2 |
2 |
3 |
|
5. |
|
+ |
|
|
|
|
Повертаємося
до п.2. Незайнятий нуль відповідає
елементу
.
Позначаємо його „ ' ” , другий рядок
робимо зайнятим та знімаємо позначку
„+” з другого стовпчика. Незайнятих
нулів у табл. 3.13 більш немає. Переходимо
до п.4. та заповнюємо таблицю 3.14.
Таблиця 3.14.
№ |
Спортсмени |
Результати спортсменів (сек.) |
|
|||
100 м |
200 м |
500 м |
800 м |
|||
1. |
Іванов |
2 |
2 |
|
|
+ |
2. |
Петров |
1 |
0* |
|
1 |
+ |
3. |
Коваленко |
0 |
2 |
|
0 |
|
4. |
Шевченко |
0* |
1 |
1 |
2 |
|
5. |
|
+ |
|
|
|
|
Повертаємося
до п.2. У третьому рядку є два незайнятих
нулі (
та
).
Виберемо, наприклад,
та
позначимо його „ ' ” (табл. 3.14). Оскільки
у третьому рядку немає 0*, тоді переходимо
до п.3.
Побудуємо
цикл:
.
Знімемо „* ” з
та замінимо „ ' ” на „* ” у
та
.
Таким чином, новий набір нулів з „* ”
має на один більше, ніж попередній.
Повертаємося до п.1. та спробуємо зробити
призначення. Так як кількість 0* дорівнює
чотирьом, знайдемо оптимальний варіант
призначень (табл. 3.15).
Таблиця 3.15.
№ |
Спортсмени |
Результати спортсменів (сек.) |
|||
100 м |
200 м |
500 м |
800 м |
||
1. |
Іванов |
|
|
|
* |
2. |
Петров |
|
* |
|
|
3. |
Коваленко |
|
|
* |
|
4. |
Шевченко |
* |
|
|
|
Мінімальний час, за який команда може пробігти естафету, дорівнює 170 секундам. У табл. 3.15 позначка „*” означає призначення спортсмена на відповідну дистанцію.
Сформульований алгоритм угорського методу може використовуватися для його програмної реалізації. Якщо задача про призначення розв’язується вручну, тоді етапи алгоритму можна виконувати простіше.
Підготовчий етап виконується аналогічно.
Основний етап: Зазначимо, що розв’язок задачі про призначення є допустимим якщо з кожного рядка та кожного стовпчика матриці вибрано тільки один елемент. Вибрані нульові елементи матриці відповідають оптимальному розв’язку задачі.
Знайти рядок матриці , який містить тільки один нульовий елемент та позначити цей елемент „*” Якщо такі рядки відсутні, а є рядки з більшою кількістю нульових елементів, тоді вибрати будь-який з них і також позначити його „*”. Перейти до п. 2.
Якщо у відповідному стовпчику та рядку є інші нульові елементи, тоді їх закреслити. Пункти 1 та 2 повторити до тих пір, поки продовження цієї процедури є можливим.
Якщо кількість позначених нульових елементів дорівнює , тоді знайдемо оптимальний розв’язок задачі.
Якщо кількість таких елементів матриці менше за , тоді п.3.
Провести мінімальне число горизонтальних та вертикальних ліній через рядки та стовпчики матриці так, щоб всі нульові елементи стали викресленими.
Знайти мінімальний елемент серед невикреслених.
Відняти його від всіх невикреслених елементів матриці та додати до всіх елементів матриці, які лежать на перехресті прямих.
Всі елементи матриці, через які проходить тільки одна пряма, залишаються без змін.
У результаті такої процедури в матриці з’явиться принаймні один новий нуль.
Повернутися до п.1. основного етапу та повторити алгоритм до тих пір, поки не буде
отриманий оптимальний розв’язок.
Приклад 3.3. Реалізація інноваційного проекту передбачає виконання трьох комплексів робіт. Є можливість розпочати ці роботи одночасно і виконувати їх паралельно, але для цього треба залучити трьох виконавців. У результаті переговорів з ними, було з’ясовано економію коштів при виконанні того чи іншого комплексу робіт кожним виконавцем. Ці дані наведені у таблиці 3.16.
Таблиця 3.16.
Виконавець |
Економія коштів на кожному комплексі робіт (тис. грн.) |
||
І |
ІІ |
ІІІ |
|
А |
10 |
12 |
15 |
В |
12 |
6 |
9 |
С |
9 |
13 |
15 |
Знайти найбільш економний варіант розподілу робіт між виконавцями.
Розв’яжемо задачу угорським методом.
Критерієм оптимальності розподілу комплексів робіт між виконавцями є економія коштів, тому цільова функція такої задачі максимізується. Тоді на першому кроці підготовчого етапу треба вибрати максимальний елемент з кожного рядка матриці і відняти від нього елементи відповідного рядка:
.
На наступних кроках всі правила алгоритму зберігаються. У кожному стовпчику матриці знайдемо мінімальний елемент та віднімемо його від елементів відповідного стовпчика. В результаті отримаємо матрицю :
.
Переходимо
до основного етапу. Виберемо рядок
матриці
,
який містить тільки один нуль (
).
Позначимо цей нуль „* ”.
Викреслюємо
елемент
.
На даному етапі можна зробити тільки
два призначення,
,
та
чи
,
тоді як треба три. Такий розподіл є
недопустимим. Переходимо до п.3. Проводимо
найменше число вертикальних та
горизонтальних прямих, які проходять
через всі нульові елементи матриці:
.
Найменшим
елементом, через який не проходить жодна
пряма є
.
Скоректуємо матрицю
відповідно до п.5. алгоритму:
та спробуємо зробити призначення. Тепер вимоги до розподілу всіх трьох виконавців за трьома комплексами робіт виконуються, тому отриманий розв’язок є оптимальним, згідно з яким виконавець А призначається виконувати третій комплекс робіт, виконавець В – перший, а виконавець С – другий комплекс робіт. Такий варіант розподілу забезпечить найбільшу економію коштів у 40 тис. грн. (15+12+13=40).