Нахождение оптимальных путей транспортировки груза при нестабильной загрузке дорог
Экономическая характеристика компании. Оценка динамики использования производственных мощностей. Разработка рациональных путей и способов транспортирования товаров. Решение транспортной задачи с помощью программы, написанной на языке Borland Delphi 7.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 31.03.2015 |
Размер файла | 2,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Одним из путей совершенствования конструкции является создание аппаратуры для снижения токсичности традиционных бензиновых двигателей без принципиального изменения их конструкции. К таким системам относятся замкнутые системы вентиляции картера, система рециркуляции отработавших газов, сгорание топлива в среде с избытком кислорода, подача воздуха под давлением в зону выпускных клапанов, наддув, подача воды во всасывающий трубопровод, предварительное охлаждение всасываемого воздуха, применение добавочных карбюраторов, применение регулятора разряжения и связанного с ним экономайзера холостого хода, применение каталитических нейтрализаторов и пламенных дожигателей.
Особую актуальность приобретает в настоящее время внедрение в практику простых регулировок, обеспечивающих снижение токсичных выбросов и не требующих больших затрат времени и сложного оборудования, например, регулировок двигателей на минимальную токсичность при работе на холостом ходу. Это объясняется тем, что до 30 % времени работы автомобильного двигателя в городских условиях составляет работа на холостом ходу, а доля окиси углерода, выделяемой при этом, составляет 40-45%.
Следующим направлением борьбы с загрязнением окружающей среды являются организационно-технические мероприятия в эксплуатации, к которым относятся: рациональная организация движения автомобилей, выбор оптимального подвижного состава, комплекс организационно-технических мероприятий по поддержанию технических характеристик современных автомобилей.
Доказано, что значительного снижения концентрации токсичных веществ в воздухе больших городов можно добиться выносом транзитного движения за пределы города, созданием скоростных дорог, прокладываемых вне зоны жилья, удалением жилых домов на определенное расстояние от автомагистралей, озеленением этих разрывов и т.п. Безостановочное движение по принципу "зеленой волны" способствует движению автомобилей с постоянной скоростью и предельно уменьшает время работы двигателя на режиме разгона и холостого хода, то есть на режимах максимальной токсичности отработавших газов. Кроме того, около стоящих автомобилей отсутствует циркуляция воздуха, возникающая при движении. С этой целью во многих городах ведется реконструкция: выпрямляются улицы, расширяется проезжая часть, устраиваются пересечения в различных уровнях.
Экспериментально доказано, что увеличение сети дорог в небольшом городке в 2 раза, практически не уменьшив суммарный выброс токсичных веществ, снижает удельное загрязнение зон города окисью углерода и углеводорода почти в 1,5-2 раза.
Наряду с поиском новых видов топлива для автомобильного транспорта ведется работа по совершенствованию использования традиционных топлив с целью их соответствия требованиям охраны окружающей среды.
Заключение
транспортирование экономический задача программа
Описанная в курсовой работе задача об оптимальных перевозках и методы ее решения - только отдельный пример огромного множества задач линейного программирования. Цель транспортной задачи - разработка наиболее рациональных путей и способов транспортирования товаров, устранение чрезмерно дальних, встречных, повторных перевозок. Все это сокращает время продвижения товаров, уменьшает затраты предприятий, фирм, связанные с осуществлением процессов снабжения сырьем, материалами, топливом, оборудованием и т.д.
В данной курсовой была рассмотрена работа транспортной компании ЧП «ШымОйл», дана характеристика продукции, дан общий обзор методов оптимизации, реализована программа.
Представленная в данной курсовой работе параметрическая транспортная задача была решена вручную - методом потенциалов, и с помощью программы, написанной на языке Borland Delphi 7.
Оба способа дают одинаковое решение и определяют оптимальный план перевозок товара и минимальную стоимость всех перевозок для каждого из маршрутов, тариф которых изменяется в зависимости от выбранного маршрута.
Таким образом, в данной курсовой работе с заданными параметрами были получены следующие результаты: ЧП “ШымОйл” целесообразно выбрать Маршрут №1, так как он является наиболее оптимальным. Затраты на транспортные расходы Маршрута №1 являются минимальными и составляют 219 тыс. тенге.
Список использованной литературы
1. Моисеев Н.Н., Иванов Ю.П., Столярова Е.М. Методы оптимизации. - М.: Наука, 1978 г.
2. Боборыкин В.А. Математические методы решения транспортных задач. - Л.: СЗПИ, 1986 г.
3. Карманов В.Г. Математическое программирование. - М.: Наука, 1986г.
4. Кузнецов Ю.Н., Кузубов В.И., Волощенко А.Б. Математическое программирование. - М.: Высшая школа, 1980 г.
5. Еремин И.И., Астафьев Н.Н. Введение в теорию линейного и выпуклого программирования - М.: Наука, 1976 г.
6. Иванов Ю.П., Лотов А.В. Математические модели в экономике. - М.: Наука, 1979г.
7. Кузнецов А.В., Новикова Г.И., Холод И.И. Сборник задач по математическому программированию. - Минск: Высшая школа, 1985 г.
Приложение
Программный код
unit potenzial;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Math, ComCtrls, ExtCtrls, jpeg, XPMan, Menus;
const
fFigSize: integer = 10; // half size
type
TFigure = class
public
x,y: integer;
num: integer;
flag: integer; // type
val: integer;
p: integer; // при выводе в стринггрид
end;
TLine = class
public
i1, i2: integer;
val: integer;
end;
TData = class
public
Width, Height: integer;
Arr: array [0..99, 0..99] of integer;
Left, Top: array[0..99] of integer;
constructor Create;
procedure Reset;
procedure Assign( data: TData );
procedure AssignLT( data: TData );
function NoNulls: integer;
function Min: integer;
end;
TEquation = record
p1, p2: integer;
sum: integer;
solved: boolean;
end;
TVar = record
v: integer;
solved: boolean;
end;
TEqSolve = class
public
Eq: array [0..100] of TEquation;
fV: array [0..100] of TVar;
fEqCount, fVarCount, fH: integer;
function GetU( index: integer ): TVar;
function GetV( index: integer ): TVar;
procedure AddEq( p1, p2, s: integer );
// Количество уравнений динамическое.Количество переменных можно узнать
// сразу.
constructor Create( h, v_c: integer );
procedure Solve;
property U[index: integer]: TVar read GetU;
property V[index: integer]: TVar read GetV;
end; {}
TForm1 = class(TForm)
XPManifest1: TXPManifest;
Image2: TImage;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button2: TButton;
StringGrid1: TStringGrid;
Image1: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
Memo2: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
fData: TData;
fFigures: TList;
fLines: TList;
fMouseState: integer;
fMouseInd: integer;
{ Public declarations }
function Check( data: TData ): boolean;
procedure CalcNorthWest( data: TData; var plan: TData );
procedure CalcMinEl( data: TData; var plan: TData );
procedure CalcPotential( data: TData; var plan, x: TData );
procedure Dump( data: TData; fl: integer );
function CalcSum( data, plan: TData ): integer;
procedure ShiftPlan( var data, plan, potential: TData );
function IsOver( x,y: integer ): integer;
procedure AddRemoveLine( i1, i2: integer );
end;
var
Form1: TForm1;
ii: integer;
srav: array [1..3] of integer;
implementation
{$R *.dfm}
uses size;
procedure TForm1.Button1Click(Sender: TObject);
var
min, minii, ii: integer;
begin
min:=srav[1]; minii:=1;
for ii:=1 to 3 do
if min > srav[ii] then begin
min:=srav[ii];
minii:=ii;
end;
Memo2.Clear;
Memo2.Lines.Append('Оптимальный маршрут № ' + IntToStr(minii));
Memo2.Lines.Append('S min = ' + IntToStr(min));
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (StringGrid1.Col = 1) and (StringGrid1.Row = 1) then
begin
Key:= #0;
exit;
end;
if (Key < '0') or (Key > '9') then
Key:= #0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[1,0]:= 'Магазины';
StringGrid1.Cells[0,1]:= 'Заводы';
StringGrid1.Cells[1,1]:= 'Нал.\Потреб.';
StringGrid1.Cells[0,2]:= 'А1';
StringGrid1.Cells[0,3]:= 'А2';
StringGrid1.Cells[2,0]:= 'B1';
StringGrid1.Cells[3,0]:= 'B2';
StringGrid1.Cells[4,0]:= 'B3';
StringGrid1.Cells[5,0]:= 'B4';
StringGrid1.Cells[6,0]:= 'B5';
FillChar( fData, sizeof(fData), 0 );
fFigures:= TList.Create;
fLines:= TList.Create;
fMouseState:= 0;
ii:=1;
end;
procedure TForm1.Button2Click(Sender: TObject);
function GetInt( x, y: integer ): integer;
begin
Result:= StrToInt( StringGrid1.Cells[ x, y ] );
end;
var
index, index2, s, old_s: integer;
data, plan, potential: TData;
begin
Memo1.Lines.Clear;
// Прочитать данные из грида
data:= TData.Create;
data.Width:= StringGrid1.ColCount-2;
data.Height:= StringGrid1.RowCount-2;
for index:= 0 to data.Height-1 do
for index2:= 0 to data.Width-1 do
data.Arr[index2,index]:= GetInt( index2+2, index+2 );
for index:= 0 to data.Width-1 do
data.Top[index]:= GetInt( index+2, 1 );
for index:= 0 to data.Height-1 do
data.Left[index]:= GetInt( 1, index+2 );
plan:= TData.Create;
potential:= TData.Create;
Memo1.Lines.Add( 'Исходные данные' );
Dump( data, 7 );
Memo1.Lines.Add( 'Исходный план:' );
CalcNorthWest( data, plan );
Dump( plan, 1 );
Memo1.Lines.Add( 'S min: ' + IntToStr( CalcSum(data, plan) ) ); {}
old_s:= 0;
while (true) do
begin
CalcPotential( data, plan, potential );
Memo1.Lines.Add( 'Потенциал:' );
Dump( potential, 1 ); {}
if (potential.Min >= 0) then
begin
Memo1.Lines.Add( 'Успешно завершено' );
break;
end;
ShiftPlan( data, plan, potential );
s:= CalcSum(data, plan);
Memo1.Lines.Add( 'План:' );
Dump( plan, 1 );
Memo1.Lines.Add( 'S min: ' + IntToStr(s) ); {}
srav[ii]:= CalcSum(data, plan);
if (old_s = s) then
break
else
old_s:= s;
end;
end;
{ TData }
procedure TData.Assign(data: TData);
var
index, index2: integer;
egin
AssignLT( data );
for index:= 0 to Height-1 do
for index2:= 0 to Width-1 do
Arr[index2,index]:= data.Arr[index2,index];
end;
procedure TData.AssignLT(data: TData);
var
index: integer;
begin
Reset;
Width:= data.Width;
Height:= data.Height;
for index:= 0 to Width-1 do
Top[index]:= data.Top[index];
for index:= 0 to Height-1 do
Left[index]:= data.Left[index];
end;
constructor TData.Create;
begin
Reset;
end;
function TForm1.Check(data: TData): boolean;
var
s, index: integer;
begin
s:= 0;
for index:= 0 to data.Width-1 do
s:= s + data.Top[index];
for index:= 0 to data.Height-1 do
s:= s - data.Left[index];
Result:= s = 0; // Или тут больше поставить ?
end;
procedure TForm1.CalcNorthWest( data: TData; var plan: TData);
var
index, index2, t: integer;
begin
index:= 0;
index2:= 0;
plan.AssignLT( data );
while (index < plan.Height) and (index2 < plan.Width) do
begin
t:= min( plan.Left[index], plan.Top[index2] );
plan.Arr[index2,index]:= t;
plan.Top[index2]:= plan.Top[index2]-t;
plan.Left[index]:= plan.Left[index]-t;
if (plan.Top[index2] = 0) then
index2:= index2+1;
if (plan.Left[index] = 0) then
index:= index+1;
end;
procedure TForm1.Dump(data: TData; fl: integer);
function i2s( i: integer ): string;
var
r: string;
begin
r:= IntToStr( i );
while( length(r) < 3 ) do
r:= ' ' + r;
Result:= r;
end;
var
index, index2: integer;
s: string;
begin
// top
if ((fl and 2) <> 0) then
begin
s:= ' ';
for index:= 0 to data.Width-1 do
s:= s + i2s( data.Top[index] );
Memo1.Lines.Add( s );
end;
if ((fl and 5) = 0) then
exit;
for index:= 0 to data.Height-1 do
begin
// left
if ((fl and 4) <> 0) then
s:= i2s( data.Left[index] )
else
s:= '';
// arr
if ((fl and 1) <> 0) then
for index2:= 0 to data.Width-1 do
s:= s + i2s( data.Arr[index2,index] );
Memo1.Lines.Add( s );
end;
procedure TForm1.Button3Click(Sender: TObject);
procedure c( x, y: integer; s: string );
begin
StringGrid1.Cells[ x, y ]:= s;
end;
begin
ii:=1;
Image1.Picture.LoadFromFile('1.jpg');
StringGrid1.ColCount:= 7;
StringGrid1.RowCount:= 4;
// top
c( 2, 1, '7' );
c( 3, 1, '8' );
c( 4, 1, '10' );
c( 5, 1, '9' );
c( 6, 1, '11' );
// left
c( 1, 2, '20' );
c( 1, 3, '25' );
// mid
c( 2, 2, '2' );
c( 3, 2, '4' );
c( 4, 2, '5' );
c( 5, 2, '6' );
c( 6, 2, '8' );
c( 2, 3, '3' );
c( 3, 3, '5' );
c( 4, 3, '7' );
c( 5, 3, '9' );
c( 6, 3, '5' );
end;
function TForm1.CalcSum(data, plan: TData): integer;
var
index, index2, s: integer;
begin
s:= 0;
for index:= 0 to data.Height-1 do
for index2:= 0 to data.Width-1 do
s:= s + data.Arr[index2,index] * plan.Arr[index2, index];
Result:= s;
end;
procedure TForm1.Button4Click(Sender: TObject);
procedure c( x, y: integer; s: string );
begin
StringGrid1.Cells[ x, y ]:= s;
end;
begin
ii:=2;
Image1.Picture.LoadFromFile('2.jpg');
StringGrid1.ColCount:= 7;
StringGrid1.RowCount:= 4;
// top
c( 2, 1, '7' );
c( 3, 1, '8' );
c( 4, 1, '10' );
c( 5, 1, '9' );
c( 6, 1, '11' );
// left
c( 1, 2, '20' );
c( 1, 3, '25' );
// mid
c( 2, 2, '10' );
c( 3, 2, '8' );
c( 4, 2, '6' );
c( 5, 2, '5' );
c( 6, 2, '2' );
c( 2, 3, '9' );
c( 3, 3, '7' );
c( 4, 3, '5' );
c( 5, 3, '4' );
c( 6, 3, '3' );
end;
function TData.Min: integer;
var
index, index2, m: integer;
begin
m:= MaxInt;
for index:= 0 to Height-1 do
for index2:= 0 to Width-1 do
if (m > Arr[index2,index]) then
m:= Arr[index2,index];
Result:= m;
end;
function TData.NoNulls: integer;
var
index, index2, c: integer;
begin
c:= 0;
for index:= 0 to Height-1 do
for index2:= 0 to Width-1 do
if (Arr[index2,index] > 0) then
inc(c);
Result:= c;
end;
procedure TForm1.CalcMinEl( data: TData; var plan: TData );
var
index, index2, x_m, y_m, v_m, s, v: integer;
begin
s:= 0;
plan.AssignLT( data );
for index:= 0 to plan.Width-1 do
s:= s + data.Top[index];
while (s > 0) do
begin
v_m:= MaxInt;
x_m:= -1;
y_m:= -1;
for index:= 0 to plan.Height-1 do
for index2:= 0 to plan.Width-1 do
if ((v_m > data.Arr[index2,index]) and
(plan.Arr[index2,index] = 0) and
(plan.Top[index2] > 0) and (plan.Left[index] > 0)) then
begin
v_m:= data.Arr[index2,index];
x_m:= index2;
y_m:= index;
end;
if (v_m = MaxInt) then
break;
v:= min( plan.Top[ x_m ], plan.Left[ y_m ] );
plan.Top[ x_m ]:= plan.Top[ x_m ] - v;
plan.Left[ y_m ]:= plan.Left[ y_m ] - v;
plan.Arr[ x_m, y_m ]:= v;
s:= s - v;
end;
procedure TData.Reset;
begin
FillChar( Left, sizeof(Left), 0 );
FillChar( Top, sizeof(Top), 0 );
FillChar( Arr, sizeof(Arr), 0 );
end;
{ TEqSolve }
procedure TEqSolve.AddEq( p1,p2,s: integer );
begin
Eq[ fEqCount ].p1:= p1;
Eq[ fEqCount ].p2:= p2 + fH;
Eq[ fEqCount ].sum:= s;
Eq[ fEqCount ].solved:= false;
// Дебужный вывод уравнений
Form1.Memo1.Lines.Add( 'u' + IntToStr(p1+1) + ' + v' + IntToStr(p2+1) +
' = ' + IntToStr( s ) ); {}
inc( fEqCount );
end;
constructor TEqSolve.Create( h, v_c: integer );
begin
FillChar( Eq, sizeof(Eq), 0 );
FillChar( fV, sizeof(fV), 0 );
fEqCount:= 0;
fVarCount:= v_c;
fH:= h;
end;
function TEqSolve.GetU(index: integer): TVar;
begin
Result:= fV[index];
end;
function TEqSolve.GetV(index: integer): TVar;
begin
Result:= fV[index+fH];
end;
procedure TEqSolve.Solve;
var
non_solved, index, c: integer;
ceq: ^TEquation;
begin
FillChar( fV, sizeof(fV), 0 );
non_solved:= fVarCount-1;
fV[0].v:= 0;
fV[0].solved:= true;
while (non_solved > 0) do
begin
c:= 0;
for index:= 0 to fEqCount-1 do
begin
ceq:= @Eq[index];
if (ceq.solved) then continue;
if (fV[ ceq.p1 ].solved) then
begin
fV[ ceq.p2 ].v:= ceq.sum - fV[ ceq.p1 ].v;
fV[ ceq.p2 ].solved:= true;
inc(c);
ceq.solved:= true;
end
else if (fV[ ceq.p2 ].solved) then
begin
fV[ ceq.p1 ].v:= ceq.sum - fV[ ceq.p2 ].v;
fv[ ceq.p1 ].solved:= true;
inc(c);
ceq.solved:= true;
end;
end; // for
if (c = 0) then
exit;
end;
procedure TForm1.CalcPotential(data: TData; var plan, x: TData);
function to_sign( v: integer ): integer;
begin
if (v = 0) then
Result:= 1
else
Result:= -1;
end;
var
index, index2, t: integer;
solve: TEqSolve;
s: string;
begin
// Создать систему уравнений и решить ее
solve:= TEqSolve.Create( plan.Height, plan.Height + plan.Width );
for index:= 0 to plan.Height-1 do
for index2:= 0 to plan.Width-1 do
if (plan.Arr[index2,index] > 0) then
solve.AddEq( index, index2, data.Arr[index2,index] );
// Не хватает уравнений - достроить их
index:= 0;
index2:= 0;
while (solve.fEqCount < plan.Height + plan.Width-1) do
begin
inc(index2);
if (index2 = plan.Width) then
begin
index2:= 0;
inc( index );
if (index = plan.Height) then
break; // wtf ?
end;
if (plan.Arr[index2,index] = 0) then
solve.AddEq( index, index2, data.Arr[index2,index] );
end; {}
Размещено на Allbest.ru
Подобные документы
Математическая постановка транспортной задачи открытой модели методом потенциалов при известных показателях запаса груза поставщика и потребности потребителя; ее решение ручным способом и с помощью компьютерной программы, написанной в среде Delphi.
курсовая работа [167,2 K], добавлен 16.01.2011Методология и технология разработки программного продукта. Решение задачи поиска кратчайших путей между всеми парами пунктов назначения, используя алгоритм Флойда. Разработка интерфейса программы, с использованием среды Delphi Borland Developer Studio.
курсовая работа [2,0 M], добавлен 26.07.2014Описание алгоритма решения транспортной задачи по планированию перевозки зерна. Ход решения задачи вручную, в программе TORA методом наименьшего элемента, с помощью MS Excel. Разработка программы для решения задачи в общем виде средствами Delphi.
курсовая работа [2,5 M], добавлен 22.11.2012Особенности решения транспортной задачи распределительным методом и анализ результатов. Построение математической модели, алгоритма. Создание программы для решения транспортной задачи распределительным методом в программной среде Borland Delphi 7.
курсовая работа [1000,7 K], добавлен 23.06.2012Формирование текстового документа с именем goto.cpp., содержимое которого взято из русифицируемой справки MSDN по оператору безусловного перехода. Выбор оптимального алгоритма решения задачи, разработка интерфейса, отладка и тестирование программы.
курсовая работа [499,8 K], добавлен 10.11.2009Разработка программных продуктов на языке программирования Borland Delphi. Применяемые таблицы и связи между ними. Пользовательский интерфейс работы с базой данных. Алгоритм работы программы "Футбольные команды и игроки". Защита от ввода неверных данных.
курсовая работа [788,1 K], добавлен 22.06.2011Оптимизация затрат на доставку продукции потребителям. Характеристика транспортной задачи, общий вид решения, обобщение; содержательная и математическая постановка задачи, решение с помощью программы MS Excel: листинг программы, анализ результатов.
курсовая работа [514,8 K], добавлен 04.02.2011Разработка программы проверки знаний для тестирования студентов по программированию с кодом на языке Delphi. Проектирование визуального интерфейса и словесный алгоритм работы программы. Алгоритмы разработанных процедур и функций, инструкция пользователя.
курсовая работа [506,5 K], добавлен 21.02.2011Задача для проведения теплофизического расчета с помощью программы написанной на языке Pascal. Модуль программы, позволяющий определить и рассчитать параметры для решения задачи теплофизического расчета. Блок-схема, отображающая основные действия.
методичка [17,5 K], добавлен 02.09.2010Математическая формулировка задачи, принципиальная схема гидравлического демпфера. Структурная схема программы связи модулей, реализованной на языке высокого уровня Borland Delphi 7.0. Ее описание, руководство пользователя, особенности тестирования.
курсовая работа [140,0 K], добавлен 29.05.2013