вариант 5

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Программирование
  • 66 66 страниц
  • 3 + 3 источника
  • Добавлена 15.05.2009
1 496 руб.
  • Содержание
  • Часть работы
  • Список литературы
Содержание

Введение
Постановка задачи.
Терминология.
Алгоритм программы
Инструкция к программе.
Исходный код программы
Результаты моделирования
Выводы
Заключение
Список литературы


Фрагмент для ознакомления

dfm}


{ TSRExponential }

function TSRUniform.GetDelay: real;
begin
// Получение интервала времени до следующей заявки (машины)
Result:=self.m+(2*Random-1)*sigma;
end;



{ TTVCheckerModel }

procedure TTVCheckerModel.AddCaptionsToFile(AFileName: string);
var F:TextFile;
begin
Assign(F,AFileName);
Append(F);
write(f,'Успешно обслужено;');
write(f,'Потеряно;');
write(f,'Среднее количество телевизоров, ожидающих проверки;');
write(f,'Макисмальное количество телевизоров, ожидающих проверки;');
write(f,'Среднее время ожидания проверки;');
write(f,'Среднее количество телевизоров, ожидающих наладки;');
write(f,'Макисмальное количество телевизоров, ожидающих наладки;');
write(f,'Среднее время ожидания наладки;');
write(f,'Загрузка наладчика;');
write(f,'Загрузка первого тестировщика;');
writeln(f,'Загрузка второго тестировщика');

Close(f);
end;

procedure TTVCheckerModel.AddResultsToFile(AFileName: string);
var F:TextFile;
begin
Assign(F,AFileName);
Append(F);

write(f,SuccCount,';');
write(f,DiscCount,';');

write(f,AvgCheQueLength:5:3,';');
write(f,CheckerQueue.CalcMaxCount:5,';');
write(f,AvgCheQueTime/TimeSize:5:3,';');
write(f,AvgTunQueLength:5:3,';');
write(f,TunerQueue.CalcMaxCount:5,';');
write(f,AvgTunQueTime/TimeSize:5:3,';');
write(f,AvgTunLength:5:3,';');
write(f,AvgChe1Length:5:3,';');
writeln(f,AvgChe2Length:5:3);
Close(f);
end;

procedure TTVCheckerModel.CalculateStats;
var i:integer;
p:real;
AvgTime,St,Et:TDateTime;

begin

for I := 0 to High(SuccStatistics) do
begin
St:=SuccStatistics[I].StartTime;
Et:=SuccStatistics[I].EndTime;

with SuccStatistics[I] do
begin
if ModelTime >0 then p:=-(Et-St)/ModelTime;
if Count >0 then AvgTime:=-(ET-St)/Count;


case PID of
1: // Очередь цеха проверки
begin
AvgCheQueLength:=p;
AvgCheQueTime:=AvgTime;
end;
3:
begin
// Первый настройщик
AvgChe1Length:=p;
AvgChe1Time:=AvgTime;
end;
4:
begin
// Второй настройщик
AvgChe2Length:=p;
AvgChe2Time:=AvgTime;
end;
5: // Очередь цеха наладки
begin
AvgTunQueLength:=p;
AvgTunQueTime:=AvgTime;
end;
6:
begin
// Цех наладки
AvgTunLength:=p;
AvgTunTime:=AvgTime;
end;
end;
end;
end;

end;

destructor TTVCheckerModel.Destroy;
begin
// Освобождение ресурсов
Source.Free;
Tuner.Free;
TunerQueue.Free;
Checkers.Free;
CheckerQueue.Free;

end;

procedure TTVCheckerModel.FullModel;
begin
PID:=0;

// Размерность одной единицы времени - 1 минута
TimeSize:=1/24/60;

// Создаём источник заявок с экспоненциальным распределением
// времени между заявками
Source:=TSRUniform.Create(self);

// Создаём очередь
CheckerQueue:=TQueue.Create(self);

// Создаём обслуживающий многоканальный прибор
// c 3 каналами обслуживания

Checkers:=TMultiUniformChannel.CreateMchUniformDev(self,2,'Проверяющие');


TunerQueue := TQueue.Create(self);
TunerQueue.Name := 'Склад перед настройщиком';

Tuner := TSPUniform.Create(self);

Separator:=TSeparator.Create(self);

// Создаём сток для заявок
Terminator:=TTerminator.Create(self);

// Задаём параметры источника заявок
Source.m:=10;
Source.sigma := 6;
SOurce.Name:='Предпоследний участок';

Tuner.m := 30;
Tuner.sigma := 10;
Tuner.Name := 'Настройщик';

// Соединяем источник с очередью
Source.InsertTo(CheckerQueue);

// Задаём параметры очереди
CheckerQueue.QueueLength := -1;
CheckerQueue.Name:='Склад перед проверяющими';

// Соединяем очередь с прибором и источником заявок
CheckerQueue.InsertTo(Checkers);
CheckerQueue.AddTo(Source);

