close

Вход

Забыли?

вход по аккаунту

?

PZ

код для вставкиСкачать
 Содержание
Введение 4
1 Теоретический материал, постановка задачи 5
1.1 Описание предметной области моделируемой системы 5
1.2 Постановка задачи моделирования 5
1.3 Параметры и переменные системы 6
2 Метод и алгоритм решения 8
2.1 Структурная схема модели регулировочного цеха 8
2.2 Схемы алгоритмов событийной секции 9
2.3 Программная реализация модели регулировочного участка 15
3 Имитационный эксперимент 24
3.1 Анализ переходного процесса 24
3.2 Характеристики системы 28
3.3 Построение факторного плана эксперимента 33
4 Анализ эффективности 38
Заключение 40
Список литературы 41
Приложение А 42
Введение
Целью данной курсовой работы является разработка имитационной модели участка сборки и определение оптимального, с экономической точки зрения, числа занятых в производстве человек и их распределение между операциями. Для выполнения поставленной цели необходимо решить следующие задачи:
1) построить структурную схему моделируемой системы;
2) разработать алгоритм функционирования системы;
3) составить плана факторного эксперимента и осуществить его с разработанной моделью;
4) проанализировать полученные данные.
1 Описание моделируемой системы и задание на моделирование
1.1 Описание предметной области моделируемой системы
На участок поступают пуассоновские потоки узлов двух типов - с параметрами 1 мин-1 и 2 мин-1 соответственно для первого и второго.
Первая операция - операция предварительной подгонки - начинается в том случае, если в наличии есть по одному узлу каждого типа и завершена подгонка предыдущих узлов. Длительность этой операции T1минут. Дальше с вероятностью p1над узлом первого типа и p2над узлом второго типа производится операция доводки, которая длится T2 и T3 минут, соответственно. После этого узлы поступают на операцию сборки, которая начинается после поступления узлов обоих типов, которые ранее были взаимно подогнаны. Сборка длится T4минут.
Длительность каждой операции зависит от количества задействованных на ней рабочих. Всего на участке может быть задействовано не более N рабочих. Прибыль от реализации одного готового изделия составляет s1 единиц стоимости, но, если после завершения подгонки узлов до момента их сборки проходит болееТминут, прибыль от реализации изделия уменьшается вдвое. Заработная плата каждого рабочего - s2единиц стоимости в час.
1.2 Постановка задачи моделирования
В ходе выполнения курсовой работы необходимо разработать имитационную модель функционирования участка сборки. Для полученной модели необходимо:
Разработать имитационную модель функционирования участка сборки.
1. Выполнить моделирование работы системы в течение 100 смен (800 часов).
2. С использованием процедуры Велча определить наличие и продолжительность переходного процесса (в качестве характеристики можно использовать производительность за смену).
3. Исключив данные переходного процесса, оценить:
* среднюю производительность участка за смену;
* среднее время обработки изделий;
* коэффициент загрузки оборудования;
* среднюю ежедневную прибыль.
4. Оценить такое количество занятых в производстве рабочего и их распределение между операциями, которое бы обеспечило максимальную экономическую эффективность производства.
1.3 Параметры и переменные системы
В описании системы присутствует ряд параметров и переменных, которые следует задать прежде, чем приступить к моделированию.
Интенсивность поступления заявок первого типа составляет 0,029, второго - 0,027. Первая операция - операция предварительной подгонки - начинается в том случае, если в наличии есть по одному узлу каждого типа и завершена подгонка предыдущих узлов. Длительность этой операции 35 минут. Дальше с вероятностью 90% над узлом первого типа и 95% над узлом второго типа производится операция доводки, которая длится 25и 20 минут, соответственно. После этого узлы поступают на операцию сборки, которая начинается после поступления узлов обоих типов, которые ранее были взаимно подогнаны. Сборка длится 40 минут.
Длительность каждой операции зависит от количества задействованных на ней рабочих. Всего на участке может быть задействовано не более 11 рабочих. Прибыль от реализации одного готового изделия составляет 5500 единиц стоимости, но, если после завершения подгонки узлов до момента их сборки проходит более 300минут, прибыль от реализации изделия уменьшается вдвое. Заработная плата каждого рабочего - 50единиц стоимости в час.
Для удобства все параметры моделируемой системы сведены в таблицу 1, где задается их значение, а также дается их описание.
Таблица 1 - Параметры и переменные модели
ОбозначениеОписаниеЗначениеЕдиница измерения1Интенсивность поступления заявок первого типа0,0291/мин2Интенсивность поступления заявок второго типа0,0271/минp1Вероятность отправки на операцию доводки заявки первого типа90%p2Вероятность отправки на операцию доводки заявки второго типа95%T1Длительность операции предварительной подгонки25Человеко-минутT2Длительность операции доводки заявки первого типа15Человеко-минутT3Длительность операции доводки заявки второго типа10Человеко-минутT4Длительность операции сборки40Человеко-минутNМаксимальное количество рабочих11Человекs1Прибыль от реализации готового изделия5500Денежных единицs2Заработная плата рабочего50Денежных единицT5Длительность сборки, при превышении значения которой, стоимость готового изделия уменьшается вдвое300Минут
2 Метод и алгоритм решения
2.1 Структурная схема модели участка сборки
Наглядным изображением структуры моделируемой системы является ее изображение в виде Q-схемы. Основными элементами Q-схемы являются устройства, накопители и каналы обслуживания заявок.
Структура участка сборки в виде Q-схемы изображена на рисунке 1.
Рисунок 1 - Q-схема участка сборки
На представленной схеме присутствуют следующие элементы:
W1 - входящий поток узлов первого типа;
W2 - входящий поток узлов второго типа;
МКУ1 - многоканальное устройство, моделирующее операцию предварительной подгонки;
МКУ2 - многоканальное устройство, моделирующее операцию сборки;
S1 - устройство, моделирующее операцию доводки узла первого типа;
S2 - устройство, моделирующее операцию доводки узла второго типа;
Q1 - очередь на первый канал МКУ1 для узлов первого типа; Q2 - очередь на первый канал МКУ1 для узлов второго типа;
Q3 - очередь на устройство доводки узлов первого типа; Q4 - очередь на устройство доводки узлов второго типа;
Q5 - очередь на первый канал МКУ2 для узлов первого типа; Q6 - очередь на первый канал МКУ2 для узлов второго типа;
На участок сборки поступают узлы двух типов: W1 - входящий поток узлов первого типа, W2 - входящий поток узлов второго типа. Данные узлы занимают очереди Q1 и Q2 соответственно. Далее, если оба канала МКУ1 свободны, то узлы поступают на операцию предварительной подгонки. Далее с вероятность p1 и вероятностью p2 соответственно для узлов первого и второго типа выполняется операция доводки. Для этого узел занимает соответственно очередь Q1 или Q2. Если устройство s1 свободно, то узел первого типа поступает на операцию доводки. Если устройство s2 свободно, то узел второго типа поступает на операцию доводки. Если один из подогнанных узлов не поступает на операцию доводки, то и другой так же не поступает на операцию доводки. Далее узлы занимают очереди Q5 и Q6 соответственно. Если оба канала МКУ2 свободны, то узлы поступают на операцию сборки, после чего узлы выводятся из системы.
2.2 Схемы алгоритмов событийной секции
При моделировании участка сборки необходимо выделить следующие события:
1. поступление узлов;
2. завершение предварительной подгонки;
3. завершение доводки;
4. завершение сборки;
5. завершение смены;
6. завершение моделирования.
События и последовательность их наступления в системе представлены граф-схемой, изображенной на рисунке 2.
Рисунок 2 - Граф-схема системы
Между событиями "поступление узлов" и "завершение предварительной подгонки" существует переход "поступление узлов на предварительную подгонку, планирование завершения операции". Между событиями "завершение предварительной подгонки" и "завершение доводки" присутствует переход "поступление узлов на доводку, планирование окончания доводки". Между событиями "завершение доводки" и "завершение смены" существует переход "поступление узлов на сборку, планирование окончания сборки". Так же существует рекурсивный переход для события "поступление узлов". Для каждой событийной секции построены блок-схемы, представленные рисунками
Рисунок 3 - блок-схема секции "поступление узлов"
Рисунок 4 - блок-схема секции "завершение предварительной подгонки"
Рисунок 4 - продолжение блок-схемы секции "завершение предварительной подгонки"
Рисунок 5 - блок-схема секции "завершение доводки"
Рисунок 6 - блок-схема секции "завершение сборки"
2.3 Программная реализация модели участка сборки
При реализации программной модели участка сборки использовались средства модуля DelpSMPL. Выделенные события генерируются функцией _SHEDL. Константные обозначения разных типов событий:
evCome = 1 - поступление узла;
evEndAdjustment = 3 - завершение предварительной подгонки;
evEndTweaking = 5 - завершения доводки;
evEndAssembly = 9 - завершение сборки;
evEndModelling = 10 - завершение моделирования;
evFixStat = 11 - завершение смены;
В процедуре initialize осуществляется освобождение динамической памяти, обнуляется время модельного таймера, после чего определяются очереди и устройства моделируемой системы. Затем планируются события прихода узлов первого и второго типа, окончания смены и окончания моделирования.
procedure TForm1.Initialize;
var i: integer;
begin
_REINIT; tr := 1;
_TIME:=0;
for i:=1 to QUEUE_COUNT do
Q[i]:=_QUEUE(inttostr(i));
for i:=1 to DEVISE_COUNT do
D[i]:=_DEVICE(inttostr(i));
_SCHEDL(evCome, NegExp(round(1/L1)), tr);
_SCHEDL(evCome, NegExp(round(1/L2)), tr+1000);
_Schedl(evFixStat,480,1500); _SCHEDL(evEndModelling, 48000, 2000);
end;
После выполнения данной процедуры происходит вызов подпрограммы "StartModelling". В зависимости от события, происходит вызов соответствующей событию процедуры.
_CAUSE(event,tr);
case event of
evCome: TransactionCome;
evEndAdjustment: EndAdjustment;
evEndTweaking: EndTweaking;
evEndAssembly: EndAssembly;
evFixStat: FixStat;
end;
Наступление события evCome обрабатывается процедурой TransactionCome. Приведемописаниеданнойпроцедуры.
В случае поступления в данную процедуру узла первого типа, данный узел занимает очередь Q1. Аналогично, если поступил узел второго типа, то он занимает очередь Q2. Далее, если два канала МКУ1 (d1 и d2) свободны, и в очередях Q1 и Q2 есть хотя бы по одному узлу, то из этих очередей извлекается по одному узлу, занимаются 2 канала МКУ2, и планируется событие окончания предварительной подгонки. Далее для узла каждого типа планируется приход следующего узла в модель. procedureTransactionCome;
begin
iftr<TRAN_DELTAthen
begin
_EnQueue(Q[1],tr,0,1);
end
else
begin
_EnQueue(Q[2],tr,0,1);
end;
if ((_STATUS(d[1])=0) and (_STATUS(d[2])=0) and (_LENGTH(Q[1])>0) and (_LENGTH(Q[2])>0)) then
begin
tr2:=_HEAD(Q[1],stad);
_RESERVE(d[1], tr2);
tr2:=_HEAD(Q[2],stad);
_RESERVE(d[2],tr2);
_Schedl(evEndAdjustment,NegExp(Round(T1/k1)),tr2);
end;
iftr<TRAN_DELTA then
begin
_Schedl(evCome, NegExp(round(1/L1)), tr);
end
else
begin
_Schedl(evCome, NegExp(round(1/L2)), tr);
end;
end;
Наступление события evAdjustment обрабатывается процедурой EndAdjustment. Приведем описание данной процедуры.
Прежде всего, происходит освобождение двух каналов МКУ1 (d1 и d2). Далее с вероятностями p1 и p2 узлы первого и второго типа попадают на операцию доводки: занимаются очереди Q3 и Q4 соответственно, проверяется, свободны ли устройства d3, d4. Если устройства свободны, то из очередей Q3 и Q4 извлекается по одному узлу каждого типа и занимаются устройства d3 и d4 соответственно. Далее планируется окончание доводки для узлов каждого типа.
Если два канала МКУ1 (d1 и d2) свободны, и в очередях Q1 и Q2 есть хотя бы по одному узлу, то из этих очередей извлекается по одному узлу, занимаются 2 канала МКУ2, и планируется событие окончания предварительной подгонки.
procedureEndAdjustment;
var p: integer;
begin
_RELEAS(d[1]);
_RELEAS(d[2]);
randomize();
p := random(101);
if (p<p1) and (p<p2) then
begin
_EnQueue(Q[3],tr-1000,0,1);
if _STATUS(d[3])=0 then
begin
tr2:=_HEAD(Q[3],stad);
_RESERVE(d[3], tr2);
_Schedl(evEndTweaking,NegExp(Round(T2/k2)),tr2);
end;
_EnQueue(Q[4],tr,0,1);
if _STATUS(d[4])=0 then
begin
tr2:=_HEAD(Q[4],stad);
_RESERVE(d[4], tr2);
_Schedl(evEndTweaking,NegExp(Round(T3/k3)),tr2);
end;
end
else if ((_STATUS(d[1])=0) and (_STATUS(d[2])=0) and (_LENGTH(Q[1])>0) and (_LENGTH(Q[2])>0)) then
begin
tr2:=_HEAD(Q[1],stad);
_RESERVE(d[1], tr2);
tr2:=_HEAD(Q[2],stad);
_RESERVE(d[2],tr2);
_Schedl(evEndAdjustment,NegExp(Round(T1/k1)),tr2);
end;
end;
Наступление события evEndTweaking обрабатывается процедурой EndTweaking. Приведем описание данной процедуры.
Если в процедуру пришел узел первого типа, то освобождаем устройство d3 и узел становится в очередь Q5. Делается проверка, если длина очереди Q3>0, то извлекаем узел из очереди Q3, занимаем устройство d3 и планируем окончание доводки. Аналогичные действия происходят в случае появления в процедуре узла второго типа. Если два канала МКУ2 (d5 и d6) свободны, и в очередях Q5 и Q6 есть хотя бы по одному узлу, то из этих очередей извлекается по одному узлу, занимаются 2 канала МКУ2, и планируется событие окончания сборки.
procedureEndTweaking;
begin
iftr<TRAN_DELTA then
begin
_RELEAS(d[3]);
_EnQueue(Q[5],tr,0,1);
if _Length(Q[3])>0 then
begin
tr2:=_HEAD(Q[3],stad);
_RESERVE(d[3], tr2);
_Schedl(evEndTweaking,NegExp(Round(T2/k2)),tr2);
end;
end
else
begin
_RELEAS(d[4]);
_EnQueue(Q[6],tr,0,1);
if _Length(Q[4])>0 then
begin
tr2:=_HEAD(Q[4],stad);
_RESERVE(d[4], tr2);
_Schedl(evEndTweaking,NegExp(Round(T3/k3)),tr2);
end;
end;
if ((_STATUS(d[5])=0) and (_STATUS(d[6])=0) and (_LENGTH(Q[5])>0) and (_LENGTH(Q[6])>0)) then
begin
tr:=_HEAD(Q[5],stad);
_RESERVE(d[5], tr);
tr:=_HEAD(Q[6],stad);
_RESERVE(d[6],tr);
_Schedl(evEndAssembly,NegExp(Round(T4/k4)),tr);
end;
end;
Наступление события evEndAssembly обрабатывается процедурой EndAssembly. Приведем описание данной процедуры. Если два канала МКУ2 (d5 и d6) свободны, и в очередях Q5 и Q6 есть хотя бы по одному узлу, то из этих очередей извлекается по одному узлу, занимаются 2 канала МКУ2 и планируется событие окончания сборки. Происходит освобождение каналов МКУ2 (d5 и d6). procedureEndAssembly;
begin
_RELEAS(d[5]);
_RELEAS(d[6]);
if ((_STATUS(d[5])=0) and (_STATUS(d[6])=0) and (_LENGTH(Q[5])>0) and (_LENGTH(Q[6])>0)) then
begin
tr:=_HEAD(Q[5],stad);
_RESERVE(d[5], tr);
tr:=_HEAD(Q[6],stad);
_RESERVE(d[6],tr);
_Schedl(evEndAssembly,NegExp(Round(T4/k4)),tr);
end;
end;
По окончании смены вызывается функция по сбору статистики. В ней рассчитываются производительность участка за смену, время обработки изделия за смену, коэффициент загрузки оборудования, прибыль за смену. После планируется окончание следующей смены. Процедура со всеми вспомогательными расчетами определена следующим образом:
procedureFixStat;
var i: Integer;
dif: Integer;
sum:Real;
begin
inc(shift);
sb_array12[shift] := sb_array12[shift] + round((d[1].SB-sb_prev12)/480)*100;
sb_array3[shift] := sb_array3[shift] + round((d[3].SB-sb_prev3)/480)*100;
sb_array4[shift] := sb_array4[shift] + round((d[4].SB-sb_prev4)/480)*100;
sb_array56[shift] := sb_array56[shift] + round((d[5].SB-sb_prev56)/480)*100;
sb_prev12 := d[1].SB;
sb_prev3 := d[3].SB;
sb_prev4 := d[4].SB;
sb_prev56 := d[5].SB;
product[shift]:=product[shift]+(d[6].Z - released);
dif:=0;
sum:=0;
for i:=released+1 to (d[6].Z) do
begin
proc_time[i].period:= proc_time[i].outp-proc_time[i].into;
ifproc_time[i].period<=norm_proc then sum:=sum+s1 else sum:=sum+(s1/2);
end;
income[shift]:= income[shift]+sum-Salary*8*(k1+k2+k3+k4);
for i:=released+1 to d[6].Z do
dif:=dif+proc_time[i].period;
if d[6].Z - released<>0 then
proc[shift]:=proc[shift]+(dif/(d[6].Z - released))
elseproc[shift]:=0;
released:=d[6].Z;
_Schedl(evFixStat,480,1500)
end;
3 Имитационный эксперимент
3.1 Анализ переходного процесса
Для определения средних показателей системы необходимо оценить установившееся среднее. Проблема начального переходного процесса чаще всего решается методом, называемым переходным периодом работы модели или удалением начальных данных. Процедура Велча используется для выявления наличия и продолжительности переходного процесса и основывается на результатах n независимых повторных прогонов имитационной модели и осуществляется посредством следующих шагов:
1. Выполняется n повторных прогонов имитационной модели (n> 5), продолжительность каждого из которых равна т (где т - большое число). Пусть Yij представляет данные i-го наблюдения в ходе j-го повторного прогона имитационной модели (j= 1,2,..., n; i = 1, 2,..., т), как показано на рисунке 7.
2.Пусть Усредненный процесс имеет средние и дисперсии . Следовательно, усредненный процесс имеет ту же кривую переходного среднего, что и начальный процесс, но его график имеет лишь (1/n)-ю дисперсию.
Рисунок 7 - Усредненный процесс и скользящее среднее с w= 1, полученный на основании n повторных прогонов имитационной модели
продолжительностью т
3. Чтобы выровнять высокочастотные колебания в процессе (но сохранить нужные низкочастотные колебания или долговременную тенденцию), определить скользящее среднее (где w - это окно; wявляется положительным целым числом из условия, когда w [m/4] следующим образом:
Поэтому, если iне очень близко к началу повторных прогонов модели, то является всего лишь простым средним 2w + 1 наблюдений усредненного процесса, центрированного по наблюдению i. Оно называется скользящим средним, поскольку iперемещается во времени.
4. Создать график дляi=1,2,..., т - wи выбрать l как значение i, за которым очевидно схождение процесса В качестве характеристики для определения переходного процесса используется производительность за смену, выраженная в денежных единицах. Программная реализация процедуры Велча:
procedureWelch(w: integer; ind:integer); vars,i: integer;
sum: real;
begin
for i:=1 to shift-w do
begin
Sum:=0;
ifi<=w then
begin
for S:=-(i-1) to (i-1) do
Sum:=Sum+product[i+s];
product[i]:=Sum/(2*i-1);
end
else
begin
for S:=-w to w do
Sum:=Sum+product[i+s];
product[i]:=Sum/(2*w+1);
end;
end;
for i:=1 to shift-w do
form1.Chart1.Series[ind].Add(product[i]);
end;
Скользящие средние выводятся на компоненту формы Chart в виде графиков. Перед вызовом процедуры Welch проводится 10 прогонов имитационной модели и усредняются полученные значения:
for i:=1 to run_times do
begin
released:=0;
shift:=0;
k1:=1;
k2:=1;
k3:=1;
k4:=1;
for k:=1 to 1500 do
begin
come_1[k]:=0;
come_2[k]:=0;
end;
for k:=1 to 1500 do
begin
proc_time[k].into:=0;
proc_time[k].outp:=0;
proc_time[k].period:=0;
end;
StartModelling;
end;
Далее происходит вызов процедуры Велча с разными размерами окон (3, 5, 9) (рисунок 8). Рисунок 8 - Результат применения процедуры Велча
Опираясь на полученный результат, можно сделать вывод о том, что переходный процесс существует и длится 20 рабочих смен.
3.2 Характеристики системы
Расчет характеристик модели участка сборки производится программно при нажатии на кнопку "Моделирование". В программе результаты расчетов этих характеристик за каждую смену по нескольким прогонам заносятся в массивы по индексам, соответствующим номеру смену: product - производительность, proc - время сборки изделия, income - прибыль за смену и sb_array12, sb_array3, sb_array4, sb_array56 - коэффициенты загруженности устройств предварительной подгонки, настроек узлов обоих типов и сборки.
Заполнение массивов в основном происходит в процедуре FixStat. Ее определение было приведено выше. Стоит отметить, что для организации сбора данных по нескольким прогонам элементы массивов рассчитываются в накапливающем режиме, то есть к показателю предыдущего прогона пробавляется вновь рассчитанный и так далее. После окончания нужного количества прогонов показатели каждой смены делятся на число прогонов модели. Таким образом, получаются усредненные по прогонам значения каждой характеристики для каждой из смен.
Производительность за смену в процедуре FixStat рассчитывается как накопленное соответствующее значение за предыдущие прогоны плюс количество выходов с устройства операции сборки (d[2].Z-sort1) за вычетом уже вышедшей продукции (released):
product[shift]:=product[shift]+(d[6].Z - released);
Для определения прибыли за смену высчитываем для каждого собранного изделия время его обработки в системе, если это время не превышает значение norm_proc, то к сумме прибавляется полная стоимость единицы продукции, в противном случае лишь половина. Далее эта сумма прибыли за смену прибавляется к ранее накопленным суммам этой смены за предыдущие прогоны, вычитаются издержки на заработную плату рабочим и записывается в соответствующий элемент массива:
for i:=released+1 to (d[6].Z) do
begin
proc_time[i].period:= proc_time[i].outp-proc_time[i].into;
if proc_time[i].period<=norm_proc then sum:=sum+s1 else sum:=sum+(s1/2);
end;
income[shift]:= income[shift]+sum-Salary*8*(k1+k2+k3+k4);
Чтобы определить среднюю длительность сборки одного изделия за смену с момента поступления хотя бы 1 из комплектующих его узлов по окончание сборки, нужно сложить все длительности обработок собранных за эту смену изделий и разделить на их количество. В программе это выглядит так: for i:=released+1 to d[6].Z do
dif:=dif+proc_time[i].period;
if d[6].Z - released<>0 then
proc[shift]:=proc[shift]+(dif/(d[6].Z - released))
else proc[shift]:=0;
Коэффициент загруженности устройств определяется как разница текущей суммы периодов занятого времени минус предыдущий показатель, деленная на длительность смены и умноженная на 100%. Подобным образом вычисления производятся для каждого из устройств. В процедуре эти вычисления производятся следующим образом:
sb_array12[shift] := sb_array12[shift] + round((d[1].SB-sb_prev12)/480)*100;
sb_array3[shift] := sb_array3[shift] + round((d[3].SB-sb_prev3)/480)*100;
sb_array4[shift] := sb_array4[shift] + round((d[4].SB-sb_prev4)/480)*100;
sb_array56[shift] := sb_array56[shift] + round((d[5].SB-sb_prev56)/480)*100;
Обработка нажатия кнопки "Моделирование" начинается с инициализации всех массивов характеристик в 0.
Далее организуется цикл, обеспечивающий 10 прогонов модели, перед каждым прогоном вспомогательные переменные и индексы инициализируются своими начальными значениями. По окончании прогонов модели в элементах массивов содержатся накопленные данные каждой смены по результатам 10 прогонов. Соответственно, далее необходимо эти указатели усреднить по количеству прогонов. То есть каждый элемент массива разделить на количество прогонов:
for i:=1 to 100 do
begin
product[i] := Round(product[i]/run_times);
proc[i] := Round(proc[i]/run_times);
income[i] := Round(income[i]/run_times);
sb_array12[i] := Round(sb_array12[i]/run_times);
sb_array3[i] := Round(sb_array3[i]/run_times);
sb_array4[i] := Round(sb_array4[i]/run_times);
sb_array56[i] := Round(sb_array56[i]/run_times);
end;
Далее, отбросив значения характерные для переходного процесса, просуммируем оставшиеся:
fori:=T_setto 100 do
begin
sum.income:=Sum.income+prod[i].income;
sum.sort1:=sum.sort1+prod[i].sort1;
sum.sort2:=sum.sort2+prod[i].sort2;
end;
for i:=t_set to 100 do
sum2:=Sum2+proc[i];
for i:=t_set to 100 do
begin
sum3.d1:=sum3.d1+util[i].d1;
sum3.d2:=sum3.d2+util[i].d2;
sum3.d3:=sum3.d3+util[i].d3;
end;
После чего рассчитываются непосредственно средние показатели системы. Накопленные суммы делятся на количество дней установившегося функционирования:
for i:=21 to 100 do
begin
proca:=proca+proc[i];
prod:=prod+product[i];
incom:=incom+income[i];
sb_ave12 := sb_ave12 + sb_array12[i];
sb_ave3 := sb_ave3 + sb_array3[i];
sb_ave4 := sb_ave4 + sb_array4[i];
sb_ave56 := sb_ave56 + sb_array56[i];
end;
proca:=Round(proca/80);
incom:=Round(incom/80);
prod:=Round(prod/80);
sb_ave12 := Round(sb_ave12/80);
sb_ave3 := Round(sb_ave3/80);
sb_ave4 := Round(sb_ave4/80);
sb_ave56 := Round(sb_ave56/80);
Далее характеристики выводятся на форму посредством ShowMessage. Полный текст процедуры находится в приложении А. Результаты расчетов приведены на рисунках 9, 10, 11,12,13.
Рисунок 9 - Результат работы программы по оценке характеристик системы
Рисунок 10 - Результат работы программы по оценке характеристик системы
Рисунок 11 - Результат работы программы по оценке характеристик системы
Рисунок 12 - Результат работы программы по оценке характеристик системы
Рисунок 13 - Результат работы программы по оценке характеристик системы
3.3 Построение факторного плана эксперимента
В определении необходимых характеристик и их дальнейшей интерпретации для последующего изучения объекта или процесса состоит цель моделирования. Имитационные модели воспроизводят динамику функционирования исследуемой реальной системы. В связи с тем, что поведение реальных систем определяется множеством случайных факторов, появляется необходимость в процессе имитации осуществлять большое число прогонов модели, как с разными входными данными, так и с разными значениями последовательностей случайных чисел. Результаты проведения многовариантных экспериментов должны быть структурированы и интерпретированы для дальнейшего принятия решений. Чтобы получить существенную информацию, наиболее важную с точки зрения на основе имитационной модели необходимо тщательно организовать и провести машинные эксперименты.
Среди поставленных в курсовой работе задач наиболее значимая состоит в оценкеколичества занятых в производстве рабочих и их распределение между операциями, которое бы обеспечило максимальную экономическую эффективность производства. При этом важно учитывать, что длительность каждой операции зависит от количества задействованных на ней рабочих, которых может быть задействовано не более 11рабочих. При этом заработная плата каждого рабочего составляет 50единиц стоимости в час.
Так, для моделируемого участка сборки выделим 4 фактора: количество рабочих на операции предварительной подгонки (k1), количество рабочих на операции доводки узлов первого типа (k2), количество рабочих на операции доводки узлов второго типа (k3) и количество рабочих на операции сборки (k4).
При наличии от 2 факторов и более строится факторные планы типа 2k, что является наиболее экономичной стратегией, с помощью которой можно измерять взаимодействие и влияние факторов. Данная стратегия предполагает выбор двух уровней каждого фактора, а затем проведение имитационных прогонов для каждой из 2k возможных комбинаций уровней факторов, называемых точками плана. В данном конкретном случае количество факторов 4, а следовательно точек плана необходимо составить 24, то есть 16.
Каждому фактору были поставлены в соответствие следующие уровни: k1: 1 и 4; k2: 1 и 2; k3: 1 и 2; k4: 1 и 3;
В качестве отклика системы возьмем среднее значение прибыли за смену за вычетом расходов на выплату заработной платы рабочим.
При помощи процедуры Велча для каждого сочетания значений факторов была определена продолжительность переходного процесса, с целью дальнейшего исключения его данных при определении реакции системы. Так, для точки плана (1, 1, 1, 1) продолжительность переходного процесса составила 20 смен, для (1, 1, 1, 3) - 20 смен, (1, 1, 2, 1) - 20 смен, для (1, 1, 2, 3) - 15 смен, для (1, 2, 1, 1) - 20 смен, для (1, 2, 1, 3) - 30 смен, для (1, 2, 2, 1) - 30 смен, для (1, 2, 2, 3) - 20 смен, для (4, 1, 1, 1) - 15 смен, для (4, 1, 1, 3) - 20 смен, для (4, 1, 2, 1) - 25 смен, для (4, 1, 2, 3) - 25 смен, для (4, 2, 1, 1) - 20 смен, для (4, 2, 1, 3) - 15 смен, для (4, 2, 2, 1) - 25 смен и для (4, 2, 2, 3) - 15 смен.
Построение факторного плана осуществляется в программе при нажатии кнопки "Факторный план". Процедура обработки нажатия кнопки полностью приведена в приложении А. Результат представлен на рисунках 10 и 11.
Рисунок 14 - Результат построения факторного плана
Рисунок 15 - Результат построения факторного плана
Как видно из результатов проведенных экспериментов, оптимальное сочетание количества рабочих на операциях 4, 2, 2 и 3.
Главной целью планирования эксперимента является оценка влияния факторов на отклик.
Главным эффектом фактора j является средняя величина изменения в отклике, обусловленная переходом фактора j с уровня "-" на уровень "+", в то время как остальные факторы остаются без изменений. Такая средняя величина берется для всех комбинаций уровней факторов.
Следует оценить главные эффекты каждого из факторов:
b1 = ((28059-28948)+(30102-29612)+(28431-28615)+(27506-28897)+(28056-29007)+(29134-28610)+(27541-28320)+(31201-28372))/8 = -43,88
b2 = ((29007-28948)+(28610-29612)+(28320-28615)+(28372-28897)+(28056-28059)+(29134-30102)+(27541-28431)+(31201-27506))/8 = 8,875
b3 = ((28615-28948)+(28897-29612)+(28320-29007)+(28372-28610)+(28431-28059)+(27506-30102)+(27541-28056))/8 = -589
b4 = ((29612-28948)+(28897-28615)+(28610-29007)+(28372-28320)+(30102-28059)+(27506-28431)+(29134-28056)+(31201-27541))/8 = 807,13
Наибольшее значение главного эффекта соответствует четвертому фактору, в среднем, при переходе на его максимальное значение, прибыль увеличивалась на 807,13, следовательно, количество рабочих на операции сборки является главным фактором.
4 Анализ эффективности Необходимо произвести статистический анализ функционирования смоделированного регулировочного участка цеха. Для этого устроим 10 прогонов имитационной модели, каждый раз, по окончании смены, занося значение полученной прибыли. Отбросив данные, соответствующие переходному процессу, то есть первые 15, усредним оставшиеся 85 значений по прогонам и рассчитаем статистические показатели полученной совокупности. Так, математическое ожидание соответствует среднему значению прибыли за смену, которые было уже получено ранее и составило µ = 31201ден.ед.
Дисперсия представляет собой средний квадрат отклонений индивидуальных значений от их средней величины (обозначается греческой буквой - "сигма квадрат"). Дисперсия вычисляется по формуле:
Таким образом, дисперсия составила = 22604139,82.
Среднее квадратическое отклонение представляет собой корень квадратный из среднего квадрата отклонений отдельных значений признака отих средней:
Рассчитанное значение среднего квадратического отклонения составило = 4754,38ден.ед.
Коэффициент вариации - процентное отношение среднего квадратического отклонения к средней величине признака:
%.
=16,76%
Приближённый 95% доверительный интервал для среднего значения чистой прибыли составляет [30190,257; 32221,74].
Согласно полученным результатам, существует достаточно большая величина отклонения данных от среднего значения, что говорит о том, что система функционирует не оптимально при заданных условиях. В системе наблюдается практически полная загруженность устройства частичной регулировки, когда же ветвь участка по выпуску изделий первого сорта менее загружена. Для нормализации работы регулировочного цеха необходимо либо уменьшить темп поступления агрегатов в систему.
Заключение
В процессе написания курсовой работы была достигнута главная её цель - разработана модель участка сборки и определено наиболее выгодное с экономической точки количество рабочих на каждой операции.
Была осуществлена формализация решаемой задачи, построена событийная модель системы, разработаны алгоритмы работы и написана программа, моделирующая работу регулировочного участка цеха.
С полученной моделью был проведён эксперимент, позволивший определить оптимальный вариант функционирования системы. Также были рассчитаны статистические показатели.
Список использованных источников
1. Савина, О. А.Имитационное моделирование экономических систем и процессов [Текст] / Ольга Александровна Савина,Сергей Викторович Терентьев. - Орел: ОрелГТУ, 2004. - 172 с.
2. Савина, О. А.Методические указания к выполнению курсового проекта по дисциплине "Моделирование систем" [Текст] / Ольга Александровна Савина,Сергей Викторович Терентьев. - Орел: ОрелГТУ, 2009. - 37 с.
Приложение А
(обязательное)
Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DelpSMPL, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart,
Grids, Buttons;
const
evCome = 1;
evBeginAdjustment = 2;
evEndAdjustment = 3;
evBeginTweaking = 4; evEndTweaking = 5;
evBeginAssembly = 8;
evEndAssembly = 9; evEndModelling = 10;
evFixStat = 11;
L1 = 0.029; // Приход узла первого типа
L2 = 0.027; // Приход узла второго типа
P1 = 90; // Вероятность отправки на доводку узла первого типа
P2 = 95; // Вероятность отправки на доводку узла второго типа
T1 = 35; // Операция предварительной подгонки
T2 = 25; // Операция доводки узла первого типа
T3 = 20; // Операция доводки узла второго типа
T4 = 40; // Операция сборки
Salary = 50;
S1=5500;
norm_proc = 300;
QUEUE_COUNT = 6;
DEVISE_COUNT = 6;
TRAN_DELTA = 1000;
run_times = 10; //количество прогонов модели
t_ok = 20; //продолжительность переходного процесса
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Button1: TButton;
Chart1: TChart;
lnsrsSeries1: TLineSeries;
lnsrsSeries2: TLineSeries;
lnsrsSeries3: TLineSeries;
lnsrsSeries4: TLineSeries;
strngrd1: TStringGrid;
btn1: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
procedure StartModelling;
procedure Initialize;
{ Private declarations }
public
{ Public declarations }
end;
time = record
into,outp, period: Integer;
end;
var
Form1: TForm1;
Q:array[1..QUEUE_COUNT] of P_Queue;
D:array[1..DEVISE_COUNT] of P_Device;
event, tr, tr2, stad: word;
z: text;
d1_l,d2_l,d3_l,d4_l,d5_l,d6_l: word;
product: array[1..100] of real; //массив для хранения производительности по кажд.смене
released: Integer; //количество продукции за предшествующие смены
shift: Integer; // номер смены
come_1: array[1..1500] of Integer;//массив для фиксации времени прихода узлов 1типа
come_2: array[1..1500] of Integer;//массив для фиксации времени прихода узлов 1типа
proc: array[1..100] of real; //массив для хранения времени начала обработки изделия
proc_time: array[1..1500] of time;
income: array[1..100] of Real;
node1, node2, fabric: integer;
done: Integer; // здесь будет накапливаться время ухода готовых иделий.
fail:Integer;
f: text;
sb_prev12: integer;
sb_prev3: integer;
sb_prev4: integer;
sb_prev56: integer;
sb_array12: array [1..100] of Integer;
sb_array3: array [1..100] of Integer;
sb_array4: array [1..100] of Integer;
sb_array56: array [1..100] of Integer;
k1, k2, k3, k4: integer;
perehod_arr: array[1..16] of Integer;
implementation
{$R *.dfm}
procedure TransactionCome;
begin
writeln(f, '');
writeln(f, 'Транзакт ' + inttostr(tr) + ' пришел в систему, время - ', inttostr(_Time));
if tr<TRAN_DELTA then
begin
_EnQueue(Q[1],tr,0,1);
come_1[node1]:=_Time;
Inc(node1);
writeln(f, 'Транзакт ' + inttostr(tr) + ' встал в очередь Q1, время - ', inttostr(_Time));
end
else
begin
_EnQueue(Q[2],tr,0,1);
come_2[node2]:=_Time;
Inc(node2);
writeln(f, 'Транзакт ' + inttostr(tr) + ' встал в очередь Q2, время - ', inttostr(_Time));
end;
if ((_STATUS(d[1])=0)and(_STATUS(d[2])=0)and(_LENGTH(Q[1])>0)and(_LENGTH(Q[2])>0)) then
begin
tr2:=_HEAD(Q[1],stad);
_RESERVE(d[1], tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q1 и занял устройство 1, время - ', inttostr(_Time));
tr2:=_HEAD(Q[2],stad);
_RESERVE(d[2],tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q2 и занял устройство 2, время - ', inttostr(_Time));
_Schedl(evEndAdjustment,NegExp(Round(T1/k1)),tr2);
end;
if tr<TRAN_DELTA then
begin
_Schedl(evCome, NegExp(round(1/L1)), tr);
end
else
begin
_Schedl(evCome, NegExp(round(1/L2)), tr);
end;
end;
procedure EndAdjustment;
var p: integer;
begin
_RELEAS(d[1]);
_RELEAS(d[2]);
writeln(f, 'Устройства 1 и 2 освобождены, время - ', inttostr(_Time));
randomize();
p := random(101);
if (p<p1) and (p<p2) then
begin
if come_1[fabric+fail]<come_2[fabric+fail] then
proc_time[fabric].into:=come_1[fabric+fail]
else proc_time[fabric].into:=come_2[fabric+fail];
writeln(f, 'Начало обработки '+inttostr(fabric)+' устройства: '+floattostr(proc_time[fabric].into));
Inc(fabric);
writeln(f, 'Транзакт ' + inttostr(tr-1000) + ' встал в очередь Q3, время - ', inttostr(_Time));
_EnQueue(Q[3],tr-1000,0,1);
if _STATUS(d[3])=0 then
begin
tr2:=_HEAD(Q[3],stad);
_RESERVE(d[3], tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q3 и занял устройство 3, время - ', inttostr(_Time));
_Schedl(evEndTweaking,NegExp(Round(T2/k2)),tr2);
end;
writeln(f, 'Транзакт ' + inttostr(tr) + ' встал в очередь Q4, время - ', inttostr(_Time));
_EnQueue(Q[4],tr,0,1);
if _STATUS(d[4])=0 then
begin
tr2:=_HEAD(Q[4],stad);
_RESERVE(d[4], tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q3 и занял устройство 3, время - ', inttostr(_Time));
_Schedl(evEndTweaking,NegExp(Round(T3/k3)),tr2);
end;
end
else
{ begin
proc_time[fabric-1].into:=0;}
inc(fail);
{end;}
if ((_STATUS(d[1])=0)and(_STATUS(d[2])=0)and(_LENGTH(Q[1])>0)and(_LENGTH(Q[2])>0)) then
begin
tr2:=_HEAD(Q[1],stad);
_RESERVE(d[1], tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q1 и занял устройство 1, время - ', inttostr(_Time));
tr2:=_HEAD(Q[2],stad);
_RESERVE(d[2],tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q2 и занял устройство 2, время - ', inttostr(_Time));
_Schedl(evEndAdjustment,NegExp(Round(T1/k1)),tr2);
end;
end;
procedure EndTweaking;
begin
if tr<TRAN_DELTA then
begin
_RELEAS(d[3]);
_EnQueue(Q[5],tr,0,1);
writeln(f, 'Транзакт ' + inttostr(tr) + ' освободил устройство 3 и занял очередь 5, время - ', inttostr(_Time));
if _Length(Q[3])>0 then
begin
tr2:=_HEAD(Q[3],stad);
_RESERVE(d[3], tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q3 и занял устройство 3, время - ', inttostr(_Time));
_Schedl(evEndTweaking,NegExp(Round(T2/k2)),tr2);
end;
end
else
begin
_RELEAS(d[4]);
_EnQueue(Q[6],tr,0,1);
writeln(f, 'Транзакт ' + inttostr(tr) + ' освободил устройство 4 и занял очередь 6, время - ', inttostr(_Time));
if _Length(Q[4])>0 then
begin
tr2:=_HEAD(Q[4],stad);
_RESERVE(d[4], tr2);
writeln(f, 'Транзакт ' + inttostr(tr2) + ' вышел из очереди Q3 и занял устройство 3, время - ', inttostr(_Time));
_Schedl(evEndTweaking,NegExp(Round(T3/k3)),tr2);
end;
end;
if ((_STATUS(d[5])=0)and(_STATUS(d[6])=0)and(_LENGTH(Q[5])>0)and(_LENGTH(Q[6])>0)) then
begin
tr:=_HEAD(Q[5],stad);
_RESERVE(d[5], tr);
writeln(f, 'Транзакт ' + inttostr(tr) + ' вышел из очереди Q5 и занял устройство 5, время - ', inttostr(_Time));
tr:=_HEAD(Q[6],stad);
_RESERVE(d[6],tr);
writeln(f, 'Транзакт ' + inttostr(tr) + ' вышел из очереди Q6 и занял устройство 6, время - ', inttostr(_Time));
_Schedl(evEndAssembly,NegExp(Round(T4/k4)),tr);
end;
end;
procedure EndAssembly;
begin
_RELEAS(d[5]);
_RELEAS(d[6]);
writeln(f, 'Устройства 5 и 6 освобождены, время - ', inttostr(_Time));
proc_time[d[6].Z].outp:=_time;
writeln(f, 'Время поступления на сборку '+inttostr(d[6].Z)+' изделия: '+ floattostr(proc_time[d[6].Z].into));
writeln(f, 'Время окончания сборки '+inttostr(d[6].Z)+' изделия: '+ floattostr(proc_time[d[6].Z].outp));
writeln(f, 'Все время сборки '+inttostr(d[6].Z)+' изделия: '+ floattostr(proc_time[d[6].Z].outp-proc_time[d[6].Z].into));
//writeln(f, 'количество брака: '+inttostr(fail));
if ((_STATUS(d[5])=0)and(_STATUS(d[6])=0)and(_LENGTH(Q[5])>0)and(_LENGTH(Q[6])>0)) then
begin
tr:=_HEAD(Q[5],stad);
_RESERVE(d[5], tr);
writeln(f, 'Транзакт ' + inttostr(tr) + ' вышел из очереди Q5 и занял устройство 5, время - ', inttostr(_Time));
tr:=_HEAD(Q[6],stad);
_RESERVE(d[6],tr);
writeln(f, 'Транзакт ' + inttostr(tr) + ' вышел из очереди Q6 и занял устройство 6, время - ', inttostr(_Time));
_Schedl(evEndAssembly,NegExp(Round(T4/k4)),tr);
end;
end;
procedure FixStat;
var i: Integer;
dif: Integer;
sum:Real;
begin
inc(shift);
sb_array12[shift] := sb_array12[shift] + round((d[1].SB-sb_prev12)/480)*100;
sb_array3[shift] := sb_array3[shift] + round((d[3].SB-sb_prev3)/480)*100;
sb_array4[shift] := sb_array4[shift] + round((d[4].SB-sb_prev4)/480)*100;
sb_array56[shift] := sb_array56[shift] + round((d[5].SB-sb_prev56)/480)*100;
sb_prev12 := d[1].SB;
sb_prev3 := d[3].SB;
sb_prev4 := d[4].SB;
sb_prev56 := d[5].SB;
product[shift]:=product[shift]+(d[6].Z - released);
dif:=0;
sum:=0;
for i:=released+1 to (d[6].Z) do
begin
proc_time[i].period:= proc_time[i].outp-proc_time[i].into;
if proc_time[i].period<=norm_proc then sum:=sum+s1 else sum:=sum+(s1/2);
end;
income[shift]:= income[shift]+sum-Salary*8*(k1+k2+k3+k4);
for i:=released+1 to d[6].Z do
dif:=dif+proc_time[i].period;
if d[6].Z - released<>0 then
proc[shift]:=proc[shift]+(dif/(d[6].Z - released))
else proc[shift]:=0;
released:=d[6].Z;
_Schedl(evFixStat,480,1500)
end;
procedure TForm1.Initialize;
var i: integer;
begin
_REINIT; tr := 1;
_TIME:=0;
node1:=1;
node2:=1;
fabric:=1;
done:=0;
fail:=0;
for i:=1 to QUEUE_COUNT do
Q[i]:=_QUEUE(inttostr(i));
for i:=1 to DEVISE_COUNT do
D[i]:=_DEVICE(inttostr(i));
_SCHEDL(evCome, NegExp(round(1/L1)), tr);
_SCHEDL(evCome, NegExp(round(1/L2)), tr+1000);
_Schedl(evFixStat,480,1500); //планируем окончание 1 смены
_SCHEDL(evEndModelling, 48000, 2000);
end;
procedure TForm1.StartModelling;
begin
Initialize;
sb_prev12 :=0;
sb_prev3 :=0;
sb_prev4 :=0;
sb_prev56 :=0;
repeat
_CAUSE(event,tr);
case event of
evCome: TransactionCome;
evEndAdjustment: EndAdjustment;
evEndTweaking: EndTweaking;
evEndAssembly: EndAssembly;
evFixStat: FixStat;
end;
until event=evEndModelling;
end;
procedure Welch(w: integer; ind:integer); //процедура велча (построение 1 скользящей средней)
var s,i: integer;
sum: real;
begin
for i:=1 to shift-w do
begin
Sum:=0;
if i<=w then
begin
for S:=-(i-1) to (i-1) do
Sum:=Sum+product[i+s];
product[i]:=Sum/(2*i-1);
end
else
begin
for S:=-w to w do
Sum:=Sum+product[i+s];
product[i]:=Sum/(2*w+1);
end;
end;
for i:=1 to shift-w do
form1.Chart1.Series[ind].Add(product[i]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,k: Integer;
proca,incom,prod:Real;
sb_ave12, sb_ave3, sb_ave4, sb_ave56: real;
begin
for i:=1 to 100 do
begin
product[i] :=0;
proc[i] :=0;
income[i] :=0;
sb_array12[i] :=0;
sb_array3[i] :=0;
sb_array4[i] :=0;
sb_array56[i] :=0;
end;
AssignFile(f,'log.txt');
rewrite(f);
for i:=1 to run_times do
begin
released:=0;
shift:=0;
k1:=1;
k2:=1;
k3:=1;
k4:=1;
for k:=1 to 1500 do
begin
come_1[k]:=0;
come_2[k]:=0;
end;
for k:=1 to 1500 do
begin
proc_time[k].into:=0;
proc_time[k].outp:=0;
proc_time[k].period:=0;
end;
StartModelling;
end;
closefile(f);
for i:=1 to 100 do
begin
product[i] := Round(product[i]/run_times);
proc[i] := Round(proc[i]/run_times);
income[i] := Round(income[i]/run_times);
sb_array12[i] := Round(sb_array12[i]/run_times);
sb_array3[i] := Round(sb_array3[i]/run_times);
sb_array4[i] := Round(sb_array4[i]/run_times);
sb_array56[i] := Round(sb_array56[i]/run_times);
end;
proca:=0;
incom:=0;
prod:=0;
for i:=21 to 100 do
begin
proca:=proca+proc[i];
prod:=prod+product[i];
incom:=incom+income[i];
sb_ave12 := sb_ave12 + sb_array12[i];
sb_ave3 := sb_ave3 + sb_array3[i];
sb_ave4 := sb_ave4 + sb_array4[i];
sb_ave56 := sb_ave56 + sb_array56[i];
end;
proca:=Round(proca/80);
incom:=Round(incom/80);
prod:=Round(prod/80);
sb_ave12 := Round(sb_ave12/80);
sb_ave3 := Round(sb_ave3/80);
sb_ave4 := Round(sb_ave4/80);
sb_ave56 := Round(sb_ave56/80);
AssignFile(f,'productivity.txt');
Rewrite(f);
for i:=1 to 100 do
Writeln(f,product[i]);
CloseFile(f);
AssignFile(f,'process.txt');
Rewrite(f);
for i:=1 to 100 do
Writeln(f,proc[i]);
CloseFile(f);
chart1.Series[0].Clear;
chart1.Series[1].Clear;
chart1.Series[2].Clear;
chart1.Series[3].Clear;
Welch(3,1);
Welch(5,2);
Welch(9,3);
AssignFile(z,'rep.txt');
rewrite(z);
_report(z);
closefile(z);
{ Label7.Caption := FloatToStr(Proca) + ' мин.';
Label8.Caption := FloatToStr(sb_ave12);
Label9.Caption := FloatToStr(sb_ave3);
Label10.Caption := FloatToStr(sb_ave4);
Label11.Caption := FloatToStr(sb_ave56);
Label14.Caption := FloatToStr(prod) + ' шт.';
Label16.Caption := FloatToStr(incom)+' ден.ед.';}
ShowMessage('Среднее время на всю сборку: ' + FloatToStr(proca)+' мин., средняя производительность за смену: '+FloatToStr(prod)+' шт., средняя прибыль за смену: '+FloatToStr(incom)+' ден.ед.');
ShowMessage('Коэффициент загруженности Первого устройства: ' + FloatToStr(sb_ave12));
ShowMessage('Коэффициент загруженности Третьего устройства: ' + FloatToStr(sb_ave3));
ShowMessage('Коэффициент загруженности Четвертого устройства: ' + FloatToStr(sb_ave4));
ShowMessage('Коэффициент загруженности Пятого устройства: ' + FloatToStr(sb_ave56));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
strngrd1.RowCount := 17;
strngrd1.ColCount := 5;
strngrd1.Cells[0,0]:='k1';
strngrd1.Cells[1,0]:='k2';
strngrd1.Cells[2,0]:='k3';
strngrd1.Cells[3,0]:='k4';
strngrd1.Cells[4,0]:='Прибыль';
strngrd1.Cells[0,1]:='1';
strngrd1.Cells[1,1]:='1';
strngrd1.Cells[2,1]:='1';
strngrd1.Cells[3,1]:='1';
strngrd1.Cells[0,2]:='1';
strngrd1.Cells[1,2]:='1';
strngrd1.Cells[2,2]:='1';
strngrd1.Cells[3,2]:='3';
strngrd1.Cells[0,3]:='1';
strngrd1.Cells[1,3]:='1';
strngrd1.Cells[2,3]:='2';
strngrd1.Cells[3,3]:='1';
strngrd1.Cells[0,4]:='1';
strngrd1.Cells[1,4]:='1';
strngrd1.Cells[2,4]:='2';
strngrd1.Cells[3,4]:='3';
strngrd1.Cells[0,5]:='1';
strngrd1.Cells[1,5]:='2';
strngrd1.Cells[2,5]:='1';
strngrd1.Cells[3,5]:='1';
strngrd1.Cells[0,6]:='1';
strngrd1.Cells[1,6]:='2';
strngrd1.Cells[2,6]:='1';
strngrd1.Cells[3,6]:='3';
strngrd1.Cells[0,7]:='1';
strngrd1.Cells[1,7]:='2';
strngrd1.Cells[2,7]:='2';
strngrd1.Cells[3,7]:='1';
strngrd1.Cells[0,8]:='1';
strngrd1.Cells[1,8]:='2';
strngrd1.Cells[2,8]:='2';
strngrd1.Cells[3,8]:='3';
strngrd1.Cells[0,9]:='4';
strngrd1.Cells[1,9]:='1';
strngrd1.Cells[2,9]:='1';
strngrd1.Cells[3,9]:='1';
strngrd1.Cells[0,10]:='4';
strngrd1.Cells[1,10]:='1';
strngrd1.Cells[2,10]:='1';
strngrd1.Cells[3,10]:='3';
strngrd1.Cells[0,11]:='4';
strngrd1.Cells[1,11]:='1';
strngrd1.Cells[2,11]:='2';
strngrd1.Cells[3,11]:='1';
strngrd1.Cells[0,12]:='4';
strngrd1.Cells[1,12]:='1';
strngrd1.Cells[2,12]:='2';
strngrd1.Cells[3,12]:='3';
strngrd1.Cells[0,13]:='4';
strngrd1.Cells[1,13]:='2';
strngrd1.Cells[2,13]:='1';
strngrd1.Cells[3,13]:='1';
strngrd1.Cells[0,14]:='4';
strngrd1.Cells[1,14]:='2';
strngrd1.Cells[2,14]:='1';
strngrd1.Cells[3,14]:='3';
strngrd1.Cells[0,15]:='4';
strngrd1.Cells[1,15]:='2';
strngrd1.Cells[2,15]:='2';
strngrd1.Cells[3,15]:='1';
strngrd1.Cells[0,16]:='4';
strngrd1.Cells[1,16]:='2';
strngrd1.Cells[2,16]:='2';
strngrd1.Cells[3,16]:='3';
perehod_arr[1] := 20;
perehod_arr[2] := 20;
perehod_arr[3] := 20;
perehod_arr[4] := 15;
perehod_arr[5] := 20;
perehod_arr[6] := 30;
perehod_arr[7] := 30;
perehod_arr[8] := 20;
perehod_arr[9] := 15;
perehod_arr[10] := 20;
perehod_arr[11] := 25;
perehod_arr[12] := 25;
perehod_arr[13] := 20;
perehod_arr[14] := 15;
perehod_arr[15] := 25;
perehod_arr[16] := 15;
end;
procedure TForm1.btn1Click(Sender: TObject);
var i,j,k: Integer;
incom: Real;
begin
for j:=1 to 16 do
begin
for i:=1 to 100 do
begin
product[i] :=0;
proc[i] :=0;
income[i] :=0;
sb_array12[i] :=0;
sb_array3[i] :=0;
sb_array4[i] :=0;
sb_array56[i] :=0;
end;
AssignFile(f,'log.txt');
rewrite(f);
for i:=1 to run_times do
begin
released:=0;
shift:=0;
k1:=StrToInt(strngrd1.Cells[0,j]);
k2:=StrToInt(strngrd1.Cells[1,j]);
k3:=StrToInt(strngrd1.Cells[2,j]);
k4:=StrToInt(strngrd1.Cells[3,j]);
for k:=1 to 1500 do
begin
come_1[k]:=0;
come_2[k]:=0;
end;
for k:=1 to 1500 do
begin
proc_time[k].into:=0;
proc_time[k].outp:=0;
proc_time[k].period:=0;
end; StartModelling;
end;
closefile(f);
for i:=1 to 100 do
begin
income[i] := Round(income[i]/run_times);
end;
incom:=0;
for i:=perehod_arr[j]+1 to 100 do
begin
incom:=incom+income[i];
end;
incom:=Round(incom/(100-perehod_arr[j]));
strngrd1.Cells[4,j] := FloatToStr(incom);
end;
end;
end.
3
Документ
Категория
Рефераты
Просмотров
85
Размер файла
422 Кб
Теги
лабораторная работа, лаба, лабораторная
1/--страниц
Пожаловаться на содержимое документа