Розділ 4. Постановка економіко-математичної задачі із застосуванням теорії двоїстості
Оптимальний план прямої задачі передбачає виробництво лише двох видів продукції С і Д у кількості відповідно 35 та 45 од. Випуск продукції А та В не передбачається (х1 = х2 = 0). Додаткові змінні х5, х6, х7 характеризують залишок (невикористану частину) ресурсів відповідно 1, 2 та 3. Оскільки х6 = 30, другий ресурс використовується у процесі виробництва продукції не повністю, а перший та третій… Читати ще >
Розділ 4. Постановка економіко-математичної задачі із застосуванням теорії двоїстості (реферат, курсова, диплом, контрольна)
Підприємство «Еталон» виготовляє чотири види автобусів (A, B, C, D) використовуючи для цього три види каркасів. Норми витрат ресурсів на одиницю кожної продукції (в умовних одиницях) наведено в таблиці:
Таблиця 4.1 Норми витрат ресурсів на одиницю кожної продукції.
Ресурс. | Норма витрат на одиницю продукції, ум. од., за видами продукції. | Запас ресурсу. | |||
А. | В. | С. | D. | ||
Відома ціна одиниці продукції кожного виду: для продукції А — 2 ум. од., для В і D — по 4 од., для С — 3 од. Визначити оптимальний план виробництва продукції кожного виду в умовах обмеженості ресурсів, який дає підприємству найбільший дохід. Наведемо симплекс-таблицю, що відповідає оптимальному плану поставленої задачі.
Передбачається виконання наступних завдань:
- 1. Сформулювати математичну модель даної задачі лінійного програмування та двоїстої до неї;
- 2. Записати оптимальні плани прямої та двоїстої задач і зробити їх економічний аналіз;
- 3. Визначити статус ресурсів прямої задачі та інтервали стійкості двоїстих оцінок відносно зміни запасів дефіцитних ресурсів;
- 4. Визначити план виробництва продукції та зміну загального доходу підприємства, якщо запас першого ресурсу збільшити на 10 од., другого — зменшити на 10 од., а третього — збільшити на 20 ум. од;
- 5. Визначити рентабельність кожного виду продукції, що виготовляється на підприємстві;
- 6. Розрахувати інтервали можливої зміни ціни одиниці кожного виду продукції.
Виконання.
1. Математичні моделі прямої та двоїстої задачі мають такий вигляд:
де хj — обсяг виробництва продукції j-го виду ;
де yi — оцінка одиниці і-го виду ресурсу .
2. Розв’язуючи пряму задачу симплексним метод отримано таку останню оптимальну симплекс таблицю:
Таблиця 4.2 Остання симплексна таблиця із оптимальним планом.
Базис. | Сбаз | План. | |||||||
х1 | х2 | х3 | х4 | х5 | х6 | х7 | |||
х4 | — 2. | ½. | ½. | — 1. | |||||
х6 | — 1. | — 1. | |||||||
х3 | 3/2. | — ½. | |||||||
Zj — Cj? 0. | 5/2. | ½. |
З наведеної симплекс-таблиці виявлено:
Х* = (0; 0; 35; 45; 0; 30; 0), max F = 285;
Y* = (4; 0; 3) • = (½; 0; 2);
min Z = 250/2 + 160 = 285 = max F.
Оптимальний план прямої задачі передбачає виробництво лише двох видів продукції С і Д у кількості відповідно 35 та 45 од. Випуск продукції А та В не передбачається (х1 = х2 = 0). Додаткові змінні х5, х6, х7 характеризують залишок (невикористану частину) ресурсів відповідно 1, 2 та 3. Оскільки х6 = 30, другий ресурс використовується у процесі виробництва продукції не повністю, а перший та третій ресурси — повністю (х5 = х7 = 0). За такого оптимального плану виробництва продукції та використання ресурсів підприємство отримує найбільший дохід у розмірі 285 ум. од.
План двоїстої задачі дає оптимальну систему оцінок ресурсів, що використовуються у виробництві. Так, у1 = ½ та у3 = 2 відмінні від нуля, а ресурси 1 та 2 використовуються повністю. Двоїста оцінка у2 = 0 і відповідний вид ресурсу не повністю використовується при оптимальному плані виробництва продукції. Це підтверджується також попереднім аналізом додаткових змінних оптимального плану прямої задачі. Така оптимальна система оцінок дає найменшу загальну вартість усіх ресурсів, що використовуються на підприємстві: min F = 285 ум. од.
3. Статус ресурсів прямої задачі можна визначити трьома способами. Перший — підстановкою Х * у систему обмежень прямої задачі. Якщо обмеження виконується як рівняння, то відповідний ресурс дефіцитний, у противному разі — недефіцитний.
Другий спосіб — за допомогою додаткових змінних прямої задачі. Якщо додаткова змінна в оптимальному плані дорівнює нулю, то відповідний ресурс дефіцитний, а якщо відмінна від нуля — ресурс не дефіцитний.
Третій спосіб — за допомогою двоїстих оцінок. Якщо уі 0, то зміна (збільшення або зменшення) обсягів і-го ресурсу приводить до відповідної зміни доходу підприємства, і тому такий ресурс є дефіцитним. Якщо уі = 0, то і-й ресурс недефіцитний. Так,.
у1 = ½ (ресурс 1 дефіцитний);
у2 = 0 (ресурс 2 недефіцитний);
у3 = 2 (ресурс 3 дефіцитний).
Отже, якщо запас першого дефіцитного ресурсу збільшити на одну умовну одиницю (b1 = 250 + 1 = 251), то цільова функція maxF збільшиться за інших однакових умов на у1 = ½ ум. од. і становитиме max F= 285,5 ум. од.
Але за рахунок яких змін в оптимальному плані виробництва продукції збільшиться дохід підприємства? Інформацію про це дають елементи стовпчика «х5» останньої симплекс-таблиці, який відповідає двоїстій оцінці у1 = ½. У новому оптимальному плані значення базисної змінної збільшиться на ½, змінної — зменшиться на одиницю, а — на ½. При цьому структура плану не зміниться, а нові оптимальні значення змінних будуть такими:
Х* = (0; 0; 34,5; 45,5; 0; 29; 0).
Отже, збільшення запасу першого дефіцитного ресурсу за інших однакових умов приводить до зростання випуску продукції Д та падіння виробництва продукції С, а обсяг використання ресурсу 2 збільшується. За такого плану виробництва максимальний дохід підприємства буде.
max Z = 2 0 + 4 0 + 3 34,5 + 4 45,5 = 285,5,.
тобто зросте на у1 = ½.
Проаналізуємо, як зміниться оптимальний план виробництва продукції, якщо запас дефіцитного ресурсу 2 за інших однакових умов збільшити на одну умовну одиницю (b3 = 80 + 1 = 81). Аналогічно попереднім міркуванням, скориставшись елементами стовпчика «х7» останньої симплекс-таблиці, що відповідає двоїстій оцінці у3 = 2, можна записати новий оптимальний план:
Х* = (0; 0; 37; 44; 0; 30; 0).
max F = 2 0 + 4 0 + 3 37 + 4 44 = 287.
Отже, дохід підприємства збільшиться на дві умовні одиниці за рахунок збільшення виробництва продукції С на дві одиниці та зменшення випуску продукції Д на одну одиницю. При цьому обсяг використання ресурсу 2 не змінюється.
Але після проведеного аналізу постає логічне запитання: а чи зберігатимуться встановлені пропорції, якщо запас дефіцитного ресурсу змінити не на одиницю, а наприклад, на 10 ум. од. Щоб однозначно відповісти на поставлене запитання, необхідно розрахувати інтервали можливої зміни обсягів дефіцитних ресурсів, у межах яких двоїсті оцінки уі залишаються на рівні оптимальних значень.
Приріст (зміну) запасу ресурсу 1 позначимо b1. Тоді, якщо.
.
то новий оптимальний план.
Х* = (0; 0; 35−½b1; 45 + ½b1; 0; 30 — b1; 0).
Єдина вимога, яку можна поставити до можливих нових оптимальних значень, — це умова невід'ємності, тобто.
.
Це означає, що коли запас ресурсу 1 збільшиться на 30 ум. од. або зменшиться на 90 ум. од., то оптимальною двоїстою оцінкою ресурсу 1 залишиться у1 = ½. Отже, запас ресурсу 1 може змінюватись у межах.
.
.
Згідно з цим максимально можливий дохід підприємства перебуватиме в межах.
.
.
а оптимальний план виробництва продукції.
(0; 0; 80; 0; 0; 120; 0)? Х*? (0; 0; 20; 60; 0; 0; 0).
Аналогічно розраховується інтервал стійкості двоїстої оцінки у3 = 2 дефіцитного ресурсу 3:
.
.
Отже, якщо запас ресурсу 3 збільшиться на 45 ум. од. або зменшиться на 17,5 ум. од., то двоїста оцінка у3 = 2 цього ресурсу залишиться оптимальною. Згідно із цим можливий дохід підприємства та оптимальний план виробництва продукції перебуватимуть у межах.
;
(0; 0; 0; 62,5; 0; 30; 0)? Х*? (0; 0; 125; 0; 0; 30; 0).
Зауважимо, що визначені інтервали стосуються лише випадків, коли змінюється тільки один ресурс, а запаси всіх інших фіксовані, тобто за інших однакових умов. У разі одночасної зміни обсягів усіх або кількох ресурсів підхід до визначення нового оптимального плану дещо інший.
4. За умовою задачі обсяги всіх трьох ресурсів змінюються відповідно.
b1 = +10, b2 = -10, b3 = +20.
Для визначення компонентів нового оптимального плану скористаємось одним із головних співвідношень обчислювальної процедури симплекс-методу:
.
З останньої симплекс-таблиці можна записати обернену матрицю:
.
Змінені запаси ресурсів утворюють вектор
.
Тоді новий оптимальний план виробництва продукції за відповідної одночасної зміни запасів усіх трьох ресурсів.
.
Тобто.
Х * = (0; 0; 70; 30; 0; 10; 0).
Усі і тому оптимальним планом двоїстої задачі залишається.
Y * = (½; 0; 2).
Загальний максимальний дохід підприємства зміниться на.
?Fmax = b1y1 + b2y2 + b3y3 = 10 • ½ -10 • 0+ 20 • 2 = +45 ум. од.
Становитиме.
max F= 285 + 45 = 330 ум. од.
5. Оцінка рентабельності продукції, що виготовляється на підприємстві, виконується за допомогою двоїстих оцінок та обмежень двоїстої задачі, які характеризують кожний вид продукції.
Підставимо Y * у систему обмежень двоїстої задачі. Якщо вартість ресурсів на одиницю продукції (ліва частина) перевищує ціну цієї продукції (права частина), то виробництво такої продукції для підприємства недоцільне. Якщо ж співвідношення виконується як рівняння, то продукція рентабельна.
Аналогічні результати можна дістати, проаналізувавши двоїсті оцінки додаткових змінних, значення яких показують, на скільки вартість ресурсів перевищує ціну одиниці відповідної продукції. Тому, якщо додаткова змінна двоїстої задачі дорівнює нулю, то продукція рентабельна. І, навпаки, якщо уі 0, то відповідна продукція нерентабельна.
Додаткові змінні двоїстої задачі розміщуються в оцінковому рядку останньої симплекс-таблиці у стовпчиках «х1"—»х4". Їх оптимальні значення у4 = 5; у5 = 5/2; у6 = 0; у7 = 0. Тому продукція, А і В нерентабельна, а продукція С і Д — рентабельна.
6. Під впливом різних обставин ціна одиниці продукції на підприємстві може змінюватися (збільшуватися чи зменшуватися). І тому завжди цікаво знати, у межах яких змін ціни продукції кожного виду оптимальний план її виробництва залишається таким:
Х * = (0; 0; 35; 45).
Для визначення інтервалів зміни коефіцієнтів цільової функції скористаємось тим, що при цьому симплекс-таблиця, яка відповідає оптимальному плану, зберігає свій вигляд за винятком елементів оцінкового рядка. Нові оцінки (Zj — Cj) мають задовольняти умову оптимальності задачі максимізації, тобто бути невід'ємними.
Зміну коефіцієнта С1 позначимо С1. Оскільки х1 — небазисна змінна, то в симплекс-таблиці зміниться лише відповідна оцінка Z1 — C1:
(Z1 — C1) = 4 (-2) + 0 1 +3 3/2 — (2 + С1) = 5 — С1.
За умови Z1 — C1 0 дістанемо нерівність 5 — С1? 0, тобто С1? 5. Це означає, що коли ціна одиниці продукції А за інших однакових умов зросте не більш як на 5 ум. од., то оптимальним планом виробництва продукції на підприємстві все одно залишиться.
Х * = (0; 0; 35; 45).
Лише максимальний дохід зміниться на.
max ?F= С1х1.
Аналогічно розраховується інтервал зміни коефіцієнта С2:
(Z2 — C2) = 5/2 — С2? 0; С2? 5/2.
Зі зростанням ціни одиниці продукції В на 5/2 ум. од. за інших однакових умов оптимальний план виробництва продукції не зміниться, а.
max ?F = С2Х2.
Дещо складніше розраховується інтервал зміни коефіцієнтів для базисних змінних. У цьому разі зміни відбуваються також у стовпчику «Сбаз» симплекс-таблиці, а це, у свою чергу, стосується всіх ненульових оцінок (Zj — Cj). Так, для базисної змінної х3 зміна коефіцієнта на С3 приведе до таких оцінок:
- (Z1 — C1) = 4 (-2) + 0 (-1) +(3 + С3) 5 — 2 = 5 + 5С3;
- (Z2 — C2) = 4 ½ + 0 1 + (3 + С3) 3/2 — 4 = 5/2 + 3/2С3;
- (Z5 — C5) = 4 ½ + 0 (-1) — ½ • (3 + С3) — 0 = ½ — ½С3;
(Z7 — C7) = 4 (-1) + 0 0 + 2 • (3 + С3) — 0 = 2 + 2С3.</…
var s: string;
begin.
s:=SGRD_A.Cells[j, i];
if s='=' then ReadZnak:=0.
else.
if ((s='<') or (s='<=')) then ReadZnak:=1.
else.
if ((s='>') or (s='>=')) then ReadZnak:=2.
else.
begin.
SGRD_A.Cells[j, i]: ='';
ReadZnak:=-1;
ERROR:=true;
ShowMessage ('Неправильний ввід знаку у нерівності ' + IntToStr (i-1));
end;
end;
function TForm1. ReadReal_A (i, j: integer):real;
var is_error: boolean;
begin.
is_error:=false;
if SGRD_A.Cells[j, i]='' then.
begin.
SGRD_A.Cells[j, i]: ='0';
ReadReal_A:=0;
end.
else.
begin.
try.
StrToFloat (SGRD_A.Cells[j, i]);
except.
is_error:=true;
SGRD_A.Cells[j, i]: ='0';
ERROR:=true;
if i=1 then ShowMessage ('Неправильний ввід коефіцієнта ЦФ біля Х' + IntToStr (j)).
else.
if j=n+2 then ShowMessage ('Неправильний ввід коефіцієнта B' + IntToStr (i)).
else.
ShowMessage ('Неправильний ввід коефіцієнта біля Х'+IntToStr (j)+' рівняння '+IntToStr (i-1)).
end;
if is_error then ReadReal_A:=0.
else ReadReal_A:=StrToFloat (SGRD_A.Cells[j, i]);
end;
end;
procedure TForm1. BtnRozmiryEnterClick (Sender: TObject);
var i: integer;
is_error:boolean;
begin.
N4.Enabled:=true; // Робимо доступним пункт меню «Зчитати дані» .
N2.Enabled:=false;
STB2.Visible:=false;
is_error:=false;
try.
StrToInt (Edit_N.Text);
except.
Edit_N.Text:='1';
is_error:=true;
ShowMessage ('Неправильний ввід кількості змінних');
end;
try.
StrToFloat (Edit_M.Text);
except.
Edit_N.Text:='1';
is_error:=true;
ShowMessage ('Неправильний ввід кількості рядків');
end;
if not is_error then.
begin.
//Заблокуємо для редактування поля введення розмірів ЗЛП.
Edit_N.Enabled:=false;
Edit_M.Enabled:=false;
CBox_EXTREMUM.Enabled:=false;
BtnRozmiryEnter.Enabled:=false;
//Зчитаємо розміри ЗЛП.
n:=StrTOInt (Edit_N.Text);
m:=StrTOInt (Edit_M.Text);
if CBox_EXTREMUM.ItemIndex=1 then extremum_max:=false.
else extremum_max:=true;
//Побудова поля введення коефіцієнтів ЗЛП.
Panel_A.Visible:=true;
Panel_A.Width:=Form1.Width div 2;
PanelDUO.Width:=Form1.Width div 2;
SGRD_A.Enabled:=true;
SGRD_A.RowCount:=m+3;
SGRD_A.ColCount:=n+3;
for i := 1 to n do.
begin.
SGRD_A.Cells[i, 0]: ='X' + IntTOStr (i);
SGRD_A.Cells[i, m+2]: ='+';
end;
SGRD_A.Cells[n+1,0]: ='знак';
SGRD_A.Cells[n+2,0]: ='B';
SGRD_A.Cells[0,1]: ='ЦФ';
SGRD_A.Cells[n+1,1]: ='Х';
SGRD_A.Cells[n+2,1]: ='Х';
for i := 2 to m+1 do.
SGRD_A.Cells[0, i]: ='(' + IntTOStr (i-1) + ')';
SGRD_A.Cells[0,m+2]: ='Xj>0 (+,-)';
end;
end;
procedure TForm1. btn_BuildDuoClick (Sender: TObject);
var i, j: integer;
first_el:boolean;
s:string;
begin.
//припустимо відсутність помилок вводу.
ERROR:=false;
// Задання розміру масиву коефіцієнтів матриці А.
SetLength (A, m+1, n+1);
// Задання розміру масиву коефіцієнтів ЦФ — С, та вектора вільних членів — В.
SetLength (C, n+1);
SetLength (B, m+1);
SetLength (Znak, m+1);
SetLength (X_nevid, n+1);
//Зчитування вектора С.
for j := 1 to n do.
C[j]: = ReadReal_A (1,j);
//зчитування матриці А.
for i := 1 to m do.
for j := 1 to n do.
A[i, j]: = ReadReal_A (i+1,j);
//Зчитування вектора B.
for i := 1 to m do.
B[i]: = ReadReal_A (i+1,n+2);
//Зчитування знаків нерівностей обмежень.
for i := 1 to m do.
Znak[i]: = ReadZnak (i+1,n+1);
//Зчитування обмежень на невід'ємність змінних.
for j := 1 to n do.
if SGRD_A.Cells[j, m+2]='+' then.
X_nevid[j]: = true.
else X_nevid[j]: = false;
// Побудова двоїстої задачі при відсутності помилок.
if not ERROR then.
begin.
// Зміни в доступності пунктів меню.
N_PZ_Standart.Enabled:=true;
N_DZ_standart.Enabled:=true;
N4.Enabled:=false;
// Зробимо видимою панель виводу результатів.
PanelDUO.Visible:=true;
SGRD_A.Enabled:=false;
MemoDUO.Lines.Clear;
MemoDUO.Lines.Add (' Введена задача:');
//Вивід ЦФ прямої задачі.
first_el := true;
for j := 1 to n do.
if C[j]0 then.
begin.
if not first_el then.
begin.
if C[j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if C[j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (Abs (C[j])) + ' X' + FloatToStr (j);
end;
s:=s+' -> ';
if extremum_max then s:=s + 'max'.
else s:=s + 'min';
MemoDUO.Lines.Add (s);
//вивід обмежень прямої задачі.
for i := 1 to m do.
begin.
s:='';
first_el := true;
for j := 1 to n do.
if A[i, j]0 then.
begin.
if not first_el then.
begin.
if A[i, j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if A[i, j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (ABS (A[i, j])) + ' X' + IntToStr (j);
end;
case Znak[i] of.
- 0:s:=s+' = ';
- 1:s:=s+' <= ';
- 2:s:=s+' >= ';
end;
s:=s + FloatToStr (B[i]);
MemoDUO.Lines.Add (s);
end;
// вивід обмежень на невід'ємність змінних.
s:='';
first_el := true;
for j := 1 to n do.
if X_nevid[j] then.
begin.
if not first_el then.
begin.
s:=s+ ', ';
end.
else first_el:=false;
s:=s + ' X' + IntToStr (j);
end;
s:=s+' >=0 ';
MemoDUO.Lines.Add (s);
end;
end;
procedure TForm1. FormResize (Sender: TObject);
begin.
Panel_A.Width:=Form1.Width div 2;
PanelDUO.Width:=Form1.Width div 2;
end;
procedure TForm1. N2Click (Sender: TObject);
begin.
BtnRozmiryEnterClick (Sender);
end;
procedure TForm1. N3Click (Sender: TObject);
begin.
Close ();
end;
procedure TForm1. N4Click (Sender: TObject);
begin.
btn_BuildDuoClick (Sender);
end;
procedure TForm1. N_PSM_DZClick (Sender: TObject);
label 1;
var djmin, iter, i, j, ky, kz, nst, npk, ind, isb, isM, roz_s, roz_r, npk0, minus,.
iii, n2, m2:integer;
djmin_z, djM, djmin_c, c_, mina: real;
C_dz, B_dz: array of real;
A_dz: array of array of real;
Znak_dz: array of integer; { масив знаків нерівностей обмежень.
- 0 — рівне (=)
- 1 — менше рівне (<=)
- 2 — більше рівне (>=)}
begin.
SetLength (A_dz, n+1,m+1);
SetLength (C_dz, m+1);
SetLength (B_dz, n+1);
SetLength (Znak_dz, n+1);
n2:=m;
m2:=n;
for i := 1 to n2 do.
for j := 1 to m2 do.
A_dz[i, j]: =A[j, i];
for i := 1 to m2 do.
begin.
B_dz[i]: =C[i];
if X_nevid[i] then Znak_dz[i]: =2.
else Znak_dz[i]: =0;
end;
for j := 1 to n2 do.
C_dz[j]: =B[j];
with STB2 do.
begin.
visible:=true;
iter:=0;
colcount:=n2+3;
rowcount:=m2+3;
if n2<10 then Width:=65*(n2+3).
else Width:=65*12+16;
if m2<14 then Height:=25*(m2+3).
else Height:=25*16+16;
cells[0,0]: ='Початкова';
cells[1,0]: ='таблиця';
cells[0,1]: ='Cjб';
cells[1,1]: ='Xjб';
cells[2,1]: ='Bi';
cells[2,0]: ='Cj';
cells[0,m2+2]: ='індексний';
cells[1,m2+2]: ='рядок';
for j:=1 to n2 do.
begin.
cells[j+2,1]: ='x' + IntToStr (j);
if extremum_max then minus:=1 else minus:=-1;
cells[j+2,0]: =FloatToStr (minus*C_dz[j]);
end;
{сама табличка}.
for j:=1 to n2 do.
for i:=1 to m2 do.
cells[j+2,i+1]: =FloatToStr (A_dz[i, j]);
{вектор B}.
for i:=1 to m2 do.
begin.
cells[2,i+1]: =FloatToStr (B_dz[i]);
if B_dz[i]<0 then.
begin.
for j:=0 to n2 do.
cells[2+j, i+1]: =FloatTostr (-StrToFloat (cells[2+j, i+1]));
if Znak[i]=1 then Znak[i]: =2.
else if Znak[i]=2 then Znak[i]: =1;
end;
end;
{зведення до канонічного вигляду}.
ky:=0;
kz:=0;
nst:=n2;
for i:=1 to m2 do.
begin.
if (Znak[i]=1)then.
begin.
ky:=ky+1;
n2:=n2+1;
colcount:=n2+3;
if n2<12 then Width:=65*(n2+3).
else Width:=65*14+16;
cells[n2+2,0]: ='0';
cells[n2+2,1]: ='" y'+IntToStr (ky);
for j:=1 to m2 do.
if (ji) then cells[n2+2,j+1]: ='0'.
else cells[n2+2,j+1]: ='1';
cells[0,i+1]: ='0';
cells[1,i+1]: =cells[n2+2,1];
end;
if (Znak[i]=2)then.
begin.
ky:=ky+1;
n2:=n2+1;
colcount:=n2+3;
if n2<12 then Width:=65*(n2+3).
else Width:=65*14+16;
cells[n2+2,0]: ='0';
cells[n2+2,1]: ='" y'+IntToStr (ky);
for j:=1 to m2 do.
if (ji) then cells[n2+2,j+1]: ='0'.
else cells[n2+2,j+1]: ='-1';
Znak[i]: =0;
end;
end;
for i:=1 to m2 do.
if (Znak[i]=0)then.
begin.
kz:=kz+1;
n2:=n2+1;
colcount:=n2+3;
if n2<12 then Width:=65*(n2+3).
else Width:=65*14+16;
cells[n2+2,0]: ='-M';
cells[n2+2,1]: ='" Z'+IntToStr (kz);
for j:=1 to m2 do.
if (ji) then cells[n2+2,j+1]: ='0'.
else cells[n2+2,j+1]: ='1';
cells[0,i+1]: ='-M';
cells[1,i+1]: =cells[n2+2,1];
end;
npk:=1;
ind:=1;
while ind=1 do.
begin.
{заповнює індексний рядок}.
isM:=0;
For i:= 1 To m2 do.
If cells[0,npk + i]='-M' Then isM:= 1;
If isM=0 Then.
begin.
//memo1.Lines.Add ('вітка без М');
For j:=2 To (n2+2)do.
if cells[j, 0]'-M' then.
begin.
If j=2 Then c_:=0.
Else c_:=-StrToFloat (Cells[j, 0]);
For i:=1 To m2 do.
c_:=c_+StrToFloat (Cells[0,npk+i])*StrToFloat (Cells[j, npk+i]);
Cells[j, npk+m2+1]: =FloatToStr (roundto (c_,-3));
if j=3 then begin djmin_z:=c_; djmin:=j; end;
if (j>3)and (c_.
begin djmin:=j; djmin_z:=c_; end;
end.
else Cells[j, npk+m2+1]: ='-';
end.
Else.
begin {isM=1}.
For j:=2 To (n2+2) do.
if cells[j, 0]'-M' then.
Begin.
djm:=0;
If j=2 Then c_:=0.
Else c_:=-StrToFloat (Cells[j, 0]);
For i:=1 To m2 do.
If Cells[0,npk+i]'-M' Then.
c_:=c_+StrToFloat (Cells[0,npk + i])*StrToFloat (Cells[j, npk + i]).
else djm:=djm-StrToFloat (Cells[j, npk+i]);
if djM=0 then Cells[j, npk + m2+1]: =FloatToStr (roundto (c_,-3)).
Else.
begin.
if c_<0 then Cells[j, npk + m2+1]: =FloatToStr (roundto (djm,-3))+'M'+FloatToStr (roundto (c_,-3));
if c_=0 then Cells[j, npk + m2+1]: =FloatToStr (roundto (djm,-3))+'M';
if c_>0 then Cells[j, npk + m2+1]: =FloatToStr (roundto (djm,-3))+'M+'+FloatToStr (roundto (c_,-3));
end;
if j=3 then begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;
if (j>3)and ((djM.
begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;
end.
else Cells[j, npk + m2+1]: ='0';
{next j}.
End; {isM=1}.
if isM=1 then.
if (djmin_z>0)or ((djmin_z=0)and (djmin_c>=0)) then.
begin.
ShowMessage ('Функція не має розв" язку через несумісність умов');
goto 1;
end;
if (isM=0)and (djmin_z>=0) then.
begin.
//виведення результатів.
MemoDUO.Lines.Add ('');
MemoDUO.Lines.Add ('Оптимальний план Двоїстої задачі:');
for iii := 1 to m2 do.
MemoDUO.Lines.Add (Cells[1, npk+iii]+ ' = ' + Cells[0, npk+iii]);
MemoDUO.Lines.Add ('Оцінки двоїстої задачі:');
for iii := 1 to n2 do.
MemoDUO.Lines.Add ('d' + Cells[iii+2,1] + ' = ' + Cells[iii+2, npk+m2+1]);
ShowMessage ('План оптимальний');
goto 1;
end;
roz_s:=djmin;
ind:=1;
{розв'язковий рядок}.
isb:=0;
i:=1;
roz_r:=0;
While ((isb=0) And (i<=m2)) do.
begin.
If StrToFloat (Cells[roz_s, npk+i])>0 Then.
begin.
isb:=1;
mina:=StrToFloat (Cells[2,npk+i])/StrToFloat (Cells[roz_s, npk+i]);
roz_r:=i;
end;
i:=i+1;
end;
If isb=0 Then begin showmessage ('Функція необмежена'); goto 1; end;
For i:=1 To m2 do.
If ((StrToFloat (Cells[roz_s, npk+i])>0)And (isM=0)) Or ((StrToFloat (Cells[roz_s, npk+i])>0)And (isM=1)And (Cells[0,npk+i]='-M')) Then.
If (StrToFloat (Cells[2,npk+i])/StrToFloat (Cells[roz_s, npk+i]))<=mina Then.
begin.
mina:=StrToFloat (Cells[2,npk+i])/StrToFloat (Cells[roz_s, npk+i]);
roz_r:=i;
end;
roz_r:=roz_r+npk;
npk0:=npk;
npk:=npk+m2+2;
{переписуємо і міняємо базову змінну}.
rowcount:=npk+m2+2;
if cells[0,roz_r]='-M' then.
for j:=1 to n2 do.
if (cells[1,roz_r]=cells[j+2,1]) then cells[j+2,npk]: ='вибула';
for j:=1 to n2 do.
if (cells[j+2,npk0]='вибула') then cells[j+2,npk]: ='вибула';
if (npk+m2<14) then Height:=25*(npk+m2+2).
else.
begin.
height:=13*25;
width:=width+18;
end;
For i:=1 To (m+1) do.
If (npk0+i=roz_r) Then.
begin.
Cells[1,npk+i]: =Cells[roz_s, 1];
Cells[0,npk+i]: =Cells[roz_s, 0].
end.
Else.
begin.
Cells[1,npk+i]: =Cells[1,npk0+i];
Cells[0,npk+i]: =Cells[0,npk0+i];
end;
iter:=iter+1;
cells[0,npk0+m2+2]: ='ітер '+inttostr (iter);
cells[1,npk0+m2+2]: ='р.ел ('+Inttostr (roz_r-npk0)+';'+Inttostr (roz_s-2)+')';
{заповнюємо симплекс табличку}.
For j:=0 To n2 do.
if cells[j+2,npk]'вибула' then.
begin.
For i:=1 To m2 do.
If (npk0+i=roz_r) Then.
Cells[j+2,npk+i]: =FloatToStr (roundto (StrToFloat (Cells[j+2,npk0+i])/StrToFloat (Cells[roz_s, roz_r]),-3)).
Else.
Cells[j+2,npk+i]: =FloatToStr (roundto (StrToFloat (Cells[j+2,npk0+i])-StrToFloat (Cells[roz_s, npk0+i])*StrToFloat (Cells[j+2,roz_r])/StrToFloat (Cells[roz_s, roz_r]),-3));
end.
else For i:=1 To m2 do Cells[j+2,npk+i]: ='-';
end;
end;
1:end;
procedure TForm1. N_PSMClick (Sender: TObject);
label 1;
var djmin, iter, i, j, ky, kz, nst, npk, ind, isb, isM, roz_s, roz_r, npk0, minus,.
iii, n2: integer;
djmin_z, djM, djmin_c, c_, mina: real;
Znak_pz: array of integer;
begin.
n2:=n;
SetLength (Znak_pz, m+1);
for i := 1 to m do Znak_pz[i]: =Znak[i];
with STB2 do.
begin.
visible:=true;
iter:=0;
colcount:=n2+3;
rowcount:=m+3;
if n<10 then Width:=65*(n2+3).
else Width:=65*12+16;
if m<14 then Height:=25*(m+3).
else Height:=25*16+16;
cells[0,0]: ='Початкова';
cells[1,0]: ='таблиця';
cells[0,1]: ='Cjб';
cells[1,1]: ='Xjб';
cells[2,1]: ='Bi';
cells[2,0]: ='Cj';
cells[0,m+2]: ='індексний';
cells[1,m+2]: ='рядок';
for j:=1 to n2 do.
begin.
cells[j+2,1]: ='x' + IntToStr (j);
if extremum_max then minus:=1 else minus:=-1;
cells[j+2,0]: =FloatToStr (minus*C[j]);
end;
{сама табличка}.
for j:=1 to n2 do.
for i:=1 to m do.
cells[j+2,i+1]: =FloatToStr (A[i, j]);
{вектор B}.
for i:=1 to m do.
begin.
cells[2,i+1]: =FloatToStr (B[i]);
if B[i]<0 then.
begin.
for j:=0 to n2 do.
cells[2+j, i+1]: =FloatTostr (-StrToFloat (cells[2+j, i+1]));
if Znak_pz[i]=1 then Znak[i]: =2.
else if Znak_pz[i]=2 then Znak_pz[i]: =1;
end;
end;
{зведення до канонічного вигляду}.
ky:=0;
kz:=0;
nst:=n2;
for i:=1 to m do.
begin.
if (Znak_pz[i]=1)then.
begin.
ky:=ky+1;
n2:=n2+1;
colcount:=n2+3;
if n2<12 then Width:=65*(n2+3).
else Width:=65*14+16;
cells[n2+2,0]: ='0';
cells[n2+2,1]: ='" y'+IntToStr (ky);
for j:=1 to m do.
if (ji) then cells[n2+2,j+1]: ='0'.
else cells[n2+2,j+1]: ='1';
cells[0,i+1]: ='0';
cells[1,i+1]: =cells[n2+2,1];
end;
if (Znak_pz[i]=2)then.
begin.
ky:=ky+1;
n2:=n2+1;
colcount:=n2+3;
if n2<12 then Width:=65*(n2+3).
else Width:=65*14+16;
cells[n2+2,0]: ='0';
cells[n2+2,1]: ='" y'+IntToStr (ky);
for j:=1 to m do.
if (ji) then cells[n2+2,j+1]: ='0'.
else cells[n2+2,j+1]: ='-1';
Znak_pz[i]: =0;
end;
end;
for i:=1 to m do.
if (Znak_pz[i]=0)then.
begin.
kz:=kz+1;
n2:=n2+1;
colcount:=n2+3;
if n2<12 then Width:=65*(n2+3).
else Width:=65*14+16;
cells[n2+2,0]: ='-M';
cells[n2+2,1]: ='" Z'+IntToStr (kz);
for j:=1 to m do.
if (ji) then cells[n2+2,j+1]: ='0'.
else cells[n2+2,j+1]: ='1';
cells[0,i+1]: ='-M';
cells[1,i+1]: =cells[n2+2,1];
end;
npk:=1;
ind:=1;
isb:=1;
while ind=1 do.
begin.
{заповнює індексний рядок}.
isM:=0;
For i:= 1 To m do.
If cells[0,npk + i]='-M' Then isM:= 1;
If isM=0 Then.
begin.
For j:=2 To (n2+2)do.
if cells[j, 0]'-M' then.
begin.
If j=2 Then c_:=0.
Else c_:=-StrToFloat (Cells[j, 0]);
For i:=1 To m do.
c_:=c_+StrToFloat (Cells[0,npk+i])*StrToFloat (Cells[j, npk+i]);
Cells[j, npk+m+1]: =FloatToStr (roundto (c_,-3));
if j=3 then begin djmin_z:=c_; djmin:=j; end;
if (j>3)and (c_.
begin djmin:=j; djmin_z:=c_; end;
end.
else Cells[j, npk+m+1]: ='-';
end.
Else.
begin {isM=1}.
For j:=2 To (n2+2) do.
if cells[j, 0]'-M' then.
Begin.
djm:=0;
If j=2 Then c_:=0.
Else c_:=-StrToFloat (Cells[j, 0]);
For i:=1 To m do.
If Cells[0,npk+i]'-M' Then.
c_:=c_+StrToFloat (Cells[0,npk + i])*StrToFloat (Cells[j, npk + i]).
else djm:=djm-StrToFloat (Cells[j, npk+i]);
if djM=0 then Cells[j, npk + m+1]: =FloatToStr (roundto (c_,-3)).
Else.
begin.
if c_<0 then Cells[j, npk + m+1]: =FloatToStr (roundto (djm,-3))+'M'+FloatToStr (roundto (c_,-3));
if c_=0 then Cells[j, npk + m+1]: =FloatToStr (roundto (djm,-3))+'M';
if c_>0 then Cells[j, npk + m+1]: =FloatToStr (roundto (djm,-3))+'M+'+FloatToStr (roundto (c_,-3));
end;
if j=3 then begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;
if (j>3)and ((djM.
begin djmin_z:=djm; djmin_c:=c_; djmin:=j; end;
end.
else Cells[j, npk + m+1]: ='0';
{next j}.
End; {isM=1}.
if isM=1 then.
if (djmin_z>0)or ((djmin_z=0)and (djmin_c>=0)) then.
begin.
ShowMessage ('Функція не має розв" язку через несумісність умов');
goto 1;
end;
if (isM=0)and (djmin_z>=0) then.
begin.
//виведення результатів.
MemoDUO.Lines.Add ('');
MemoDUO.Lines.Add ('Оптимальний план прямої задачі:');
for iii := 1 to m do.
MemoDUO.Lines.Add (Cells[1, npk+iii]+ ' = ' + Cells[0, npk+iii]);
MemoDUO.Lines.Add ('Оцінки прямої задачі:');
for iii := 1 to n2 do.
MemoDUO.Lines.Add ('d' + Cells[iii+2,1] + ' = ' + Cells[iii+2, npk+m+1]);
ShowMessage ('План оптимальний');
goto 1;
end;
roz_s:=djmin;
ind:=1;
{розв'язковий рядок}.
isb:=0;
i:=1;
roz_r:=0;
While ((isb=0) And (i<=m)) do.
begin.
If StrToFloat (Cells[roz_s, npk+i])>0 Then.
begin.
isb:=1;
mina:=StrToFloat (Cells[2,npk+i])/StrToFloat (Cells[roz_s, npk+i]);
roz_r:=i;
end;
i:=i+1;
end;
If isb=0 Then begin showmessage ('Функція необмежена'); goto 1; end;
For i:=1 To m do.
If ((StrToFloat (Cells[roz_s, npk+i])>0)And (isM=0)) Or ((StrToFloat (Cells[roz_s, npk+i])>0)And (isM=1)And (Cells[0,npk+i]='-M')) Then.
If (StrToFloat (Cells[2,npk+i])/StrToFloat (Cells[roz_s, npk+i]))<=mina Then.
begin.
mina:=StrToFloat (Cells[2,npk+i])/StrToFloat (Cells[roz_s, npk+i]);
roz_r:=i;
end;
roz_r:=roz_r+npk;
npk0:=npk;
npk:=npk+m+2;
{переписуємо і міняємо базову змінну}.
rowcount:=npk+m+2;
if cells[0,roz_r]='-M' then.
for j:=1 to n2 do.
if (cells[1,roz_r]=cells[j+2,1]) then cells[j+2,npk]: ='вибула';
for j:=1 to n2 do.
if (cells[j+2,npk0]='вибула') then cells[j+2,npk]: ='вибула';
if (npk+m<14) then Height:=25*(npk+m+2).
else.
begin.
height:=13*25;
width:=width+18;
end;
For i:=1 To (m+1) do.
If (npk0+i=roz_r) Then.
begin.
Cells[1,npk+i]: =Cells[roz_s, 1];
Cells[0,npk+i]: =Cells[roz_s, 0].
end.
Else.
begin.
Cells[1,npk+i]: =Cells[1,npk0+i];
Cells[0,npk+i]: =Cells[0,npk0+i];
end;
iter:=iter+1;
cells[0,npk0+m+2]: ='ітер '+inttostr (iter);
cells[1,npk0+m+2]: ='р.ел ('+Inttostr (roz_r-npk0)+';'+Inttostr (roz_s-2)+')';
{заповнюємо симплекс табличку}.
For j:=0 To n2 do.
if cells[j+2,npk]'вибула' then.
begin.
For i:=1 To m do.
If (npk0+i=roz_r) Then.
Cells[j+2,npk+i]: =FloatToStr (roundto (StrToFloat (Cells[j+2,npk0+i])/StrToFloat (Cells[roz_s, roz_r]),-3)).
Else.
Cells[j+2,npk+i]: =FloatToStr (roundto (StrToFloat (Cells[j+2,npk0+i])-StrToFloat (Cells[roz_s, npk0+i])*StrToFloat (Cells[j+2,roz_r])/StrToFloat (Cells[roz_s, roz_r]),-3));
end.
else For i:=1 To m do Cells[j+2,npk+i]: ='-';
end;
end;
1:end;
procedure TForm1. N_DZ_standartClick (Sender: TObject);
var i, j: integer;
first_el:boolean;
s:string;
begin.
begin.
// Зміни в доступності пунктів меню.
N_makeDZ.Enabled:=false;
N_makePZ.Enabled:=true;
N4.Enabled:=false;
// Зведення задачі до стандартизованого вигляду ПЗ.
if extremum_max then.
begin.
extremum_max:=false;
for j := 1 to n do.
C[j]: =-1*C[j];
end;
for i := 1 to m do.
if Znak[i]=1 then.
begin.
Znak[i]: =2;
for j := 1 to n do.
A[i, j]: =-1*A[i, j];
B[i]: =-1*B[i];
end;
// Зробимо видимою панель виводу результатів.
PanelDUO.Visible:=true;
SGRD_A.Enabled:=false;
MemoDUO.Lines.Add ('');
MemoDUO.Lines.Add (' Стандартизований вигляд (Двоїста задача):');
//Вивід ЦФ прямої задачі.
first_el := true;
for j := 1 to n do.
if C[j]0 then.
begin.
if not first_el then.
begin.
if C[j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if C[j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (ABS (C[j])) + ' y' + FloatToStr (j);
end;
s:=s+' -> ';
if extremum_max then s:=s + 'max'.
else s:=s + 'min';
MemoDUO.Lines.Add (s);
//вивід обмежень прямої задачі.
for i := 1 to m do.
begin.
s:='';
first_el := true;
for j := 1 to n do.
if A[i, j]0 then.
begin.
if not first_el then.
begin.
if A[i, j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if A[i, j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (Abs (A[i, j])) + ' y' + FloatToStr (j);
end;
case Znak[i] of.
- 0:s:=s+' = ';
- 1:s:=s+' <= ';
- 2:s:=s+' >= ';
end;
s:=s + FloatToStr (B[i]);
MemoDUO.Lines.Add (s);
end;
// вивід обмежень на невід'ємність змінних.
s:='';
first_el := true;
for j := 1 to n do.
if X_nevid[j] then.
begin.
if not first_el then.
begin.
s:=s+ ', ';
end.
else first_el:=false;
s:=s + 'y' + FloatToStr (j);
end;
s:=s+' >= 0 ';
MemoDUO.Lines.Add (s);
end;
end;
procedure TForm1. N_makeDZClick (Sender: TObject);
var i, j: integer;
first_el:boolean;
s:string;
begin.
begin.
// Зміни в доступності пунктів меню.
N_DZ_standart.Enabled:=true;
N_PZ_standart.Enabled:=true;
N4.Enabled:=false;
// Зробимо видимою панель виводу результатів.
PanelDUO.Visible:=true;
SGRD_A.Enabled:=false;
MemoDUO.Lines.Add ('');
MemoDUO.Lines.Add (' ДВОЇСТА ЗАДАЧА');
//Вивід ЦФ прямої задачі.
first_el := true;
for i := 1 to m do.
if B[i]0 then.
begin.
if not first_el then.
begin.
if B[i]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if B[i]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (ABS (B[i])) + ' y' + FloatToStr (i);
end;
s:=s+' -> min';
MemoDUO.Lines.Add (s);
//вивід обмежень прямої задачі.
for j := 1 to n do.
begin.
s:='';
first_el := true;
for i := 1 to m do.
if A[i, j]0 then.
begin.
if not first_el then.
begin.
if A[i, j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if A[i, j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (Abs (A[i, j])) + ' y' + FloatToStr (i);
end;
if X_nevid[j] then s:=s+' >= '.
else s:=s+' = ';
s:=s + FloatToStr (C[j]);
MemoDUO.Lines.Add (s);
end;
// вивід обмежень на невід'ємність змінних.
s:='';
first_el := true;
for i := 1 to m do.
if Znak[i]0 then.
begin.
if not first_el then.
begin.
s:=s+ ', ';
end.
else first_el:=false;
s:=s + 'y' + FloatToStr (i);
end;
s:=s+' >= 0 ';
MemoDUO.Lines.Add (s);
end;
end;
procedure TForm1. N_makePZClick (Sender: TObject);
var i, j: integer;
first_el:boolean;
s:string;
begin.
begin.
// Зміни в доступності пунктів меню.
N_DZ_standart.Enabled:=true;
N_PZ_standart.Enabled:=true;
N4.Enabled:=false;
// Зробимо видимою панель виводу результатів.
PanelDUO.Visible:=true;
SGRD_A.Enabled:=false;
MemoDUO.Lines.Add ('');
MemoDUO.Lines.Add (' ПРЯМА ЗАДАЧА');
//Вивід ЦФ прямої задачі.
first_el := true;
for i := 1 to m do.
if B[i]0 then.
begin.
if not first_el then.
begin.
if B[i]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if B[i]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (ABS (B[i])) + ' х' + FloatToStr (i);
end;
s:=s+' -> max';
MemoDUO.Lines.Add (s);
//вивід обмежень прямої задачі.
for j := 1 to n do.
begin.
s:='';
first_el := true;
for i := 1 to m do.
if A[i, j]0 then.
begin.
if not first_el then.
begin.
if A[i, j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if A[i, j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (Abs (A[i, j])) + ' х' + FloatToStr (i);
end;
if X_nevid[j] then s:=s+' <= '.
else s:=s+' = ';
s:=s + FloatToStr (C[j]);
MemoDUO.Lines.Add (s);
end;
// вивід обмежень на невід'ємність змінних.
s:='';
first_el := true;
for i := 1 to m do.
if Znak[i]0 then.
begin.
if not first_el then.
begin.
s:=s+ ', ';
end.
else first_el:=false;
s:=s + 'х' + FloatToStr (i);
end;
s:=s+' >= 0 ';
MemoDUO.Lines.Add (s);
end;
end;
procedure TForm1. N_PZ_StandartClick (Sender: TObject);
var i, j: integer;
first_el:boolean;
s:string;
begin.
begin.
// Зміни в доступності пунктів меню.
N_makeDZ.Enabled:=true;
N_makePZ.Enabled:=false;
N4.Enabled:=false;
// Зведення задачі до стандартизованого вигляду ПЗ.
if not extremum_max then.
begin.
extremum_max:=true;
for j := 1 to n do.
C[j]: =-1*C[j];
end;
for i := 1 to m do.
if Znak[i]=2 then.
begin.
Znak[i]: =1;
for j := 1 to n do.
A[i, j]: =-1*A[i, j];
B[i]: =-1*B[i];
end;
// Зробимо видимою панель виводу результатів.
PanelDUO.Visible:=true;
SGRD_A.Enabled:=false;
MemoDUO.Lines.Add ('');
MemoDUO.Lines.Add (' Стандартизований вигляд (Пряма задача):');
//Вивід ЦФ прямої задачі.
first_el := true;
for j := 1 to n do.
if C[j]0 then.
begin.
if not first_el then.
begin.
if C[j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if C[j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (ABS (C[j])) + ' X' + FloatToStr (j);
end;
s:=s+' -> ';
if extremum_max then s:=s + 'max'.
else s:=s + 'min';
MemoDUO.Lines.Add (s);
//вивід обмежень прямої задачі.
for i := 1 to m do.
begin.
s:='';
first_el := true;
for j := 1 to n do.
if A[i, j]0 then.
begin.
if not first_el then.
begin.
if A[i, j]>0 then s:=s+ ' + '.
else s:=s+ ' - ';
end.
else.
begin.
first_el:=false;
if A[i, j]<0 then s:=s+ '-';
end;
s:=s + FloatToStr (Abs (A[i, j])) + ' X' + FloatToStr (j);
end;
case Znak[i] of.
- 0:s:=s+' = ';
- 1:s:=s+' <= ';
- 2:s:=s+' >= ';
end;
s:=s + FloatToStr (B[i]);
MemoDUO.Lines.Add (s);
end;
// вивід обмежень на невід'ємність змінних.
s:='';
first_el := true;
for j := 1 to n do.
if X_nevid[j] then.
begin.
if not first_el then.
begin.
s:=s+ ', ';
end.
else first_el:=false;
s:=s + ' X' + FloatToStr (j);
end;
s:=s+' >= 0 ';
MemoDUO.Lines.Add (s);
end;
end;
procedure TForm1. N_VVIDClick (Sender: TObject);
begin.
Panel_ROZMIRU.Visible:=true;
Edit_N.Enabled:=true;
Edit_M.Enabled:=true;
CBox_EXTREMUM.Enabled:=true;
BtnRozmiryEnter.Enabled:=true;
Panel_A.Visible:=false;
N2.Enabled:=true;
N_PZ_Standart.Enabled:=false;
N_DZ_standart.Enabled:=false;
end;
end.