|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите советом в моделировании СМО
Всем доброго времени суток. Пишу программку на Delphi для решения задачи по имитационному моделированию системы массового обслуживания. Вот условие" В систему с несколькими обслуживающими аппаратами одинаковой производительности поступают заявки. Входящий поток является пуассоновским с заданным значением интенсивности. Заявки становятся в общую очередь и обслуживаются по мере освобождения обслуживающих аппаратов. Время обслуживания подчиняется экспоненциальному закону. Если очередь превышает заданную величину, заявка покидает систему. Оценить среднее время нахождения заявки в системе, среднее время прибывания в очереди, среднее количество заявок в системе, среднюю длину очереди."
Очередь ограничена, при достижении максимума последняя заявка теряется. Но вот в чем беда - у меня очередь максимум из одного человека, потому что обработка идет последовательно "Приход заявки - проверка на наличие очереди (если есть очередь, найти аппарат, который освободится быстрее всего и занять его) - проверка свободных аппаратов". Объясните пожалуйста, как правильно в имитационном моделировании строить хронологический порядок действий. Нужно ли применять какие то таймеры, календари событий, а если нужно, то объясните пожалуйста, как этим пользоваться. Код:
type kalsob = record time:real; event:string[20]; end; masks = array [1..10000] of kalsob; vremobsl = array [1..1000] of real; logic = array [1..1000] of boolean; TForm1 = class(TForm) StringGrid1: TStringGrid; lam: TEdit; ocher: TEdit; kolvo: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; srchcl: TLabel; Button1: TButton; vrvoch: TLabel; Label4: TLabel; lams: TEdit; // procedure StringGrid1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var ks: masks; lambda,lambdas,Th,m,t,t1,t2,t3,r,tss,timsr,mintt,srvroch:real; ko,n,i,k,kmax,nom,sroch:integer; s:logic ; ts,vrmpr:vremobsl; Form1: TForm1; implementation {$R *.dfm} procedure input; begin randomize; t1:=-1/lambda*ln(random(100)*0.01+0.01); end; procedure TForm1.Button1Click(Sender: TObject); begin randomize; lambda:=strtofloat(lam.Text); lambdas:=strtofloat(lams.Text); ko:=strtoint(kolvo.Text); kmax:=strtoint(ocher.Text); Th:=100; t:=0; n:=0; timsr:=0; sroch:=0; while t<Th do begin //t1:=-1/lambda*ln(random(100)*0.01+0.01); input; stringgrid1.Cells[0,n]:=floattostr(t1); t:=t+t1; stringgrid1.Cells[1,n]:=floattostr(t); n:=n+1; if k>0 then begin k:=k-1; mintt:=ts[1]; i:=1; nom:=1; for i:=2 to ko do begin if mintt>ts[i] then begin mintt:=ts[i]; nom:=i; end; end; s[nom]:= true; tss:=-1/lambdas*ln(random(100)*0.01+0.01); timsr:=timsr+(ts[nom]-t); srvroch:=srvroch + (ts[nom]-t); ts[nom]:=t+tss; timsr:=timsr+tss; end; for i:=1 to ko do begin if t>ts[i] then begin s[i]:= true; tss:=-1/lambdas*ln(random(100)*0.01+0.01); ts[i]:=t+tss; timsr:=timsr+tss; break; end else if i=ko then begin k:=k+1; vrmpr[k]:=t; sroch:=sroch+1; end; if k > kmax then begin k:=k-1; sroch:=sroch-1; end; end; end; stringgrid1.RowCount:=n; timsr:=timsr/n; srvroch:=srvroch/sroch; input; srchcl.Caption:='Среднее время нахождения клиентов в системе'+#13 + floattostr(timsr); vrvoch.Caption:='Среднее время нахождения в очереди'+#13 + floattostr(srvroch); end; end. Последний раз редактировалось warlokzzz, 10.12.2012 в 23:13. |
#2
|
|||
|
|||
Я бы сделал подругому.
Каждый аппарат моделируется отдельным потоком. Очередь общая FIFO. Плюс еще один поток для генерации заявок. Для каждой заявки проставляются отсечки времени по нахождению в соотв. состоянии. После обработки заявки она просто записывается куда-нить как есть. После окончания моделирования просто пробегаешься по обработанным заявкам и считаешь статистику. Фактически, тебе таймеры будут не нужны, достаточно будет задержек в соотв. потоках. ЗЫ. Если что, пиши в приват. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
warlokzzz (10.12.2012)
|