Консультация № 181425
18.12.2010, 14:30
45.46 руб.
0 4 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
код программы почти остается тот же
см. этот вопрос
Задание:
Задание
Тема:
Моделирование законов распределения случайных чисел.
Моделирование одноканальной СМО с неограниченной очередью

и вроде легко и непойму как реализовать.

Обсуждение

давно
Профессионал
304622
583
19.12.2010, 20:16
общий
Итак, на первый взгляд получается, что задача действительно простая: заменить генераторы показательного распределения на равномерное и нормальное (соответственно тексту задания) и выдачу результатов через каждый час.

В выложенном файле задания прямо не сказано, что очередь неограничена. Это точно?
Неизвестный
19.12.2010, 21:17
общий
Вот файл с исходником (лаб-я, ее еще пришлось исправить немного)
файл исходник

А здесь я написал нахождение нормально распредленнного случайного числа(button1)
исходник распределенное случайное число

нужно смоделировать одноканальной СМО с неограниченной очередью.

далее:
вроде вот этот код
Код:

if p+1 >= k then
begin
n := n+1;
end
else
begin
m := m+1;
k := k-1;
end;

нужно убрать, т.к. мы емкость накопителя не копим теперь.
Неизвестный
19.12.2010, 21:25
общий
теперь что писать в характеристиках:
посмотреть файл с характеристиками

лучше их оформить тоже в форме таблицы.

ну и пример разделения на 10 частей:
Код:

tk=1
T<Tk
выдача характеристик
Tk=Tk+1


где Tk-время моделирования (у нас 10 часов)
T-текущее время
давно
Профессионал
304622
583
23.12.2010, 00:39
общий
это ответ
Здравствуйте, novij2011!

Ещё раз извиняюсь -- конец семестра, должники идут косяком. Так что без комментариев в тексте программы. Чуть-чуть примечаний:
1)Пора уже сделать то, что надо было с самого начала: генерирование случайных чисел вынести в функции. Не по нажатию кнопки, а при каждом обращении к функции. Кроме того, нет никакой нужды количество суммируемых чисел выносить на пользовательский интерфейс – это внутреннее дело программы. (Кстати, в заготовке ошибка: в ch считывается 12, суммирование-то делается «for it := 1 to 10 do»).
2)Один общий совет: никогда не делайте глобальную переменную индексом цикла for; в самой процедуре надо делать «var it:integer;»
3)Слишком много randomize делать не надо. На всю работу программы достаточно одного раза.

Код:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series, Grids;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label6: TLabel;
Edit6: TEdit;
Label7: TLabel;
Edit7: TEdit;
Label8: TLabel;
Edit8: TEdit;
Button2: TButton;
Edit9: TEdit;
Edit10: TEdit;
Label4: TLabel;
Label5: TLabel;
Label9: TLabel;
StringGrid1: TStringGrid;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
K,maxK,p,i,io,n,chas,m:integer;
Potk,Pbo,tz,bTz,tobsl,Tzvezda,Tfree,STfree:real;
landa,Toc,T,Tk,Mi,Trazg:real;
Tin: array [0..3000] of real;
Tout: array [0..3000] of real;
implementation

{$R *.dfm}

const nnorm=12;
var xsr,deltax,mx,bx:real;

function GetR:real;
var R:real;
begin
R:=random;
GetR:=xsr+deltax*(2*R-1)
end;

function GetNorm:real;
var R:real;
it:integer;
begin
R:=0;
for it := 1 to nnorm do R:=R+Random;
GetNorm:=(sqrt(12/nnorm))*(R-nnorm/2)*bx+mx;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
mx:=strtoint(Edit1.Text);
bx:=strtoint(Edit2.Text);
xsr:=Strtoint(Edit6.Text);
deltax:=strtoint(edit7.Text);
Tk:=Strtofloat(Edit8.Text);
T := 0;
Tzvezda := 0;
Tfree:=0;
STfree:=0;
chas:=0;
K := 0;
maxK:=0;
n := 0; // обслужено
m := 0; // отказано
Pbo:=0;
i:=0;
io:=0;
Randomize;

tz :=GetR;
bTz:=T+tz;
while T < Tk do
begin
if Tzvezda > bTz then
begin
T := bTz;
K := K+1;
if K>maxK then maxK:=K;
{if p+1 >= k then
begin}
n := n+1;
{end
else
begin
m := m+1;
k := k-1;
end;}
if K = 1 then
begin
tobsl := GetNorm;
Tzvezda := bTz+tobsl;
Pbo:=Pbo+1;
STfree:=STfree + (T-Tfree);
end
else
begin
Tin[i] := T;
i := i+1;
end;
if K > 0 then
begin
tobsl := GetNorm;
Tzvezda := bTz+tobsl;
end;
tz :=GetR;
bTz := bTz+tz;
end
else begin
T := Tzvezda;
if K > 0 then
begin
K := K-1;
end;
if K = 0 then
begin
Tzvezda := Tk;
Tfree:=0;
end
else
begin
Tout[io]:=T;
io:=io+1;
tobsl := GetNorm;
Tzvezda := T+Tobsl;
end;
end;

if T - chas*60 > 60 then
begin
chas:=chas+1;
StringGrid1.Cells[chas,2]:=inttostr(K);
StringGrid1.Cells[chas,3]:=inttostr(maxK);
StringGrid1.Cells[chas,4]:=floattostrf(STfree,ffFixed,5,3);
StringGrid1.Cells[chas,5]:=floattostrf(Pbo/(Pbo+io),ffFixed,5,3);
end;
end;
//вычисление характеристик
n:=n-K;
Toc:=0;
for i:= 0 to io-1 do begin
Toc:=Toc+Tout[i]-Tin[i];
end;
Toc:=Toc/io;// клиентов прибыло
//вероятность того, что в системе нет запросов
Edit3.Text:=floattostr(STfree/Tk);
//максимальное число запросов в очереди
Edit4.Text:=inttostr(maxK);
//Edit6.Text:=
// вероятность что будет обслужена без очереди
Pbo := Pbo/(Pbo+io);
Edit9.Text:=floattostr(Pbo);
// время ожидания
Edit10.Text:=floattostr(Toc);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.ColCount:=11;
StringGrid1.Cells[1,0]:='1 час';
StringGrid1.Cells[2,0]:='2 час';
StringGrid1.Cells[3,0]:='3 час';
StringGrid1.Cells[4,0]:='4 час';
StringGrid1.Cells[5,0]:='5 час';
StringGrid1.Cells[6,0]:='6 час';
StringGrid1.Cells[7,0]:='7 час';
StringGrid1.Cells[8,0]:='8 час';
StringGrid1.Cells[9,0]:='9 час';
StringGrid1.Cells[10,0]:='10 час';

StringGrid1.RowCount:=8;
StringGrid1.Cells[0,0]:='характеристика';
StringGrid1.Cells[0,1]:='приш.заявки';
StringGrid1.Cells[0,2]:='длина очереди';
StringGrid1.Cells[0,3]:='max длина очерели';
StringGrid1.Cells[0,4]:='t простоя';
StringGrid1.Cells[0,5]:='P(простоя нет запросов)';
StringGrid1.Cells[0,6]:='cр время ожидания';
StringGrid1.Cells[0,7]:='вер-ть не ждет обслуж-я';
end;

end.
5
спасибочки
Форма ответа