Решение транспортной задачи методом Фогеля

Автор работы: Пользователь скрыл имя, 01 Марта 2013 в 17:48, реферат

Описание работы

Транспортная задача линейного программирования получила в настоящее время широкое распространение в теоретических обработках и практическом применении на транспорте и в промышленности. Особенно важное значение она имеет в деле рационализации поставок важнейших видов промышленной и сельскохозяйственной продукции, а также оптимального планирования грузопотоков и работы различных видов транспорта.

Содержание работы

Введение4
1Аналитическая часть5
2Технологическая часть6

Заключение15

Список литературы26
javascript:save_paper(1558940)
Приложения А Текст программы27

Файлы: 1 файл

пОЯСНИТ ЗАПИСКА по МОДЕЛИРОВАНИю.doc

— 767.00 Кб (Скачать файл)

 

  1. Технологическая часть

    1. Назначение и цель создания

 

Главной задачей было изучение темы «Решение транспортной задачи методом Фогеля». Задача была предложена в качестве темы для курсового  проекта по предмету «Моделирование производственных и экономических процессов». Так же целью создания программы было практическое закрепление навыков программирования и изучение языка Delphi.

 

    1. Требование к системе

      1. Требования к функциям системы

 

Программа предназначена  для использования на ПК.

Для выполнения корректной работы этой программы необходимы:

  1. Процессор не ниже Pentium 2;
  2. Операционная система Windows 95, 98, 2000, XP;
  3. Оперативная память не меньше 125 Мб;
  4. Клавиатура, мышь;
  5. Цветной монитор SVGA.

 

      1. Требования к интерфейсу пользователя

 

Требования, предъявляемые  к интерфейсу пользователя, приведены ниже:

  • Программа содержит несколько рабочих форм, на которых расположены все функциональные элементы, что очень удобно и просто.
  • Программа содержит эргономичный интерфейс, что позволяет каждому пользователю без предварительного обучения работать с этим приложением.
  • В данной программе была создана детальная, предельно понятная справочная система, которая описывает все этапы работы с программой, от введения исходных значений, до выхода из программы.

 

      1. Требования к защите информации

 

Программа проверяет  правильность введенных пользователем значений, а именно не даст решить задачу при неверно введенных данных таких как, например: буква вместо числа, любой знак вместо числа, так же пока таблица не будет заполнена полностью. Если количество потребностей  не равно количеству запасов, то добавляется строка или столбец, для того чтобы уровнять запасы и потребности.

 

    1. Перечень и описание входных данных

 

В качестве входных данных для программы выступают следующие  элементы:

  1. Количество поставщиков 
  2. Количество потребителей
  3. Количество запасов и потребностей
  4. Стоимости перевозок

 

2.4 Руководство к использованию и эксплуатации

 

Рисунок 2.2 – Общий вид окна заставки программы.

 

Для входа в главное  окно программы необходимо кликнуть мышью на клавишу «Вход». Далее откроется окно программы, на которой будут происходить расчеты. Общий вид окна программы приведен на рисунке 2.3 ниже.



Рисунок 2.3 – Общий вид окна программы.

 

Ниже описаны основные элементы окна программы:

  1. Кнопка «Задать размер». После нажатия клавиши на экране  видим окно, в котором задается количество поставщиков и потребителей (смотреть Рисунок 2.4).

 

Рисунок 2.4 – Окно ввода количества поставщиков и потребителей.

 

  1. Кнопка «Посчитать», производит вычисления, появляется после задания размера матрицы перевозок.
  2. Кнопка «Очистить таблицу», очищает поля таблицы от данных.
  3. Кнопка «О программе» выводит данные о создателях приложения.
  4. Кнопка «Меню». После нажатия клавиши появляется меню, имеющие кнопки: «Помощь» - выводит файл справку, «Выход» - закрывает приложение.
  5. Таблица ввода дынных.

Просмотр результата выполнения программы после нажатия кнопки «Посчитать». Полученный опорный будет выведен в таблицу ввода первоначальных данных. Общий вид ответа приведен на рисунке 2.6 ниже.

 

Рисунок 2.6 – Просмотр ответа.

 

Ниже приведены этапы работы с программой:

  1. Ввод количества строк и столбцов.
  2. Заполнение таблицы стоимостей перевозок, ввод количества запасов и потребностей.
  3. Расчет опорного плана перевозок методом Фогеля.

Просмотр справки вызывается нажатием кнопки «Справка» в главном  меню. Она содержит подробное описание работы с программой. Общий вид  справки приведен на рисунке 2.7 ниже.

 

Рисунок 2.7 – Справка.

 

    1. Результаты экспериментальной проверки

 

После окончательной отладки программы была произведена серия тестов на решение задач автоматически и вручную. Результаты работы программы совпали с результатами, вычисленными вручную, что подтверждает правильность работы программы. 
Заключение

 

В процессе выполнения курсового проекта была написана программа для решения транспортной задачи методом Фогеля, с использованием ЭВМ. Был глубоко изучен язык программирования DELPHI, многие его компоненты  и закреплены навыки объектно-ориентированного программирования. Так же была изучена тема «Решение транспортной задачи методом Фогеля». 