// Соединяем прибор с очередью и стоком заявок
Checkers.AddTo(CheckerQueue);
Checkers.InsertTo(Separator);
Checkers.m := 20;
Checkers.sigma := 5;

Separator.AddTo(Checkers);

Separator.IfProb := 0.5;
Separator.IfNext := Terminator;
Separator.ElseNext := TunerQueue;

Tuner.AddTo(TunerQueue);
Tuner.InsertTo(CheckerQueue);

TunerQueue.AddTo(Separator);
TunerQueue.InsertTo(Tuner);
TunerQueue.QueueLength:=2;

// Нет предпочтений в выборе проверяющего
Checkers.ISRandomChoose:=true;


// Соединяем сток с прибором
Terminator.AddTo(Separator);

AddUnit(Source);
AddUnit(TunerQueue);
AddUnit(CheckerQueue);
AddUnit(Tuner);
AddUnit(Checkers);
AddUnit(Separator);
AddUnit(Terminator);
end;

procedure TTVCheckerModel.RewriteResultsToFile(AFileName: string);
var F:TextFile;
begin
Assign(F,AFileName);
Rewrite(F);
Close(f);
end;

procedure TfrmMain.btnStartClick(Sender: TObject);
var
i:integer;
p:real;
avgtime:TDateTime;
begin
// Делаем один шаг моделирования до тех пор
// пока модельное время не превысит 8 часов
Fmodel.Reset;
FModel.DiscCount := 0;
FModel.SuccCount := 0;
btnPrepare.Click;

Fmodel.RunTo(StrToFloat(Edit1.Text)/24);
lblModelTime.Caption := FloatToStr(FModel.DiscCount)+'/'+FloatToStr(Fmodel.SuccCount);

// рассчитываем параметры системы
Fmodel.CalculateStats;
edtLog.Lines.Clear;
// выводим их на экран
edtLog.Lines.Add(Format('%s %f',['Среднее количество телевизоров, ожидающих проверки',FModel.AvgCheQueLength]));
edtLog.Lines.Add(Format('%s %d',['Макисмальное количество телевизоров, ожидающих проверки',FModel.CheckerQueue.CalcMaxCount]));
edtLog.Lines.Add(Format('%s %f',['Среднее время ожидания проверки',FModel.AvgCheQueTime/Fmodel.TimeSize]));
edtLog.Lines.Add(Format('%s %f',['Среднее количество телевизоров, ожидающих наладки',FModel.AvgTunQueLength]));
edtLog.Lines.Add(Format('%s %d',['Макисмальное количество телевизоров, ожидающих наладки',FModel.TunerQueue.CalcMaxCount]));
edtLog.Lines.Add(Format('%s %f',['Среднее время ожидания наладки',FModel.AvgTunQueTime/Fmodel.TimeSize]));
edtLog.Lines.Add(Format('%s %f',['Загрузка наладчика',FModel.AvgTunLength]));
edtLog.Lines.Add(Format('%s %f',['Загрузка первого тестировщика',FModel.AvgChe1Length]));
edtLog.Lines.Add(Format('%s %f',['Загрузка второго тестировщика',FModel.AvgChe2Length]));
edtLog.Lines.Add(Format('%s %d',['Потеряно заявок',FModel.DiscCount]));
edtLog.Lines.Add(Format('%s %d',['Успешно обслужено',FModel.SuccCount]));

end;

procedure TfrmMain.btnStepClick(Sender: TObject);
var i,j:integer;
p:real;
begin
// Проводим один шаг моделирования
FModel.Step;
lblModelTime.Caption := FloatToStr(FModel.DiscCount)+'+'+FloatToStr(Fmodel.SuccCount);
end;

procedure TfrmMain.btnToFileClick(Sender: TObject);
var Filename:String;
I: Integer;
begin
Filename := ExtractFilePath(Application.ExeName)+'\out.csv';

btnPrepare.Click;


FModel.RewriteResultsToFile(Filename);
FModel.AddCaptionsToFile(Filename);
for I := 1 to 500 do
begin
Fmodel.Reset;
Fmodel.RunTo(StrToFloat(Edit1.Text)/24);
Fmodel.CalculateStats;
FModel.AddResultsToFile(Filename);
Application.ProcessMessages;
end;
end;

procedure TfrmMain.btnPrepareClick(Sender: TObject);
begin
// Подготавливаем модель
FModel.Start;

// Задаём параметры модели
Fmodel.CheckerQueue.QueueLength:=StrToIntDef(self.edtCheckersQueueLength.Text,0);
Fmodel.TunerQueue.QueueLength:=StrToIntDef(self.edtCQL.Text,0);
FModel.Source.m := StrToFloat(self.edtSm.Text);
FModel.Source.sigma := StrToFloat(self.edtSSigma.Text);
FModel.Tuner.m := StrToFloat(self.edtTM.Text);
FModel.Tuner.sigma := StrToFloat(self.edtTS.Text);
Fmodel.Checkers.m := StrToFloat(self.edtChM.Text);
Fmodel.Checkers.sigma := StrToFloat(self.edtChSigma.Text);
FModel.Separator.IfProb := StrToFloat(self.edtTestLevel.Text);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
// Создание объекта - модели
FModel:=TTVCheckerModel.Create;
Fmodel.FullModel;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
// Осовбождение объекта - модели
FModel.Free;
end;
{ TSDUniform }

