Скачиваний:
37
Добавлен:
30.05.2020
Размер:
3.32 Mб
Скачать

z

Запитання для самоконтролю

1. Що розуміють під терміном «програмування» у назві математич­

 

ної дисципліни «Математичне програмування»?

2.Які задачі розв'язує така математична дисципліна, як дослі­ дження операцій?

3.Як математичне програмування пов'язане з дослідженням опе­ рацій?

4.Яке відношення має математичне програмування до теорії прийняття рішень?

5.На які два типи можна поділити всі задачі математичного про­ грамування? Які їх характерні ознаки?

6.Які класи задач виділяються окремо у математичному програму­ ванні?

7.Як формулюється задача про використання сировини? Обґрун­ туйте, чому її можна віднести до задач лінійного програмування.

8.Як формулюється задача про складання харчового раціону? Обґрунтуйте, чому її можна віднести до задач лінійного програ­ мування.

9.Як формулюється задача про рюкзак? Обґрунтуйте, чому її мож­ на віднести до задач лінійного програмування.

10.Як формулюється транспортна задача? Обґрунтуйте, чому її можна віднести до задач лінійного програмування.

11.Як формулюється загальна задача лінійного програмування?

12.Що називають системою обмежень задачі лінійного програму­ вання?

13.Що називають цільовою функцією задачі лінійного програмування?

14.Що називають допустимими розв'язками або планами задачі лінійного програмування? Скільки їх може бути? Обґрунтуйте свою відповідь.

15.Який розв'язок задачі лінійного програмування називається оп­ тимальним планом?

16.У чому полягає методика використання «заглушок» у програмі?

17.Сформулюйте алгоритм геометричного розв'язування задачі лінійного програмування від двох параметрів.

18.Виконайте алгоритм геометричного розв'язування задачі ліній­ ного програмування від двох параметрів на власному прикладі, пояснюючи його кроки.

Р19. Які можливі випадки одержання розв'язку задачі лінійного про­ грамування? Обґрунтуйте свою відповідь.

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

До задач лінійного програмування відноситься і задача про призначення. Вона формулюється наступним чином.

Нехай на деякому підприємстві оголошено конкурс на замі­ щення т вакантних посад. На конкурс подали заявки я канди­ датів. Причому кожен з кандидатів має право претендувати на будь-яку посаду. Після проведення співбесіди з керівництвом підприємства за певною шкалою було визначено коефіцієнти корисності призначення кожного кандидата на всі посади. Ця ін-

190

формація була занесена у таблицю Щ (і = 1, 2, ..., п; j = 1, 2, ..., пі). Необхідно знайти таке призначення всіх кандидатів на вакант­ ні посади, яке принесе максимальну користь підприємству.

Розглянемо конкретний приклад. Нехай кількість кандидатів на вакантні посади і кількість цих посад є однаковою (п = 5,т = 5), а таблиця коефіцієнтів корисності визначається за 10-бальною системою і представлена на малюнку 113, а.

Цю саму інформацію можна зобразити графічно (мал. 113, б), де вершини 1-5 визначають кандидатів, а 1' - 5' - посади. Вона, фактично, представляє собою дводольний граф із вказанням «ва­ ги» на кожному ребрі, що відповідає можливому призначенню конкретного кандидата на конкретну посаду.

^

V

2'

3'

4'

5'

 

1

6

3

8

 

 

 

2

 

7

10

5

 

 

3

4

 

 

 

2

 

4

 

6

 

 

 

 

5

 

1

 

7

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

б)

 

 

 

 

 

 

Мал. 113

Розв'язання задачі про призначення полягає у тому, щоб усіх кандидатів розподілити на існуючі вакантні посади, а це означає, що в кожному рядку таблиці (мал. 113, а) необхідно вибрати лише по одному елементу, але так, щоб вони були роз­ ташовані в різних стовпцях. Це означає, що один кандидат не може бути призначений на кілька посад і, відповідно, на одну посаду не може бути призначено більше одного кандидата. Скільки варіантів таких призначень можна зробити? Зро­ зуміло, що досить багато. І всі вони будуть мати свою міру ко­ рисності, що визначається сумою коефіцієнтів корисності всіх визначених призначень. Але серед усіх цих варіантів необхідно вибрати такий, для якого ця міра буде найбільшою.

