Курсовая работа по дисциплине «Математические методы» Тема: «Применение линейного программирования для оптимизации прибыли в издательском бизнесе»

Вид материалаКурсовая

Содержание


Алгоритм симплекс-метода
Конец работы алгоритма
Практическая задача
Решение практической задачи
Разработка программного обеспечения
Подобный материал:
1   2   3   4
^

Алгоритм симплекс-метода:

  1. Определить число и состав базисных и свободных переменных.
  2. Выразить базисные переменные через свободные переменные.
  3. Выразить целевую функцию через свободные переменные.
  4. Построить начальную симплекс-таблицу.
  5. Проверить решение на оптимальность: если в F-строке (кроме С0) все Сj0, то получено оптимальное решение: X=(B1,...,Bm,0,...,0), F=C0. Если же существует Cj<0, то решение можно улучшить, но предварительно надо проверить факт существования решения.
  6. Проверить существование решения: рассмотрим все столбцы, у которых Сj<0, если существует хотя бы один столбец, у которого все коэффициенты Ai,j<0, то задача решения не имеет, т.к. множество допустимых решений D не ограничено и целевая функция неограниченно возрастает. Если таких столбцов нет, то переходим к следующему этапу.
  7. Выбрать свободную переменную, которую надо ввести в базис (выбор разрешающего столбца): это столбец, с минимальным значением Сj (пусть это k-й столбец)
  8. Выбрать базисную переменную, которую надо вывести из базиса (выбор разрешающей строки): рассмотрим k-й столбец и все его элементы, которые больше нуля, т.е. Ai,k>0; для всех этих элементов находим отношение Bi/Ai,k и выбираем строку, которая соответствует минимальному значению этого отношения (пусть это i-я строка); соответствующая i-я переменная Xi выводится из базиса; при нескольких одинаковых отношениях берем любую строку; элемент Ai,k называется разрешающим элементом.
  9. Пересчитать симплекс-таблицу: составляем новую симплекс-таблицу заменив в составе базисных переменных Xi на Xk; заполняем сначала новую k-ю строку, записывая в нее элементы старой i-ой строки, поделенные на разрешающий элемент; после заполнения k-ой строки заполняем оставшиеся строки; для этого k-ю строку умножаем последовательно на такие числа, чтобы после сложения ее с каждой строкой старой таблицы в k-ом столбце получить везде ноль (кроме единицы в k-ой строке).
  10. После заполнения новой симплекс-таблицы алгоритм возвращается к 5-му пункту.
^

Конец работы алгоритма:

  1. либо когда в F-строке все коэффициенты (кроме С0) будут больше нуля, тогда получаем оптимальное решение,
  2. либо когда существует столбец , у которого Cj<<0 и все коэффициенты Ai,j<<0, в этом случае решения на существует.
  1. ^ Практическая задача

Постановка задачи


Компания производит большие и маленькие книги. Каждая книга должна быть напечатана и склеена. На печать маленькой книги уходит 1 час, а на склеивание 2 часа. На печать большой книги уходит 2 часа, на склеивание 2 часа. Печатный цех работает 90 часов в неделю, а склеивательный 80. Прибыль, получаемая с маленькой книги составляет 10$, а с большой 12$. Сколько книг каждого вида должна производить компания для максимизации прибыли?


^ Решение практической задачи


Пусть фирма производит X1-кол-во больших книг и Х2-кол-во маленьких. Тогда для решения задачи необходимо найти такие X1 и Х2, что:


10*X1 + 12*Х2 - > max

1*X1+2*X2<=90
2*X1+2*X2<=80

X1 , X2 > = 0


Введем переменные Х3, Х4 >= 0, тогда задача примет стандартный (канонический) вид:

10*X1 + 12*Х2+X3+X4- > max

1*X1+2*X2+X3<=90
2*X1+2*X2+X4<=80

X1 , X2 , X3, X4 > = 0


Рассмотрим решение этой задачи, используя симплекс таблицу. Данное решение подходит для всех случаев, когда правая часть уравнений ограничений неотрицательна (90 и 80 в нашем примере). Если правая честь уравнений ограничений, после приведения задачи к каноническому виду, содержит отрицательные числа, то используйте вариант решения, разобранный во втором примере.


Составим симплекс-таблицу:


Базисные
переменные

Свободные
члены

