Проектування моделей з використанням двоїстого симплекс методу

Рішення задачі лінійного програмування за допомогою двоїстого симплекс–методу. Поняття двоїстості в лінійному програмуванні. Аналіз першої та другої теореми подвійності. Сутність двоїстого симплекс метод та його алгоритм. Схема алгоритму подвійних задач.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 20.12.2008
Размер файла 154,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Міністерство освіти і науки України

Східноукраїнський національний університет

імені Володимира Даля

Коледж

Спеціальність : «Прикладна математика»

Проектування моделей з використанням двоїстого симплекс методу

Пояснювальна записка

КП.5.080202.МП.44.10.ПЗ

Керівник __________ Латкова А.О.

Виконав студент групи 1ПМ-05 __________ Почепко А.С

2008

Міністерство освіти і науки України

Східноукраїнський національний університет

імені Володимира Даля

Коледж

ЗАВДАННЯ

для курсового проекту

по предмету “Моделювання виробничих і економічних процесів”

студентові спеціальності 5.080202 групи 1ПМ-05______________

Почепко Артуру Сергійовичу__________________________________

Тема завдання: «Проектування моделей з використанням двоїстого симплекс методу»__________________________________________

Література

1. Науменко К. Д. і др. Математичні методи в плануванні і керуванні_ виробництвом на гірських підприємствах - Москва: Надра, 1970. ______

2 .Беллман Р. Динамічне програмування________________________

Курсовий проект на вказану тему виконується в наступному об'ємі

____________________________________________________________

_____________________________________________________________

1. Записка пояснення

Введення

1 Двоїстість в лінійному програмуванні

2 Подвійний симплекс метод. Алгоритм двоїстого симплекс методу. Схема алгоритму.

3 Рішення поставленої задачі.

3.1 Умова завдання.

3.2 Рішення задачі вручну.

4 Виводи.

Література

Додатки (текст програми, схема програми, опис програми, інструкція по роботі з програмою, вхідна і вихідна інформація)

2. Розрахункова частина

Вирішити завдання подвійним симплекс методом

Задача 1

за умови

Задача 2

за умови

Задача 3

За умови

3. Графічна частина

Лист1 Схема програми___________________________________

_______________________________________________________

Дата видачі «_1_»_____09______2008

Термін закінчення «_17»_____09______2008

Зав. відділенням ______________

Керівник проекту ______________

ЗАТВЕРДЖУЮ

Зав. відділенням

……………………………….

«__»_________200_р.

Графік

роботи над курсовим проектом

студента групи 1ПМ-05 Почепко А.С

п-п

Розділи, графи проекту

Характер роботи

Об'їм роботи

Термін виконання

Відмітка керівника про виконання

1

Введення

Опіс. частина

10

1.09-5.09

2

Двоїстість в лінійному програмуванні

Опіс. частина

15

6.09-17.09

3

Двоїстий симплекс метод.

Алгоритм методу.

Схема алгоритму

Опіс. частина

8

18.09-20.09

4

Рішення поставленої задачі

Опіс. частина

15

21.09-22.09

5

Умова завдання

Граф. частина

12

23.09-24.09

7

Складання програми

Робота на ЕОМ

20

25.09-5.10

8

Відладка програми

Робота на ЕОМ

15

6.10-9.10

9

Опис програми

Апіс. частина

2

10.10-19.10

10

Інструкція користувачу

Апіс. частина

3

20.10-24.10

11

Графічна частина А1, А4

Граф. частина

3

25.10-6.11

12

Оформлю. Титл. і л. зміст

Граф. частина

5

7.11-11.11

13

Висновки

Апіс. частина

2

12.11-16.11

14

Здача курсового проекту

17.11

Термін здачі проекту на перевірку __9.11.2008-17.11.2008

День захисту проекту_____20.11.2008_____________

Керівник______________________________

Зміст

Введення

1. Двоїстість в лінійному програмуванні. .............................

2.Двоїстий симплекс метод, алгоритм методу, схема алгоритму......................................................................................................

3 Рішення поставленої задачі.....................................................

3.1 Умова задачі ..........................................................................

3.2 Рішення задачі вручну..........................................................

4 Висновки.............................................................................................

Література

Додаток А Текст програми

Схема алгоритму

Опис програми

Інструкція користувачеві

Додаток Б Вхідна інформація

Вихідна інформація

Додаток В Графічна частина (А1)

ВВЕДЕННЯ

Використання ідей подвійності у поєднанні із загальною ідеєю симплекс-методу дозволило розробити один метод вирішення завдань лінійного програмування - двоїстий симплекс-метод. Вперше цей метод був запропонований Лемке у 1954 р.

Рішення задачі лінійного програмування зводиться до відшукання оптимального плану прямої задачі послідовним переходом від одного базису до іншого.

Двоїстий симлекс-метод - це характерний приклад ітераційних обчислень, які використовуються при вирішенні більшості оптимізаційних завдань.

В обчислювальній схемі двоїстого симплекс-методу реалізується впорядкований процес, при якому, починаючи з деякої початкової допустимої кутової точки (зазвичай початок координат), здійснюються послідовні переходи від однієї допустимої екстремальної крапки до іншої до тих пір, поки не буде знайдена крапка, відповідна оптимальному рішенню

1 ДВОЇСТІСТЬ В ЛІНІЙНОМУ ПРОГРАМУВАННІ

Поняття подвійності.

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

Зв'язок вихідної і подвійної задач полягає в тому, що коефіцієнти Cj цільової функції вихідної задачі є вільними членами системи обмежень подвійної задачі, вільні члени Bi системи обмежень вихідної задачі служать коефіцієнтами цільової функції подвійної задачі, а матриця коефіцієнтів системи обмежень подвійної задачі є транспонованою матрицею коефіцієнтів системи обмежень вихідної задачі. Рішення подвійної задачі може бути отримане з рішення вихідною і навпаки.

