Решение задачи о смесях симплексным методом
Сущность симплекс-метода. Общая характеристика задачи о смесях. Разработка основных алгоритмов решения задачи. Решение задачи в среде визуального программирования Delphi. Проектирование интерфейса пользователя. Разработка форм ввода-вывода информации.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 22.05.2012 |
Размер файла | 476,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
21
Размещено на http://www.allbest.ru/
Содержание
- Введение
- 1. Симплекс-метод
- 2. Линейное программирование
- 3. Общая характеристика задачи о смесях
- 4. Аналитическое решение
- 5. Математическая постановка задачи
- 6. Разработка основных алгоритмов решения задачи. Решение задачи в среде визуального программирования Delphi
- 7. Проектирование интерфейса пользователя. Построение графа состояний интерфейса
- 8. Разработка форм ввода-вывода информации
- 9. Контрольный пример
- 10. Заключение
- 11. Исходный код
- Список использованной литературы
Введение
В различных отраслях народного хозяйства возникает проблема составления таких рабочих смесей на основе исходных материалов, которые обеспечивали бы получение конечного продукта, обладающего определенными свойствами. К этой группе задач относятся задачи о выборе диеты, составлении кормового рациона в животноводстве, шихт в металлургии, горючих и смазочных смесей в нефтеперерабатывающей промышленности, смесей для получения бетона в строительстве и т. д.
Высокий уровень затрат на исходные сырьевые материалы и необходимость повышения эффективности производства выдвигает на первый план следующую задачу: получить продукцию с заданными свойствами при наименьших затратах на исходные сырьевые материалы.
1. Симплекс-метод
Симплекс-метод -- алгоритм решения оптимизационной задачи линейного программирования путём перебора вершин выпуклого многогранника в многомерном пространстве. Метод был разработан американским математиком Джорджем Данцигом (George Dantzig) в 1947 году.
Задача линейного программирования состоит в том, что необходимо максимизировать или минимизировать некоторый линейный функционал на многомерном пространстве при заданных линейных ограничениях.
Заметим, что каждое из линейных неравенств на переменные ограничивает полупространство в соответствующем линейном пространстве. В результате все неравенства ограничивают некоторый многогранник (возможно, бесконечный), называемый также полиэдральным комплексом. Уравнение W(x) = c, где W(x) -- максимизируемый (или минимизируемый) линейный функционал, порождает гиперплоскость L(c). Зависимость от c порождает семейство параллельных гиперплоскостей. Тогда экстремальная задача приобретает следующую формулировку -- требуется найти такое наибольшее c, что гиперплоскость L(c) пересекает многогранник хотя бы в одной точке. Заметим, что пересечение оптимальной гиперплоскости и многогранника будет содержать хотя бы одну вершину, причём, их будет более одной, если пересечение содержит ребро или 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 |
10000 |
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=10000.
Т.е. для получения максимальной прибыли следует производить только бензин В (100 тыс. л.), при этом выручка составит 10000 руб.
ОТВЕТ: для получения максимальной прибыли следует производить только бензин В (100 тыс. л.), при этом выручка составит 10000 руб.
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 О.О. Замков, А.В. Толстопятенко, Ю.Н. Черемных «Математические методы»
Размещено на Allbest.ru
Подобные документы
Постановка задачи линейного программирования. Решение системы уравнений симплекс-методом. Разработка программы для использования симплекс-метода. Блок-схемы основных алгоритмов. Создание интерфейса, инструкция пользователя по применению программы.
курсовая работа [1,7 M], добавлен 05.01.2015Обзор алгоритмов методов решения задач линейного программирования. Разработка алгоритма табличного симплекс-метода. Составление плана производства, при котором будет достигнута максимальная прибыль при продажах. Построение математической модели задачи.
курсовая работа [266,4 K], добавлен 21.11.2013Алгоритм решения задач линейного программирования симплекс-методом. Построение математической модели задачи линейного программирования. Решение задачи линейного программирования в Excel. Нахождение прибыли и оптимального плана выпуска продукции.
курсовая работа [1,1 M], добавлен 21.03.2012Описание симплекс метода решения задачи линейного программирования. Решение задачи методом Литла на нахождение кратчайшего пути в графе, заданном графически в виде чертежа. Из чертежа записываем матрицу расстояний и поэтапно находим кратчайший путь.
задача [390,4 K], добавлен 10.11.2010Построение математической модели. Выбор, обоснование и описание метода решений прямой задачи линейного программирования симплекс-методом, с использованием симплексной таблицы. Составление и решение двойственной задачи. Анализ модели на чувствительность.
курсовая работа [100,0 K], добавлен 31.10.2014Решение задачи линейного программирования графическим методом, его проверка в MS Excel. Анализ внутренней структуры решения задачи в программе. Оптимизация плана производства. Решение задачи симплекс-методом. Многоканальная система массового обслуживания.
контрольная работа [2,0 M], добавлен 02.05.2012Графическое решение задач. Составление математической модели. Определение максимального значения целевой функции. Решение симплексным методом с искусственным базисом канонической задачи линейного программирования. Проверка оптимальности решения.
контрольная работа [191,1 K], добавлен 05.04.2016Решение задачи линейного программирования симплекс-методом: постановка задачи, построение экономико-математической модели. Решение транспортной задачи методом потенциалов: построение исходного опорного плана, определение его оптимального значения.
контрольная работа [118,5 K], добавлен 11.04.2012Сущность линейного программирования. Математическая формулировка задачи ЛП и алгоритм ее решения с помощью симплекс-метода. Разработка программы для планирования производства с целью обеспечения максимальной прибыли: блок-схема, листинг, результаты.
курсовая работа [88,9 K], добавлен 11.02.2011Методы решения задач линейного программирования: планирования производства, составления рациона, задачи о раскрое материалов и транспортной. Разработка экономико-математической модели и решение задачи с использованием компьютерного моделирования.
курсовая работа [607,2 K], добавлен 13.03.2015