X1

X2

Bi/Ai,k

X3

90

1

2

45

X4

80

2

2

40

L

0

-10

-12





Так как в столбце свободных членов нет отрицательных элементов, то найдено допустимое решение. Так как в строке L есть отрицательные элементы, то полученное решение не оптимально. Для определения ведущего столбца найдем максимальный по модулю отрицательный элемент в строке L (-12). А ведущая строка та, у которой наименьшее положительное отношение свободного члена к соответствующему элементу ведущего столбца.


Получим Симплекс-таблицу:


Базисные
переменные

Свободные
члены

X1

X4

Bi/Ai,k

X3

10

-1

-1

45

X2

40

1

0.5

40

L

480

2

6





Найдено оптимальное решение.


Из таблицы получим значения переменных целевой функции:

x1

x2

x3

x4

0

40

10

0



Целевая функция:
Lmax=10*0+12*40

И в результате:
Lmax=480


  1. ^ Разработка программного обеспечения



    1. Описание входных данных.

Входные данные вводятся пользователем. Далее выводится симплекс таблица для заполнения дополнительных данных.
    1. Описание выходных данных.

Получаем симплекс-таблицу для максимизации прибыли. Stringgrid 2 – таблица содерщая конечную симплекс таблицу.Memo1 – выводится результата.

    1. Описание основных функций программного обеспечения.

1)Ввод входных данных;

2)Составление таблицы;

3)Вывод выходных данных;
    1. Ход вычислений программы.

Ввод входных данных:









Расчет при нажатии “Решить”



Вывод ответа по симплекс –таблицы:




    1. Руководство пользователя по использованию ПО.

Запустить файл Money.exe .В появившимся окне будет предложено ввести данные. Добавить данные в таблицу надо нажать кнопку “Добавить”, а так же можно “Изменить” или “Удалить” выделенную запись. Далее нажимает кнопку далее – появляется симплекс таблица, которую надо дополнить не достающие данные. Заполнив ее нажимаем кнопку решить – Выводится таблицы на каждом шаге. Получив конечную таблицу нажимаем на кнопку “Ответ” – выводится ответ.


Приложения


Распечатка вычислительной программы

unit Unit1;


interface


uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, StdCtrls, Buttons, ComCtrls, Menus;


type

TForm1 = class(TForm)

GroupBox1: TGroupBox;

Edit1: TEdit;

Edit2: TEdit;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

Label1: TLabel;

Label2: TLabel;

StringGrid1: TStringGrid;

Label3: TLabel;

GroupBox2: TGroupBox;

BitBtn4: TBitBtn;

BitBtn5: TBitBtn;

BitBtn6: TBitBtn;

BitBtn7: TBitBtn;

GroupBox3: TGroupBox;

BitBtn3: TBitBtn;

BitBtn8: TBitBtn;

BitBtn9: TBitBtn;

Edit3: TEdit;

Label6: TLabel;

Edit4: TEdit;

Label7: TLabel;

StringGrid2: TStringGrid;

Label9: TLabel;

Label5: TLabel;

GroupBox4: TGroupBox;

StringGrid3: TStringGrid;

Label10: TLabel;

GroupBox5: TGroupBox;

StringGrid4: TStringGrid;

BitBtn11: TBitBtn;

GroupBox6: TGroupBox;

Memo1: TMemo;

RichEdit1: TRichEdit;

Button2: TButton;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

procedure BitBtn6Click(Sender: TObject);

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure BitBtn1Click(Sender: TObject);

procedure StringGrid1Click(Sender: TObject);

procedure BitBtn7Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure Edit2KeyPress(Sender: TObject; var Key: Char);

procedure BitBtn4Click(Sender: TObject);

procedure BitBtn5Click(Sender: TObject);

procedure Edit3KeyPress(Sender: TObject; var Key: Char);

procedure Edit4KeyPress(Sender: TObject; var Key: Char);

procedure BitBtn3Click(Sender: TObject);

procedure BitBtn9Click(Sender: TObject);

procedure BitBtn8Click(Sender: TObject);

procedure StringGrid2Click(Sender: TObject);

procedure StringGrid3KeyPress(Sender: TObject; var Key: Char);

procedure BitBtn11Click(Sender: TObject);

procedure Button2Click(Sender: TObject);


private

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;


implementation