Розглянемо наведений приклад (мал. 113, а). Він навмисне підібраний так, щоб найкращий варіант призначення можна було підібрати без спеціально розробленого алгоритму, а візу­ ально аналізуючи вхідні дані. Почнемо з кандидата 4. Він пре­ тендує лише на одну посаду 2'. Отже, перше призначення зроб­ лено 4 <» 2'. Другу посаду надалі виключаємо з перегляду. Розглянемо кандидата за номером 5, оскільки тепер його мож­ на призначити тільки на посаду 4': 5 о 4'. На посаду 5' претен-

191

дує лише один кандидат за номером 3, тому іншого вибору не­ має: 3 о 5'. Залишилось дві вакантні посади V і 3', на які пре­ тендує два кандидати 1 і 2. Однак на посаду V претендує тільки один кандидат за номером 1. Робимо це призначення: 1 <t> V. Останній крок є однозначним, оскільки залишився непризначеним кандидат за номером 2 і вакантною посада 3': 2 о З'. Вартість отриманого призначення становить 31.

Спробуємо знайти інший розподіл призначень: 1 <=> 3' (8), 2 » 2 ' (7), 3 о 1' (4). На цьому ланцюг призначень перери­ вається, оскільки кандидат за номером 4 претендує лише на одну посаду 3', а вона вже зайнята. Виявляється, що й інші спроби сформувати призначення для наведеного прикладу без­ перспективні.

Чи завжди можна логічними міркуваннями визначитися з найкращим варіантом призначення? Мабуть, ні, особливо в разі задання повної таблиці призначень, тобто розглядається випадок, коли всі кандидати претендують на всі вакантні поса­ ди. У цьому разі таких варіантів може бути дуже багато.

Як бути в ситуації, коли кількість кандидатів і посад різна?

Утакому разі зайві кандидати залишаться без призначень або деякі посади залишаться вакантними. Як ми бачили раніше, розглядаючи дводольні графи, кількість ребер у максимально­ му паросполученні дорівнює мінімальній кількості вершин у двох групах. Можна запропонувати інший вихід із такої ситу­ ації: доповнити умову задачі фіктивними кандидатами або по­ садами, надавши їм коефіцієнтів корисності зі значенням 0.

Утакому разі вони просто не будуть призначені.

Сформулюємо задачу про призначення в термінах лінійного програмування. Нехай задана таблиця корисності С при при­ значенні кожного з п кандидатів на кожну з т посад. Оскільки необхідно зробити вибір по одному елементу таблиці С у кожному її рядку і стовпці, сформуємо додаткову таблицю X, у якій всі елементи дорівнюють 0 або 1 (х^ {0,1}, і = 1, 2,..., п, j = 1, 2,.., т), у кожному рядку і стовпці розташовано лише по одному зна­ ченню 1

п

і=1

т

2jJfy$ 1,і = 1, 2, ...,п,

г=і

а сумарна кількість значень 1 у таблиці X дорівнює тіп(п, т)

пт

Х Х ^ ч = тіп(п,т).

і=1 ;=1

192

Виконання останньої умови означає, що зроблено макси­ мально можливе призначення: всі кандидати призначені на можливі посади {п < т), або всі посади зайняті кандидатами, що на них претендували < п).

Загалом можна сказати, що наведені вище дві умови існу­ вання розв'язку задачі про призначення є системою обмежень.

Проаналізуємо роль таблиці X у побудові розв'язку задачі. Якщо елемент xtj = 0, то це означатиме, що відповідний елемент ctj не враховується в результуючому призначенні, якщо xtj - 1, то це означатиме, що кандидат і призначається на поса­ ду j і значення ctj додається до сумарної корисності призначен­ ня. Таким чином, якщо розглянути добуток Щ>Хф ТО ВІН врештірешт і визначатиме, враховується чи ні призначення кандида­ та і на посаду у.

Тепер можемо записати цільову функцію, значення якої слід оптимізувати:

пт