Як приклад розглянемо задачу використання ресурсів. Підприємство має т видів ресурсів в кількості bi (i = 1, 2 ..., m) одиниць, з яких проводиться n видів продукції. Для виробництва 1 од. i-й продукції витрачається aij од. t-гo ресурсу, а її вартість складає Cj од. Скласти план випуску продукції, що забезпечує її максимальний випуск у вартісному виразі. Позначимо через xj (j =1,2, ..., n) кількість од. j-й продукций, Тоді вихідну задачу сформулюємо так.

Знайти вектор Х =(x1, x2 ., xn), який задовольняє обмеженням

a11x1 + a12x2 + … + a1nxn b1,

a21x1 + a22x2 + … + a2nxn b2, xj 0 (j =1,2, ..., n)

…………………………………

am1x1 + am2x2 + … + amnxn bm,

і доставляє максимальне значення лінійної функції

Z = C1x1 + C2x2 + … + Cnxn,

Оцінимо ресурси, необхідні для виготовлення продукції. За одиницю вартості ресурсів приймемо одиницю вартості продукції, що випускається. Позначимо через уi (j =1,2, ..., m) вартість одиниці i-го ресурсу. Тоді вартість всіх витрачених ресурсів, що йдуть на виготовлення одиниці j-й продукції, рівна .

Вартість витрачених ресурсів не може бути менше вартості остаточного продукту, тому повинна виконуватися нерівність Cj, j =1,2, ..., n.

Вартість всіх наявних ресурсів виразиться величиною . Отже, подвійну задачу можна сформулювати таким чином.

Знайти вектор Y =(y1, y2 ., yn), який задовольняє обмеженням

a11y1 + a21y2 + … + am1ym C1,

a12y1 + a22y2 + … + am2ym C2, yj 0 (i =1,2, ..., m)

…………………………………

a1ny1 + a2ny2 + … + amnym Cm,

і доставляє мінімальне значення лінійної функції

f = b1y1 + b2y2 + . + bmym.

Розглянуті вихідна і подвійна задача можуть бути економічно інтерпретовані таким чином.

Вихідна задача. Скільки і. якій продукції xj (j =1,2, ..., n) необхідно провести, щоб при заданих вартостях Cj (j =1,2, ..., n) одиниці продукції і розмірах наявних ресурсів bi (i =1,2, ..., n) максимізувати випуск продукції у вартісному виразі.

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

Змінні уi називаються оцінками або обліковими, неявними цінами.

Багато задач лінійного програмування спочатку ставляться у вигляді вихідних або подвійних задач, тому має сенс говорити про пару подвійних задач лінійного програмування.

У несиметричних подвійних задачах система обмежень вихідної задачи задається у вигляді рівності, а подвійна -- у вигляді нерівностей, причому в останній змінні можуть бути і негативними. Для простоти доказів постановку задачі умовимося записувати в матричній формі.

Вихідна задача. Знайти матрицю-стовпець X = (x1, x2 ., xn), яка задовольняє обмеженням

AX = A0, Х 0 (1.1)

і мінімізує лінійну функцію Z = СХ.

Подвійна задача. Знайти матрицю-рядок Y = (y1, y2 ., ym), яка задовольняє обмеженням

YA С (1.2)

і максимізував лінійну функцію f = YA0

У обох задачах C = (c1, c2 ., cn) - матриця-рядок, A0 = (b1, b2 ., bm) -- матриця-стовпець, А = (aij) -- матриця коефіцієнтів системи обмежень. Зв'язок між оптимальними планами пари подвійних задач встановлює наступна теорема.

Теорема (теорема подвійності). Якщо з пари подвійних задач одна володіє оптимальним планом, то і інша має рішення, причому для екстремальних значень лінійних функцій виконується співвідношення

min Z = max f.

Якщо лінійна функція однієї із задач не обмежена, то інша не має рішення.

Доказ. Припустимо, що вихідна задача володіє оптимальним планом, який отриманий симплексним методом. Не порушуючи спільності, можна вважати, що остаточний базис складається з т перших векторів A1, A2 ..., Am. Тоді остання симплексна таблиця має вид табл. 1.1.

Таблиця 1.1

i

Базис

С базиса

A0

C1

C2

Cm

Cm+1

cn

A1

A2

Am

Am+1

An

1

2

.

.

.

m

A1

A2

.

.

.

Am

C1

C2

.

.

.

Cm

x1

x2

.

.

.

xm

1

0

.

.

.

0

0

1

.

.

.

0

...

...

.

.

.

.

0

0

.

.

.

1

x1, m+1

x2, m+1

.

.

.

xm, m+1

.

.

.

x1n

x2n

.

.

.

xmn

m+1

Zi - Cj

Z0

Z1 - C1

Z2 - C2

...

Zm - Cm

Zm+1 - Cm+1

Zn - Cn

Хай D -- матриця, складена з компонент векторів остаточного базису A1, A2 ..., Am; тоді табл. 1.1 складається з коефіцієнтів розкладання векторів A1, A2 ..., An вихідної системи по векторах базису, тобто кожному вектору Aj в цій таблиці відповідає такий вектор Xj що

Aj = DXj (j= 1,2, ,.., n) .(1.3)

Для оптимального плану отримуємо

A0 = DX* (1.4)

де X* = (x*1, x*2 ., x*m).

Позначимо через матрицю, складену з коефіцієнтів розкладання векторів Аj (j = 1, 2 ..., n), записаних в табл. 1.1. Тоді, враховуючи співвідношення (1.3) і (1.4), отримуємо:

A = D, D-1A = , (1.5)

A0=DX*; D-1A0 = X*, (1.6)

min Z= C*X*, (1.7)

= C*--C 0, (1.8)

где С* = (C*1, C*2, …, C*m), С = (C1, C2, …, Cm, Cm+1, …, Cn), a = (C*X1 - C1; С*Х2 - С2, ..., C*Xn - Cn) = (Z1 - С1; Z2 - C2; ..., Zn -- Cn) вектор, компоненти якого непозитивні, оскільки вони співпадають з Zj -- Cj 0, відповідними оптимальному плану.

Оптимальний план вихідної задачі має вид X* = D-1 А0, тому оптимальний план подвійної задачі шукаємо у вигляді

Y* = C*D-1. (1.9)

Покажемо, що Y* дійсно план подвійної задачі. Для цього обмеження (1.2) запишемо у вигляді нерівності YA -- С 0, в ліву частину якого підставимо Y*. Тоді на підставі (1.9), (1.5) і (1.8) отримаємо

Y* А - С = С* D-1А - С = С* - С 0,

звідки знаходимо Y*A С.

Оскільки Y* задовольняє обмеженням (1.2), то це і є план подвійної задачі. При цьому плані значення лінійної функції подвійної задачі f (Y*) = Y*A0. Враховуючи співвідношення (1.9), (1.6) і (1.7), маємо

f (Y*) = Y*A0 = C*D-1 A0 = C*X* = min Z(X). (1.10)

Таким чином, значення лінійної функції подвійної задачі від Y* чисельно рівне мінімальному значенню лінійної функції вихідної задачі.

Доведемо тепер, що Y* є оптимальним планом. Помножимо (1.1) на будь-який план Y подвійної задачі, а (1.2) -- на будь-який план X вихідної задачі: YAX=YA0=f (Y), YAX СХ = Z (X), звідси витікає, що для будь-яких планів Х і Y виконується нерівність

f (Y) Z (X). (1.11)

Цим же співвідношенням зв'язані і екстремальні значення

max f (Y) min Z (Х). З останньої нерівності укладаємо, що максимальне значення лінійної функції досягається тільки у випадку, якщо max f (Y) = min Z (X), але це значення [див. (1.10)] f (Y) досягає при плані Y*, отже, план Y* -- оптимальний план подвійної задачі.

Аналогічно можна довести, що якщо подвійна задача має рішення, то вихідна також володіє рішенням і має місце співвідношення max f (Y) = min Z (X).

Для доказу другої частини теореми допустимо, що лінійна функція вихідної задачі не обмежена знизу. Тоді з (1.11) витікає, що f (Y) - . Цей вираз позбавлений сенсу, отже, подвійна задача не має рішень.

Аналогічно припустимо, що лінійна функція подвійної задачі не обмежена зверху. Тоді з (1.11) отримуємо, що Z (X) +. Цей вираз також позбавлений змісту, тому вихідна задача не має рішень.

Доведена теорема дозволяє при вирішенні однієї з подвійних задач знаходити оптимальний план іншої.

Друга теорема подвійності

Zmax=CX Fmin=YA0

Ax>=A0 | y1 A- матриця коефіцієнтів

x>=0 | y>=0 y1>=c

Теорема : Для того що б допустиме рішення Х* і У* пари подвійних задач були оптимальними, необхідно і достатньо, що б для них виконувалися умови «додаткове не жорсткості»

Zmax=Cx Fmin=YA0

Ax<=A0 |y YA>=C |x

x>=0 y>=0

Y*(Ax*-A0)=0 (тоді оптимальне рішення)

(У*A-с)Х*=0

необхідність :

Х* У* - оптимальне рішення.

Довести: 1 і 2

Доказ: оскільки Х* є оптимальним рішенням, то і є допустимим рішенням => Ах*<=A0|y*>=0 Y*Ax*<=y*A0; y* в ходить ОДР => Y*A>=C|x*>=0 y*Ax*>=Cx* =>

Cx*<=Y*Ax*<=y*Ao, оскільки х* і у* - оптимальне рішення, то Сх*=уb*, по першій теоремі => Сх*=у*ах*=у*A0.

(С-у*а)х*=0

2) (у*А-С)х*=0

1) у*(Ах*-A0)=0

достатність

Дано

1) 2)

Довести

Х* і У* - оптим. рішення.

Доказ: у*Ах*-у*A0=0

Y*Ax*=y*A0

y*Ax*-Cx=0

yAx*=Cx*

Cx*=T=y*A0=> Cx*=y*bA0

Вивід для практики : Якщо в оптимальному рішенні початкової задачі х*j >< 0, то відповідне обмеження подвійної зазачі перетворюється на оптимальне вирішення рівності. Якщо яке-небудь з обмежень початкової задачі в оптимальному рішенні перетворюється на не строгу рівність, то відповідна змінна подвійної задачі = 0

2. Двоїстий симплекс метод. Алгоритм методу. Схема алгоритму.

Різновидом подвійних задач лінійного, програмування є подвійні симетричні задачі, в яких система обмежень як вихідної, так і подвійної задач задається нерівностями, причому на подвійні змінні накладається умова позитивності.

На підставі розглянутих несиметричних і симетричних подвійних задач можна укласти, що математичні моделі пари подвійних задач можуть мати один з наступних видів.

Несиметричні задачі

(1) Вихідна задача Подвійна задача

Zmin = CX; fmax = YA0;

AX = A0; YA С.

X 0.

(2) Вихідна задача Подвійна задача

Zmax = CX; fmin = YA0;

AX = A0; YA С.

X 0.

Симетричні задачі

(3) Вихідна задача Подвійна задача

Zmin = CX; fmax = YA0;

AX A0; YA С.

