Решение задачи о смесях симплексным методом

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

  • Введение
  • 1. Симплекс-метод
  • 2. Линейное программирование
  • 3. Общая характеристика задачи о смесях
  • 4. Аналитическое решение
  • 5. Математическая постановка задачи
  • 6. Разработка основных алгоритмов решения задачи. Решение задачи в среде визуального программирования Delphi
  • 7. Проектирование интерфейса пользователя. Построение графа состояний интерфейса
  • 8. Разработка форм ввода-вывода информации
  • 9. Контрольный пример
  • 10. Заключение
  • 11. Исходный код
  • Список использованной литературы

Введение

В различных отраслях народного хозяйства возникает проблема составления таких рабочих смесей на основе исходных материалов, которые обеспечивали бы получение конечного продукта, обладающего определенными свойствами. К этой группе задач относятся задачи о выборе диеты, составлении кормового рациона в животноводстве, шихт в металлургии, горючих и смазочных смесей в нефтеперерабатывающей промышленности, смесей для получения бетона в строительстве и т. д.

Высокий уровень затрат на исходные сырьевые материалы и необходимость повышения эффективности производства выдвигает на первый план следующую задачу: получить продукцию с заданными свойствами при наименьших затратах на исходные сырьевые материалы.

1. Симплекс-метод

Симплекс-метод -- алгоритм решения оптимизационной задачи линейного программирования путём перебора вершин выпуклого многогранника в многомерном пространстве. Метод был разработан американским математиком Джорджем Данцигом (George Dantzig) в 1947 году.

Задача линейного программирования состоит в том, что необходимо максимизировать или минимизировать некоторый линейный функционал на многомерном пространстве при заданных линейных ограничениях.

Заметим, что каждое из линейных неравенств на переменные ограничивает полупространство в соответствующем линейном пространстве. В результате все неравенства ограничивают некоторый многогранник (возможно, бесконечный), называемый также полиэдральным комплексом. Уравнение W (x) = c, где W (x) -- максимизируемый (или минимизируемый) линейный функционал, порождает гиперплоскость L©. Зависимость от c порождает семейство параллельных гиперплоскостей. Тогда экстремальная задача приобретает следующую формулировку -- требуется найти такое наибольшее c, что гиперплоскость L© пересекает многогранник хотя бы в одной точке. Заметим, что пересечение оптимальной гиперплоскости и многогранника будет содержать хотя бы одну вершину, причём, их будет более одной, если пересечение содержит ребро или k-мерную грань. Поэтому максимум функционала можно искать в вершинах многогранника. Принцип симплекс-метода состоит в том, что выбирается одна из вершин многогранника, после чего начинается движение по его рёбрам от вершины к вершине в сторону увеличения значения функционала. Когда переход по ребру из текущей вершины в другую вершину с более высоким значением функционала невозможен, считается, что оптимальное значение c найдено.

Последовательность вычислений симплекс-методом можно разделить на две основные фазы:

1. нахождение исходной вершины множества допустимых решений,

2. последовательный переход от одной вершины к другой, ведущий к оптимизации значения целевой функции.

При этом в некоторых случаях исходное решение очевидно или его определение не требует сложных вычислений, например, когда все ограничения представлены неравенствами вида «меньше или равно» (тогда нулевой вектор совершенно точно является допустимым решением, хотя и, скорее всего, далеко не самым оптимальным). В таких задачах первую фазу симплекс-метода можно вообще не проводить. Симплекс-метод, соответственно, делится на однофазный и двухфазный.

2. Линейное программирование

Линейное программирование — математическая дисциплина, посвящённая теории и методам решения задач об экстремумах линейных функций на множествах n-мерного векторного пространства, задаваемых системами линейных уравнений и неравенств.

Линейное программирование является частным случаем выпуклого программирования, которое в свою очередь является частным случаем математического программирования. Одновременно оно — основа нескольких методов решения задач целочисленного и нелинейного программирования. Одним из обобщений линейного программирования является дробно -линейное программирование.

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

Линейное программирование (планирование) служит для выбора наилучшего плана распределения ограниченных однородных ресурсов в целях решения поставленной задачи.

Для решения задач линейного программирования созданы специальные методы. Изучению одного из них, а именно задаче о смесях, посвящена эта курсовая работа.