(=1 j=i

При формулюванні поставленої задачі необхідно знайти та­ ке розміщення значень 1 у таблиці X, при якому L сягне макси­ мального значення.

Таким чином, ми переконалися, що задача про призначення є задачею лінійного програмування.

На практиці частіше розглядають задачу про призначення на знаходження не максимального, а мінімального значення, тобто коли матриця С виражає міру шкідливості кожного з п кандидатів при призначенні на кожну з т посад. За таких умов необхідно знайти призначення, яке мінімізує сумарну шкідли­ вість. З чим це пов'язано, згодом стане зрозумілим.

Переформулювати поставлену задачу з пошуку максимуму на пошук мінімуму зовсім не складно. Замінимо матрицю С на С", виконавши такі дії: знайдемо в ній максимальний елемент (наприклад, г) і віднімемо від нього кожний елемент матриці

с' • — г - С-.

У результаті підстановки і розкриття дужок отримаємо:

п т

п т

п т

п т

пт

Оскільки значення Z-iZ-irxtj є константою, бо не залежить від

£=1 / = 1

вхідних даних таблиці С, а вираз zS^jCiixij є досліджуваною

j = l j=l

цільовою функцією L, то цільова функція L' запишеться так:

7 Інформатика, 9-Ю кл.

193

 

її т

п

т

.

t=Y^Lrxa-

EZ с «х «=c o n s t -L -

 

l=\ ;=1

i=l /=1

Тобто максимізуючи цільову функцію L, ми цим самим міні­ мізуємо відповідну їй функцію І/ і навпаки.

А тепер перейдемо до опису алгоритму розв'язування задачі про призначення, який носить назву «угорського» тому, що ба­ зується на ідеях наукової роботи угорця Егерварі, написаної в 1931 р.

Розглянемо задачу про призначення на конкретному прикладі (мал. 114, а), де визначено всі можливі призначення кандидатів на вакантні посади. Хоча в реальних ситуаціях це не завжди так буває, ми обмежимося саме такою постановкою задачі.

 

1

2

3

4

5

 

п\

1

2

3

4

5

 

 

1

2

3

4

5

1

6

3

8

5

1

 

1

5

2

7

4

0

 

1

2

2

6

4

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

9

7

10

5

1

 

2

8

6

9

4

0

 

2

5

6

8

4

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

4

6

3

1

2

 

3

3

5

2

0

1

 

3

0

5

1

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

7

6

4

3

6

 

4

4

3

1

0

3

 

4

1

3

0

0

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

5

1

9

7

1

 

5

4

0

8

6

0

 

5

1

0

7

6

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

 

 

 

б)

 

 

 

 

 

 

в)

 

 

 

 

 

Мал. 114

Скористаємося операцією приведення, що була описана в за­ дачі про комівояжера. У нашому випадку смисл операції при­ ведення полягає в наступному. Найменшим шуканим невід'єм­ ним значенням цільової функції L є значення 0. А це означає, що якщо можна визначити у таблиці С по одному елементу в кожному рядку і стовпці зі значенням 0, то сумарно ми отри­ маємо ідеальне мінімальне призначення.

Спробуємо перетворити таблицю С, отримавши максималь­ но можливу кількість нульових значень і не спотворивши при цьому поставлену задачу. Оскільки коефіцієнти корисності кожного і-го кандидата на всі посади є величиною відносною, то їх можна зменшити на одне і те саме число. Таким числом може бути мінімальне значення в кожному рядку заданої таб­ лиці. Приведення по рядках, що дорівнює значенню 7, дасть нам результат, зображений на малюнку 114, б.

З тими самими міркуваннями підійдемо до коефіцієнтів призначення на кожну ./-ту посаду: зменшимо значення у кож­ ному стовпці таблиці С на значення найменшого елемента в кожному з них. Приведення по стовпцях таблиці, зображеної на малюнку 114, б, показано на малюнку 114, в. Коефіцієнт

194

приведення по стовпцях дорівнює 4. Сумарна вартість приве­ дення заданої таблиці С по рядках і стовпцях становить 11. Це значення означає, що ми зменшили загальну вартість призна­ чення кандидатів на посади па 11, тому після одержання оста­ точного результату необхідно буде це значення додати.