X 0. Y 0.

(4) Вихідна задача Подвійна задача

Zmax = CX; fmin = YA0;

AX A0; YA С.

X 0. Y 0.

Таким чином, перш ніж записати подвійну задачу для даної вихідної, систему обмежень вихідної задачі необхідно привести до відповідного вигляду. Запишемо, наприклад, математичну модель подвійної задачі для наступної вихідної.

Приведемо без доказу наступну теорему.

Теорема 1.1. Якщо при підстановці компонент оптимального плану в систему обмежень вихідної задачі i-e обмеження звертається в нерівність, то i-я компоненту оптимального плану подвійної задачі рівна нулю.

Якщо i-я компоненту оптимального плану подвійної задачі позитивна, то i-e обмеження вихідної задачі задовольняється її оптимальним рішенням як строга рівність.

Перехід до подвійної задачі не обов'язковий, оскільки якщо розглянути першу симплексну таблицю з одиничним додатковим базисом, то легко відмітити, що в стовпцях записана вихідна задача, а в рядках - подвійна. Причому оцінками плану вихідної задачі є Сj а оцінками плану подвійної задачі - bi. Вирішимо "подвійну задачу по симплексній таблиці, в якій записана вихідна задача; знайдемо оптимальний план подвійної задачі, а разом з ним і оптимальний план вихідної задачі. Цей метод носить назву подвійного симплексного методу.

Хай необхідно вирішити вихідну задачу лінійного програмування, поставлену в загальному вигляді: мінімізувати функцію Z = СХ при АХ = A0, Х 0. Тоді в подвійної задачі необхідно максимізувати функцію f = YA0 при YA С.

Допустимо, що вибраний такий базис D = (A1, А2 ..., Аi ..., Аm), при якому хоч би одна з компонент вектора Х = D-1 A0 = (x1, x2 ..., xi ..., xm) негативна (наприклад, xi < 0), але для всіх векторів Aj виконується співвідношення Zj - Cj 0 (i = 1,2 ..., n). Тоді на підставі теореми подвійності Y = Сбаз D-1 - план подвійної задачі. Цей план не оптимальний, оскільки, з одного боку, при вибраному базисі X містить негативну компоненту і не є планом вихідної задачі, а з іншого боку, оцінки оптимального плану подвійної задачі повинні бути ненегативними.

Таким чином, вектор Аi, відповідний компоненті xi < 0, слід виключити з базису вихідної задачі, а вектор, відповідний негативній оцінці, - включити в базис подвійної задачі.

Для вибору вектора, що включається в базис вихідної задачі, проглядаємо i-й рядок: якщо в ньому не містяться xij < 0, то лінійна функція подвійної задачі не обмежена на многограннику рішень, а вихідна задача не має рішень. Якщо ж деякі xij < 0, то для стовпців, що містять ці негативні значення, обчислюваний 0j= min (xi/xij) 0 і визначаємо вектор, відповідний max 0j(Zj -- Cj) при рішенні вихідної задачі на мінімум і min 0j(Zj -- Cj) при рішенні вихідної задачі на максимум. Цей вектор і включаємо в базис вихідної задачі. Вектор, який необхідно виключити з базису вихідної задачі, визначається направляючим рядком.

Якщо 0j = min (xi/xij) = 0, тобто xi = 0, то xij береться за розв'язуючий елемент тільки в тому випадку, якщо xij > 0. Такий вибір розв'язуючого елементу на даному етапі не приводить до збільшення кількості негативних компонент вектора X. Процес продовжуємо до отримання Х 0; при цьому знаходимо оптимальний план подвійної задачі, отже, і оптимальний план вихідної задачі. В процесі обчислень по алгоритму двоїстого симплексного методу умова Zj - Cj 0 можна не враховувати до виключення всіх хi < 0, потім оптимальний план знаходиться звичайним симплексним методом. Це зручно використовувати, якщо все хi < 0; тоді для переходу до плану вихідної задачі за одну ітерацію необхідне 0j визначити не по мінімуму, а по максимуму відносин, тобто 0j = max (xi/xij) > 0.

Двоїстим симплексним методом можна вирішувати задачі лінійного програмування, системи обмежень яких при позитивному базисі містять вільні члени будь-якого знаку. Цей метод дозволяє зменшити кількість перетворень системи обмежень, а також розміри симплексної таблиці.

3 Рішення поставленої задачі

3.1 Умова задачі

Вирішити задачі подвійним симплекс методом

Задача 1

за умови

Приводимо систему обмежень до канонічного вигляду

Базис

С

План

x1

x2

x3

x4

x5

3

2

0

0

0

x3

0

21

3

1

1

0

0

x4

0

30

2

3

0

1

0

x5

0

-16

-2

0

0

0

1

z-c

0

-3

-2

0

0

0

x1

3

7

1

1/3

1/3

0

0

x4

0

16

0

7/3

-2/3

1

0

x5

0

-2

0

2/3

2/3

0

1

z-c

21

0

-1

1

0

0

x1

3

33/7

1

0

3/7

-1/7

0

x2

2

48/7

0

1

-2/7

3/7

0

x5

0

-46/7

0

0

6/7

-2/7

1

z-c

195/7

0

0

5/7

3/7

0

Відповідь: Fmax=27,857 Xопт=(4,714;6,857;0;0;0)

Задача 2

за умови

при условиях

Приводим систему к каноническому виду

Двойственную задачу будем решать двойственным симплекс методом

Базис

С

План

У1

У2

У3

У4

У5

 

 

 

3

2

0

0

0

Y4

0

7

1

5

1

1

0

Y5

0

1

1

1

5

0

1

t-b

0

-3

-5

-5

0

0

Y4

0

2

-4

0

-24

1

-5

Y2

