Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая работа1.doc
Скачиваний:
164
Добавлен:
01.05.2014
Размер:
352.77 Кб
Скачать

Описание постоянных величин

S_P_Int=10;

Интервал прихода новой партии деталей

O_Delay=7;

Задержка обработки деталей

B_Delay=6;

Время сборки деталей

R_Delay=8;

Время регулирования изделия

B_Brak=4;

Процент рака при регулировке

ModellingTime = 24*60;

Время моделирования в минутах

Описание переменных величин

S_P_NextTime:Cardinal

Следующая партия придёт в это время

O_NextTime:Cardinal

Обработка завершится в это время

B_NextTime:Cardinal

Сборка завершится в это время

R_NextTime:Cardinal

Регулировка завершится в это время

newPart:Boolean

Флаг – пришла новая партия

QDP:TList

Очередь не обработанных деталей для сборки

QDO:TList

Очередь обработанных деталей для сборки

QO:TList

Очередь не обработанных деталей для обработки

QR:TList

Очередь на регулирование

CurMin:Cardinal

Текущая минута

part:Byte

меняет 0 на 1 и наоборот от партии к партии

BuiltDetails:Cardinal

Собранные изделия

Journal:TList

Журнал Регистрирования размеров очередей

Схемы алгоритмов

Общая схема алгоритма

Блок схема шага имитации:

Блок-схема алгоритма определения следуещего момента наступления времени, распределённого по экспоненциальному закону

Текст программы

Программа написана на ObjectPascal’е.

program modelir;

uses

Classes;

const

S_P_Int = 10;

O_Delay = 7;

B_Delay = 6;

R_Delay = 8;

B_Brak = 4; //%

ModellingTime = 24 * 60;

var

S_P_NextTime: Cardinal; //Следующая партия придёт в это время

O_NextTime: Cardinal; //Обработка завершится в это время

B_NextTime: Cardinal; //сборка завершится в это время

R_NextTime: Cardinal; //Регулировка завершится в это время

newPart: Boolean;

QDP, QDO, QO, QR: TList;

CurMin: Cardinal; //Текущая минута

part: Byte; //меняет TRUE на FALSE и наоборот от партии к партии

BuiltDetails: Cardinal; //Собранные иделия

function NextExpTime(Delay: Cardinal): Cardinal;

begin

// Randomize;

case Random(2) of

0:

Result := CurMin + Delay - Round((-(1 / Delay) * Ln(1 - Random)) * Delay);

else

Result := CurMin + Delay + Round((-(1 / Delay) * Ln(1 - Random)) * Delay);

end; //Case

end;

procedure SetInitialValues;

begin

Randomize;

S_P_NextTime := 0;

O_NextTime := 0;

B_NextTime := 0;

R_NextTime := 0;

NewPart := false;

QDP := TList.Create;

QDO := TList.Create;

QO := TList.Create;

QR := TList.Create;

BuiltDetails := 0;

CurMin := 0;

part := 0;

end;

procedure Simulate;

var

f: Textfile;

i: Integer;

WasBrak: Boolean;

begin

SetInitialValues;

Assign(f, 'c:\1.txt');

Rewrite(f);

while true do

begin

WasBrak := false;

if Curmin = S_P_NextTime then

begin

NewPart := true;

S_P_NextTime := NextExpTime(S_P_Int);

end;

if NewPart = true then

begin

NewPart := false;

if Part = 1 then

begin

QDP.Add(nil);

QDP.Add(nil);

QO.Add(nil);

Part := 0;

end

else if Part = 0 then

begin

QDP.Add(nil);

QO.Add(nil);

QO.Add(nil);

Part := 1;

end;

end;

//Обработка изделия только что закончилась

if (CurMin = O_NextTime) and (CurMin <> 0) then

begin

QDO.Add(nil);

end;

//Очередь на обработку не пуста и обработка не идёт

if (QO.Count > 0) and (CurMin >= O_NextTime) then

begin

QO.Delete(0);

O_NextTime := CurMin + O_Delay;

end;

if (QDP.Count > 0) and (QDO.Count > 0) and (CurMin >= B_NextTime) then

begin

QDP.Delete(0);

QDO.Delete(0);

B_NextTime := CurMin + B_Delay;

end;

if (CurMin = B_NextTime) and (CurMin <> 0) then

begin

//Брак

BuiltDetails := BuiltDetails + 1;

if (BuiltDetails mod Cardinal(Round(100 / B_Brak))) = 0 then

begin

WasBrak := true;

//Ставим их оратно в очереди QDP и QO

QDP.Add(nil);

QO.Add(nil);

//запустим обработку, если можно

if (QO.Count > 0) and (CurMin >= O_NextTime) then

begin

QO.Delete(0);

O_NextTime := CurMin + O_Delay;

end;

end

else

QR.Add(nil); //Не брак

end;

if (QR.Count > 0) and (CurMin >= R_NextTime) then

begin

QR.Delete(0);

R_NextTime := NextExpTime(R_Delay);

end;

if CurMin = ModellingTime then

Break;

CurMin := CurMin + 1;

Writeln(f, CurMin, #32, QDP.Count, #32, QO.Count, #32,

QDO.Count, #32, QR.Count, #32, Byte(WasBrak));

end;

QDP.Free;

QDO.Free;

QO.Free;

QR.Free;

CloseFile(f);

end;

begin

Simulate;

end.