Оскільки найбільші шанси на включення до результуючого призначення на вакантні посади мають у першу чергу ті канди­ дати, що принесуть найменшу шкоду, то розглянемо в таблиці елементи зі значеннями 0. Побудуємо дводольний граф, що складається лише з нульових ребер (мал. 115, а). Максимальна кількість призначень з нульовим коефіцієнтом шкідливості в задачі, до якої звелася задача про призначення, є аналогічною до побудови максимального паросполучення в отриманому дво­ дольному графі. Таке максимальне паросполучення зображене на малюнку 115,6.

Максимальне паросполучення на нульових ребрах можна побудувати із застосуванням алгоритму, який розглядався раніше в розділі «Основи теорії графів». Нагадаємо, що для ре­ алізації цього алгоритму необхідне використання двох маси­ вів: один містить опис наявності ребер між усіма вершинами графа, значеннями елементів якого є 0 і 1; другий - опис поточ­ ного стану включених до паросполучення прямих і відповідних їм зворотних ребер, значеннями елементів якого є - 1, 0, 1.

Для зручності наступних перетворень введемо додаткову інформацію у вигляді двох одновимірних масивів mark_n- (у = 1, 2, ..., т) і mark_mi (і = 1, 2, ..., п). У першому зберігатиме­ мо номер рядка і таблиці С, де знаходиться вибраний нами нульовий елемент ctp а в другому - номер стовпця j. Також бу­ демо запам'ятовувати сумарний коефіцієнт приведення табли­ ці L (правий нижній кут таблиці), на який було зменшено зна­ чення її елементів, а одночасно і сумарного значення шкідли­ вості призначення кандидатів на посади (мал. 116).

У результаті побудови максимального паросполучення на нульових ребрах визначимо нульові елементи таблиці с.. = 0*, що їм відповідають. Розміщення елементів си - 0* відповідає

7*

195

розміщенню елементів xtj = 1, що визначені у класичному фор­ мулюванні задачі лінійного програмування про призначення.

Результат зробленого призначення відображений на малюн­ ку 116 у масивах markn і mark_m. Із вмісту цих масивів можна зробити висновок, що у максимальне паросполучення не ввійшли вершини 2 і 4'. Це саме ми спостерігаємо і на малюнку 115,6.

п

\

1

2

3

4

5

marhjn

1

 

2

2

6

4

0*

5

2

 

5

6

8

4

0

0

3

 

0*

5

1

0

1

1

4

 

1

3

0*

0

3

3

5

 

1

0*

7

6

0

2

markn

 

3

5

4

0

1

L=ll

Мал. 116

Вершини, які не беруть участі у паросполученні, називають ненасиченими, а решту - насиченими. Тож бачимо, що побудова­ не максимальне паросполучення (мал. 115,6) залишає ненасиче­ ними у верхній групі вершин (кандидати) одну вершину 2 і в нижній групі (посади) одну вершину 4'. Ненасичені вершини в дводольному графі на малюнку 115,6 виділено сірим кольором.

Ми не отримали повноцінної відповіді. Невже це остаточний результат? Мабуть, ні, оскільки не включено до розгляду велику кількість інших варіантів призначень. У таблиці, зображеній на малюнку 116, ще є достатня кількість призначень з низьким ко­ ефіцієнтом шкідливості. Для включення цих перспективних призначень необхідно збільшити кількість ребер у дводольному графі. Це дасть змогу збільшити і максимальне паросполучення. Для цього проведемо подальші перетворення таблиці.

Розглянемо елемент таблиці с2 5 . Він відповідає нульовому реб­ ру (2,5') у дводольному графі, яке не було включене до пароспо­ лучення. Цьому завадило вже на той час включене ребро (1,5'). Будемо казати, що насичена вершина 1 (вона ввійшла до паро­ сполучення) досяжна з ненасиченої вершини 2, яка не ввійшла до паросполучення, оскільки існує послідовність ребер (2,5') і (5',1), що дає змогу потрапити з вершини 2 у вершину 1. Слід зауважи­ ти також, що в цій послідовності ребер завжди чергуються ребра, які ввійшли до паросполучення з тими, що не ввійшли.