{$R *.dfm}

procedure Otchistka();

begin

form1.stringgrid1.RowCount :=2;

form1.stringgrid1.Cells [0,form1.stringgrid1.RowCount - 1] := '';

form1.stringgrid1.Cells [1,form1.stringgrid1.RowCount - 1] := '';

form1.stringgrid2.RowCount :=2;

form1.stringgrid2.Cells [0,form1.stringgrid2.RowCount - 1] := '';

form1.stringgrid2.Cells [1,form1.stringgrid2.RowCount - 1] := '';

form1.stringgrid3.RowCount :=2;

form1.stringgrid2.Cells [0,form1.stringgrid2.RowCount - 1] := '';

form1.stringgrid2.Cells [1,form1.stringgrid2.RowCount - 1] := '';

form1.stringgrid3.ColCount :=2;

form1.stringgrid3.RowCount :=2;

end;


procedure Otvet();

var count,count2:integer;

boo:boolean;

begin

form1.Memo1.Lines.Add('Выгодно производить/использовать следующую продукцию:');

for count:=1 to form1.StringGrid4.RowCount -1 do

for count2:=0 to form1.StringGrid2.RowCount -1 do

if form1.StringGrid4.Cells[0,count] = form1.StringGrid2.Cells[0,count2] then

begin

form1.Memo1.Lines.Add (form1.StringGrid4.Cells[0,count]+ ' в количестве ' + form1.StringGrid4.Cells[1,count]+' ед.');

end;

boo:=false;

for count:=1 to form1.StringGrid4.RowCount -1 do

for count2:=0 to form1.StringGrid1.RowCount -1 do

if form1.StringGrid4.Cells[0,count] = form1.StringGrid1.Cells[0,count2] then

begin

boo:=true;

break;

end;

if boo then

begin

form1.Memo1.Lines.Add('');

form1.Memo1.Lines.Add('При этом будут такие излишки ресурсов:');

for count:=1 to form1.StringGrid4.RowCount -1 do

for count2:=0 to form1.StringGrid1.RowCount -1 do

if form1.StringGrid4.Cells[0,count] = form1.StringGrid1.Cells[0,count2] then

begin

form1.Memo1.Lines.Add (form1.StringGrid4.Cells[0,count]+ ' в количестве ' + form1.StringGrid4.Cells[1,count]+' ед.');

end;

end;

form1.Memo1.Lines.Add('');

if form1.RadioButton2.Checked then

form1.Memo1.Lines.Add('Затраты при таком плане использования составят ' + floattostr((-1)*strtofloat(form1.StringGrid4.Cells[1,1]))+' у.е.')

else

form1.Memo1.Lines.Add('Прибыль при таком плане производства составит ' + form1.StringGrid4.Cells[1,1]+' у.е.');

end;


procedure zapolni();

var Count:integer;

begin


form1.StringGrid3.Cells[1,0]:='ОФР';

for Count:=1 to form1.stringgrid1.RowCount-1 do

begin

form1.StringGrid3.RowCount :=form1.StringGrid3.RowCount +1;

form1.StringGrid3.Cells[0,Count+1]:=form1.StringGrid1.Cells[0,Count];

end;


form1.StringGrid3.Cells[0,1]:='Прибыль';

form1.StringGrid3.Cells[1,1]:='0';

for Count:=1 to form1.stringgrid2.RowCount-1 do

begin

form1.StringGrid3.ColCount := form1.StringGrid3.ColCount+1;

form1.StringGrid3.Cells[Count+1,0]:=form1.StringGrid2.Cells[0,Count];

end;

for Count:=1 to form1.StringGrid1.RowCount -1 do

form1.StringGrid3.Cells[1,Count+1]:=form1.StringGrid1.Cells[1,Count];

for Count:=1 to form1.StringGrid2.RowCount -1 do

form1.StringGrid3.Cells[Count+1,1]:=form1.StringGrid2.Cells[1,Count];

end;

procedure ZapEnd();

var Count,count2,tmp,k:integer;

begin

k:=1;

if form1.RadioButton2.Checked then k:=-1;


form1.StringGrid4.RowCount :=form1.StringGrid3.RowCount;

form1.StringGrid4.ColCount := form1.StringGrid3.ColCount;

for count:=0 to form1.StringGrid3.RowCount-1 do

