Максимізація кількості призначень в задачі розподілу
Необхідні поняття теорії графів. Задача про максимальний потік. Алгоритм Форда знаходження максимального потоку. Модифікація алгоритму Форда розв’язання задачі максимізації кількості призначень у задачах розподілу. Результати числового експерименту.
Рубрика | Математика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 18.12.2013 |
Размер файла | 499,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Зміст
Вступ
1.Постановка задачі максимізації кількості призначень у задачах розподілу
2. Необхідні поняття теорії графів
3. Задача про максимальний потік
3.1 Постановка задачі
3.2 Алгоритм Форда знаходження максимального потоку
4. Задача максимізації кількості призначень у задачах розподілу як задача про максимальний потік
4.1 Зведення задачі до задачі про максимальний потік
4.2 Модифікація алгоритму Форда розв'язання задачі максимізації кількості призначень у задачах розподілу
5. Результати числового експерименту
Висновки
Список використаної літератури
Додатки
Текст програми
Інструкція користувача
Вступ
Останнім часом значно зросла зацікавленість учених та практиків мережними і потоковими моделями. Це пов'язано із впровадженням та активним розвитком різноманітних територіально розподілених систем: трубопровідних, транспортних, телекомунікаційних та ін. Основою таких систем є певна мережа (мережа трубопроводів, доріг, каналів зв'язку тощо), в якій циркулюють певні потоки (потоки речовин, транспорту, даних тощо), тому задачі, які доводиться розв'язувати при проектуванні та експлуатації систем з мережною структурою, часто зводяться до розробки математичних моделей розподілу потоків та постановки і розв'язання відповідних оптимізаційних задач.
Відомі моделі розподілу потоків у мережах базуються на поняттях теорії графів. Це пов'язано з тим, що граф дає можливість наочно відобразити структуру мережі, а параметри його вузлів і дуг - представити основними числовими характеристиками її елементів. Набір характеристик залежить від природи модельованої системи, а також характеру розв'язуваних задач, однак у потокових моделях їх, як правило, представляють такими параметрами, як зовнішній потік у вузлі, потік по дузі, пропускна здатність дуги, вартість передавання одиниці потоку по дузі тощо.
Потокові задачі, як правило, зводяться до пошуку такого розподілу потоків у мережі, при якому б забезпечувався екстремум деякого критерію. При цьому мають враховуватися обмеження, що накладаються умовами збереження потоків у вузлах і неперевищення потоками пропускної здатності дуг. Типовими потоковими задачами є задача про потік мінімальної вартості, про максимальний потік, транспортна задача, задача про призначення та інші.
У даній роботі розглядається задача максимізації кількості призначень у задачі розподілу. Дана задача також зводиться до задачі про максимальний потік і її розв'язок знаходиться з використанням модифікації алгоритму Форда.
Робота складається з теоретичної і практичної частин. У теоретичній частині розглядаються основні поняття теорії графів, задача про максимальний потік, алгоритм Форда та його модифікація для розв'язання задачі максимізації кількості призначень у задачах розподілу. У практичній частині наведено ряд задач, розв'язок яких знаходиться з використанням програмної реалізації алгориритму Форда. У додатках приводиться текст програми та інструкція користувача.
1. Постановка задачі максимізації кількості призначень у задачах розподілу
Однією із прикладних постановок задачі максимізації кількості призначень у задачах розподілу є задача призначення працівників на робочі міста. На деякому підприємстві є вакансій на які претендують працівників. Для кожної вакансії з урахування її особливостей та кваліфікації працівників вказано перелік працівників, які можуть бути призначені на цю вакансію. Задача полягає у визначенні таких призначень працівників на вакансії, при якому кількість призначень буде максимальною.
2. Необхідні поняття теорії графів
Теорія графів виникла понад 240 років тому. Основи її розробив математик Леонард Ейлер, розв'язавши в 1736 р. відому задачу про 7 мостів. Проте лише протягом останніх часів ця теорія була докладно розроблена й почала широко використовуватися у фізиці, хімії, біології, соціології, економіці, картографіі тощо. Отримання дальших суттєвих результатів у цій галузі датують серединою ХIХ століття. Однак початок проведення активних систематичних досліджень та становлення теорії графів як окремішного авторитетного розділу сучасної математики відбулося ще майже 100 років по тому, тобто в середині ХХ століття. Саме з цього часу граф стає однією з найпоширеніших і найпопулярніших математичних моделей у багатьох сферах науки і техніки. Картинка у вигляді набору точок на площині та ліній, проведених між деякими з них, стала зручною і наочною формою зображення найрізноманітніших об'єктів, процесів та явищ.
Великою мірою це пов'язано з виникненням, бурхливим розвитком та поширенням електронних обчислювальних машин і, як наслідок, значним зростанням ролі задач дискретного характеру. Математика від "обслуговування" переважно фізики переходить до проникнення своїх методів у інші сфери людської діяльності. Із суто формальної точки зору граф можна розглядати як один з різновидів алгебраїчної системи (а саме, як модель), а отже, і всю теорію графів як розділ сучасної алгебри. Справді, результати та методи алгебри широко використовуються в теорії графів. Однак за останні півстоліття активного інтенсивного та екстенсивного розвитку теорія графів виробила свою достатньо специфічну власну проблематику і методологію. На сьогодні теорія графів є однією зі складових математичного апарату кібернетики, важливим розділом дискретної математики. Тому теорія графів включається до навчальних програм університетів і технічних вузів як окрема дисципліна, або як розділ курсу "Дискретна математика".
Вперше термін граф ввів угорський математик Денеш Кеніг у 1936 р., назвавши так схеми, що складаються з певної множини точок і відрізків, прямих чи кривих , які сполучають ці точки.
Розглянемо на прикладі, що таке граф:
Припустимо, що ви запросили до себе у гості кількох осіб. Назвемо їх А, В, С, D, F. Деякі з них є вашими родичами, інші - співробітниками, а з деякими ви познайомилися під час літнього відпочинку і т.д.
Тому деякі з цих осіб не знайомі одна з одною. Намагаючись пригадати, хто з них з ким знайомий, ви , можливо, зобразите на папері 6 точок A, B, C, D, E, сполучивши їх лініями, якщо відповідні особи вже знайомі між собою(Рис.1)
Рис.1
Сукупність точок та ліній, зображених на малюнку і є графом. Точки називаються його вершинами ( вузлами), а відрізки ліній (прямих або кривих), що сполучають ці точки - ребрами ( вітками).
Отже, на Рис.1 точки A, B, C, D, E, F є вершинами графа, а, наприклад, відрізки АС, CD, CE, CF - його ребра.
Графом є, наприклад, будь-яка карта доріг, якщо міста або станції розглядаються як його вершини, а залізниці або шосейні дороги - як ребра. Графом є будь-яка схема електричного кола, схема водопроводу або газопроводу , будь-яка географічна карта тощо.
Один і той самий граф може виглядати по різному :
Рис. 2
Основні означення теорії графів
Лінія на графі, яка не проходить уздовж жодного ребра більш як один раз називається ланцюгом.
Петля - це дуга, початкова та кінцева вершина якої збігаються.
Якщо , рухаючись від вершини В , пройти по кількох вершинах графа так, щоб на кожному ребрі побувати лише один раз, а потім повернутись у вершину А, то такий шлях називатиметься циклом.
Взагалі, будь-який замкнений ланцюг називається циклом.
Граф називається зв'язним, якщо будь-які 2 з його вершин зв'язані якимось ланцюгом.( Рис. 3)
Рис.3
Граф називається повним, якщо будь-які його 2 вершини сполучені ребром.
Відповідно, граф, в якого не побудовані усі можливі ребра, називається неповним.( Рис.4)
Рис.4
Зауважимо, що коли повний граф має n вершин, то він матиме n(n - 1)/2 ребер.
Порожнім (нульовим) називається граф без ребер(тобто, складається з ізольованих вершин).(Рис. 5)
Рис.5
Кількість ребер, що виходять з вершини графа, називається степенем вершини. Вершина графа, що має непарну степінь, називається непарною, а парну степінь - парною.
Степінь кожної з n вершин повного графа дорівнює n - 1; степінь кожної вершини нульового графа дорівнює 0.
Якщо степені всіх вершин графа рівні, то граф називається однорідним. Таким чином, будь-який повний граф - однорідний. Нульовий граф є однорідним графом нульового степеня.
Якщо кількість ребер графа позначити через Р, а вершини буквами А1 , А2, …Аn, то сума
Р = Р(А1) + Р(А2) + …+ Р(Аn) (2.1)
дорівнюватиме кількості всіх ребер цього графа.
Сума (2.1) очевидно, дорівнюватиме подвоєній кількості ребер графа( кожне ребро при цьому підраховувалось двічі, з обох його кінців). Отже, загальна кількість Р ребер дорівнює:
Р =Ѕ (Р(А1) + Р(А2) + …+ Р(Аn))
Або
2 Р = Р(А1) + Р(А2) + …+ Р(Аn) (2.2)
Сума степенів усіх вершин графа є числом парним і дорівнює подвоєній кількості ребер.
Позначимо через Вi кількість тих вершин, степінь яких дорівнює i. Наприклад, В1 - кількість вершин, степінь яких = 1, В2 - кількість вершин, степінь яких = 2.
Користуючись такими позначеннями рівність (2.2) можна подати в такому вигляді:
2Р = 1* В1 + 2*В2 + 3*В3 +…+ n *Bn (2.3)
Машинне представлення графів
Існує декілька способів представлення графа. В багатьох випадках граф зручно задавати у вигляді матриці суміжності (вершин) або матриці інцидентності.
В теорії графів класичним способом представлення графа служить матриця інцидентності. Матриця інцидентності - це матриця А з n рядками, що відповідають вершинам, і m стовпцями, що відповідають ребрам. Для орієнтованого графу стовпець, що відповідає дузі , містить -1 в рядку, що відповідає х, 1 в рядку, що відповідає вершині у, і нулі у всіх інших рядках.
На рис. 6 зображений орієнтований граф і його матриця інцидентності.
Рис. 6
З алгоритмічною точки зору матриця інциденцій є, можливо, найбільш невдалим способом представлення графа. По-перше, він потребує mn комірок пам'яті, причому більшість цих комірок зайняті нулями. Незручний також і доступ до інформації. Відповідь на елементарне питання типу “ чи існує ребро {x,y}?”, “ до яких вершин ведуть ребра із x?” потребують в гіршому випадку перебору усіх стовпців матриці, а відповідно, m кроків.
Кращим способом представлення графа є матриця суміжності, що визначається як матриця B[] розмірності n x n, де 1, якщо існує ребро, що йде із вершини х в вершину у, і 0 - в протилежному випадку.
Орієнтований граф і його матриця суміжності зображені на рис. 7.
Рис. 7
Основною перевагою матриці суміжності є той факт, що за один крок можна отримати відповідь на питання “чи існує ребро із х в у?”. Недоліком є той факт, що незалежно від кількості ребер об'єм зайнятої пам'яті рівний .
Більш економним у відношенні пам'яті (особливо у випадку нещільних графів, коли m набагато менше ) є метод представлення графу за допомогою списку пар, які відповідають його ребрам (списку інцидентності). Пара відповідає дузі , якщо граф орієнтований, і ребру у випадку неорієнтованого графу. Очевидно, що об'єм пам'яті в цьому випадку складає 2m. Незручністю являється велика кількість кроків (порядку m в гіршому випадку), необхідна для отримання множини вершин, до яких ведуть ребра з даної вершини.
Список інцидентності, що відповідає графу на рис. 6. , зображений на рис. 8.
Рис. 8
3. Задача про максимальний потік
3.1 Постановка задачі
Нехай задана мережа, яка складається з множини вершин Е і множини дуг , які з'єднують деякі впорядковані пари вершин, взятих з Е. Припустимо, що вона являє собою симетричний граф, тобто, якщо дуга () належить до мережі, то до неї входить і симетрична дуга (), хоча в дійсності такої дуги може і не бути. Для визначеності присвоюємо вершинам мережі наступні номери: . Кожна вершина , характеризується інтенсивністю . Вершини, для яких >0 називаються джерелами, вершини, для яких <0 - стоками, а інші проміжковими. По шляхах мережі направляється однорідна речовина (газ, рідина, транспорт) із джерела в стоки. Кожній дузі () в мережі поставлене у відповідність число яке називається пропускною здатністю дуги. Під пропускною здатністю дуги розуміють максимальну кількість речовини, яку вона може пропустити за одиницю часу. Нехай і тоді Е0 - єдине джерело, - єдиний стік, а - проміжкові вершини мережі.
Ставиться задача визначити для заданої мережі максимальну величину потоку із джерела , в стік. Під потоком в мережі будемо розуміти сукупність потоків по всіх дугах мережі, де - потік по дузі , рівний кількості речовини, яка переміщується по ній за одиницю часу. Відмітимо, що якщо пропускні здатності симетричних дуг рівні між собою то ці дуги можуть бути замінені ребрами Будемо позначати мережу . Де - множина дуг або ребер. Сформулюємо задачу. Знайти невід'ємні значення (для всіх ), які максимізують
(3.1)
при обмеженнях:
(3.2)
. (3.3)
Умова (3.1) відображає величину максимального потоку, який рівний кількості речовини, яка витікає із джерела, або кількості речовини, яка потрапляє в стік. Умова (3.2) означає, що потік по кожній дузі має бути невід'ємним і не перевищувати її пропускну здатність. Із умови (3.3) випливає, що кількість речовини, що потрапляє до будь-якої проміжкової вершини, дорівнює кількості, речовини, яка витікає з неї.
Важливу роль в обґрунтуванні алгоритму розв'язання задачі про максимальний потік відіграє поняття розрізу. Розіб'ємо множину всіх вершин мережі на дві підмножини, які не перетинаються і так, щоб , . Якщо виділити всі дуги, початкові вершини котрих належать підмножині R, а кінцеві - , то ці дуги 6удуть утворювати розріз, який відокремлює джерело від стоку . Таким чином, розрізом називається сукупніть всіх дуг , які виходять з вершин і закінчуються у вершинах .
Кожен розріз характеризується пропускною здатністю , яка чисельно дорівнює сумі пропускних здатностей дуг, що його утворюють:
.
Очевидно, що будь-який шлях із джерела в стік містить хоча б одну дугу розрізу . Тому, якщо видалити всі дуги будь-якого розрізу, то всі шляхи із джерела в стік будуть заблоковані. Оскільки пропускна здатність шляху рівна найменшій із пропускних здатностей дуг, які належать до цього шляху, то величина потоку, який перемішується по всіх, можливих шляхах, які з'єднують з , не може перевищувати пропускну здатність будь-якого розрізу мережі, тобто, . 3 цього випливає що, якщо вдається побудувати такий шлях, що його величина буде рівною пропускній здатності деякого розрізу, то цей потік і буде максимальним.
Теорема (Форда-Фалкерсона) В будь-якій мережі максимальна величина потоку із джерела в стік дорівнює мінімальній пропускній здатності розрізу, який розділяє від .
3.2 Алгоритм Форда знаходження максимального потоку
Розглянемо табличний алгоритм Форда знаходження максимального потоку в мережі, який складається з послідовності кроків.
Початковий етап. Записуємо пропускну здатність дуг мережі в таблицю розмірності , де - кількість вершин мережі G(E,e).
Основний етап. Основний етап, який повторюється, складається з трьох дій.
1. Знаходимо по таблиці шлях з в з пропускною здатністю більшою за нуль. Для цього стовпчик, який відповідає джерелу Е0 помічаємо символом * . Шукаємо в -му рядку елементи , і стовпці в яких вони знаходяться, помічаємо зверху номером рядка, який розглядаємо (тобто цифрою 0). В результаті будуть виділені всі дуги () з додатною пропускною здатністю. Ці дуги можуть бути першими дугами шляху з в .
Далі розглянемо ті рядки, номери яких співпадають з номерами помічених стовпців. В кожному такому рядку, наприклад -овому, шукаємо елементи > 0, які знаходяться в непомічених стовпцях, і помічаємо ці стовпці номером розглядуваного рядка. Таким чином, ми виділяємо ті дуги, які можуть бути другими дугами шляху з Е0 в Е. Продовжуємо аналогічний перегляд рядків, номера яких співпадають з номером помічених стовпців, до тих пір, поки:
а) або не буде позначений стовпець (мережі). Це означає, що вдалось виділити шлях з пропускною здатністю більше нуля з в ;
б) або переконаємося в тому, що неможливо помітити нові стовпці (в розглядуваних рядках не виявиться додатних елементів, що містяться в непомічених стовпцях). В цьому випадку відсутній шлях з в , що проходить по дугах з пропускною здатністю більше нуля.
У випадку а) шуканий шлях ц з в знаходимо, використовуючи мітки. Нехай остання вершина шляху , позначена номером k. По цій помітці знаходимо попередню вершину (переглядаємо рядок , тут були помічені стовпець , і дуга () - остання в шуканому шляху) . Елемент , який знаходиться на перетині -го рядка і -го стовпця, відмічаємо знаком мінус, а симетричний йому елемент - знаком плюс. Ми розглядали -ий рядок, -й стовпець помічений, номером . Тому, рухаємося від елемента по -му стовпцю до r-го рядка. Продовжуємо цей процес до тих пір, поки не дійдемо до -го рядка і не позначимо знаком мінус елемент цього рядка і знаком плюс симетричний йому елемент. Переходимо до дії 2.
У випадку б) стовпчик , який відповідає стоку, помітити неможливо. З цього випливає, що не існує більше шляху з пропускною здатністю більше нуля з в , і основний етап, що повтроюється, завершено. Вершини, що знаходяться в постачених стовпцях, утворюють підмножину R (ці вершини досяжні по деякому шляху із джерела ). Інші вершини входять в підмножину ). Дуги, які виходять з вершин і входять в вершини і утворюють розріз з мінімальною пропускною здатністю.
2. Знаходимо пропускну здатність в знайденого шляху. Під пропускною здатністю розуміємо максимальну кількість речовини, яка може переміститися з в по шляху за одиницю часу. Пропускна здатність шляху рівна найменшій із пропускних здатностей дуг, які належать до цього шляху.
3. Визначаємо залишкову пропускну здатність дуг знайденого шляху і симетричних до них. Для цього від елементів таблиці віднімаємо , а до елементів додаємо . В результаті виконання цієї операції отримаємо нову таблицю, аналогічну початковій, але з іншими пропускними здатностями.
Після отримання нової таблиці повертаємося до дії 1 основного етапу, який виконується до тих пір, поки не отримаємо кінцеву таблицю, яка не містить жодного шляху з в з пропускною здатністю більше нуля.
Заключний етап. Від елементів початкової таблиці віднімаємо відповідні елементи таблиці, яку ми отримали на останньому кроці. В результаті отримаємо таблицю, додатні елементи якої рівні величинам потоків по відповідних дугах (). А максимальний потік в мережі - сумі елементів -го рядка або-го стовпця.
4. Задача максимізації кількості призначень у задачах розподілу як задача про максимальний потік
4.1 Зведення задачі до задачі про максимальний потік
Задачу максимізації кількості призначень у задачах розподілу можна звести до задачі теорії графів. Для цього кожній із вакансій і кожному із працівників ставимо у відповідність вершину графа. Якщо деяка вакансія може буди зайнята деяким працівником, то, відповідно, з вершини, що відає вакансії проводимо дугу до вершини, що відповідає даному працівнику. Додатково вводимо вершину, з якої виходять дуги до кожної із вершин, що представляють вакансії. Ця вершина відіграє роль джерела. Також додатково вводимо вершину, до якої проводимо дуги з кожної із верши, що представляють працівників. Ця вершина виступає в якості стоку. Для кожної з дуг вважаємо, що її пропускна здатність дорівнює 1. Отже, дана задача може бути представлена у вигляді графа
Размещено на http://www.allbest.ru/
Очевидно, пропускна здатність даної мережі буде тим більшою, чим більшою буде кількість використаних дуг (призначень). Таким чином задача максимізації кількості призначень у задачах розподілу зводиться до задачі про максимальний потік.
4.2 Модифікація алгоритму Форда розв'язання задачі максимізації кількості призначень у задачах розподілу
У алгоритмі Форда знаходження максимального потоку в мережі на основному етапі доводиться знаходити пропускну здатність знайденого шляху. Для задачі максимізації кількості призначень у задачах розподілу цей крок є надлишковим, оскільки пропускна здатність кожної із дуг дорівнює 1. На третьому кроці основного етапу кожному елементу матриці , що входять до шляху ставимо у відповідність значення 0 а симетричному елементу ставимо у відповідність значення 1. Дані особливості призводять до спрощення обчислювальної складності алгоритму і зменшення часу роботи.
5. Результати числового експерименту
Приклад 1. На підприємстві є 5 вакансій і 4 працівники. Можливість прийняття працівників на вакансії подано таблицею
Працівник 1 |
Працівник 2 |
Працівник 3 |
Працівник 4 |
||
Вакансія 1 |
+ |
+ |
|||
Вакансія 2 |
+ |
+ |
|||
Вакансія 3 |
+ |
+ |
+ |
||
Вакансія 4 |
+ |
+ |
|||
Вакансія 5 |
+ |
+ |
На основі цих даних побудуємо граф
Размещено на http://www.allbest.ru/
На основі даного графу приходимо задачі про максимальний потік. Знайдемо результат з використанням програмної реалізації модифікованого алгоритму Форда. Приведемо покроковий процес розв'язання
Приклад 2. На підприємстві є 8 вакансій і 6 працівників. Можливість прийняття працівників на вакансії подано таблицею
Прац. 1 |
Прац. 2 |
Прац. 3 |
Прац. 4 |
Прац. 5 |
Прац. 6 |
||
Вакансія 1 |
+ |
+ |
+ |
||||
Вакансія 2 |
+ |
+ |
+ |
||||
Вакансія 3 |
+ |
+ |
+ |
||||
Вакансія 4 |
+ |
+ |
+ |
||||
Вакансія 5 |
+ |
+ |
+ |
||||
Вакансія 6 |
+ |
+ |
+ |
||||
Вакансія 7 |
+ |
+ |
|||||
Вакансія 8 |
+ |
+ |
+ |
Знайдемо розв'язок з використанням програмної реалізації модифікованого алгоритму Форда
теорія граф числовий максимізація
Приклад 3. На підприємстві є 6 вакансій і 6 працівників. Можливість прийняття працівників на вакансії подано таблицею
Прац. 1 |
Прац. 2 |
Прац. 3 |
Прац. 4 |
Прац. 5 |
Прац. 6 |
Прац. 7 |
Прац. 8 |
||
Вакансія 1 |
+ |
+ |
|||||||
Вакансія 2 |
+ |
+ |
+ |
+ |
|||||
Вакансія 3 |
+ |
||||||||
Вакансія 4 |
+ |
+ |
+ |
||||||
Вакансія 5 |
+ |
+ |
+ |
+ |
Знайдемо розв'язок з використанням програмної реалізації модифікованого алгоритму Форда
Висновки
У роботі розглянуто задачу максимізації кількості призначень в задачі розподілу. Для розв'язання цієї задачі застосовано підхід, що полягає у зведенні цієї задачі до задачі про максимальний потік.
Перевагою такого підходу є те, що він дозволяє застосувати відомі методи розв'язання задачі про максимальний потік. Цей факт значно спрощує процес розв'язання поставленої задачі.
Недоліком такого підходу є те, що при побудові графа і його представленні за допомогою матриці суміжності ми одержуємо матрицю великої розмірності, яка є дуже розрідженою. Цього недоліку можна позбутися зберігаючи тільки важливі сектори даної матриці.
Список використаної літератури
1. Глебена МЛ. Кузка O.I. Задача про максимальний потік (методичні вказівки).- Ужгород 2007.
2. Навчальний посібник для студентів факультету кібернетики «Теорія графів» - 1998.
3. Уилсон Р. Введение в теорию графов.- М., 1977.
4. Оре О. Теория графов.- М., 1980.
5. Головина Л.И. Графы и их применения . Математика в школе, 1965, №3.
6. Нагибин Ф.Ф. Применение графов для решения логических задач. Математика в школе , 1964, № 3.
7. Шедивы Я. Решение логических задач при помощи графов.- Математика в школе, 1967, № 6.
8. Скляр І.В. Теорія графів у школі: задачі: посібник /Ірина Скляр. - К.:Шкільний світ, 2010. - 128с.
9. Збірник науково-популярних статей « У світі математики» Випуск 11.- 1980.
Додатки
Текст програми
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Spin, Menus;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
Label1: TLabel;
robSpinEdit: TSpinEdit;
daniStringGrid: TStringGrid;
Label2: TLabel;
misSpinEdit: TSpinEdit;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
rezEdit: TEdit;
Label3: TLabel;
priznMemo: TMemo;
Label4: TLabel;
tempStringGrid: TStringGrid;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure robSpinEditChange(Sender: TObject);
procedure misSpinEditChange(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMatr=array[-1..100,-1..100] of integer;
Pvet=^Vet;
vet=record
inf:integer;
next:PVet;
end;
var
Form1: TForm1;
Dani,FMatr,Matr:TMatr;
n,m,nr,nm:integer;
QFirst,QLast:Pvet;
implementation
uses DateUtils;
{$R *.dfm}
procedure showNums;
var i:integer;
begin
with Form1 do
begin
for i:=1 to Form1.misSpinEdit.Value do
begin
daniStringGrid.Cells[0,i]:='Місце'+inttostr(i);
end;
for i:=1 to Form1.robSpinEdit.Value do
begin
daniStringGrid.Cells[i,0]:='Роб.'+inttostr(i);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
showNums;
end;
procedure TForm1.robSpinEditChange(Sender: TObject);
begin
daniStringGrid.ColCount:=robSpinEdit.Value+1;
showNums;
end;
procedure TForm1.misSpinEditChange(Sender: TObject);
begin
daniStringGrid.RowCount:=misSpinEdit.Value+1;
showNums;
end;
procedure TForm1.N3Click(Sender: TObject);
var f:TextFile;
i,j:integer;
begin
if SaveDialog1.Execute then
begin
AssignFile(f,SaveDialog1.FileName);
Rewrite(f);
writeln(f,misSpinEdit.Value,' ',robSpinEdit.Value);
for i:=1 to misSpinEdit.Value do
begin
for j:=1 to robSpinEdit.Value do
begin
writeln(f,daniStringGrid.Cells[j,i]);
end;
end;
CloseFile(f);
end;
end;
procedure TForm1.N2Click(Sender: TObject);
var f:TextFile;
nr,nm,i,j:integer;
s:string;
begin
if OpenDialog1.Execute then
begin
AssignFile(f,OpenDialog1.FileName);
Reset(f);
readln(f,nm,nr);
robSpinEdit.Value:=nr;
misSpinEdit.Value:=nm;
for i:=1 to nm do
begin
for j:=1 to nr do
begin
readln(f,s);
daniStringGrid.Cells[j,i]:=s;
end;
end;
CloseFile(f);
end;
end;
procedure getData;
var i,j,l:integer;
d:real;
begin
with Form1 do
begin
nr:=robSpinEdit.Value;
nm:=misSpinEdit.Value;
for i:=1 to nm do
begin
for j:=1 to nr do
begin
val(daniStringGrid.Cells[j,i],dani[i,j],l);
if l<>0 then
dani[i,j]:=0;
end;
end;
end;
end;
procedure createFirstMatr;
var i,j:integer;
begin
n:=nr+nm+1;
for i:=0 to n do
begin
for j:=0 to n do
begin
FMatr[i,j]:=0;
end;
end;
//0-row
for j:=1 to nm do FMatr[0,j]:=1;
//n-col
for i:=nm+1 to nm+nr do FMatr[i,n]:=1;
//dani
for i:=1 to nm do
begin
for j:=nm+1 to nm+nr do
begin
FMatr[i,j]:=Dani[i,j-nm];
end;
end;
end;
//--------------------------------------------------
{----------------- Quee ---------------------}
procedure QPush(inf:integer);
var cur:PVet;
begin
new(cur);
cur^.inf:=inf;
cur^.next:=nil;
if QFirst=nil then
begin
QFirst:=cur; QLast:=cur;
end
else
begin
QLast^.next:=cur;
QLast:=cur;
end;
end;
function QPop(var inf:integer):boolean;
var cur:PVet;
begin
if QFirst=nil then
Result:=false
else
begin
inf:=QFirst^.inf;
cur:=QFirst;
QFirst:=QFirst^.next;
Dispose(cur);
if QFirst=nil then QLast:=nil;
Result:=true;
end;
end;
procedure QErase;
var cur:Pvet;
begin
while QFirst<> nil do
begin
cur:=QFirst;
QFirst:=QFirst^.next;
Dispose(cur);
end;
QLast:=nil;
end;
{----------------- /Quee ---------------------}
procedure ShowMaatr(M:TMatr; n:integer; s:string);
var i,j:integer;
begin
if Form1.CheckBox1.Checked then
begin
With Form1 do
begin
tempStringGrid.ColCount:=n+1;
tempStringGrid.RowCount:=n+2;
for i:=-1 to n do
begin
for j:=0 to n do
begin
tempStringGrid.Cells[j,i+1]:=inttostr(M[i,j]);
end;
end;
end;
ShowMessage(s);
end;
end;
{------------------------ Max potik ---------}
function baseEtap:boolean;
//-------------------------
function setMark:integer;
var k,j:integer;
begin
QFirst:=nil; QLast:=nil;
for j:=0 to n do Matr[-1,j]:=-1;
QPush(0);
while QPop(k) do
begin
for j:=1 to n do
begin
if (Matr[-1,j]=-1)and(Matr[k,j]>0) then
begin
Matr[-1,j]:=k;
QPush(j);
if j=n then
begin
Result:=j;
QErase;
Exit;
end;
end;
end;
end;
Result:=-1;
end;
//-------------------------
procedure Etap3(k:integer);
var kn:integer;
begin
kn:=n;
repeat
Matr[k,kn]:=0;
Matr[kn,k]:=1;
kn:=k;
k:=Matr[-1,k];
until kn=0;
end;
var k:integer;
begin
repeat
k:=setMark;
ShowMaatr(Matr,n,'setMark');
if k<>-1 then
begin
Etap3(k);
ShowMaatr(Matr,n, 'etap3');
end;
until k=-1
end;
Function MaxPriznach:integer;
var i,j,kPrizn:integer;
function getRob(i:integer):integer;
var j:integer;
begin
for j:=nm+1 to nm+nr do
begin
if FMatr[i,j]>0 then
begin
Result:=j-nm;
Exit;
end;
end;
Result:=-1;
end;
begin
Matr:=FMatr;
baseEtap;
for i:=0 to n do
begin
for j:=0 to n do
begin
FMatr[i,j]:=FMatr[i,j]-Matr[i,j]
end;
end;
//------------
kPrizn:=0;
for j:=0 to n do kPrizn:=kPrizn+FMatr[0,j];
for i:=1 to nm do FMatr[i,-1]:=getRob(i);
Result:=kPrizn;
ShowMaatr(FMatr,n,'Rez');
end;
{------------------------ /Max potik ---------}
procedure TForm1.N6Click(Sender: TObject);
var i:integer;
begin
getData;
createFirstMatr;
ShowMaatr(FMatr,n,'First');
rezEdit.Text:=inttostr(MaxPriznach);
priznMemo.Clear;
for i:=1 to nm do
begin
if FMatr[i,-1]>0 then
priznMemo.Lines.Add('(Місце - '+inttostr(i)+') -> (Робочий -'+inttostr(FMatr[i,-1])+')');
end;
end;
procedure TForm1.N7Click(Sender: TObject);
begin
close
end;
end.
Інструкція користувача
Головна форма програми має зручний і зрозумілий інтерфейс
Всі операції з даними (зберігання даних, завантаження) виконуються з використанням пункту головного меню «Файл».
Знаходження оптимального розподілу здійснюється з використанням пункту головного меню «Знайти макс. призначення».
З використанням елемента «Виводити проміжкові результати» користувач має можливість проглядати покроково весь процес розв'язання.
Размещено на Allbest.ru
Подобные документы
Поняття та значення симплекс-методу як особливого методу розв'язання задачі лінійного програмування, в якому здійснюється скерований рух по опорних планах до знаходження оптимального рішення. Розв'язання задачі з використанням програми Simplex Win.
лабораторная работа [264,1 K], добавлен 30.03.2015Теорія графів та її використання у різних галузях. У фізиці: для побудови схем для розв’язання задач. У біології: для розв’язання задач з генетики. Спрощення розв’язання задач з електротехніки за допомогою графів. Математичні розваги і головоломки.
научная работа [2,1 M], добавлен 10.05.2009Розв'язання графічним методом математичної моделі задачі з організації випуску продукції. Розв'язання транспортної задачі методом потенціалів. Знаходження умовних екстремумів функцій методом множників Лагранжа. Розв'язання задач симплекс-методом.
контрольная работа [48,5 K], добавлен 16.07.2010Випадок однорідної крайової задачі. Розв’язання виродженого крайового виразу. Теорема Коші, іі доведення. Означення узагальненої функції Гріна крайової задачі. Формулювання алгоритму відшукання узагальненої функції Гріна. Приклади роз'язання завдань.
лекция [108,5 K], добавлен 24.01.2009Визначення кількості сполучень при дослідженні ймовірностей. Закон розподілу випадкової величини. Функція розподілу, знаходження середнього квадратичного відхилення. Визначення щільності розподілу ймовірностей. Закон неперервної випадкової величини.
контрольная работа [71,3 K], добавлен 13.03.2015Класична ймовірність події як відношення кількості сприятливих до загальної кількості можливих подій. Інтегральна теорема Мавра-Лапласа. Підпорядкування випадкової величини біноміальному закону розподілу з певними параметрами. Ряд розподілу цієї величини.
задача [22,2 K], добавлен 14.06.2009Эйлеровы цепи и циклы, теоремы. Алгоритм построения эйлерова цикла. Обоснование алгоритма. Нахождение кратчайших путей в графе. Алгоритм Форда отыскания кратчайшего пути. Задача отыскания кратчайших расстояний между всеми парами вершин. Алгоритм Флойда.
реферат [108,4 K], добавлен 01.12.2008Розв'язання системи лінійних рівнянь методом повного виключення змінних (метод Гаусса) з використанням розрахункових таблиць. Будування математичної моделі задачі лінійного програмування. Умови для застосування симплекс-методу. Розв'язка спряженої задачі.
практическая работа [42,3 K], добавлен 09.11.2009Етапи розв'язування задачі дослідження певного фізичного явища чи процесу, зведення її до диференціального рівняння. Методика та схема складання диференціальних рівнянь. Приклади розв'язування прикладних задач за допомогою диференціального рівняння.
контрольная работа [723,3 K], добавлен 07.01.2016Послідовність графічного розв'язання задачі лінійного програмування. Сумісна система лінійних нерівностей, умови невід'ємності, визначення півплощини з граничними прямими. Графічний метод для визначення оптимального плану задачі лінійного програмування.
задача [320,6 K], добавлен 31.05.2010