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

Схемы алгоритмов Общая

В данном курсовом проекте будем использовать моделирующий алгоритм, который реализует принцип постоянного приращения модельного времени (принципа t); его укрупненная схема представлена на следующем рисунке:

В начале инициализируется программа, в частности вводятся значения Zi(t­0),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.