Актуальность данной темы в современном мире, особенно во времена мирового экономического кризиса, когда нужен четкий план развития предприятия и жесткий контроль за выполнением найденного оптимального плана.

Задачи курсовой работы:

— изучить теоретический материал по данной теме;

— решить поставленную задачу;

— разработать алгоритм для решения данной задачи;

— автоматизировать процесс решения;

— разработать программу для решения задач данного класса.

Каждая из этих задач является частным случаем общей задачи линейного программирования.

Программа будет разработана в среде Borland Delphi 7. Системные требования: процессор с частотой свыше 300 МГц, Windows 98/SE/2000/ME/XP/Vista/Win 7, 128 RAM.

3. Общая характеристика задачи о смесях

От того, как будут распределяться ограниченные ресурсы, зависит конечный результат деятельности бизнеса, т. е., успешность решения подавляющего большинства экономических задач зависит от наилучшего способа использования ресурсов.

В результате чего и разработали методы решения данных задач, называемых оптимизационными методами задач распределения, основные из них: симплекс-метод, двойственный симплекс-метод, метод искусственного базиса, графический метод и решение задач средствами Excel через «Поиск решений».

К группе задач о смесях относят задачи по отысканию наиболее дешевого набора из определенных исходных материалов, обеспечивающих получение смеси с заданными свойствами. Иными словами, получаемые смеси должны иметь в своем составе m различных компонентов в определенных количествах, а сами компоненты являются составными частями n исходных материалов.

4. Аналитическое решение

Задача:

Нефтеперерабатывающий завод получает четыре полуфабриката:

400 тыс. л. алкилата;

250 тыс. л. крекинг-бензина;

350 тыс. л. бензина прямой перегонки;

100 тыс. л. изопентона;

В результате смешивания этих четырёх компонентов в разных пропорциях образуются три сорта авиационного бензина:

Бензин, А — 2: 3: 5: 2;

Бензин В — 3: 1: 2: 1;

Бензин С — 2: 2: 1: 3;

Стоимость 1 тыс.л. указанных сортов бензина:

Бензин, А — 120 руб.

Бензин Б — 100 руб.

Бензин С — 150 руб.

Необходимо определить план смешения компонентов, при котором будет достигнута максимальная стоимость все продукции.

Сводная таблица условий задачи:

Таблица1

Компоненты, используемые для производства трёх видов бензина.

Сорта производимого бензина

Объем ресурсов

(тыс. л)

А

В

С

Алкилат

400

Крекинг-бензин

250

Бензин прямой перегонки

300

Изопентат

250

Цена бензина (рублей за 1 тыс.л.)

120

100

150

5. Математическая постановка задачи

Составим математическую модель задачи. Обозначим через t1 количество бензина А, через t2 количество бензина В, через t3 количество бензина С. Тогда, целевая функция будет:

L=y1t1+ y2t2+ y3t3=120t1+100t2+150t3 > max

Система ограничений:

Приведем систему ограничений к виду основной задачи линейного программирования (введем новые переменные t4, t5, t6, t7, которые входят в целевую функцию с нулевыми коэффициентами):

Выберем t1, t2, t3 свободными переменными, а t4, t5, t6, t7 — базисными и приведем к стандартному виду для решения с помощью симплекс-таблицы:

L=0-(-120t1−100t2−150t3)

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

Это решение опорное, т.к. все свободные члены положительны.

Т. к. все коэффициенты в целевой функции отрицательные, то можно взять любой столбец разрешающим (пусть t1). Выберем в качестве разрешающего элемента тот, для которого отношение к нему свободного члена будет минимально (это t7)

Таблица 2

b

t1

t2

t3

L

0

-120

-100

-150

6000

60

60

180

t4

400

2

3

2

400/2=200

-100

-1

-1

-3

t5

250

3

1

2

250/3=83,3

-150

-1,5

-1,5

-4,5

t6

350

5

2

1

350/5=70

-250

-2,5

-2,5

-7,5

t7

100

2

1

3

100/2=50

50

0,5

0,5

1,5

Далее меняем t2 и t1.

Таблица 3

b

t7

t2

t3

L

6000

60

-40

30

4000

40

80

120

t4

300

-1

2

-1

300/2=150

-200

-2

-4