for count2:=0 to form1.StringGrid3.ColCount-1 do

form1.StringGrid4.Cells [Count2,count] :=form1.StringGrid3.Cells [Count2,count];

for count:=1 to form1.StringGrid3.RowCount-1 do

for count2:=1 to form1.StringGrid3.ColCount-1 do

form1.StringGrid4.Cells [Count2,count] :=floattostr(k*strtofloat(form1.StringGrid3.Cells [Count2,count]));

for count:=1 to form1.StringGrid4.ColCount -1 do

form1.StringGrid4.Cells[count,1]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,1])*(-1));


tmp:=form1.StringGrid4.ColCount;

form1.StringGrid4.ColCount := tmp + form1.StringGrid3.RowCount -2;

for Count:=2 to form1.StringGrid3.RowCount -1 do

begin

form1.StringGrid4.Cells [count+tmp-2,0]:=form1.StringGrid3.Cells [0,count];

end;

for count:=tmp to form1.StringGrid4.ColCount-1 do

for count2:=1 to form1.StringGrid4.RowCount - 1 do

if form1.StringGrid4.Cells [count,0]= form1.StringGrid4.Cells [0,count2] then

form1.StringGrid4.Cells [count,count2]:='1'

else

form1.StringGrid4.Cells [count,count2]:='0';


end;


function Proverka():boolean;

var Count,Count2:integer;

boo:boolean;

begin

boo:=true;

form1.StringGrid3.Cells [1,1]:='0';

for Count:=1 to form1.StringGrid3.RowCount -1 do

for Count2:=1 to form1.StringGrid3.ColCount -1 do

if form1.StringGrid3.Cells [Count2,Count]='' then

begin

boo:=false;

form1.Label5.Caption :='Ошибка заполнения таблицы. Найдено пустое поле!';

end;

proverka:=boo;


end;

procedure SimplexMetod(n:boolean);

var Count,Count2,MinC,MinR:integer;

MinEl,zna4,zna4TMP,zna4TMP2:double;

boo,reshil:boolean;

begin

reshil:=false;

repeat

boo:=false;

for count:=1 to form1.StringGrid4.ColCount -1 do

if strtofloat(form1.StringGrid4.Cells [count,1])<0 then boo:=true;


if boo then

begin

MinC:=2;

zna4:=strtofloat(form1.StringGrid4.Cells [2,1]);

for count:=2 to form1.StringGrid4.ColCount -1 do

if strtofloat(form1.StringGrid4.Cells [count,1])
begin

zna4:=strtofloat(form1.StringGrid4.Cells [count,1]);

MinC:=count;

end;

zna4TMP:=strtofloat(form1.StringGrid4.Cells [1,2]);

zna4TMP2:=strtofloat(form1.StringGrid4.Cells [MinC,2]);

MinEl:=zna4TMP/zna4TMP2;

MinR:=2;

for Count:=2 to form1.StringGrid4.RowCount -1 do

begin

zna4TMP:=strtofloat(form1.StringGrid4.Cells [1,count]);

zna4TMP2:=strtofloat(form1.StringGrid4.Cells [MinC,count]);

if zna4TMP2>0 then

begin

zna4:=zna4TMP/zna4TMP2;

if zna4
begin

MinEl:=zna4;

MinR:=Count;

end;

end;

end;


MinEl:=strtofloat(form1.StringGrid4.Cells[MinC,MinR]);

for count:=1 to form1.StringGrid4.ColCount -1 do

form1.StringGrid4.Cells[count,MinR]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,MinR])/MinEl);


for count:=1 to form1.StringGrid4.ColCount -1 do

for Count2:=1 to form1.StringGrid4.RowCount -1 do

if (count<>MinC)and(count2<>MinR) then

form1.StringGrid4.Cells [count,count2]:=floattostr(strtofloat(form1.StringGrid4.Cells [count,count2])-strtofloat(form1.StringGrid4.Cells [count,MinR])*strtofloat(form1.StringGrid4.Cells [MinC,count2]));


form1.StringGrid4.Cells[0,MinR]:=form1.StringGrid4.Cells[MinC,0];

for count:=1 to form1.StringGrid4.RowCount - 1 do

if form1.StringGrid4.Cells [MinC,0]= form1.StringGrid4.Cells [0,count] then

