Економічна частина. Розробка модуля виключення нуль-рівнянь в комплексі "Рішення задачі лінійного програмування".
1.2 Постановка задачі лінійного програмування та завдання на розробку модуля.
Розглянемо задачу оптимального планування виробництва [1]. Нехай підприємство випускає n виробів, для виробництва яких використовується m інгредієнтів. Інгредієнти це - деталі певного сортаменту, верстати, працівники, електроенергія і т.д., інакше кажучи, все що потрібно для здійснення виробничого циклу. Запаси інгредієнтів задаються вектором b = (b 1, b 2, ..., b m), де b i - запас i-го інгрідієнта (i = 1, ..., m). Задано матриця А, елемент якої a ij визначає витрату i-го інгрідієнта для виробництва одиниці j-го виробу (i = 1, ..., m; j = 1, ..., n). Крім того, задано вектор ринкових цін виробів p = (p 1, p 2, ..., p n), де p - ціна j-го виробу (j = 1, ..., n). Потрібно скласти такий план виробництва х = (х 1, х 2, ..., х n), щоб при виконання умов
a 11 x 1 + a 12 x 2 + ... + a 1n x n b 1 | (1) a 21 x 1 + a 22 x 2 + ... + a 2n x n b 2 | ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... .... | a m1 x 1 + a m2 x 2 + ... + a mn x n b m | x j 0, (j = 1, ..., n). |
досягався максимум функції (1 ')
Z = p 1 x 1 + p 2 x 2 + ... + p n x n
Функція Z називається цільовий. i-е обмеження з (1) означає, що не можна витратити i-го інгредієнта більше, ніж є в наявності. Обмеження (1) задають безліч . Змінні, що задовольняють умові x j 0, називаються невільними. У нашій задачі це означає, що при x j = 0 - нічого не виробляється або при x j> 0 виробляється певна кількість виробів. Змінні, на які умови неотрицательности не накладаються, називаються вільними. Задача (1) - (1 ') і є завдання оптимального виробничого планування, вирішення якої забезпечує досягнення в конкретних умовах максимального прибутку. Сформулюємо двоїсту до (1) - (1 ') завдання про придбанні інгридієнтів за мінімальною ринковою вартістю. Хай те ж саме підприємство, що і в задачі (1) - (1 '), збирається придбати на ринку m інгридієнтів для виробництва тих же n виробів. При цьому кількість придбаних інгридієнтів визначається вектором b = (b 1, b 2, ..., b m). Задано та ж матриця А, елемент якої aij визначає витрату i-го інгрідієнта для виробництва j-го виробу. Крім того задано вектор цін p = (p 1, p 2, ..., p n) на продукцію підприємства. Потрібно відшукати вектор цін інгридієнтів u = (u 1, u 2, ..., u m), де u i - ціна одиниці i-го інгрідієнта (i = 1, ..., m), щоб виконувалися умови:
a 11 u 1 + a 21 u 2 + ... + a m1 u m p 1 | (2) a 12 u 1 + a 22 u 2 + ... + a m2 u m p 2 | ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... .... | a 1n u 1 + a 2n u 2 + ... + a mn u m p n | u i 0, (i = 1, ..., m) |
при досягненні мінімуму цільової функції (2 ')
W = b 1 u 1 + ... + b m u m
j-е умова (2) означає, що вартість усіх інгредієнтів, що йдуть на виробництво j-го виробу, не менше ринкової ціни цього виробу. Умова невільною u j 0 означає, що j-й інгредієнт або безкоштовний (u j = 0), або коштує позитивний кількість рублів (u j> 0). Опорним рішенням задачі (1) - (1 ') називається точка безлічі , в якому не менш ніж n обмежень з (1) звертається у вірне рівність. Це - так звана, кутова точка множини. Для n = 2 це - вершина плоского кута. Опорним рішенням задачі (2) - (2 ') називається точка, в якій не менше ніж m обмежень з (2) звертається у вірне рівність. У задачі (1) - (1 ') опорне рішення - точка х = (0, ..., 0), початок координат. У задачі (2) - (2 ') початок координат - точка u = (0, ..., 0), опорним рішенням не є. Опорне рішення, що доставляє максимум функції (1 ') або мінімум функції (2') називається оптимальним. У роботі [1] показано, що оптимальне рішення можна завжди шукати серед опорних рішень. Серед лінійних обмежень задачі (1) - (1 ') крім нерівностей можуть бути і рівності. Тоді домовимося писати ці рівності першими. Якщо їх кількість дорівнює k, то область запишеться у вигляді:
a 11 x 1 + a 12 x 2 + ... + a 1n x n = b 1 | ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ... | (3) a k1 x 1 + a k2 x 2 + ... + a kn x n = b k | a k +1, 1 x 1 + a k +1, 2 x 2 + ... + a k +1, n x n b k +1 | ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ... | a m1 x 1 + a m2 x 2 + ... + a mn x n b m | x j 0, (j = 1, ..., n) |
Потрібно знайти максимум функції (3 ')
Z = p 1 x 1 + p 2 x 2 + ... + p n x n
У загальному випадку серед змінних x j можуть бути вільні. Номери вільних змінних будемо зберігати в окремому масиві. При формуванні двоїстої задачі до задачі (3) - (3 ') i-му обмеження - рівності буде відповідати вільна мінлива u i (i = 1, ..., k), а вільної змінної x j обмеження - рівність: a 1j u 1 + a 2j u 2 + ... + a mj u m = p j Введемо допоміжні змінні y i 0 (i = 1, ..., n) і запишемо обмеження (3) і функцію Z у вигляді:
0 = a 11 (-x 1) + a 12 (-x 2) + ... + a 1n (-x n) + a 1, n +1 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... | (4) 0 = a k1 (-x 1) + a k2 (-x 2) + ... + a kn (-x n) + a k, n +1 | y k +1 = a k +1, 1 (-x 1) + a k +1, 2 (-x 2) + ... + a k +1, n (-x n) + a k +1, n + 1 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... | y m = a m1 (-x 1) + a m2 (-x 2) + ... + a mn (-x n) + a m, n +1 | Z
= A m +1, 1 (-x 1) + a m +1, 2 (-x 2) + ... + a m +1, n (-x n) + a m +1, n +1 |
Умова невільною окремих або всіх змінних тут не відзначено. Позначення:
a i, n +1 = b i (i = 1, ..., m), a m +1, j =-p j (j = 1, ..., n) a m +1, n +1 = 0.
Таким чином, матрицю а ми доповнили стовпцем вільних членів, а також рядок коефіцієнтів цільової функції, змінивши знаки цих коефіцієнтів на протилежні. Тоді завдання (4) можна представити у вигляді таблиці. 1:
Пряма задача Таблиця 1
| -X 1 | -X 2 |
| -X n | 1 | 0 = | a 11 | a 12 | ... | a 1n | a 1, n +1 | ... ... | ... ... ... ... ... ... ... ... ... ... ... | ... ... ... | 0 = | .. | a k, n +1 | y k +1 = | a k1 | a k2 | ... | a kn | a k +1, n +1 | ... ... | a k +1, 1 | a k +1, 2 | ... | a k +1, n | ... ... ... | y m = | ... ... ... ... ... ... ... ... ... ... ... | ... ... ... |
| a m1 | a m2 | ... | a mn | a m, n +1 | Z = | a m +1, n | a m +1, 2 | ... | a m +1, n | a m +1, n +1 |
Номери вільних змінних запам'ятовуються окремо. Сумісний таблицю двоїстої задачі з таблицею. 1 і отримаємо таблицю. 2.
Пряма і двоїста задачі Таблиця 2
|
| v 1 = | v 2 = |
| v n = | W = |
|
| -X 1 | -X 2 |
| -X n | 1 | u 1 | 0 = | a 11 | a 12 | ... | a 1n | a 1, n +1 |
| ... ... | ... ... ... ... ... ... ... ... ... ... ... ... | ... ... ... | u k | 0 = | a k1 | a k2 | ... | a kn | a k, n +1 | u k +1 | y k +1 = | a k +1, 1 | a k +1, 2 | ... | a k +1, n | a k +1, n +1 |
| ... ... | ... ... ... ... ... ... ... ... ... ... ... | ... ... ... | u m | y m = | a m1 | a m2 | ... | a mn | a m, n +1 | 1 | Z = | a m +1, n | a m +1, 2 | ... | a m +1, n | a m +1, n +1 |
v j - допоміжні змінні двоїстої задачі. Тоді j-е обмеження з таблиці має вигляд:
v j = a 1j u 1 + a 2j u 2 + ... + a mj u m + a m +1, j 0, якщо x j 0
Якщо змінна x j вільна, то їй відповідає обмеження-рівність двоїстої задачі:
0 = a 1j u 1 + a 2j u 2 + ... + a mj u m + a m +1, j
тобто замість v j фактично буде нуль. Крім того перший k змінних двоїстої задачі вільні, а інші невільні. Цільова функція двоїстої задачі
W = a 1, n +1 u 1 + a 2, n +1 u 2 + ... + a m, n +1 u m + a m +1, n +1
Поєднання в одній таблиці прямий і двоїстої задачі невипадково. Вирішуючи пряму задачу, ми отримуємо про дновременно рішення двоїстої задачі, причому
max Z = min W = a m +1, n +1
Зробимо заміну змінних в таблиці 1, перекинувши допоміжну змінну y r на верх таблиці зі знаком мінус, а основну мінно x s на бік таблиці (a rs 0). Це означає рух з вершини x = (0, ..., 0) в іншу вершину багатогранника за його ребру. Елемент а rs називається що дозволяє, рядок r - роздільної рядком, стовпець s - дозволяючим стовпцем. Така заміна змінних носить назву модифікованих Жорданових винятків (Мжі). Елементи матриці а, не належать дозволяючим стовпцю чи дозволяє рядку, назвемо рядовими.
2.2 Опис вихідних даних і результатів рішення задачі лінійного програмування.
Обговоримо вихідні дані (текстовий файл simp.dat) та результати виконання завдання лінійного програмування (текстовий файл simp.res). На початку файлу simp.dat розташовані, так звані, представницькі дані - строкові дані, кожне з яких розташований у файлі з нового рядка: 1. Рядок з номером варіанту, 2. Рядок з російською назвою модуля, 3. Рядок з координатами студента (ПІБ, факультет, курс, група), 4. Рядок з датою виконання. Далі йдуть рядки файлу з числовими вихідними даними: 1. Керуючий вектор kl - окремий рядок складається з трьох чисел kl 1, kl 2, kl 3: kl 1 = 0, якщо необхідно отримати рішення тільки прямої задачі. kl 1 = 1, якщо необхідно отримати рішення тільки двоїстої задачі. kl 1 = 2, якщо необхідно отримати рішення обох задач. kl 2 = 0, якщо немає вільних змінних, інакше kl 2 дорівнює числу цих нуль-рівнянь. 2. Число обмежень і змінних (окремий рядок введення). 3. Коефіцієнти розширеної матриці a, починаючи з окремого рядка введення. 4. Вектор номерів вільних змінних, якщо вони є, починаючи з окремого рядка введення. Результати рішення залежать від значення kl. Якщо kl 1 = 0, то при успішному результаті це буде вектор оптимального рішення прямої задачі і оптимальне значення цільової функції. При несприятливому результаті, це одне з повідомлень: або "Система обмежень несовместна", або "Цільова функція необмежена". Якщо kl 2 = 1, то ж для двоїстої задачі. Якщо kl 2 = 2, то спочатку видається рішення прямій, а потім двоїстої задачі. При не успішному результаті повідомлення справедливі тільки для прямої задачі (для двоїстої аналогічні повідомлення не видаються). Результати поміщаються у файл simp.res. 3.2 Опис модуля типів.
Для завдання типів і файлових змінних вступного та вивідного текстових файлів використовується модуль типів unit typesm, структура якого наведена нижче
unit typesm; interface const mmax = 20; nmax = 20; e = 1e-5; type klt = array [1 .. 3] of integer; at = array [1 .. mmax +1,1 .. nmax +1] of real; vec1it = array [1 .. nmax] of integer; vec2it = array [1 .. mmax] of integer; vec1rt = array [1 .. nmax] of real; vec2rt = array [1 .. mmax] of real; var fi, fo: text; implementation end.
У розділі констант задані константи nmax і mmax, що задають максимальне число рядків розширеної матриці a без одиниці, а також порогова константа е, використовувана в модулі пошуку роздільної рядка. Константа ий використовується для забезпечення стійкості алгоритму (модуль дозволяє елемента не повинен бути занадто малий, а саме, більше е). Нижче наведена таблиця фактичних і формальних параметрів підпрограм завдань лінійного програмування. Позначення формальних і фактичних параметрів збігаються.
N / N | Призначення | Позначення | Тип | 1. | Керуючий вектор | k1 | ki1t | 2. | Число обмежень | m | integer | 3. | Число змінних | n | integer | 4. | Матриця коефіцієнтів | a | at | 5. | Вектор номерів вільних змінних | i1 | vec1it | 6. | Відслідковує вектор основних змінних прямої задачі | p1 | vec1it | 7. | Відслідковує вектор допоміжних змінних двоїстої задачі | q1 | vec1it | 8. | Відслідковує вектор допоміжних змінних прямої задачі | p2 | vec2it | 9. | Відслідковує вектор основних змінних двоїстої задачі | q2 | vec2it | 10. | Роздільна рядок | r | integer | 11. | Дозволяє стовпець | s | integer | 12. | Вектор-рішення прямої задачі | x | vec1rt | 13. | Вектор-рішення двоїстої задачі | u | vec2rt |
4.2 Укрупненная блок-схема задачі лінійного програмування.
5.2 Параметри і заголовки процедур завдання лінійного програмування.
В основній програмі використовуються наступні змінні, які описані в розділі var:
m, n, r, s: integer; {числові змінні цілого типу}
Процедури програми:
N / N | Призначення | Тема | 1. | Введення і контроль вихідних даних і виведення їх у файл результатів | input (var k1: k1t; var m, n: integer; var a: at, var i1: vec1it; var p1, q1: vec1it; var p2, q2: vec2it) | 2. | Виняток вільних змінних | issp (var k1: k1t; m, n: integer; var a: at; var i1, p1, q1: vec1it; var p2, q2: vec2it) | 3. | Виняток нуль-рівнянь | isnu (var k1: k1t; m, n: integer; var a: at; var p1, q1: vec1it; var p2, q2: vec2it) | 4. | Пошук опорного рішення | opor (m, n: integer; var a: at; var p1, q1: vec1it; var p2, q2: vec2it) | 5. | Пошук оптимального рішення | optim (m, n: integer; var a: at; var p1, q1: vec1it; var p2, q2: vec2it) | 6. | Висновок рішення прямої задачі | outp (m, n: integer; var a: at; var p2: vec2it; x: vec1rt) | 7. | Висновок рішення двоїстої задачі | outd (m, n: integer; var a: at; var q1: vec1it; u: vec2rt) | 8. | Мжі | mji (m, n: integer; var a: at; r, s: integer) | 9. | Пошук роздільної рядки | nstro (m, n: integer; var a: at; r, s: integer var p2: vec2it) |
6.2 Блок-схема і параметри реалізованої процедури. r = 1
та немає
p2 r <0 p1 (| p2 r |) =- 1
P = 0
p1 j> 0 j = 1 немає
та
немає
| A rj |> p
та
p = | a rj | s = j
j = n
та
P = 0
немає
"Викл. R-е нуль-ур. Не можна"
MJI (m, n, a, r, s)
p2 r = p1 s p1 s =- 1 t = q2 r q2 r = q1 s q1 s = t
Закрити файли
До
r = k
B
Обращащеніе: isnu (k1, m, n, a, p1, q1, p2, q2). Використовуються модулі typesm, mjim. Параметри підпрограми isnu:
Найменування | Позначення | Число обмежень | m | Число змінних | n | Матриця завдання | a | Відстежують вектори | p1, q1, p2, q2 |
У результаті успішної роботи алгоритму всі нуль-рівняння будуть виключені, і в відстежує векторі p1 це буде відзначено як -1, що дасть можливість у подальшому відповідні стовпці матриці А при виборі дозволяє елемента не чіпати. Якщо ж алгоритм застосувати не можна, то буде видане повідомлення (див. блок-схему), і робота програми закінчиться. 7.2 Лістинг модуля, вихідних даних і результатів машинного розрахунку.
unit isnum; interface uses typesm, mjim; procedure isnu (var k1: k1t; m, n: integer; var a: at; var p1, q1: vec1it; var p2, q2: vec2it); implementation procedure isnu; var p: real; k, s, r, j, t: integer; begin for r: = 1 to k do begin if p2 [r] <0 then p1 [abs (p2 [r ])]:=- 1; end; p: = 0; for j: = 1 to n do begin if p1 [j]> 0 then begin if abs (a [r, j])> p then begin p: = abs (a [r, j]); s: = j; end; end; end; if p = 0 then begin writeln (fo, 'Виключити r', r: 6, '-е нуль-рівняння не можна'); close (fi); close (fo); halt end; mji (m, n, a, r, s); p2 [r]: = p1 [s]; p1 [s]: =- 1; t: = q2 [r]; q2 [r]: = q1 [s]; q1 [s]: = t; end; end.
Вихідний файл simp.dat:
12 Виняток нуль-рівнянь Моносов ЕОУС-1-2 викладач Марьям А. Г. 12.05.98 2 2 0 5 Березня -2 -1 1 -2 1 -1 0 -1 -1 -1 0 -2 0 1 0 2 2 1 0 4 4 4 0 0 2 Січень
Файл результатів simp.res:
МОСКОВСЬКИЙ державний технічний університет КАФЕДРА ІНФОРМАТИКИ І ПРИКЛАДНОЇ МАТЕМАТИКИ Лабораторна робота з інформатики Факультет ЕОУС, 2-ий семестр навчання Рішення задачі лінійного програмування Варіант 12 модуль: Виключення нуль-рівнянь Виконав студент Моносов ЕОУС-1-2 викладач Марьям А. Г. Дата виконання: 12.05.98 Керуючий вектор: 2 2 0 Число обмежень: 5 Число змінних: 3 Матриця завдання Н-р Коефіцієнти Св. члени рядки 1 -2.00000 -1.00000 1.00000 -2.00000 2 1.00000 -1.00000 0.00000 -1.00000 3 -1.00000 -1.00000 0.00000 -2.00000 4 0.00000 1.00000 0.00000 2.00000 5 2.00000 1.00000 0.00000 4.00000 6 4.00000 4.00000 0.00000 0.00000 Вектор номерів вільних змінних: 2 Січень Вектор рішення прямої задачі: 1.00000 2.00000 3.00000 Значення цільової функції прямої задачі = 12.00000 Вектор рішення двоїстої задачі: 0.00000 4.00000 0.00000 8.00000 0.00000 Значення цільової функції двоїстої задачі = 12.00000
8.2 Ручний розрахунок задачі лінійного програмування.
Потрібно максимізувати функцію
z = 4x 1 +5 x 2
при обмеженнях:
-2x 1-x 2 + x 3 =- 2 x 1-x 2 -1 - X 1 - x 2 -2 0x 1 + 1x 2 2 2x 1 + 1x 2 4 x 3 0
Коефіцієнти обмежень, записаних у такому вигляді, переписуються зі своїми знаками, в останньому рядку таблиці записуються коефіцієнти цільової функції з протилежними знаками. Спершу слід виключити вільні змінні, перекинувши їх на бік таблиці:
| -X 1 | -X 2 | -X 3 | 1 | 0 = | -2 | -1 | 1 | -2 | y 2 = | 1 | -1 | 0 | -1 | y 3 = | -1 | -1 | 0 | -2 | y 4 = | 0 | 1 | 0 | 2 | y 5 = | 2 | 1 | 0 | 4 | z = | -4 | -4 | 0 | 0 |
| -X 1 | -Y 4 | -X 3 | 1 | 0 = | -2 | 1 | 1 | 0 | y 2 = | 1 | 1 | 0 | 1 | y 3 = | -1 | 1 | 0 | 0 | * X 2 = | 0 | 1 | 0 | 2 | y 5 = | 2 | -1 | 0 | 2 | z = | -4 | 4 | 0 | 8 |
| -Y 2 | -Y 4 | -X 3 | 1 | 0 = | -2 | 3 | 1 | 2 | * X 1 = | 1 | 1 | 0 | 1 | y 3 = | -1 | 2 | 0 | 0 | * X 2 = | 0 | 1 | 0 | 2 | y 5 = | 2 | -3 | 0 | 0 | z = | 4 | 8 | 0 | 12 |
Після цього слід виключити нуль-рівняння:
|
|
| * |
|
| -Y 2 | -Y 4 | -Y 1 | 1 | x 3 = | -2 | 3 | 1 | 2 | * X 1 = | 1 | 1 | 0 | 1 | y 3 = | -1 | 2 | 0 | 0 | * X 2 = | 0 | 1 | 0 | 2 | y 5 = | 2 | -3 | 0 | 0 | z = | 4 | 8 | 0 | 12 |
Ми бачимо, що вільні члени в непозначених рядках ненегативні, отже опорне рішення отримано і треба перейти до пошуку оптимального рішення. Знаходимо непозначених стовпці з негативними коефіцієнта цільової функції, крім останнього. У нас таких немає, тому оптимальне рішення отримано і переходимо до вилучення результатів. Для цього складемо ще одну таблицю, де міститися змінні прямої і двоїстої задач. Для витягання рішень потрібні лише стовпець вільних членів і рядок коефіцієнтів цільової функції. Тому внутрішня частина таблиці не узгоджено.
|
| u 2 = | u 4 = | u 1 = | w = |
|
| -Y 2 | -Y 4 | -Y 1 | 1 | v 3 = | x 3 = | -2 | 3 | 1 | 2 | v 1 = | x 1 = | 1 | 1 | 0 | 1 | u 3 = | y 3 = | -1 | 2 | 0 | 0 | v 2 = | x 2 = | 0 | 1 | 0 | 2 | u 5 = | y 5 = | 2 | -3 | 0 | 0 | 1 | z = | 4 | 8 | 0 | 12 |
У результаті отримуємо такі результати:
Пряма задача. Змінні прямої задачі, що знаходяться зверху таблиці рівні у вирішенні 0, а збоку - відповідним вільним членам:
x 1 = 1; x 2 = 2; x 3 = 2.
Двоїста задача. Змінні двоїстої задачі, що знаходяться зверху таблиці рівні 0, а збоку - відповідним коефіцієнтом цільової функції:
u 1 = 0; u 2 = 4; u 3 = 0; u 4 = 8; u 5 = 0.
Значення цільових функцій обох задач z max = w min = 12.
9.2 Висновки.
Отримані результати при ручному розрахунку збігаються з даними машинного рахунку. Це підтверджує правильність складання алгоритму і написання програми. Список використаної літератури.
|