Можна припустити, що, включивши до розгляду інші «де­ шеві» ребра, що виходять з вершини 1, і замінивши одним з них ребро (1,5'), ми б змогли включити в паросполучення ребро (2,5'). Як бачимо з таблиці (мал. 115), такі ребра з «вагою» 2 є (1,1') і (1,2'). Але ми домовилися включати до паросполучення

196

ребра з нульовими значеннями. Тому виконаємо таку опера­ цію: від усіх значень елементів рядка з номером 1 віднімемо значення найменшого ненульового елемента. В результаті у нас з'являться нові нульові ребра, що виходитимуть з вершини 1, і з'явиться змога включити їх до розгляду. Разом з тим нульові елементи цього рядка, а в ньому є як мінімум один такий нульовий елемент (с2 5 = 0), перетворяться на від'ємне число. Оскільки ми розв'язуємо задачі лінійного програмування лише в області невід'ємних чисел, а також не можемо відкидати вже отримані нульові ребра, то необхідно в тих стовпцях таблиці, де c^ = 0, додати те саме мінімальне значення. Для нашого ви­ падку таким стовпцем є стовпець з номером 5.

Описана операція носить назву перетворення Егерварі. Обґрунтування її справедливості буде таким. Ми вже скориста­ лися тією властивістю задачі про призначення, що при змен­ шенні кожного рядка і стовпця таблиці на деякі числа резуль­ тат її розв'язання залишається таким самим, як і в початковій задачі. Ця властивість може бути застосована і в разі додаван­ ня деякого числа (або віднімання деякого від'ємного числа). Чи зміниться при цьому вартість остаточного призначення? Ні, оскільки на вже присутніх у паросполученнях ребрах вартість залишилася нульовою: ми спочатку відняли одне і те саме чис­ ло, а потім його додали. Тому на даному етапі поточна вартість призначення залишається без змін L = 11.

Проведемо описане вище перетворення на таблиці, зобра­ женій на малюнку 116. У масиві markjrn визначимо елементи зі значенням 0, що вказують на ненасичені вершини, тобто не задіяні у паросполученні. У нашому прикладі таким рядком є рядок з номером 2. Визначаємо позицію / першого нульового елемента в цьому рядку: j = 5. У масиві mark_n на п'ятій позиції знаходиться число 1, що вказує на номер рядка, який необхідно перетворювати. У нашому прикладі мінімальним ненульовим елементом у рядку 1 є число 2. Віднімемо його від ненульових елементів цього рядка. Від нульового елемента відні­ мати немає сенсу, оскільки потім до нього це число знову буде додаватися, і переходити при цьому в область від'ємних чисел також немає сенсу (мал. 117, а).

Тепер до стовпця 5, інформація про який знаходиться у mark_m1 (розглядається рядок з номером 1), додаємо число 2. Насправді додамо до всіх елементів, окрім с1 5 (мал. 117, б). Як бачимо, до старих нульових елементів додалися нові і це дає змогу поновити наші пошуки повноцінного призначення.

Однак отримано таблицю, у якій не у всіх рядках є хоча б по одному нульовому значенню: у рядку 2 всі елементи ненульові. Проблеми немає, приведемо отриману таблицю по рядках і стовп­ цях (мал. 117, в) і почнемо побудову максимального паросполу-

197

чення спочатку. Для нашого прикладу приведення відбувається лише по рядку під номером 2, який відмічено сірим кольором, і його вартість становить 2 (мал. 117,6). Таким чином, на поточний момент сумарна вартість приведення початкової таблиці L = 13.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

3

4

5

 

X

1

2

3

4

5

 

га\

1

2

3

4

5

1

0

0

4

2

о_2

 

1

0

0

4

2

0

 

1

0

0

4

2

0

2

5

6

8

4

0

 

2

5

6

8

4

2

 

2

3

4

6

2

0

3

0

5

1

0

1

 

3

0

5

1

0

3

 

3

0

5

1

0

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

1

3

0

0

3

 

4

1

3

0

0

5

 

4

1

3

0

0

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

1

0

7

6

0

 

5

1

0

7

