Схемы алгоритмов Общая
В данном курсовом проекте будем использовать моделирующий алгоритм, который реализует принцип постоянного приращения модельного времени (принципа t); его укрупненная схема представлена на следующем рисунке:
В начале инициализируется программа, в частности вводятся значения Zi(t0),i=1,2,…k. Которые характеризуют состояние системы вk-мерном фазовом пространстве состояний в начальный момент времениt0. Модельное время устанавливаетсяt=t0= 0. Основные операции по имитации системы осуществляется в цикле. Функционирование системы отслеживается по последовательной схеме состоянийZi(t). Для этого модельному даётся некоторое приращениеdt. Затем по вектору текущих состояний определяются новые состоянияZi(t+dt), которые становятся текущими. Для определения новых состояний по текущим в формализованном описании системы должны существовать необходимые математические зависимости. По ходу имитации измеряются, вычисляются, фиксируются необходимые выходные характеристики. При моделировании стохастических систем вместо новых состояний вычисляются распределения вероятностей для возможных состояний. Конкретные значения вектора текущих состояний определяются по результатам случайных испытаний. В результате проведения имитационного эксперимента получается одна из возможных реализаций случайного многомерного процесса в заданном интервале времени (t0 , Tk).
Алгоритм шага симуляции
SETTIME
Текст программы:
Программа написана на ObjectPascalв средеDelphi. В курсовой работе представлен главный модуль проекта, также ещё существует отдельный файл с образом формы, на которой расположена единственная кнопка. Я посчитал целесообразным не публиковать его здесь.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math, ExtCtrls;
type
TForm1 = class(TForm)
BtnStartModelling: TButton;
procedure BtnStartModellingClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
newDetInterval = 50; //min 75
St1HandleTime1 = 40; //min
St2HandleTime1 = 60; //min
St1HandleTime2 = 100; //min
St2HandleTime2 = 100; //min
st1RejectPercentage = 4; //% брака 1го станка
st2RejectPercentage = 8; //% брака 2го станка
type
TdetalStates = (ds_net, ds_pervObr, ds_vtorObr);
TDetal = record
State: TdetalStates;
WasRejected: Boolean; //Была ли деталь уже однажды отбракована
end;
PDetal = ^TDetal;
TModel = class
private
VsegoDetalei: Cardinal;
MaxZadel: Cardinal;
Stanok1Detal: PDetal;
Stanok2Detal: PDetal;
Stanok1DetFree: Cardinal; //vremya kogda st1 obrabotaet detal
Stanok2DetFree: Cardinal; //vremya kogda st1 obrabotaet detal
Stanok1HandledPcs: Cardinal; //подсчет обработанных деталей 1го станка
Stanok2HandledPcs: Cardinal; //подсчет обработанных деталей 2го станка
q1AddTime: Cardinal;
//vremya kogda postupit novaya detal na obrabotku (v ochered q1)
public
WrkTime, St2WrkTime, St2WrkTime2, St1WrkTime: Cardinal;
q1, q2, q3, q4, w: TList;
constructor Create;
destructor Destroy; override;
procedure Simulate(DetAmount: Cardinal);
end;
function NextTime(Delay: Cardinal): Cardinal;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TModel.Create;
begin
q1 := TList.Create;
q2 := TList.Create;
q3 := TList.Create;
q4 := TList.Create;
w := TList.Create;
end;
destructor TModel.Destroy;
procedure freeDetalList(lst: TList);
var
i: Integer;
begin
for i := 0 to Lst.Count - 1 do
if lst[i] <> nil then
Dispose(PDetal(lst[i]));
end;
begin
freeDetalList(q1);
freeDetalList(q2);
freeDetalList(q3);
freeDetalList(q4);
freeDetalList(w);
q1.Free;
q2.Free;
q3.Free;
q4.Free;
w.Free;
inherited;
end;
procedure TModel.Simulate(DetAmount: Cardinal);
var
Min: Cardinal;
begin
VsegoDetalei := DetAmount;
Min := 0;
while true do
begin
//настало время добавления в очередь для перв. обраб-тки
if q1AddTime = Min then
begin
q1.Add(New(Pdetal));
PDetal(q1[q1.Count - 1])^.WasRejected := false;
PDetal(q1[q1.Count - 1])^.State := ds_pervObr;
q1AddTime := Min + NextTime(newDetInterval);
end;
//Станок №1 закончил обработку детали
if (Stanok1Detal <> nil) and (Stanok1Detal^.State <> ds_net) and
(Min <> 0) and (Stanok1DetFree = Min) then
begin
Inc(Stanok1HandledPcs);
//эта деталь оказалась бракованная
//Floor - окр. вниз т.к. в задании указано, что брак станка 1 _до_ 4%
if (Stanok1HandledPcs mod Cardinal(Floor(100 / st1RejectPercentage))) = 0 then
begin
if Stanok1Detal.WasRejected = true then
begin
W.Add(Stanok1Detal); //добавляем деталь в список отходов
end
else
begin
//брак при первой обработке попадает в очередь q3
Stanok1Detal^.WasRejected := true;
q3.Add(Stanok1Detal);
end;
end
else
begin //если не бракованная
if Stanok1Detal^.State = ds_pervObr then
begin
Stanok1Detal^.State := ds_vtorObr;
q2.Add(Stanok1Detal);
//если первичная обр-тка то добавляем её в "задел" - q2
end
else
begin
q4.Add(Stanok1Detal);
//если вторичная обработка, то добавляем её в готовую продукцию
end;
end;
Stanok1Detal := nil; //убираем детали со станка
end;
//Станок №12закончил обработку детали
if (Stanok2Detal <> nil) and (Stanok2Detal^.State <> ds_net) and
(Min <> 0) and (Stanok2DetFree = Min) then
begin
Inc(Stanok2HandledPcs);
//эта деталь оказалась бракованная
if (Stanok2HandledPcs mod Round(100 / st2RejectPercentage)) = 0 then
begin
if Stanok2Detal.WasRejected = true then
begin
W.Add(Stanok2Detal); //добавляем деталь в список отходов
end
else
begin
//брак при первой обработке попадает в очередь q3
Stanok2Detal^.WasRejected := true;
q3.Add(Stanok2Detal);
end;
end
else
begin //если не бракованная
if Stanok2Detal^.State = ds_pervObr then
begin
Stanok2Detal^.State := ds_vtorObr;
q2.Add(Stanok2Detal);
end
else //если первичная обр-тка то добавляем её в "задел" - q2
begin
q4.Add(Stanok2Detal);
//если вторичная обработка, то добавляем её в готовую продукцию
end;
end;
Stanok2Detal := nil; //убираем детали со станка
end;
//2й станок без деталей, хотя очередь бракованных не пуста
if (Stanok2Detal = nil) and (q3.Count > 0) then
begin
Stanok2Detal := PDetal(q3[0]);
q3.Delete(0);
if Stanok2Detal^.State = ds_pervObr then
Stanok2DetFree := Min + NextTime(St2HandleTime1)
else //если первичная повторн. обр
Stanok2DetFree := Min + NextTime(St2HandleTime2)
//если вторичная повторн. обр
end;
//первично обработанных деталей >3 а станок 2 не работает
if (Stanok2Detal = nil) and (q2.Count > 3) then
begin
Stanok2Detal := PDetal(q2[0]);
q2.Delete(0);
Stanok2DetFree := Min + NextTime(St2HandleTime2);
end;
//1й станок без деталей хотя очередь на перв. обработку не пустует
if (Stanok1Detal = nil) and (q1.Count > 0) then
begin
Stanok1Detal := PDetal(q1[0]); //деталь на 1м станке обрабатывается первично
q1.Delete(0);
Stanok1DetFree := Min + NextTime(St1HandleTime1);
end;
//1й станок без деталей, и в очереди_обработанных_1н_раз что-то есть
if (Stanok1Detal = nil) and (q2.Count > 0) then
begin
Stanok1Detal := PDetal(q2[0]); //деталь на 1м станке обрабатывается вторично
q2.Delete(0);
Stanok1DetFree := Min + NextTime(St1HandleTime2);
end;
WrkTime := WrkTime + 1;
if (Stanok1Detal <> nil) and (Stanok1Detal^.State <> ds_net) then
begin
St1WrkTime := St1WrkTime + 1;
end;
if (Stanok2Detal <> nil) and (Stanok2Detal^.State <> ds_net) then
begin
St2WrkTime := St2WrkTime + 1;
end;
if (Stanok2Detal <> nil) and (Stanok2Detal^.State = ds_vtorObr) then
St2WrkTime2 := St2WrkTime2 + 1;
if q2.Count > MaxZadel then
MaxZadel := q2.Count;
if Cardinal(q4.Count) >= VsegoDetalei then
Break; //Моделирование изготовления заданного количества деталей закончилось
Min := Min + 1;
end
end;
function NextTime(Delay: Cardinal): Cardinal;
begin
// Randomize;
case Random(2) of
0:
Result := Delay - Round((-(1 / Delay) * Ln(1 - Random)) * 100);
1:
Result := Delay + Round((-(1 / Delay) * Ln(1 - Random)) * 100);
end; //Case
end;
procedure TForm1.BtnStartModellingClick(Sender: TObject);
var
Model: TModel;
begin
Model := TModel.Create;
Model.Simulate(500);
MessageDlg(Format('отходы: %d%% '#13#10'Время работы: %d; время I станка: %d; I'
'I го: %d; IIго только на 2-чной оработке: %d; загрузка IIго на 2чной обр-тке: '
'%d%%; макс. задел: %d%%', [Round(Model.w.Count / model.VsegoDetalei * 100),
Model.WrkTime, Model.St1WrkTime, Model.St2WrkTime, Model.St2WrkTime2,
Round(Model.St2WrkTime2 / Model.WrkTime * 100),
Round(model.MaxZadel / model.VsegoDetalei * 100)]), mtInformation, [mbOK], 0);
Model.Free;
end;
end.