350
j
|
Наименование
|
Расстояние
до потребителя, км
|
Объем
поставки, м3
|
1
|
Владимир
|
92
|
40
|
2
|
Москва
|
240
|
100
|
3
|
Ярославль
|
170
|
60
|
4
|
Кострома
|
210
|
80
|
Количество типов транспортных средств: R = 3
Транспортные средства для поставки готовой
продукции
R
|
Количество,
шт.
|
Грузоподъемность,
м3
|
Расход
топлива, л/100км
|
Цена
1л. топлива, руб.
|
1
|
2
|
20
|
20
|
13,5
|
2
|
6
|
40
|
22,5
|
13,5
|
Транспортные средства для поставки сырья
R
|
Количество,
шт.
|
Грузоподъемность,
м3
|
Расход
топлива, л/100км
|
Цена
1л. топлива, руб.
|
3
|
14
|
4
|
28,3
|
13,5
|
Расчет:
Таким образом, автопарку ДЗ
необходимо развести 280 м3 продукции и завести 420 м3 сырья.
Критерий:
Ограничения:
на объем необходимого сырья
на объем вывозимой продукции
на использование транспортных средств
На количество обслуживаемых
потребителей
Обозначим переменные следующим
образом:
Подставим константы:
В критерий:
В ограничения:
Результат расчета контрольного
примера:
Листинг программы контрольного
примера
Unit1;
interface,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls,
Grids;
= 1E-6;=
40;= 1.7E+308;= 10000;= class(TForm): TLabel;: TEdit;: TStringGrid;: TLabel;:
TEdit;: TStringGrid;: TLabel;: TStringGrid;: TButton;: TLabel;: TLabel;:
TEdit;: TEdit;FormCreate(Sender: TObject);SG2KeyPress(Sender: TObject; var Key:
Char);Button1Click(Sender: TObject);SG3KeyPress(Sender: TObject; var Key: Char);Edit1Change(Sender:
TObject);Edit2Change(Sender: TObject);
{ Private
declarations }
{ Public
declarations };
=
array[1..5,1..5] of Real;= array [0..MaxSizeArray,0..MaxSizeArray] of double;
:
TForm1;,J:Integer;: array [1..3] of integer;, Vsir:integer;
C: TArr;
, n1, n2: word; // Число строк,
номер строки (i), m1: word; // Число столбцов, номер столбца (j), a1, a2:
TMatr;, x1, x2: TArr; // Коэффициенты целевой функции: array [1..MaxSizeArray]
of double; // Коэффициенты базисных переменных: array [1..MaxSizeArray] of
word; // Номера базисных переменных
Z: array
[1..MaxSizeArray] of double; // Строка оценок
mi, mj: word; // Ключевые строка и
столбец
min:
double;: integer;: array [1..MaxSizeArray] of boolean;, MM, PP, LL, FF, TT:
word;
{$R *.dfm}
TForm1.FormCreate(Sender:
TObject);:integer;:=StrToInt(Edit1.Text);u:=1 to I
do.Cells[0,u]:=IntToStr(u);.Cells[0,0]:='№';.Cells[1,0]:='Расстояние,
км.';
SG1.Cells[2,0]:='Объем сырья, м3';
SG1.Cells[1,1]:='70';SG1.Cells[1,2]:='110';.Cells[2,1]:='100';SG1.Cells[2,2]:='350';
:=StrToInt(Edit2.Text);u:=1
to J do.Cells[0,u]:=IntToStr(u);.Cells[0,0]:='№';.Cells[1,0]:='Расстояние,
км.';
SG2.Cells[2,0]:='Объем поставки,
м3';
SG2.Cells[1,1]:='92';SG2.Cells[1,2]:='240';SG2.Cells[1,3]:='170';SG2.Cells[1,4]:='210';.Cells[2,1]:='40';SG2.Cells[2,2]:='100';
SG2.Cells[2,3]:='60';SG2.Cells[2,4]:='80';
u:=1 to 3
do.Cells[0,u]:=IntToStr(u);.Cells[0,0]:='№';.Cells[1,0]:='Количество';.Cells[2,0]:='Грузоподъемность,
м3';.Cells[3,0]:='Расх.
топл.
на
100 км';
SG3.Cells[4,0]:='Цена 1л. топлива,
руб.';
SG3.Cells[1,1]:='2';SG3.Cells[1,2]:='6';SG3.Cells[1,3]:='14';.Cells[2,1]:='20';SG3.Cells[2,2]:='40';SG3.Cells[2,3]:='30';.Cells[3,1]:='20';SG3.Cells[3,2]:='22.5';SG3.Cells[3,3]:='28.3';.Cells[4,1]:='13.5';SG3.Cells[4,2]:='13.5';
SG3.Cells[4,3]:='13.5';
:=0;u:=1 to
j do:=Vprod + StrToInt(SG2.Cells[2,u]);.Text:=IntToStr(VProd);
:=Round(3/2*VProd);.Text:=IntToStr(Vsir);
u:=1 to 3
do[u]:=StrToInt(SG3.Cells[1,U]);
;
TForm1.SG2KeyPress(Sender:
TObject; var Key: Char);: integer;:=0;u:=1 to j doSG2.Cells[2,u]='' then
SG2.Cells[2,u]:='0';:=Vprod + StrToInt(SG2.Cells[2,u]);;.Text:=IntToStr(VProd);
:=Round(3/2*VProd);.Text:=IntToStr(Vsir);;
Simplex(var
d: TMatr; var y: TArr); // Симплекс метод, j: word;:
double;i:=1 to n dosign[i] then d[i,m+i]:=-1
else d[i,m+i]:=1; // Введем
дополнительные переменные[i]:=m+i; // и занесем номер базисной
переменной[i]:=0;;:=m+n; // Изменим размерность массива на кол-во доп.
переменных
it:=0;
//
ListScore;j:=1 to m do:=0;i:=1 to n do cba:=cba+CB[i]*d[i,j];
end;:=0; // Поиск ключевого
столбца:=0;
for j:=1 to
m domin>Z[j] then:=Z[j];:=j;
end;mj=0 then break; // Ключевой
столбец не найден - Некуда идти:= MaxDouble; // Поиск ключевой строки:=0;
for i:=1 to
n do(d[i,mj]<>0) and (min>abs(d[i,0]/d[i,mj])) and (nb[i]>m-n)
then:=d[i,0]/d[i,mj];:=i;;;mi=0 then break; // Ключевая строка не найдена
- Некуда идти:=d[mi,mj];
// JordanGauss(d);i:=1 to n doj:=0
to m DO(i<>mi) and (j<>mj) then[i,j]:=d[i,j]-d[i,mj]*d[mi,j]/d[mi,mj];j:=0
to m do d[mi,j]:=d[mi,j]/min;i:=1 to n do if i<>mi then
d[i,mj]:=0;[mi]:=mj;(it);it>MaxIteration-1;
;
CheckForFrac(x: TArr): integer;:
integer;:= 0;i := 1 to n1 doFrac(x[i,1]) <> 0 then result := i;;
Func(x: TArr): Real;: integer;:= 0;i
:= 1 to n1 do:= result + c[i,2]*x[i,1];;
correction(var x: TArr);: integer;i
:= n1-MM-NN+1to n1 dox[i,1] > 0 then x[i,1] := 1;;
MVG;: integer;: TMatr;:= n;:= n;:=
m;:= a;(a, x);(x);CheckForFrac(x) <> 0 do:= b;:= CheckForFrac(x);(n2);:=
n2;:= m1;:= a;[n, 0] := int(a[p, 0])+1;[n, p] := 1;[n] := true;(a2, x2);:=
a;[n, 0] := int(a[p, 0]);[n, p] := 1;[n] := false;(a1, x1);(CheckForFrac(x1)=0)
or (CheckForFrac(x1)=0)then(CheckForFrac(x1)=0) then x := x1x :=
x2;;(CheckForFrac(x1)>CheckForFrac(x2)) then:= a1;:= x1;:= a2;:=
x2;;(x);;;TForm1.Button1Click(Sender: TObject);:integer;:Array [1..100] of
integer;,min2:Real;:integer;,i2:integer;:Boolean;:Real;:Boolean;,KM2: integer;
:=0;u:=1 to I
do:=summa+Round(StrToInt(SG1.Cells[2,u])/30-0.4);(summa>StrToInt(SG3.Cells[1,3]))(StrToInt(SG3.Cells[1,3])*30<VSir)
then.MessageBox('Нехватка транспортных средств для сырья','Error');;;
min2:=0;u:=1 to I
do[u,3]:=StrToInt(SG1.Cells[1,U])*28.3*13.5/100;:=1000000;
:=0;(k3,sizeOf(k3),0);nk<=R[3]
then:=true;i2:=1 to I dok3[i2]*StrToInt(SG3.Cells[2,3])>StrToInt(SG1.Cells[2,i2])ok:=false;
ok then:=0;i2:=1 to I
do:=summa+k3[i2]*StrToInt(SG3.Cells[2,3]);
if summa>=VSir then // ОГРАничение на объем
сырья
begin:=0;i2:=1 to I
do:=summa+k3[i2]*C[i2,3];min>summa then min:=summa;;;;:=1;(nk);(k3[1]);
k3[i1]=R[3]+1
do[i1]:=0;:=i1+1;(k3[i1]);:=nk-R[3];;NK=R[3]*I;min=1000000 then.MessageBox('Объем
сырья
у
поставщиков
меньше
необходимого','Error');;;:=min;
// к
потребителям
u:=1 to J
do[u,1]:=StrToInt(SG2.Cells[1,U])*20*13.5/100;[u,2]:=StrToInt(SG2.Cells[1,U])*22.5*13.5/100;
;:=1000000;(k3,sizeOf(k3),0);nk<=(R[1]+R[2]) then
Begin
// ограничение на использование транспортных
средств
Flag:=false;:=0;:=0;i2:=1 to j
do:=KM1+K3[i2];i2:=j+1 to j*2 do:=KM2+K3[i2];(KM1=StrToInt(SG3.Cells[1,1]))(KM2=StrToInt(SG3.Cells[1,2]))Flag:=true;flag
then
begin
// ОГРАничение на объем продукции:=true;
For i2:=1 to j
dok3[i2]*StrToInt(SG3.Cells[2,1])+k3[i2+j]*StrToInt(SG3.Cells[2,2])
<>StrToInt(SG2.Cells[2,i2])ok:=false;;
ok then:=0;i2:=1 to J do:=summa+k3[i2]*C[i2,1]+k3[i2+j]*C[i2,2];min>summa
then min:=summa;;; ;
:=1;(nk);(k3[1]);k3[i1]=R[1]+R[2]+1
do[i1]:=0;:=i1+1;(k3[i1]);:=nk-(R[1]+R[2]);;NK=(R[1]+R[2])*j*2;
min=1000000 then.MessageBox('Нехватка
транспортных
средств
для
развозки
продукции','Error');;;:=min2+min;.MessageBox(PAnsiChar(FloatToStr(min2)),'Минимальные
затраты,
руб.');
TForm1.SG3KeyPress(Sender: TObject;
var Key: Char);:integer;u:=1 to 3 do[u]:=StrToInt(SG3.Cells[1,U]);;
TForm1.Edit1Change(Sender:
TObject);:integer;Edit1.Text='' then Edit1.Text:='0';
if StrToInt(Edit1.Text)=0 then
sHOWmESSAGE('Количество поставщиков не может быть равным нолю')
else.RowCount:=StrToInt(Edit1.Text)+1;:=StrToInt(Edit1.Text);u:=1
to I do.Cells[0,u]:=IntToStr(u);;;
TForm1.Edit2Change(Sender:
TObject);:integer;Edit2.Text='' then Edit2.Text:='0';
if StrToInt(Edit2.Text)=0 then
sHOWmESSAGE('Количество потребителей не может быть равным нолю')
End; ;
.
Похожие работы на - Оптимизация транспортных издержек автопарка деревообрабатывающего завода
|