-6

t5

100

-1,5

-0,5

-2,5

50

0,5

1

-4,5

t6

50

-2,5

-0,5

-6,5

50

0,5

1

-7,5

t1

50

0,5

0,5

1,5

50/0,5=100

100

1

2

1,5

Таблица 3

b

t7

t1

t3

L

10 000

100

80

150

t4

100

-3

-4

-7

t5

150

-1

1

-1

t6

100

-2

1

-5

t2

100

1

2

3

Т.к. коэффициенты при переменных в целевой функции положительны, следовательно, это оптимальное решение.

Таким образом, t1 = t3 =0; t2=100; L=10 000.

Т.е. для получения максимальной прибыли следует производить только бензин В (100 тыс. л.), при этом выручка составит 10 000 руб.

ОТВЕТ: для получения максимальной прибыли следует производить только бензин В (100 тыс. л.), при этом выручка составит 10 000 руб.

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

Анализ процесса обработки информации и выбор структур данных для ее хранения

Для хранения первичных данных используются целочисленные переменные Count, Count2 и компонент StringGrid.

Переменные целочисленного типа tmp и k они указывают на количество столбцов и строк.

Для вычисления минимального значения столбца и минимального значения строки используются переменные целочисленного типа MinC, MinR.

Переменная логического типа Reshil используется для подсчёта и вывода пользователю максимальной прибыли, которую можно будет получить при реализации найденного оптимального плана.

Переменные целочисленного типа Count, Count2 используются как счетчики в циклических операторах.

Также для хранения промежуточных значений максимальной прибыли используются переменные вещественного типа zna4TMP, zna4TMP2.

Переменная i целочисленного типа используется для временного хранения данных.

Переменная вещественного типа zna4 используется для нахождения максимального значения прибыли во время промежуточных расчетов. Для хранения коэффициента X при максимальном значении прибыли используется переменная целочисленного типа a.

Переменная Boo логического типа хранит итоговый результат-максимальная прибыль.

Для хранения и вычисления данных используется компонент StringGrid.

7. Проектирование интерфейса пользователя. Построение графа состояний интерфейса

Рисунок 1- граф состояния интерфейса

8. Разработка форм ввода-вывода информации

Рисунок 2 — Form1

1. компонент edit1 — ввод наименования ресурса;

2. компонент edit2 — ввод количества литров;

3. компонент BitBtn1-добавляет новый ресурс в таблицу;

4. компонент BitBtn2 — изменяет ресурс добавленный в таблицу;

5. компонент BitBtn3 -удаляет ресурс из таблицы;

6. компонент StringGrid1 — таблица для ввода-вывода данных;

7. компонент RadioButton1-компонент выбирает максимальную прибыль предприятия;

8. компонент RadioButton2-компонент выбирает минимальные затраты предприятия;

9. компонент BitBtn4- выход из программы;

10. компонент BitBtn5- очищает таблицу ввода данных;

11. компонент BitBtn6- переход на Form2;

12. компонент BitBtn7-справка;

Рисунок 3 — Form2

1. компонент edit1 — ввод наименования ресурса;

2. компонент edit2 — ввод стоимости ресурса за одну единицу товара;

3. компонент BitBtn1-добавляет новый ресурс в таблицу;

4. компонент BitBtn2 — изменяет ресурс добавленный в таблицу;

5. компонент BitBtn3 -удаляет ресурс из таблицы;

6. компонент StringGrid1 — таблица для ввода-вывода данных;

7. компонент BitBtn4-выход из программы;

8. компонент BitBtn5-очищает таблицу ввода данных;

9. компонент BitBtn6-возвращает пользователя на Form1;

10. компонент BitBtn7-переход на Form3;

Рисунок 4 — Form3

1. компонент StringGrid1 — таблица вывода результата;

2. компонент BitBtn1-выход из программы;

3. компонент BitBtn2-очищает таблицу вывода результата;

4. компонент BitBtn3-возвращает пользователя на Form2;

симплекс метод delphi

9. Контрольный пример

10. Заключение

В процессе написания данной курсовой работы были углублены знания в таких дисциплинах, как: «Основы алгоритмизации и программирования», «Основы программирования в среде программирования Delphi» и «Математические методы». Также в процессе работы над курсовой работой были изучены множественные информационные источники разной предметной направленности в таких сферах, как «Объектно-ориентированное программирование», «Алгоритмизация», «Программирование в среде Delphi», «Динамическое программирование» и «Экономической оптимизации».