form1.StringGrid4.Cells [MinC,count]:='1'

else

form1.StringGrid4.Cells [MinC,count]:='0';


end

else

begin

form1.Label5.Caption :='Решение найдено!!!';

reshil:=true;

end;

until reshil or n;

end;

procedure DvSimplexMetod(n:boolean);

var Count,Count2,MinC,MinR:integer;

MinEl,zna4,zna4TMP,zna4TMP2:double;

boo,reshil,dv:boolean;

begin

reshil:=false;

dv:=form1.RadioButton2.Checked;

repeat

boo:=false;

for count:=2 to form1.StringGrid4.ColCount -1 do

if strtofloat(form1.StringGrid4.Cells [count,1])<0 then boo:=true;

for count:=2 to form1.StringGrid4.RowCount -1 do

if strtofloat(form1.StringGrid4.Cells [1,count])<0 then boo:=true;


if boo then

begin

MinR:=2;

zna4:=strtofloat(form1.StringGrid4.Cells [1,2]);

for count:=2 to form1.StringGrid4.RowCount -1 do

if strtofloat(form1.StringGrid4.Cells [1,count])
begin

zna4:=strtofloat(form1.StringGrid4.Cells [1,count]);

MinR:=count;

end;

zna4TMP:=strtofloat(form1.StringGrid4.Cells [2,1]);

zna4TMP2:=strtofloat(form1.StringGrid4.Cells [2,MinR]);

MinEl:=zna4TMP/zna4TMP2;

MinC:=2;

for Count:=2 to form1.StringGrid4.ColCount -1 do

begin

zna4TMP:=strtofloat(form1.StringGrid4.Cells [count,1]);

zna4TMP2:=strtofloat(form1.StringGrid4.Cells [count,MinR]);

if (zna4TMP>0) and (zna4TMP2<0) then

begin

zna4:=zna4TMP/zna4TMP2;

if abs(zna4)
begin

MinEl:=zna4;

MinC:=Count;

end;

end;

end;


MinEl:=strtofloat(form1.StringGrid4.Cells[MinC,MinR]);

for count:=1 to form1.StringGrid4.ColCount -1 do

form1.StringGrid4.Cells[count,MinR]:=floattostr(strtofloat(form1.StringGrid4.Cells[count,MinR])/MinEl);


for count:=1 to form1.StringGrid4.ColCount -1 do

for Count2:=1 to form1.StringGrid4.RowCount -1 do

if (count<>MinC)and(count2<>MinR) then

form1.StringGrid4.Cells [count,count2]:=floattostr(strtofloat(form1.StringGrid4.Cells [count,count2])-strtofloat(form1.StringGrid4.Cells [count,MinR])*strtofloat(form1.StringGrid4.Cells [MinC,count2]));


form1.StringGrid4.Cells[0,MinR]:=form1.StringGrid4.Cells[MinC,0];

for count:=1 to form1.StringGrid4.RowCount - 1 do

if form1.StringGrid4.Cells [MinC,0]= form1.StringGrid4.Cells [0,count] then

form1.StringGrid4.Cells [MinC,count]:='1'

else

form1.StringGrid4.Cells [MinC,count]:='0';


end

else

begin

form1.Label5.Caption :='Решение найдено!!!';

reshil:=true;

end;

until reshil or n;

end;


procedure TForm1.BitBtn6Click(Sender: TObject);

begin

form1.Close;

end;


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

case key of

#8: ;

#13: edit2.SetFocus ;

'a'..'z': ;

'A'..'Z': ;

'а'..'я': ;

'А'..'Я': ;

'0'..'9': ;

else key:=#0;

end;


end;


procedure TForm1.BitBtn1Click(Sender: TObject);

var Count:integer;

boo:boolean;

begin

boo:=true;

if (edit1.Text ='')or(edit2.Text ='') then

begin

boo:=false;

label5.Caption :='Заполните все поля ввода.';

end;


for Count := 1 to stringgrid1.RowCount do

begin

if (edit1.Text = stringgrid1.Cells [0,Count]) then

boo:=false;

end;


if boo then

begin

if (stringgrid1.RowCount = 2) and (stringgrid1.Cells[0,1]='') then

stringgrid1.RowCount := stringgrid1.RowCount

else

stringgrid1.RowCount := stringgrid1.RowCount + 1;