5

1

1

1

5

0

1

t-b

5

2

0

20

0

5

Tmax=5; Yопт=(0;5;0;0;0)

В третьей итерации получиди все положительные оценки т.к решалась симметричная двойственная задача, то єлементы последней симплексной таблицы одновременно дают оптимальное решение исходной задачи. Однако прежде чем расшифровать решение исходной задачи нужно установить сопряжонные пары переменных прямой и двойственной задачи. Введем в исходную задачу, кроме трех основных переменных, две дополнительных Х3, Х4,Х5 которые характеризуют каждое неравенство. Точно так же в двойственной задаче дополнительные переменные У4, У5 характеризуют каждое равенство

Сопряженные пары.

Базисные Свободные переменные

Х3 Х4 Х5 Х1 Х2

У1 У2 У3 У4 У5

Свободные переменные Базисные двойственной задачи

Відповідь: Fmin=Tmax=5 Xопт=(0;5,2;0;20;)

Задача 3

за умови

Базис

С

План

x1

x2

x3

x4

x5

X6

1

2

0

0

0

0

x3

0

-6

-6

-2

1

0

0

0

x4

0

6

3

-2

1

0

0

0

x5

0

3

-3

1

0

0

1

0

X6

0

10

2

2

0

0

0

1

z-c

0

-1

-2

0

0

0

0

X3

0

0

-12

0

1

0

2

0

X4

0

12

-3

0

0

0

2

0

X2

2

3

-3

1

0

0

1

0

X6

0

4

8

0

0

0

-2

1

z-c

6

-7

0

0

0

2

0

X3

0

6

0

0

1

0

-1

1,5

X4

0

13,5

0

0

0

0

1,25

0,375

X2

2

4,5

0

1

0

0

0,25

0,375

X1

1

0,5

1

0

0

0

-0,25

0125

z-c

9,5

0

0

0

0

0,25

0,875

Відповідь: Fmax=9,5 Xопт=(0,5;4,5;0;0;0;0)

ЛІТЕРАТУРА

1 Деордіца Ю.С., Нефедов Ю.М. Дослідження операцій в плануванні і управлінні: Навчань допомога. - ДО.: Вища шк., 1991. - 270 с.

2 Кузнецов Ю.Н. Математическое программирование. Высшая школа. 1980р.

3 Кузнецов Ю.Н., Кузубов В.И., Волощенко А.Б. Математическое программирование. «Наука», 1980 г.

4 Солодовников А.С., Бабайцев В.А., Браилов А.В. Математика в экономике. «Финансы и статистика», 1998 г.

Додаток А

unit SimplexM;

interface

uses

Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,StdCtrls,Grids,

Buttons,Chart, Dialogs;

type

TSimplexM = class(TCustomPanel)

private

FStrGr: TStringGrid;

FLabel1,

FLabel2: TLabel;

FBitBtn1,

FBitBtn2,

FBitBtn3,

FBitBtn4,

FBitBtn5: TBitBtn;

FColX: Integer;

FGroupBox: TGroupBox;

FBottomPanel,

FRightPanel,

FCenterPanel: TPanel;

FRadioButton1,

FRadioButton2: TRadioButton;

maxRow, maxCol, NumMinCol: integer;

Data: array of TStrings;

procedure SetColX (Value: integer);

procedure SGColRow;

{ Private declarations }

procedure Main(var flag: boolean; MaxRow: integer);

function Res(var NumMinCol:integer): boolean;

procedure Resultat(flag: boolean);

procedure MinPlusDate(var Answ: boolean; xov, NumMinCol: integer; var ColSet, RowSet: integer; var date:real);

procedure InputData(var xov, MaxRow: integer);

procedure Name0Str(xov: integer);

procedure Name0Col(xov: integer);

procedure divizion(NumMinCol: integer);

procedure Adding (RowSet, ColSet, Maxcol, MaxRow, NumMinCol:integer);

procedure SaveData;

procedure LoadData;

protected

{ Protected declarations }

FOnBitBtn1Click, FOnBitBtn2Click, FOnBitBtn3Click: TNotifyEvent;

procedure SetBitBtnClick(Sender: TObject);

procedure SetBitBtn4Click(Sender: TObject);

procedure SetBitBtn5Click(Sender: TObject);

public

constructor Create(AOwner: TComponent); override;

{ Public declarations }

published

{ Published declarations }

property Color;

property Caption;

property Align;

property Height;

property ColX: Integer read FColX write SetColX;

property StrGr: TStringGrid read FStrGr write FStrGr;

property Label1: TLabel read FLabel1 write FLabel1;

property Label2: TLabel read FLabel2 write FLabel2;

property BitBtn1: TBitBtn read FBitBtn1 write FBitBtn1;

property BitBtn2: TBitBtn read FBitBtn2 write FBitBtn2;

property BitBtn3: TBitBtn read FBitBtn3 write FBitBtn3;

property RadioButton1: TRadioButton read FRadioButton1 write FRadioButton1;

property RadioButton2: TRadioButton read FRadioButton2 write FRadioButton2;

property OnBitBtn1Click: TNotifyEvent read FOnBitBtn1Click

write FOnBitBtn1Click;

property OnBitBtn2Click: TNotifyEvent read FOnBitBtn2Click

write FOnBitBtn2Click;

property OnBitBtn3Click: TNotifyEvent read FOnBitBtn3Click

write FOnBitBtn3Click;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('Probnic', [TSimplexM]);

end;

{ TSimplexTab }

constructor TSimplexM.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

FCenterPanel := TPanel.Create(Self);

FCenterPanel.Align := alClient;

FCenterPanel.Parent := Self;

FStrGr := TSTringGrid.Create(Self);

with FStrGr do

begin

