Автор работы: Пользователь скрыл имя, 08 Апреля 2011 в 09:11, дипломная работа
Транспортная задача является классической задачей исследования операций. Множество задач распределения ресурсов сводится именно к этой задаче. Распределительные задачи связаны с распределением ресурсов по работам, которые необходимо выполнить. Задачи этого класса возникают тогда, когда имеющихся в наличии ресурсов не хватает для выполнения каждой работы наиболее эффективным образом. Поэтому целью решения задачи, является отыскания такого распределения ресурсов по работам, при котором либо минимизируются общие затраты, связанные с выполнением работ, либо максимизируется получаемый в результате общий доход
Введение 4
1 Исследовательская часть 5
1.1 Описание и анализ предметной области 5
1.2 Обзор используемых элементов языка и среды программирования 11
2 Технологическая часть 16
2.1 Постановка задачи 16
2.2 Реализация модели математическим методом 17
2.3 Выбор архитектуры приложения 28
2.4 Структурные и функциональные схемы 29
2.5 Проектирование интерфейса пользователя 30
3 Специальная часть 32
3.1 Описание разрабатываемых процедур и функций 32
3.2 Таблица идентификаторов 34
3.3 Выбор стратегии тестирования и разработка тестов 35
4 Мероприятия по охране труда и технике безопасности 39
4.1 Освещение 40
4.2 Микроклимат 40
4.3 Эргономичность 42
4.4 Техника безопасности 47
5 Экономическая часть 49
5.1 Расчет стоимости разработки 49
5.2 Расчет экономического эффекта от внедрения программного обеспечения 58
Заключение 60
Список используемых источников 62
Приложение
После запуска необходимо ввести количество поставщиков и потребителей в соответствующие поля в верхней части диалогового окна программы и нажать на кнопку «Новый расчёт», либо оставить эти значения без изменений (по умолчанию, два и два соответственно).
Рисунок Б.1 – Графический интерфейс приложения
Затем
вводятся данные в таблицу. Программа
исключает возможность ввода некорректных
данных, при попытке его произвести пользователь
увидит соответствующее сообщение.
ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ Б
Рисунок Б.2 – Реакция программы на ввод некорректных данных
Значение
в таблицу заносятся
После
ввода исходных данных необходимо нажать
на кнопку Расчёт, после этого будут выведены
оптимальный план перевозок и значение
целевой функции для задачи.
ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ Б
Рисунок Б.3 – Результат работы программы
Для получения справочной информации о программе предназначена кнопка «Справка». Окно с инструкцией по использованию выводится в не модальном режиме, что не мешает одновременно использовать основное окно программы и читать руководство пользователя.
Получить
сведения о разработчике приложения
можно с помощью кнопки «О программе».
ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ Б
Рисунок Б.4 – Диалоговое окно «Справочная информация»
Рисунок Б.5 – Диалоговое окно «О программе»
Выход из программы осуществляется с помощью кнопки «Выход». Если при выходе в таблицу вводились какие-либо данные, программа выдаст предупреждение, что после закрытия все введённые или полученные в результате работы параметры будут утеряны. Аналогичное сообщение выводится при нажатии на кнопку «Новый расчёт» при внесённых в таблицу данных.
Рисунок
Б.6 – Предупреждение об утере данных
при закрытии программы
ПРИЛОЖЕНИЕ В
ЛИСТИНГ
ПРОГРАММЫ
Transport.dpr
program
Transport;
uses
Forms,
TR_MainForm in 'TR_MainForm.pas' {fMain},
TR_AlignEdit in 'TR_AlignEdit.pas',
TR_Decision in 'TR_Decision.pas',
TR_AboutForm in 'TR_AboutForm.pas' {fAbout},
TR_HelpForm in 'TR_HelpForm.pas' {fHelp};
{$R *.res}
{$R
help.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := 'Решение транспортной задачи';
Application.CreateForm(TfMain, fMain);
Application.CreateForm(
Application.CreateForm(TfHelp, fHelp);
Application.Run;
end.
TR_AlignEdit.pas
unit
TR_AlignEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TAlign = (eaLeft, eaCenter, eaRight);
TAlignEdit = class(TEdit)
private
FAlign: TAlign;
procedure SetAlign(const Value: TAlign);
protected
property Alignment: TAlign read FAlign write SetAlign default eaLeft;
end;
procedure
Register;
implementation
constructor TAlignEdit.Create(Aowner: TComponent);
begin
ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ В
inherited Create(AOwner);
FAlign := eaLeft;
end;
procedure TAlignEdit.SetAlign(const Value: TAlign);
begin
if FAlign <> Value then
begin
FAlign := Value;
RecreateWnd;
end;
end;
procedure TAlignEdit.CreateParams(var Params: TCreateParams);
begin
inherited;
case FAlign of
eaLeft: Params.Style := Params.Style or ES_LEFT;
eaCenter: Params.Style := Params.Style or ES_CENTER;
eaRight: Params.Style := Params.Style or ES_RIGHT;
end;
end;
procedure Register;
begin
RegisterComponents('
end;
end.
TR_Decision.pas
unit
TR_Decision;
interface
uses
Windows, Math, Contnrs, SysUtils;
type
TMatrix = array of array of Double;
TVector = array of Double;
TTransportTaskType = (tttClosed, // Закрытая задача
tttSurplus, // Открытая задача, избыток запасов
tttShortage); // Открытая задача, дефицит запасов
TTransportTask = class
private
FNeedSumm: Double;
FStockSumm: Double;
DF: Double;
FTaskType: TTransportTaskType;
FCalculated: Boolean;
CC, SC: Longword;
C, X: TMatrix;
Need, Stock: TVector;
ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ В
function VectorSumm(V: TVector): Double;
public
constructor Create(SuppliersCount, ConsumersCount: Longword);
destructor Destroy;
procedure SetInputData(APrices: TMatrix; ANeed, AStock: TVector);
procedure Calculate;
procedure GetOutputData(out XValues: TMatrix);
property NeedSumm: Double read FNeedSumm;
property StockSumm: Double read FStockSumm;
property TaskType: TTransportTaskType read FTaskType;
property SuppliersCount: Longword read SC;
property ConsumersCount: Longword read CC;
property DestFunction: Double read DF;
end;
implementation
uses
TR_MainForm;
type
TTRCoord = class
public
I, J: Longword;
constructor Create(I, J: Longword);
end;
const
HighDouble = 1.7E308;
{
TTransportTask }
procedure TTransportTask.Calculate;
var
D: TMatrix;
U, V: TVector;
I, J: Longword;
L: TObjectList;
MinD, F: Double;
MinP: TTRCoord;
B: array of array of Boolean;
function PlanIsOptimal: Boolean;
var
I, J: Longword;
begin
Result := True;
for I := 0 to CC - 1 do
for J := 0 to SC - 1 do
if D[I, J] < 0 then
begin
Result := False;
Exit;
end;
end;
function ValueAtPoint(P: TTRCoord): Double;
begin
ПРОДОЛЖЕНИЕ ПРИЛОЖЕНИЯ В
Result := X[P.I, P.J];
end;
procedure SetValueAtPoint(P: TTRCoord; Value: Double);
begin
X[P.I, P.J] := Value;
end;
function GetCycle(P: TTRCoord; O: Boolean = True): Boolean;
var
I: Longword;
AP: TTRCoord;
begin
Result := False;
AP := TTRCoord.Create(0, 0);
if O then
for I := 0 to SC - 1 do
begin
if I = P.J then
Continue;
if (P.I = MinP.I) and (I = MinP.J) and (P.J <> MinP.J) then
begin
Result := True;
L.Add(TTRCoord.Create(P.I, P.J));
Exit;
end;
if B[P.I, I] then
begin
Result := True;
AP.I := P.I;
AP.J := I;
if GetCycle(AP, not O) then
begin
L.Add(TTRCoord.Create(P.I, P.J));
Break;
end;
end;
end
else
for I := 0 to CC - 1 do
begin
if I = P.I then
Continue;
if (I = MinP.I) and (P.J = MinP.J) and (P.I <> MinP.I) then
Информация о работе Разработка программы "Организация перевозок"