function TSPUniform.GetDelay: real;
begin
Result:=self.m+(2*Random-1)*sigma;
end;

{ TMultiUniformChannel }

class function TMultiUniformChannel.CreateMchUniformDev(AModel: TModel;
ADevCount: integer; AName: string): TMultiUniformChannel;
var i:integer;
begin
Result := Create(AModel);
with Result do
begin
// Задаём массив приборов
SetLength(FPribors,ADevCount);
FName:=AName;

for I := 0 to ADevCount - 1 do
begin
// Создаём прибор
FPribors[i]:=TSPUniform.Create(AModel);
// Присваиваем ему составное имя
FPribors[i].Name :=Format(AName+'%d',[i+1]);
// Делаем его следующим относительно многоканального устройства
FPribors[i].AddTo(Result);
// и изначально не заянятым
FPribors[i].FIsBusy:=false;

end;
ISRandomChoose:=false;
PrefDev:=0;
FActive:=false;
FDevCount:=ADevCount;
end;
end;

procedure TMultiUniformChannel.SetFm(Value: real);
var i:integer;
begin
for I := 0 to High(FPribors) do
begin
TSPUniform(FPribors[i]).m := Value;
end;
self.Fm := Value;
end;


procedure TMultiUniformChannel.SetSigma(Value: real);
var i:integer;
begin
for I := 0 to High(FPribors) do
begin
TSPUniform(FPribors[i]).sigma := Value;
end;
self.fsigma := Value;
end;

begin
// Инициализация генератора случайных чисел
Randomize;
end.

Результаты моделирования
(Время моделирования – 8 часов, среднее за 500 прогонов)
Место на складе 1 Место на складе 2 Отброшенных заявок Обслуженных заявок Загрузка 1 контролера Загрузка 2 контролера Загрузка наладчика ∞ 1 3,598 87 0,89 0,89 0,6 ∞ 5 0,366 87,684 0,67 0,91 0,91 ∞ 10 0 87 0,91 0,91 0,66 1 ∞ 10,552 81,614 0,84 0,84 0,56 5 ∞ 1,33 87,644 0,91 0,91 0,66 10 ∞ 0,066 87,424 0,91 0,91 0,68 18 ∞ 0 87,454 0,91 0,91 0,68 18 10 0,0 86,9 0,91 0,91 0,67
Выводы
Как видно из результатов моделирования нулевые потери заявок обеспечивают следующие длины очередей – 18 для очереди перед цехом контроля и 10 для очереди перед цехом наладки. Это означает, что на складе в цехе контроля должно быть предусмотрено место, как минимум, 18 телевизоров; а в цехе наладки – для 10 телевизоров.
Заключение
В данном курсовом проекте была создана программа, реализующая имитационную модель станции технического контроля телевизионного цех, и решена задача выбора оптимальной максимальной длины очередей.
Имитационное моделирование — удобный способ решить задачу исследования поведения системы в случае, если провести эксперименты на реальной модели затруднительно, дорого или вовсе невозможно.
Список литературы
Хомоненко А. Гофман В. Мещеряков Е. Никифоров В. Delphi 7 — Санкт-Петербург: БХВ-Санкт-Петербург, 2006.— 1216 с.
Цифровая имитация автоматизированных систем — Москва: Институт проблем передач информации АН СССР, 1983.— 139 с.
Шенном Р. Имитационное моделирование систем — исскуство и наука; пер с англ. — Москва: Наука, 1985.— 237 с.














1



Присвоить времени следующего события модели время текущего объекта (NextModelTime = Object.NextMesslTime)


Создать события для всех активных узлов, для которых время следующего события равно текущему модельному времени

Да

Нет

Время следующего события текущего объекта меньше времени модели? (Object.NextMesslTime < NextModelTime)

Выбрать следующий активный объект модели

Да

Нет

Продвинуть модельное время к времени следующего события (AModelTime = NextModelTime).

Объекты модели закончились?

Нет

Да

Обработать результаты

Конец

Модельное время больше времени окончания моделирования (ModelTime > EndTime)?

Установить модельное время в 0 (ModelTime=0)

Начало

Список литературы
1.Хомоненко А. Гофман В. Мещеряков Е. Никифоров В. Delphi 7 — Санкт-Петербург: БХВ-Санкт-Петербург, 2006.— 1216 с.
2.Цифровая имитация автоматизированных систем — Москва: Институт проблем передач информации АН СССР, 1983.— 139 с.
3.Шенном Р. Имитационное моделирование систем — исскуство и наука; пер с англ. — Москва: Наука, 1985.— 237 с.