6

2

 

5

1

0

'7

6

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

 

 

 

б)

Мал. 117

 

 

в)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приведення таблиці (мал. 117, в) зображено на малюнку 118, а. Нульовим елементам цієї таблиці відповідає граф, зображений на малюнку 118, б. Виконавши алгоритм побудови максималь­ ного паросполучення на цьому графі, отримаємо результат, зоб­ ражений на малюнку 118, в. Ця сама інформація відображена в масивах mark_n і mark_m на малюнку 118, а. Вміст цих масивів свідчить про те, що задача розв'язана і знайдене найменше за вартістю шкідливості (L = 13) призначення всіх кандидатів на вакантні посади, вартість якого позначена на кожному ребрі знайденого максимального паросполучення (мал. 118, в).

"\

т

1

2

3

4

5

mark_m

П

^ \

 

 

 

 

 

 

 

1

0*

0

4

2

0

1

 

2

3

4

6

2

0*

5

 

3

0

5

1

0*

3

4

 

4

1

3

0*

0

5

3

 

5

1

0*

7

6

2

2

markka

1

5

4

3

2

L=13

 

 

 

 

 

 

 

 

а)

Варто детальніше розглянути умови завершення роботи ал­ горитму. У нашому прикладі все склалося ідеально: всі канди­ дати отримали запропоновані їм посади. Однак можливий і та-

198

кий випадок, коли всі кандидати претендують на одну і ту саму посаду. При цьому логічно призначити на неї того, хто най­ менш шкідливий, а решта кандидатів і посад залишаться віль­ ними. Тому обмежуватись ознакою завершення алгоритму, що гарантує зайнятість усіх кандидатів або всіх посад, не слід. Якою в цьому разі буде ознака завершеності алгоритму? Запро­ понуємо таку послідовність міркувань.

На кожній ітерації спочатку виконується приведення поточ­ ного стану таблиці коефіцієнтів шкідливості кандидатів на по­ сади. У разі появи в ній нових нульових елементів змінюється дводольний граф і може бути побудований новий варіант приз­ начення. А що може спровокувати зміни в цій таблиці? Тільки перетворення Егерварі, що виконується на її рядках та стовп­ цях. Тому можна підбити підсумок: умовою завершення алго­ ритму є відсутність результативного перетворення Егерварі в таблиці С.

Нарешті сформулюємо алгоритм визначення розв'язку за­ дачі про призначення у загальному вигляді.

1. Ввести початкові значення п, т елементів таблиці cij(i = 1, 2, ..., п; j = 1, 2, ..., т); визначити L = 0.

2.Привести таблицю С по рядках і стовпцях; сумарний ко­ ефіцієнт приведення додати до поточного значення L.

3.Побудувати максимальне паросполучення на нульових елементах таблиці С.

4. Визначити значення елементів масивів markn і markm.

5.З масиву mark_m визначити всі ненасичені вершини, що відповідають кандидатам на вакантні посади; з масиву markn визначити насичені вершини, які є досяжними з ненасичених вершин.

6.Виконати перетворення Егерварі в рядках і стовпцях, що відповідають визначеним досяжним вершинам.

7.Якщо перетворення Егерварі змінило поточний стан еле­ ментів таблиці С, то перейти до п. 2.

8.Завершити алгоритм.

Реалізуємо основну частину алгоритму у вигляді Pascalпрограми.

L := 0; nm := n + m;

 

{Ініціалізація результату! роботи програми.}

r e p e at

 

{Організація ітерацій виконання алгоритму.}

for І := 1 t o n d o mark_m[i] := 0;

{Ініціалізація масиву тагкт.)

for j := 1 to m do mark_n[j] := 0;

{Ініціалізація масиву тагк_п.}

reduce;

{Приведення масиву С і обчислення L:=L + тіп.}

maximummatching; {Побудова максимального паросполучення на нульових ребрах.}

for і :- 1 to nm do

{Обробка масиву поточних призначень f.}

for j := 1 to nm do

 

if f A [ i , j] > 0 then

{Якщо існує призначення, то занесення інформації}

199

Соседние файлы в папке Методи побудови алгоритмів та їх аналіз