Главная / Моделирование систем / Моделирование производственной системы на основе имитации случайных событий

Моделирование производственной системы на основе имитации случайных событий

Пример 1.5. Предприятие выпускает некоторые изделия, которые продаются по цене 70 денежных единиц (д. е.) за штуку. Затраты на выпуск одного изделия составляют 50 д. е.

При изготовлении изделий возможны два вида брака (A и B), причем одно изделие не может иметь одновременно оба вида брака. С браком вида A выпускается примерно 5% изделий, с браком вида B — 9%. Изделия, имеющие брак, могут быть исправлены; затраты на операции по устранению брака для одного изделия составляют 15 д. е. При этом не всегда удается исправить брак; из изделий, имеющих брак вида A, удается исправить только 60%, а из изделий с браком B — 80%, остальные бракуются окончательно.

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

На рис.1.1 приведена схема алгоритма имитации для данной задачи. В схеме использованы следующие обозначения: tipbrak — переменная, обозначающая тип брака и принимающая одно из трех значений: 0 (брака нет), 1 (брак A) или 2 (брак B); verustrA и verustrB — вероятности устранения брака A и B (0,6 и 0,8); Rustr — СРРЧ, используемая для имитации устранения брака; norm — счетчик изделий, сразу выпущенных без брака; ustrA и ustrB- счетчики изделий, в которых устранен брак A и B соответственно; neremA и neremB — счетчики изделий, в которых не удалось устранить соответствующий вид брака; i — счетчик испытаний (изделий).

Для имитации типа брака использован алгоритм, рассмотренный в pазделе 1.3.2, и реализующая его процедура model_dsv. Так как изделие не может иметь оба вида брака одновременно, для имитации вида брака можно использовать полную группу из трех несовместных событий (отсутствие брака, брак A или брак B). Эту группу событий можно рассматривать и как ДСВ, принимающую одно из трех значений (в программе значение 0 соответствует отсутствию брака, 1 — брак A, 2 — брак B; эти значения выбираются из массива brak и присваиваются переменной tipbrak).

Приводится текст программы (на языке Паскаль) для данной задачи. Имена переменных в программе соответствуют именам, использованным в схеме алгоритма. Смысл остальных переменных: nizd — количество испытаний (изделий); verbrak — массив, в котором хранятся вероятности различных видов брака (первый элемент массива — вероятность отсутствия брака, второй и третий — вероятности брака A и B соответственно); brak — массив, в котором хранятся величины, используемые в качестве обозначе-ний вида брака (из этого массива в процедуре model_dsv выбирается значение, присваиваемое переменной tipbrak); cena — цена, по которой продаются изделия (70 д. е.); zatr_vyp и zatr_ustr — затраты на выпуск изделия и на устранение брака (50 и 15 д. е.); procnorm — процент изделий, сразу выпущенных без брака; procA, procB — процент изделий, в которых устранен брак A и B соответственно; procneremA и procneremB — процент изделий, в которых не удалось устранить соответствующий вид брака; prib — общая прибыль от выпуска 10000 изделий; stop — вспомогательная переменная для задержки выполнения программы.

Program model1_5;

Uses crt;

Const nizd=10000;

Type velich=array[1..3] of integer;

veroyat=array[1..3] of real;

Var verbrak: veroyat;

brak: velich;

tipbrak: integer;

rustr: real;

norm, ustrA, ustrB, neremA, neremB: integer;

i: integer;

verustrA, verustrB: real;

cena, zatr_vyp, zatr_ustr: longint;

procnorm, procA, procB, procneremA, procneremB, prib: real;

stop: char;

Procedure model_dsv(dsv: velich; ver_dsv: veroyat; var znach: integer);

Var i: integer;

r, sum: real;

Begin

R:=random;

Sum:=0;

I:=0;

While (r>sum) do

begin

i:=i+1;

sum:=sum+ver_dsv[i];

end;

Znach:=dsv[i];

End;

Begin

Norm:=0; ustrA:=0; ustrB:=0; neremA:=0; neremB:=0;

Prib:=0;

Brak[1]:=0; brak[2]:=1; brak[3]:=2;

Clrscr;

Write(‘Продажная цена изделия: ‘); readln(cena);

Write(‘Затраты на выпуск изделия: ‘); readln(zatr_vyp);

Write(‘Вероятность брака A: ‘); readln(verbrak[2]);

Write(‘Вероятность брака B: ‘); readln(verbrak[3]);

Verbrak[1]:=1-verbrak[2]-verbrak[3];

Write(‘Вероятность устранения брака A: ‘); readln(verustrA);

Write(‘Вероятность устранения брака B: ‘); readln(verustrB);

Write(‘Затраты на устранение брака: ‘); readln(zatr_ustr);

for i:=1 to nizd do

begin

model_dsv(brak, verbrak, tipbrak);

if tipbrak=0 then norm:=norm+1

else begin

rustr:=random;

if tipbrak=1 then begin

if rustr<verustrA then ustrA:=ustrA+1

else neremA:=neremA+1;

end

else begin

if rustr<verustrB then ustrB:=ustrB+1

else neremB:=neremB+1;

end;

end;

end;

Prib:=cena*(nizd-neremA-neremB)-zatr_vyp*nizd-zatr_ustr*(ustrA+ustrB);

procnorm:=(norm/nizd)*100;

procA:=(ustrA/nizd)*100;

procB:=(ustrB/nizd)*100;

procneremA:=(neremA/nizd)*100;

procneremB:=(neremB/nizd)*100;

writeln; writeln;

writeln(‘Процент изделий без брака: ‘,procnorm:6:2);

writeln(‘Процент изделий с исправлением брака A: ‘,procA:6:2);

writeln(‘Процент изделий с исправлением брака B: ‘,procB:6:2);

writeln(‘Процент неустранимого брака A: ‘,procneremA:6:2);

writeln(‘Процент неустранимого брака B: ‘,procneremB:6:2);

writeln;

writeln(‘Прибыль от выпуска ‘,nizd,’ изделий: ‘, prib:8:2);

stop:=readkey;

end.

Результаты моделирования работы предприятия, полученные с помощью данной программы, примерно следующие: без брака выпускается 85,94% изделий; брак A устраняется в 3,21% изделий, брак B — в 7,23%; окончательно бракуется из-за брака A 2%, из-за брака B — 1,62% изделий. Прибыль от выпуска 10000 изделий составляет примерно 159000 д. е.