Курсовой проект состоит из двух частей – пояснительной записки, в корой рассмотрены все теоретические сведения, и программы, позволяющей автоматизировать процесс построения опорного плана методом Фогеля.

 

Список использованной литературы

 

1. Исследование  операций под редакцией Кремера

2. А.И.   Ларионов,  А.В. Юрченко – Экономико-математические   методы   в планировании

3. Н.Ш.    Кремер - Математическое    моделирование    и    модели    в планировании

  1. С. Вентцель - Исследование операций
  2. А. Калихман  - Сборник задач по математическому программированию
  3. Н.А.Осадчая – Моделирование производственных и экономических процессов, курс лекций, колледж ВКГТУ, Усть-Каменогорск, 2007 / с.
  4. Гофман В.Э., Мещеряков Е., Никифоров В.В., Хомоненко А.Д. Delphi 7 в подлиннике;
  5. Баженова И.Ю. Delphi 7: Самоучитель программиста;
  6. Белов В.В., Чистякова В.И. Программирование в Delphi: процедурное, объектно-ориентированное;
  7. А.Н. Вальвачев, К.А. Сурков, Д.А. Сурков, Ю.М. Четырько. Программирование на языке Delphi. Учебное пособие. — 2005.;
  8. Фленов Михаил - Библия Delphi 2007

 

 

 

 

 

 

 

 

 

 

Приложения А

Листинг программы

 

 

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,smin,o,o1:integer;

  prv,prv2,prv3:boolean;

implementation

uses Unit2, Unit3, Unit4, Unit5;

{$R *.dfm}

//Вывод ошибки «только  цифры»

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,

ARow: Integer; const Value: String);

begin

if value<>'' then

try

mass1[acol,arow]:=strtoint(value);

except on Econverterror do begin showmessage(Только цифры!!!'); stringgrid1.cells[acol,arow]:=' '; end;end;

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]:=inttostr(mass1[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:integer);

var

B : TBitmap;

begin

B := TBitmap.Create;

if pos=1 then

B.LoadFromFile ('1.bmp') else B.LoadFromFile ('2.bmp');

form1.stringGrid1.Canvas.CopyRect(form1.stringGrid1.CellRect(vert, hor),

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(stringgrid1.Cells[j,i]);

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.Canvas.textout(j*51+34,

i*51+5,StringGrid1.Cells[j,i]);end;

StringGrid1.Canvas.textout(j*51+10,

i*51+30,inttostr(mass1[j,i]));end;

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.Cells[j,i]);

if (j=stolb+1) and (i<>strok+1) then potr:=potr+strtoint(stringgrid1.Cells[j,i]);end;

if zap=potr then begin prv2:=true;stringgrid1.Cells[stolb+1,strok+1]:=inttostr(zap)+'='+inttostr(potr);end end;

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(stringgrid1.cells[j,i])*mass1[j,i];end;

if sc=(strok+stolb-1) then

label5.Caption:='невырожденный' else 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,max1,max2:integer;

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]:=inttostr(min);

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]:=inttostr(min);

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]='')then begin if mass1[j,i]<>strtoint(stringgrid3.Cells[k,i-1]) then min:=mass1[j,i];end;

stringgrid3.Cells[k,i-1]:=inttostr(abs(strtoint(stringgrid3.Cells[k,i-1])-min));

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]) then min:=mass1[j,i];end;

stringgrid2.Cells[j-1,k]:=inttostr(abs(strtoint(stringgrid2.Cells[j-1,k])-min));

min:=100;

end;

{ýòàï 2}

max1:=0;

for j:=1 to stolb do if strtoint(stringgrid2.Cells[j-1,k])>max1 then begin max1:=strtoint(stringgrid2.Cells[j-1,k]);y:=j;end;

for i:=1 to strok do if strtoint(stringgrid3.Cells[k,i-1])>max2 then begin max2:=strtoint(stringgrid3.Cells[k,i-1]);x:=i;end;

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]:='-';end;

stringgrid1.Cells[y,x]:=inttostr(zapas);

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]:='-';end;

stringgrid1.Cells[y,x]:=inttostr(zapas-lol);

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]:='-';end;

stringgrid1.Cells[y,x]:=inttostr(zapas);

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.Cells[j,i]);

if (j=stolb+1) and (i<>strok+1) then potr:=potr+strtoint(stringgrid1.Cells[j,i]);end;

except on Econverterror do begin showmessage(Таблица заполнена не полностью!!!');

prv3:=false;

end;

end;

if potr>zap then begin

stringgrid1.ColCount:=stringgrid1.ColCount+1;

stolb:=stolb+1;

for i:=1 to strok do stringgrid1.Cells[stolb+1,i]:=stringgrid1.Cells[stolb,i];

for i:=1 to strok do stringgrid1.Cells[stolb,i]:='0';

Информация о работе Решение транспортной задачи методом Фогеля