Автор работы: Пользователь скрыл имя, 01 Марта 2013 в 17:48, реферат
Транспортная задача линейного программирования получила в настоящее время широкое распространение в теоретических обработках и практическом применении на транспорте и в промышленности. Особенно важное значение она имеет в деле рационализации поставок важнейших видов промышленной и сельскохозяйственной продукции, а также оптимального планирования грузопотоков и работы различных видов транспорта.
Введение4
1Аналитическая часть5
2Технологическая часть6
Заключение15
Список литературы26
javascript:save_paper(1558940)
Приложения А Текст программы27
Главной задачей было изучение темы «Решение транспортной задачи методом Фогеля». Задача была предложена в качестве темы для курсового проекта по предмету «Моделирование производственных и экономических процессов». Так же целью создания программы было практическое закрепление навыков программирования и изучение языка Delphi.
Программа предназначена для использования на ПК.
Для выполнения корректной работы этой программы необходимы:
Требования, предъявляемые к интерфейсу пользователя, приведены ниже:
Программа проверяет правильность введенных пользователем значений, а именно не даст решить задачу при неверно введенных данных таких как, например: буква вместо числа, любой знак вместо числа, так же пока таблица не будет заполнена полностью. Если количество потребностей не равно количеству запасов, то добавляется строка или столбец, для того чтобы уровнять запасы и потребности.
В качестве входных данных
для программы выступают
Рисунок 2.2 – Общий вид окна заставки программы.
Для входа в главное окно программы необходимо кликнуть мышью на клавишу «Вход». Далее откроется окно программы, на которой будут происходить расчеты. Общий вид окна программы приведен на рисунке 2.3 ниже.
Рисунок 2.3 – Общий вид окна программы.
Ниже описаны основные элементы окна программы:
Рисунок 2.4 – Окно ввода количества поставщиков и потребителей.
Просмотр результата выполнения программы после нажатия кнопки «Посчитать». Полученный опорный будет выведен в таблицу ввода первоначальных данных. Общий вид ответа приведен на рисунке 2.6 ниже.
Рисунок 2.6 – Просмотр ответа.
Ниже приведены этапы работы с программой:
Просмотр справки вызывается нажатием кнопки «Справка» в главном меню. Она содержит подробное описание работы с программой. Общий вид справки приведен на рисунке 2.7 ниже.
Рисунок 2.7 – Справка.
После окончательной отладки программы была
произведена серия тестов на решение задач
автоматически и вручную. Результаты работы
программы совпали с результатами, вычисленными
вручную, что подтверждает правильность
работы программы.
Заключение
В процессе выполнения курсового проекта была написана программа для решения транспортной задачи методом Фогеля, с использованием ЭВМ. Был глубоко изучен язык программирования DELPHI, многие его компоненты и закреплены навыки объектно-ориентированного программирования. Так же была изучена тема «Решение транспортной задачи методом Фогеля».
Курсовой проект состоит из двух частей – пояснительной записки, в корой рассмотрены все теоретические сведения, и программы, позволяющей автоматизировать процесс построения опорного плана методом Фогеля.
1. Исследование операций под редакцией Кремера
2. А.И. Ларионов, А.В. Юрченко – Экономико-математические методы в планировании
3. Н.Ш. Кремер - Математическое моделирование и модели в планировании
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit1, Unit5;
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
form3.Hide;
form1.show;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
Close;end;
procedure TForm3.Button3Click(Sender: TObject);
begin
Application.HelpContext(0);
end;end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls, Buttons, ShellAPi, ComCtrls, jpeg;
type
TForm1 = class(TForm)
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
StringGrid2: TStringGrid;
StringGrid1: TStringGrid;
StringGrid3: TStringGrid;
Button4: TButton;
Button3: TButton;
Image1: TImage;
Label4: TLabel;
Label6: TLabel;
Label3: TLabel;
Label5: TLabel;
Button5: TButton;
procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
procedure Button1Click(Sender: TObject);
procedure draw(pos,vert,hor:integer);
procedure shag1;
procedure shag3;
procedure shag4;
procedure shag5;
procedure shag6;
procedure shag8;
procedure shag0;
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
mass1:array[1..20,1..20] of integer;
stolb,strok,c1,c2,c3,c4,k,p,
prv,prv2,prv3:boolean;
implementation
uses Unit2, Unit3, Unit4, Unit5;
{$R *.dfm}
//Вывод ошибки «только цифры»
procedure TForm1.StringGrid1SetEditText(
ARow: Integer; const Value: String);
begin
if value<>'' then
try
mass1[acol,arow]:=strtoint(
except on Econverterror do begin showmessage(Только цифры!!!');
stringgrid1.cells[acol,arow]:=
end;
// Кнопка посчитать
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
for o:=0 to 0 do begin
if p=1 then begin
for i:=1 to strok do
for j:=1 to stolb do
stringgrid1.Cells[j,i]:=
end;
shag0;
k:=0;
prv3:=false;
shag5;
if prv2=true then begin
shag1;
if prv3=false then begin
shag4;
while prv=false do
case o of
0:shag8;
end;
timer1.Enabled:=true;
shag6;
end;
end else showmessage(‘Запасы не равны потребностям');
p:=1;
end;
end;
//Загрузка картинок
procedure TForm1.draw(pos,vert,hor:
var
B : TBitmap;
begin
B := TBitmap.Create;
if pos=1 then
B.LoadFromFile ('1.bmp') else B.LoadFromFile ('2.bmp');
form1.stringGrid1.Canvas.
b.Canvas, Rect(0, 0, b.Height, b.Width));
end;
procedure TForm1.shag1;
var i,j:integer;
begin
try
for i:=1 to strok do
for j:=1 to stolb do
mass1[j,i]:=strtoint(
except on Econverterror do begin showmessage(Запасы не равны потребностям ');
prv3:=true;end;end;
for i:=1 to strok do
for j:=1 to stolb do
stringgrid1.Cells[j,i]:='';
end;
// Координаты чисел
procedure TForm1.shag3;
var i,j:integer;
buf:string;
begin
for i:=1 to strok do
for j:=1 to stolb do begin
if StringGrid1.cells[j,i]='-' then draw(2,j,i) else
begin draw(1,j,i);StringGrid1.
i*51+5,StringGrid1.Cells[j,i])
StringGrid1.Canvas.textout(j*
i*51+30,inttostr(mass1[j,i]));
end;
//Кнопка очистить таблицу
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
timer1.Enabled:=false;
for i:=1 to strok+1 do
for j:=1 to stolb+1 do
stringgrid1.Cells[j,i]:='';
button1.Enabled:=true;
timer1.Interval:=1;
end;
procedure TForm1.shag4;
var
ind,i,j:integer;
begin
ind:=0;
for i:=1 to strok do
for j:=1 to stolb do
if stringgrid1.Cells[j,i]='' then inc(ind);
if ind=0 then prv:=true else prv:=false;
end;
// Заполнение запасов и потребностей
procedure TForm1.shag5;
var i,j,zap,potr:integer;
begin
zap:=0;potr:=0;
for i:=1 to strok+1 do
for j:=1 to stolb+1 do begin
if (i=strok+1) and (j<>stolb+1) then
zap:=zap+strtoint(stringgrid1.
if (j=stolb+1) and (i<>strok+1) then
potr:=potr+strtoint(stringgrid
if zap=potr then begin prv2:=true;stringgrid1.Cells[
procedure TForm1.Timer1Timer(Sender: TObject);
begin
shag3;
timer1.Interval:=10000;end;
//Проверяет вырожденный или невырожденный
procedure TForm1.shag6;
var i,j,sc,col:integer;
begin
sc:=0;
col:=0;
for i:=1 to strok do
for j:=1 to stolb do
if stringgrid1.cells[j,i]<>'-' then
begin inc(sc);col:=col+strtoint(
if sc=(strok+stolb-1) then
label5.Caption:='невырожденный
label6.Caption:=inttostr(col);
if col<smin then begin smin:=col;o1:=o;end;
end;
// Алгоритм Метода Фогеля
procedure TForm1.shag8;
var i,j,min,x,y,zapas,potreb,lol,
begin
{ýòàï 1}
min:=100;
for i:=1 to strok do begin
for j:=1 to stolb do
if (mass1[j,i]<min) and (stringgrid1.cells[j,i]='') then begin min:=mass1[j,i];x:=i;y:=j;end;
stringgrid3.Cells[k,i-1]:=
min:=100;
end;
min:=100;
for j:=1 to stolb do begin
for i:=1 to strok do
if (mass1[j,i]<min) and (stringgrid1.cells[j,i]='') then begin min:=mass1[j,i];end;
stringgrid2.Cells[j-1,k]:=
min:=100;
end;
min:=100;
for i:=1 to strok do begin
for j:=1 to stolb do
if (mass1[j,i]<min)and (stringgrid1.cells[j,i]='')
stringgrid3.Cells[k,i-1]:=
min:=100;
end;
min:=100;
for j:=1 to stolb do begin
for i:=1 to strok do
if (mass1[j,i]<min)and (stringgrid1.cells[j,i]='')
then begin if mass1[j,i]<>strtoint(
stringgrid2.Cells[j-1,k]:=
min:=100;
end;
{ýòàï 2}
max1:=0;
for j:=1 to stolb do if strtoint(stringgrid2.Cells[j-
for i:=1 to strok do if strtoint(stringgrid3.Cells[k,
zapas:=mass1[stolb+1,x];
potreb:=mass1[y,strok+1];
lol:=zapas-potreb;
if lol=0 then begin
mass1[stolb+1,x]:=0;
mass1[y,strok+1]:=0;
for i:=1 to strok do
for j:=1 to stolb do
if (i=x) or (j=y) then
if stringgrid1.Cells[j,i]='' then begin stringgrid1.Cells[j,i]:='-';
stringgrid1.Cells[y,x]:=
end;
if lol>0 then begin
mass1[stolb+1,x]:=lol;
mass1[y,strok+1]:=0;
for i:=1 to strok do
for j:=1 to stolb do
if (j=y) then
if stringgrid1.Cells[j,i]='' then begin stringgrid1.Cells[j,i]:='-';en
stringgrid1.Cells[y,x]:=
end;
if lol<0 then begin
mass1[stolb+1,x]:=0;
mass1[y,strok+1]:=abs(lol);
for i:=1 to strok do
for j:=1 to stolb do
if (i=x) then
if stringgrid1.Cells[j,i]='' then begin stringgrid1.Cells[j,i]:='-';
stringgrid1.Cells[y,x]:=
end;
shag4;inc(k);
end;
procedure TForm1.shag0;
var i,j,zap,potr:integer;
begin
zap:=0;potr:=0;
try
for i:=1 to strok+1 do
for j:=1 to stolb+1 do begin
if (i=strok+1) and (j<>stolb+1) then
zap:=zap+strtoint(stringgrid1.
if (j=stolb+1) and (i<>strok+1) then
potr:=potr+strtoint(
except on Econverterror do begin showmessage(Таблица заполнена не полностью!!!');
prv3:=false;
end;
end;
if potr>zap then begin
stringgrid1.ColCount:=stringgr
stolb:=stolb+1;
for i:=1 to strok do stringgrid1.Cells[stolb+1,i]:=
for i:=1 to strok do stringgrid1.Cells[stolb,i]:='
Информация о работе Решение транспортной задачи методом Фогеля