В результате данной работы были достигнуты поставленные цели и задачи, а именно:

— изучен теоретический материал решения задачи линейного программирования симплексным методом для нахождения оптимального плана;

— разработан алгоритм решения данной задачи о смесях для нахождения максимальной прибыли или минимальных затрат предприятия;

— автоматизирован процесс решения поставленной задачи симплексным методом на нахождения максимальной прибыли предприятия;

— разработана программа для решения поставленной задачи симплексным методом для нахождения максимальной прибыли и минимальных затрат предприятия;

Разработанный программный продукт не может использоваться в реальной сфере экономической оптимизации, а также его не могут применять, как студенты изучающие дисциплину «Математические методы», так и преподаватели преподающие её. Студентам программный продукт не поможет решить сложные задачи, провести самоконтроль или разобраться в решении задач такого типа благодаря тому, что в процессе работы программы пользователю выводится процесс нахождения оптимального плана распределения инвестиций между предприятиями. Преподавателям же он не поможет облегчить процесс проверки решений подобных задач у студентов.

11. Исходный код

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;

BitBtn10: TBitBtn;

BitBtn11: TBitBtn;

GroupBox6: TGroupBox;

Memo1: TMemo;

RichEdit1: TRichEdit;

Button1: TButton;

Button2: TButton;

Button3: 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 BitBtn10Click (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure Button3Click (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])< zna4 then

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< MinEl then

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])< zna4 then

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)< abs (MinEl) then

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;

bitbtn10. Visible: =false;

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;

bitbtn10. 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;

bitbtn10. Visible: =false;

bitbtn11. Visible: =false;

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

bitbtn4. Enabled: =true;

end;

if groupbox6. Visible = true then

begin

groupbox6. Visible := false;

groupbox5. Visible := true;

bitbtn10. 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. BitBtn10Click (Sender: TObject);

begin

if form1. RadioButton2. Checked then

dvSimplexMetod (False)

else

SimplexMetod (False);

end;

//заполняем затраты

zapolni ();

stringgrid3. Cells [2,2] := '2';

stringgrid3. Cells [2,3] := '1';

stringgrid3. Cells [2,4] := '7';

stringgrid3. Cells [2,5] := '4';

stringgrid3. Cells [3,2] := '4';

stringgrid3. Cells [3,3] := '8';

stringgrid3. Cells [3,4] := '4';

stringgrid3. Cells [3,5] := '6';

stringgrid3. Cells [4,2] := '5';

stringgrid3. Cells [4,3] := '6';

stringgrid3. Cells [4,4] := '5';

stringgrid3. Cells [4,5] := '7';

//заполняем и выполняем

bitBtn5. Enabled:=true;

if Proverka () then

begin

groupbox1. Visible := false;

groupbox5. Visible := true;

bitbtn10. Visible: =true;

bitbtn11. Visible: =true;

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

zapend ();

end;

end;

procedure TForm1. Button2Click (Sender: TObject);

begin

bitbtn10. Visible: =false;

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;

procedure TForm1. Button3Click (Sender: TObject);

begin

application. MessageBox ('Данный программный продукт был разработан Гринёвой Татьяной. '+ #13 +' Использование данного продукта разрешено только в учебных целях. ','О программе. ');

end;

end.

Список использованной литературы

1 Зайченко Ю. П., Шумилова С. А. Исследование операций.

2 Вентцель. Е. С. Элементы динамического программирования / Е. С.

3 Карасев А. Н., Н. Ш. Кремер, Т. Н. Савельева «Математические методы в экономике», М. 2000

4 Лищенко «Линейное и нелинейное программирование», М. 2003

5 А. Н. Карасев, Н. Ш. Кремер, Т. Н. Савельева «Математические методы в экономике», М. 2000

6 Интернет источники:

http: //cyberfac. ru/

http: //emm. ostu. ru/l

http: //matekonomika. narod. ru/

7 О. О. Замков, А. В. Толстопятенко, Ю. Н. Черемных «Математические методы»

ПоказатьСвернуть
Заполнить форму текущей работой