Описание постоянных величин
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.