stringgrid1.Cells [0,stringgrid1.RowCount - 1] := edit1.Text;

stringgrid1.Cells [1,stringgrid1.RowCount - 1] := edit2.Text;

label5.Caption :='Ресурс добавлен!';

edit1.SetFocus();

end

else

label5.Caption :='Такой ресурс уже есть';


end;


procedure TForm1.StringGrid1Click(Sender: TObject);

var i :integer;

begin

i:=stringgrid1.Row;

edit1.Text := stringgrid1.Cells [0,i];

edit2.Text := stringgrid1.Cells [1,i];

label5.Caption := '';

end;


procedure TForm1.BitBtn7Click(Sender: TObject);

var Count,i:integer;

boo:boolean;

begin

boo:=true;

for Count := 1 to stringgrid1.RowCount do

begin

if (edit1.Text = stringgrid1.Cells [0,Count]) then

begin

i:=Count;

boo:=false;

end;

end;


if boo then

begin

label5.Caption :='Такого ресурса нет в списке!';

end

else

begin

stringgrid1.Cells [0,i] := edit1.Text;

stringgrid1.Cells [1,i] := edit2.Text;

label5.Caption :='Ресурс изменен.';

end;

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

stringgrid1.Cells [0,0]:='Наименование';

stringgrid1.Cells [1,0]:='ОФР';

stringgrid2.Cells [0,0]:='Наименование';

stringgrid2.Cells [1,0]:='Стоимость';

end;


procedure TForm1.BitBtn2Click(Sender: TObject);

var Count,i:integer;

boo:boolean;

begin

boo:=true;

for Count := 1 to stringgrid1.RowCount do

begin

if (edit1.Text = stringgrid1.Cells [0,Count]) then

begin

i:=Count;

boo:=false;

end;

end;


if boo then

begin

label5.Caption :='Такого ресурса нет в списке!';

end

else

begin

stringgrid1.Rows[i].Clear ;

for Count := i to stringgrid1.RowCount-1 do

begin

stringgrid1.Cells [0,Count]:=stringgrid1.Cells [0,Count+1];

stringgrid1.Cells [1,Count]:=stringgrid1.Cells [1,Count+1];

end;

stringgrid1.RowCount := stringgrid1.RowCount -1;

label5.Caption :='Ресурс стерт.';

end;

end;


procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);

begin

case key of

#8: ;

#13: bitbtn1.SetFocus;

'0'..'9': ;

#110:;

#46:;

else key:=#0;

end;

end;


procedure TForm1.BitBtn4Click(Sender: TObject);

begin

label5.Caption :='';

if groupbox5.Visible = true then

begin

groupbox5.Visible := false;

groupbox6.Visible := true;


bitbtn11.Visible :=false;

memo1.Clear();

bitbtn4.Enabled :=false;

if form1.RadioButton2.Checked then

dvSimplexMetod(False)

else

SimplexMetod(False);

Otvet();


end;


if groupbox4.Visible = true then

begin

if Proverka() then

begin

groupbox4.Visible := false;

groupbox5.Visible := true;

bitbtn11.Visible :=true;

bitbtn4.Caption := '<Ответ>';

zapend();

end;

end;


if groupbox3.Visible = true then

begin

if stringgrid2.Cells[0,1]<>'' then

begin

groupbox3.Visible := false;

groupbox4.Visible := true;

stringgrid3.ColCount :=2;

stringgrid3.RowCount :=2;

zapolni();

end

else label5.Caption :='Подуктов нет?!';


end;

if groupbox1.Visible = true then

begin

if stringgrid1.Cells[0,1]<>'' then

begin

bitbtn5.Enabled := true;

groupbox1.Visible := false;

groupbox3.Visible := true;

end

else label5.Caption :='Ресурсы не могут отсутствовать!';


end;


end;


procedure TForm1.BitBtn5Click(Sender: TObject);

begin

label5.Caption :='';

if groupbox3.Visible = true then

begin

bitbtn5.Enabled := false;

groupbox3.Visible := false;

groupbox1.Visible := true;


end;

if groupbox4.Visible = true then

begin

groupbox4.Visible := false;

groupbox3.Visible := true;


end;

if groupbox5.Visible = true then

begin

groupbox5.Visible := false;

groupbox4.Visible := true;

bitbtn11.Visible :=false;