Parent := FCenterPanel;

Align := alClient;

Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,

goRangeSelect, GoEditing];

Left := 8;

Top := 8;

Width := 473;

Height := 105;

ColCount := 6;

RowCount := 4;

Cells[0,0] := 'Базис';

Cells[1,0] := 'Св.чл.';

Font.Name := 'Comic Sans MS';

end;

FRightPanel := TPanel.Create(Self);

with FRightPanel do

begin

Parent := Self;

Left := 511;

Top := 1;

Width := 89;

Height := 463;

Align := alRight;

end;

FBottomPanel := TPanel.Create(Self);

with FBottomPanel do

begin

Parent := Self;

Left := 1;

Top := 464;

Width := 599;

Height := 40;

Align := alBottom;

end;

FLabel1 := TLabel.Create(Self);

with FLabel1 do

begin

Parent := FBottomPanel;

Caption := `Оптимальное значение функции:';

Left := 8;

Top := 5;

Height := 13;

Anchors := [akLeft, akBottom];

end;

FLabel2 := TLabel.Create(Self);

with FLabel2 do

begin

Parent := FBottomPanel;

Left := 300;

Top := 5;

Height := 13;

Anchors := [akBottom];

Caption:= '';

end;

FBitBtn1 := TBitBtn.Create(Self);

with FBitBtn1 do

begin

Parent := FRightPanel;

Left := 5;

Top := 16;

Width := 81;

Height := 25;

Anchors := [akTop, akRight];

Kind := bkOk;

Caption := '&Вычислить';

OnClick := SetBitBtnClick;

end;

FBitBtn2 := TBitBtn.Create(Self);

with FBitBtn2 do

begin

Parent := FBottomPanel;

Left := 512;

Top := 5;

Width := 81;

Height := 25;

Anchors := [akRight, akBottom];

Kind := bkClose;

Caption := '&Выход';

TabOrder := 2;

end;

FBitBtn3 := TBitBtn.Create(Self);

with FBitBtn3 do

begin

Parent := FRightPanel;

Left := 5;

Top := 123;

Width := 81;

Height := 25;

Anchors := [akRight, akTop];

Kind := bkRetry;

Caption := '&Очистить';

TabOrder := 2;

OnClick := SetBitBtnClick;

end;

FBitBtn4 := TBitBtn.Create(Self);

with FBitBtn4 do

begin

Parent := FRightPanel;

Left := 5;

Top := 155;

Width := 81;

Height := 25;

Anchors := [akRight, akTop];

Caption := '&Сохранить';

OnClick := SetBitBtn4Click;

end;

FBitBtn5 := TBitBtn.Create(Self);

with FBitBtn5 do

begin

Parent := FRightPanel;

Left := 5;

Top := 182;

Width := 81;

Height := 25;

Anchors := [akRight, akTop];

Caption := '&Читать';

OnClick := SetBitBtn5Click;

end;

FGroupBox := TGroupBox.Create(Self);

with FGroupBox do

begin

Parent := FRightPanel;

Left := 5;

Top := 48;

Width := 81;

Height := 65;

Anchors := [akTop, akRight];

Caption := ' Найти ';

end;

FRadioButton1 := TRadioButton.Create(Self);

with FRadioButton1 do

begin

Parent := FGroupBox;

Caption := 'Min';

Left := 3;

Top := 15;

Width := 60;

Checked := True;

end;

FRadioButton2 := TRadioButton.Create(Self);

with FRadioButton2 do

begin

Parent := FGroupBox;

Caption := 'Max';

Left := 3;

Top := 35;

Width := 60;

end;

Height := 255;

Width := 490;

Constraints.MinHeight := 235;

Constraints.MinWidth := 490;

FColX := 2;

end;

procedure TSimplexM.SetBitBtnClick(Sender: TObject);

var

flag: boolean;

i, j: integer;

begin

if Sender = FBitBtn1 then

begin

if Assigned(FOnBitBtn1Click) then FOnBitBtn1Click(Sender)

else begin

flag := FRadioButton2.Checked;

end;

main(flag, MaxRow);

end;

Exit;

end;

if Sender = FBitBtn3 then

begin

if Assigned(FOnBitBtn3Click) then FOnBitBtn3Click(Sender)

else begin

for i:= 1 to FStrGr.ColCount-1 do

for j := 1 to FStrGr.RowCount-1 do

FStrGr.Cells[i, j] := '';

end;

Label2.Caption:='';

Exit;

end;

end;

procedure TSimplexM.SetColX(Value: integer);

begin

FColX := Value;

FStrGr.ColCount := Value;

SGColRow;

Name0str(FColX);

Name0col(FColX);

end;

procedure TSimplexM.SGColRow; //построение таблицы

begin

maxrow:=2+FColX;

maxcol:=2+2*FColX;

FStrGr.ColCount := 2*FColX+2;

FStrGr.RowCount := 2+FColX;

end;

function TSimplexM.Res(var NumMinCol:integer): boolean;

// ищем отрицательные числа в строке F ,если есть - выходим из цикла

var i: integer;

begin

res:=true;

for i:=2 to MaxCol-1 do

begin

if strtofloat(FStrGr.Cells[i,maxRow-1])<0 then

begin

NumMinCol:=i;

res:=false;

break;

end

end;

end;

procedure TSimplexM.divizion(NumMinCol: integer); // деление гл.строки на нужный коэффициент

var i: integer;

d: real;

begin

d:=strtofloat(FStrGr.Cells[NumMinCol,1]);

for i:=1 to MaxCol-1 do

FStrGr.Cells[i,1]:=floattostr

( (strtofloat(FStrGr.Cells[i,1]))/d );

end;

procedure TSimplexM.Adding(RowSet, ColSet, MaxCol, MaxRow, NumMinCol :integer);

//сложение главной строки с другими для получения нуля

var

i, j: integer;

tmp: string;

t: real;

begin

if RowSet>1 then

begin

for i:=0 to MaxCol-1 do

begin

tmp:=FStrGr.Cells[i,1]; // поднимаем главную строку в первую строку

FStrGr.Cells[i,1]:=FStrGr.Cells[i,RowSet];

FStrGr.Cells[i,RowSet]:=tmp;

end;

end;

divizion(NumMinCol);

for i:=2 to MaxRow-1 do

begin

t:=strtofloat(FStrGr.Cells[NumMinCol,i]); // коффициенты в др.строках

for j:=1 to MaxCol-1 do

begin

if t<0 then FStrGr.Cells[j,i]:=floattostr (strtofloat(FStrGr.Cells[j,1])*abs(t)+strtofloat(FStrGr.Cells[j,i]))

// умножаем на нужный коэффициент другой строки и складываем

else FStrGr.Cells[j,i]:=floattostr (strtofloat(FStrGr.Cells[j,1])*(-t)+strtofloat(FStrGr.Cells[j,i]));

end;

end;

end;

// главная процедура

procedure TSimplexM.Main ( var flag: boolean; MaxRow: integer);

var i, NumMinCol, ColSet, RowSet: integer;

date: real;

Answ, nn: boolean;

begin

Answ:=true;

nn:=false;

if flag then

for i:=2 to FColX+1 do

try

FStrGr.Cells[i,MaxRow-1]:=floattostr

(0-strtofloat(FStrGr.Cells[i,MaxRow-1]))

except

raise Exception.Create('Неверный формат данных');

end

else begin

for i:=2 to FColX+1 do

try

if strtofloat(FStrGr.Cells[i,MaxRow-1])<0 then nn:=true;

except

raise Exception.Create(' Неверный формат данных');

end;

if not nn then

begin

resultat(flag);

exit;

end;

end;

while not Res(NumMinCol) do

begin

MinPlusDate(Answ, FColX, NumMinCol, ColSet, RowSet, date);

if Answ=false then raise Exception.Create('Нет решений') else

begin

FStrGr.Cells[0,RowSet]:='X'+inttostr(ColSet-1);

Adding(RowSet, ColSet, MaxCol, MaxRow, NumMinCol);

end;

end;

resultat(flag);

end;

procedure TSimplexM.MinPlusDate( var Answ: boolean; xov, NumMinCol: integer; var ColSet, RowSet:integer; var date:real);

//ищем наименьшее пложительное от деления св.чл. на гл.неизвестые

var t: real;

i, j, count : integer;

begin

count:=0; // кол-во отрицательных значений в столбце

for i:=1 to MaxRow-2 do

if strtofloat(FStrGr.Cells[NumMinCol,i])<0 then

count:=count+1;

if count=xov then // если кол-во отрицательных значений в столбце равно кол-ву неизвестных, то решения не существует

begin

Answ:=false;

exit;

end;

ColSet:=NumMinCol; // присвоение координат минимального из положительных (нужного) в столбце NumMinCol

RowSet:=1;

j:=1;

repeat

date:=(strtofloat(FStrGr.cells[1,j]))/(strtofloat(FStrGr.cells[NumMinCol,j])); // делим св.член на нужное

j:=j+1;

until date>0;

RowSet:=j-1; // опережает

for i:=j to MaxRow-2 do

begin

t:=(strtofloat(FStrGr.cells[1,i]))/(strtofloat(FStrGr.cells[NumMinCol,i]));

if t > 0 then

if t < date then

begin

date:=t;

RowSet:=i;

end;

end;

end;

procedure TSimplexM.Resultat; // вывод результата на экран

begin

if flag=false then Flabel2.caption:= floattostr

(-strtofloat(FStrGr.Cells[1,MaxRow-1]))

else Flabel2.caption:= FStrGr.Cells[1,MaxRow-1]

end;

procedure TSimplexM.Name0str(xov: integer); //именование нулевой строки

var i, j: integer;

begin

j:=0;

for i:=2 to 2*(xov+1) do

begin

j:=j+1;

FStrGr.Cells[i,0]:='X'+inttostr(j);

end;

end;

procedure TSimplexM.Name0Col(xov: integer); //именование нулевого столбца

var i, j: integer;

begin

j:=xov;

for i:=1 to xov do

begin

j:=j+1;

FStrGr.Cells[0,i]:='X'+inttostr(j);

end;

FStrGr.Cells[0,xov+1]:='F';

end;

procedure TSimplexM.InputData(var xov,MaxRow: integer); // введение количества неизвестных

begin

xov:=FColX;

maxrow:=2+xov;

maxcol:=2+2*xov;

FStrGr.RowCount:=maxrow;

FStrGr.ColCount:=maxcol ;

end;

procedure TSimplexM.SaveData; //сохранение вводимых в таблицу данных

var

i: Integer;

begin

SetLength(Data, FStrGr.Rowcount);

for i := 0 to FStrGr.RowCount do

begin

Data[i] := TStringList.Create;

Data[i].Assign(FStrGr.Rows[i]);

end;

end;

procedure TSimplexM.LoadData; //чтение в таблицу сохранённых данных

var

i: Integer;

begin

for i := 0 to Length(Data) do

begin

FStrGr.Rows[i].Assign(Data[i]);

end;

SetLength(Data, 0);

end;

procedure TSimplexM.SetBitBtn4Click(Sender: TObject);

begin

SaveData;

end;

procedure TSimplexM.SetBitBtn5Click(Sender: TObject);

begin

Label2.Caption:='';

LoadData;

end;

end.

ОПИС ОСНОВНИХ ПРОЦЕДУР І ФУНКЦІЙ

-procedure Main - головна процедура, що викликає всі останні.

-function Res - пошук негативних значень в рядку F

-procedure MinPlusDate - відшукання позитивних коефіцієнтів в головному стовпці і найменшого приватного при діленні базисних невідомих на коефіцієнти в головному стовпці

-procedure divizion - ділення головного рядка на відповідний коефіцієнт

-procedure Adding - отримання нулів, шляхом складання головного рядка, помноженого на відповідний коефіцієнт з іншими рядками

СКРИНШОТЫ

Теорема 3

Если в псевдоплане есть хотя бы одно отрицательное число

b1 ‹0 такое, что все aij ?0, j=1,n то задача вообще не имеет опорных планов.

Теорема 4

Если в псевдоплане Х имеются отрицательные числа b1 ‹0 такие что для любого их них существует хотя бы одно aij ‹0 то можно перейти к новому псевдоплану.

Інструкція користувачу

Запуск програми здійснюється завантаженням виконуваного файлу simplex.exe будь-яким прийнятим в Windows способом. Після завантаження на екрані з'являється головне вікно додатку.

На екран викликається вікно з умовою завдання. Користувач повинен ввести параметри умови завдання, пропоновані програмою. Ці параметри наступні.

У завданні розмірність таблиць встановлена за умовчанням 2 рядки і два стовпці. При необхідності змінити ці значення треба ввести відповідні кількості в поля введення і натиснути кнопку «Створити таблицю», після чого автоматично згенерують таблицю потрібного розміру.

Після введення умови завдання запуск процесу її рішення здійснюється шляхом натиснення кнопки «Завершити заповнення таблиці». Перевіряється правильність введення початкових даних і у випадку, якщо дані введені не вірно видається відповідне повідомлення. В цьому випадку слід перевірити введення початкових даних. Якщо дані введені вірно проводиться рішення задачі подвійним симплекс-методом. На екран на закладці «Рішення» виводяться етапи рішення - подвійна симплекс-таблиця. У кожній подвійній симплекс таблиці рядки і стовпці пойменовані відповідними базисними і вільними невідомими, а останній рядок і стовпець функцією і вільним членом. Рядок і стовпець вирішуючого елементу виділені інверсним кольором. Для кожної таблиці виводиться значення шуканої функції і номери вільної і базисної змінної, які міняються місцями (окрім останньої таблиці). Рішення задачі видно з останньої таблиці. Значення функції виділене окремо, значення змінних, які опинилися у складі вільних приймаються рівними нулю, а значення змінних, які опинилися у складі

Схема алгоритма двойственного симплекс метода


Подобные документы

  • Використання мови програмуванння Java при виконанні "задачі лінійного програмування": її лексична структура і типи даних. Методи розв’язання задачі. Особливості логічної структури програми, побудова її зручного інтерфейсу за допомогою симплекс методу.

    курсовая работа [437,9 K], добавлен 24.01.2011

  • Використання графічного методу і симплекс-методу при вирішенні задач лінейного програмування. Сутність двоякого симплекс-методу і М-методу, приклади використання. Аналіз методу динамичного програмування. Специфіка вирішення матричної, антагоністичної гри.

    контрольная работа [1,1 M], добавлен 02.07.2011

  • Застосування симплекс-методу для розв’язання оптимізаційних задач лінійного програмування, що містять три змінні. Функції ітераційної обчислювальної процедури, що виконують приведення до зручного для розв’язання оптимального вигляду ЗЛП за кілька кроків.

    курсовая работа [359,5 K], добавлен 18.09.2013

  • Метод Якобі є узагальненням симплекса-методу лінійного програмування. Він використовується для дослідження чутливості оптимального значення функції до змін у правих частинах обмежень. Умови існування екстремумів функцій при відсутності обмежень.

    курсовая работа [326,6 K], добавлен 09.01.2009

  • Теоретичні засади економіко-математичного планування; математичне формулювання задачі лінійного програмування. Оптимізація структури виробництва при налагодженні випуску продукції. Алгоритм рішення питання симплекс-методом, його переваги і недоліки.

    дипломная работа [1,8 M], добавлен 15.02.2014

  • Загальний вид двовимірного завдання лінійного програмування. Алгоритм рішення задач графічним методом. Максимізація (мінімізація) цільової функції. Послідовність рішення завдань лінійного програмування симплексом-методом. Принцип перетворення Гауса.

    контрольная работа [149,8 K], добавлен 24.11.2010

  • Основні визначення дослідження операцій. Модель "затрати-випуск" В.В. Леонтьєва. Загальний вигляд задачі лінійного програмування. Розв'язання за допомогою симплекс-методу. Економічна інтерпретація основної та спряженої задач. Поліпшення плану перевезень.

    учебное пособие [1,1 M], добавлен 27.12.2010

  • Теоретичні основи та приклади економічних задач лінійного програмування. Розробка математичної моделі задачі (запис цільової функції і системи обмежень) і програмного забезпечення її вирішення за допомогою "Пошуку рішень" в Excel симплекс-методом.

    курсовая работа [993,9 K], добавлен 10.12.2010

  • Сущность линейного программирования. Математическая формулировка задачи ЛП и алгоритм ее решения с помощью симплекс-метода. Разработка программы для планирования производства с целью обеспечения максимальной прибыли: блок-схема, листинг, результаты.

    курсовая работа [88,9 K], добавлен 11.02.2011

  • Сущность и описание симплекс-метода и улучшенного симплекс-метода (метода обратной матрицы), преимущества и недостатки их применения в линейном прогаммировании. Листинг и блок-схема программы на языке Turbo Pascal для решения математической задачи.

    курсовая работа [45,0 K], добавлен 30.03.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.