Автор: Пользователь скрыл имя, 25 Января 2012 в 22:49, реферат
В последние годы в прикладной математике большое внимание уделяется новому классу задач оптимизации, заключающихся в нахождении в заданной области точек наибольшего или наименьшего значения некоторой функции, зависящей от большого числа переменных. Это так называемые задачи математического программирования, возникающие в самых разнообразных областях человеческой деятельности и прежде всего в экономических исследованиях, в практике планирования и организации производства.
Введение
Линейное программирование
Симплекс метод
Постановка задачи
Разработка алгоритма
Решение задачи
Программная реализация на языке Delphi
Приложение
Заключение
Список используемой литературы
Для этого выбираем из старого плана четыре числа, которые расположены в вершинах прямоугольника и всегда включают разрешающий элемент РЭ.
НЭ = СЭ - (А*В)/РЭ
СТЭ - элемент старого плана, РЭ - разрешающий элемент (5.5), А и В - элементы старого плана, образующие прямоугольник с элементами СТЭ и РЭ.
Представим расчет каждого элемента в виде таблицы:
Конец итераций: найден оптимальный план
Окончательный вариант симплекс-таблицы:
X1 | X2 | X3 | X4 | X5 | X6 | св. чл. | |
1 | 0 | 159/100 | 41/100 | 0 | -9/100 | 729/20 | |
0 | 0 | -191/100 | -109/100 | 1 | -9/100 | 1429/20 | |
0 | 1 | -15/22 | -7/22 | 0 | 9/50 | 243/11 | |
0 | 0 | 1886.36 | 413.64 | 0 | 263.64 | ||
Оптимальный план можно записать так:
x1 = 729/20=36.45
x5 =1429/20= 71.45
x2 =243/11= 22.09
F(X) = 3500*36.45 + 3200*22.09 = 198281.82
Программная реализация
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Exit: TButton;
Button_Next: TButton;
Edit1: TEdit;
Button_Prev: TButton;
ScrollBox1: TScrollBox;
Conditions: TGroupBox;
Label3: TLabel;
Extrem: TComboBox;
Memo1: TMemo;
procedure ExitClick(Sender: TObject);
procedure Button_NextClick(Sender: TObject);
procedure Button_PrevClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
mm = 100; nn = 100;
var
Form1: TForm1;
table_changed,done,solve,is_
m,n,y,i_basis,i0,j0,step,iter: integer;{m - элементов , n - ограничений}
pole: array [1..nn, 1..mm] of TEdit; {поля для ввода}
podpis: array [0..nn, 0..mm] of TLabel; {подписи полей}
znak: array [1..nn] of TComboBox; {знаки сравнения ограничений}
matrix: array [1..nn, 1..mm] of double; {массив для рассчетов}
all_basis: array [1..nn] of integer;{номера базисных переменных}
f: text;{файловая переменная для отчета}
tochnost: double;
implementation
{$R *.dfm}
procedure Init;
{инициализация: ввод размеров системы}
Begin
form1.Button_Prev.Enabled:=
form1.Edit1.Enabled:=true;
form1.Edit2.Enabled:=true;
form1.Extrem.Enabled:=true;
form1.ScrollBox1.
table_changed:=true;
tochnost:=0.000000001;
assign(f, 'report.htm');
end;
procedure Step1;
{шаг первый:
создание таблички и ввод
var
i,j: integer;
nadpis: string;
begin
form1.Memo1.ReadOnly:=false;
form1.Memo1.Lines.Clear;
form1.Memo1.ReadOnly:=true;
form1.Extrem.Enabled:=true;
if table_changed=true then {если меняли количество эл-тов или ограничений,}
begin {то создаем новую табличку}
table_changed:=false;
m:=strtoint(form1.Edit1.Text);
n:=strtoi
nt(form1.Edit2.Text);{и ограничений}
form1.Edit1.Enabled:=false;{
form1.Edit2.Enabled:=false;
i:=0; {используем
нулевую строку массива
for j:=1 to 3 do {подписываем что is что}
begin
podpis[i,j]:=TLabel.Create(
podpis[i,j].parent:=form1.
podpis[i,j].Left:=5;
podpis[i,j].Top:=32*(j-1); {расстояние между надписями}
case j of
1: nadpis:='Целевая функция:';
2: nadpis:='F(x)=';
3: nadpis:='Система ограничений:';
end;
podpis[i,j].Caption:=nadpis;
end;
i:=n+1; {используем
последнюю строку массива
for j:=1 to m+1 do
begin
pole[i,j]:=TEdit.Create(Form1.
pole[i,j].parent:=form1.
pole[i,j].Height:=20;
pole[i,j].Width:=40;
pole[i,j].Left:=80*(j-1)+30;
pole[i,j].Top:=30;
pole[i,j].Text:='0';
if j<=m then
begin
podpis[i,j]:=TLabel.Create(
podpis[i,j].parent:=form1.
podpis[i,j].Height:=20;
podpis[i,j].Width:=20;
podpis[i,j].Left:=pole[i,j].
podpis[i,j].Top:=pole[i,j].
podpis[i,j].Caption:='X['+
if j<>m+1 then podpis[i,j].Caption:=podpis[i,
{если поле не последнее, то дописываем плюсик}
end;
end;
for i:=1 to n do {поля для ввода ограничений}
for j:=1 to m+1 do
begin
pole[i,j]:=TEdit.Create(Form1.
pole[i,j].parent:=form1.
pole[i,j].Height:=20;
pole[i,j].Width:=40;
pole[i,j].Left:=80*(j-1)+5; {расстояние между соседними + отступ от края}
pole[i,j].Top:=40*(i-1)+100;
pole[i,j].Text:='0';
if j<=m then
begin
podpis[i,j]:=TLabel.Create(
podpis[i,j].parent:=form1.
podpis[i,j].Height:=20;
podpis[i,j].Width:=20;
podpis[i,j].Left:=pole[i,j].
podpis[i,j].Top:=pole[i,j].
podpis[i,j].Caption:='X['+
if j<>m then podpis[i,j].Caption:=podpis[i,
{если поле не последнее, то дописываем плюсик; иначе пишем знак}
else begin
znak[i]:=TComboBox.Create(
znak[i].parent:=form1.
znak[i].Height:=20;
znak[i].Width:=40;
znak[i].Left:=podpis[i,j].
znak[i].Top:=pole[i,j].Top;
znak[i].Items.Insert( 0,'> ');
znak[i].Items.Insert( 1,'>=');
znak[i].Items.Insert( 2,' =');
znak[i].Items.Insert( 3,'<=');
znak[i].Items.Insert( 4,'< ');
znak[i].ItemIndex:=1;
end;
end else pole[i,j].Left:=pole[i,j].
//ограничений
end;
end else {если табличку создавать не надо, то разблокируем поля}
begin
for i:=1 to n+1 do
for j:=1 to m+1 do
begin
pole[i,j].Enabled:=true;
if i<=n then znak[i].Enabled:=true;
end;
end;
end;
{/////////////////}
procedure write_system(strok,stolb: integer);
{записывает массив в виде уравнений}
var
i,j: integer;
begin
write(f,'<P>F(x) = ');
for j:=1 to stolb do
begin
write(f,matrix[strok,j]:0:3);
if j<stolb then
begin
write(f,'x<sub>',j,'</sub>');
if (kanon=true) and (j=stolb-1) then write(f,' = ') else
if (matrix[strok,j+1]>=0) then write(f,' + ') else write(f,' ');
end;
end;
writeln(f,'</P>');
writeln(f,'<P>При ограничениях:</P><P>');
for i:=1 to strok-1 do
begin
for j:=1 to stolb do
BEGIN
write(f,matrix[i,j]:0:3);
if j<stolb then write(f,'x<sub>',j,'</sub> ');
if j=stolb-1 then
if kanon=false then write(f,' ',znak[i].text,' ')
else write(f,' = ');
if (matrix[i,j+1]>=0) and (j<stolb-1) then write(f,'+');
end;
writeln(f,'<br>');
end;
writeln(f,'</P>');
end;
{/////////////////}
procedure zapisat(strok,stolb: integer; v_strok,v_stolb:integer);
{записывает массив в виде таблички}
var
i,j:integer;
begin
writeln(f,'<TABLE BORDER BORDERCOLOR=black CELLSPACING=0 CELLPADDING=5>');
for i:=0 to strok do
begin
writeln(f,'<TR>');
for j:=1 to stolb+1 do
begin
write(f,'<TD ');
if i=0 then
begin
if (i_basis<>0) and (j>m+y-i_basis) and (j<=m+y) then
write(f,'BGCOLOR=yellow ')
else
write(f,'BGCOLOR=green ');
end
else
if (i=v_strok) or (j=v_stolb) then write(f,'BGCOLOR=silver ') else
if (i=strok) or (j=stolb) then
if (j<>stolb+1) then write(f,'BGCOLOR=olive ');
write(f,'align=');
if (i=0) and (j<stolb) then
write(f,'center>X<sub>',j,'<
if (i=0) and (j=stolb) then write(f,'center>св. чл.') else
if (i=0) and (j=stolb+1) then write(f,'center>базис') else
if (j=stolb+1) then
if i<>n+1 then write(f,'center>X<sub>',all_
write(f,'center> ')
else
write(f,'right>',matrix[i,j]:
writeln(f,'</TD>');
end;
writeln(f,'</TR>');
end;
writeln(f,'</TABLE>');
end;
{/////////////////}
procedure findved;
{ищет ведущий элемент}