Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
40-1-05.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
3.8 Mб
Скачать

3.2. Задача про призначення

Загальна матмодель задачі вибору або призначення має вигляд:

Алгоритм угорського методу задачі призначення має такі етапи.

  1. Зведення задачі до канонічного вигляду, тобто вона має бути закритою – матриця С має бути квадратною типу М*M (за рахунок додавання нульового фіктивного рядка або стовпчика).

  2. Визначення істотних нулів (єдиних нулів у рядках та стовпчиках), при цьому в стовпчику з нулем ставиться позначка «+»):

    • перерахунок за стовпчиками: віднімання від max елемента;

    • перерахунок по рядках: віднімання min елемента.

  3. Рішення знайдено при кількості позначок «+», рівній М – розмірності задачі. Якщо рішення не знайдено, то перехід до пункту 4.

  4. Перевірка на зацикленість, тобто номер ітерації має не перевищувати розмірність задачі М.

  5. Побудова множини (дерева) ланцюжків типу 0′0*0, де 0* – істотний нуль, а 0 – виділений нуль в рядку з 0*. Побудова ланцюжка здійснюється від 0 у невиділеному стовпчику до 0* у рядку, потім прямуємо до 0 у стовпчику і т.д., закінчуючи 0. Будуючи ланцюжок, необхідно відмічати рядки «+» та знімати позначення стовпчиків. Якщо хоч один ланцюжок побудовано, то замінюємо 00* та переходимо до пункту 3, якщо жодного не побудовано – до пункту 6.

  6. Генерація нових нулів на основі одного з непобудованих ланцюжків 00* включає:

  • визначення h 0 у матриці С серед невиділених елементів;

  • віднімання h від невиділених рядків та додавання h до виділених стовпчиків серед значень матриці С;

  • перехід до пункту 3.

Загальна схема алгоритму програми угорського методу розглянута на рисунку нижче.

Примітка. Типова помилка при програмуванні угорського методу – це розгляд згідно з літературою лише одного варіанта ланцюжка.

Розглянемо приклад.

Між чотирма кар’єрами треба розподілити п’ять екскаваторів таким чином, щоб їх виробітка була максимальною. Виробітки подані в таблиці, де стовпчики – кар’єри, а рядки – екскаватори.

3

5

5

1

Зробимо задачу закритою, тобто додамо фіктивний стовпчик:

3

5

5

1

0

5

4

3

5

5

4

3

5

0

7

8

6

2

7

8

6

2

0

4

3

5

4

4

3

5

4

0

5

3

5

1

5

3

5

1

0

+

+

+

За стовпчиками віднімаємо всі значення від max елемента:

4

3

1

4

0

За рядками віднімаємо min елемент від усіх значень та формуємо істотні нулі:

4

3

1

4

0*

2

4

3

0

0

2

4

3

0*

0

0

0

0

3

0

0*

0

0

3

0

3

5

1

1

0

3

5

1

1

0

2

5

1

4

0

2

5

1

4

0

1-а ітерація:

+

+

2-а ітерація:

+

+

+

Формуємо ланцюжок:

4

3

1

4

0*

Ланцюжок не знайдено, тому серед невиділених елементів знаходимо h=1 (див. вище) та знову формуємо ланцюжок:

3

2

0

4

0*

2

4

3

0*

0

1

3

2

0*

0

0*

0′

0

3

0

+

0*

0′

0

4

1

+

3

5

1

1

0

2

4

0*

1

0

2

5

1

4

0

1

4

0

4

0

3-а ітерація:

+

+

+

2-а ітерація:

+

+

+

+

+

Ланцюжок знову не знайдено, тому генеруємо нові 0 (теж h=1):

2

1

0

4

0*

Ланцюжок побудовано. Нулі 0′ замінюємо на 0*,

а 0* – на 0′:

2

1

0

4

0*

0

2

2

0*

0

0

2

2

0*

0

↓0*

0′

1

5

2

+

0

0*

1

5

2

1

3

0*

1

0

1

3

0*

1

0

0′

3

0

4

0

+

0*

3

0

4

0

Примітка. Розв’язання задачі призначення виконується за допомогою програми Vengr1.exe. Виклик командного рядка: <vengr1 file_in file_out>, де file_in та file_out – файли з початковими даними та ітераціями розрахунку.

Відповідь: 1 екс. – не працює, 2-ий – на 4-му кар’єрі, 3-ій – на 2-му, 4-ий – на 3-му та 5-ий – на 1-ому з загальною виробіткою 23.

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