bitbtn4.Caption := 'Дальше -->';

bitbtn4.Enabled :=true;


end;

if groupbox6.Visible = true then

begin

groupbox6.Visible := false;

groupbox5.Visible := true;

bitbtn11.Visible :=true;

bitbtn4.Enabled :=true;

end;

end;


procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);

begin

case key of

#8: ;

#13: edit4.SetFocus ;

'a'..'z': ;

'A'..'Z': ;

'а'..'я': ;

'А'..'Я': ;

'0'..'9': ;

else key:=#0;

end;

end;


procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);

begin

case key of

#8: ;

#13: bitbtn3.SetFocus;

'0'..'9': ;

#110:;

#46:;

else key:=#0;

end;

end;


procedure TForm1.BitBtn3Click(Sender: TObject);

var Count:integer;

boo:boolean;

begin

boo:=true;

if (edit3.Text ='')or(edit4.Text ='') then

begin

boo:=false;

label5.Caption :='Заполните все поля ввода.';

end;

for Count := 1 to stringgrid2.RowCount do

begin

if (edit3.Text = stringgrid2.Cells [0,Count]) then

boo:=false;

end;


if boo then

begin

if (stringgrid2.RowCount = 2) and (stringgrid2.Cells[0,1]='') then

stringgrid2.RowCount := stringgrid2.RowCount

else

stringgrid2.RowCount := stringgrid2.RowCount + 1;

stringgrid2.Cells [0,stringgrid2.RowCount - 1] := edit3.Text;

stringgrid2.Cells [1,stringgrid2.RowCount - 1] := edit4.Text;

label5.Caption :='Продукт добавлен!';

edit3.SetFocus();

end

else

label5.Caption :='Такой продукт уже есть';


end;

procedure TForm1.BitBtn9Click(Sender: TObject);

var Count,i:integer;

boo:boolean;

begin

boo:=true;

for Count := 1 to stringgrid2.RowCount do

begin

if (edit3.Text = stringgrid2.Cells [0,Count]) then

begin

i:=Count;

boo:=false;

end;

end;


if boo then

begin

label5.Caption :='Такого продукта нет в списке!';

end

else

begin

stringgrid2.Rows[i].Clear ;

for Count := i to stringgrid2.RowCount-1 do

begin

stringgrid2.Cells [0,Count]:=stringgrid2.Cells [0,Count+1];

stringgrid2.Cells [1,Count]:=stringgrid2.Cells [1,Count+1];

end;

stringgrid2.RowCount := stringgrid2.RowCount -1;

label5.Caption :='Продукт стерт.';

end;

end;

procedure TForm1.BitBtn8Click(Sender: TObject);


var Count,i:integer;

boo:boolean;

begin

boo:=true;

for Count := 1 to stringgrid2.RowCount do

begin

if (edit3.Text = stringgrid2.Cells [0,Count]) then

begin

i:=Count;

boo:=false;

end;

end;


if boo then

begin

label5.Caption :='Такого продукта нет в списке!';

end

else

begin

stringgrid2.Cells [0,i] := edit3.Text;

stringgrid2.Cells [1,i] := edit4.Text;

label5.Caption :='Продукт изменен.';

end;

end;


procedure TForm1.StringGrid2Click(Sender: TObject);

var i :integer;

begin

i:=stringgrid2.Row;

edit3.Text := stringgrid2.Cells [0,i];

edit4.Text := stringgrid2.Cells [1,i];

label5.Caption := '';

end;


procedure TForm1.StringGrid3KeyPress(Sender: TObject; var Key: Char);

begin

case key of

#8: ;

#13:;

'0'..'9': ;

#110:;

',': ;

#46:;

else key:=#0;

end;

end;


procedure TForm1.BitBtn11Click(Sender: TObject);

begin

if form1.RadioButton2.Checked then

dvSimplexMetod(True)

else

SimplexMetod(True);

end;


procedure TForm1.Button2Click(Sender: TObject);

begin


bitbtn11.Visible :=false;

bitbtn4.Caption := 'Дальше -->';

bitbtn4.Enabled :=true;

groupbox1.Visible := true;

groupbox3.Visible := false;

groupbox4.Visible := false;

groupbox5.Visible := false;

groupbox6.Visible := false;

label5.Caption:='';

Otchistka();

end;


end.