Нахождение оптимальных путей транспортировки груза при нестабильной загрузке дорог

Экономическая характеристика компании. Оценка динамики использования производственных мощностей. Разработка рациональных путей и способов транспортирования товаров. Решение транспортной задачи с помощью программы, написанной на языке 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.