Общий вид стартовой формы показан на рис. 1. Видно, что она включает ряд объектов управления, среди которых имеются три командные кнопки «Расчет», «Очистка» и «Выход».
После нажатия кнопки «Расчет» производится вычисление показателя эффективности при заданных исходных данных. При нажатии кнопки «Очистка» производится очищение текстового поля для вывода результата моделирования. Затем может быть произведено изменение исходных данных и проведение новых расчетов с использованием кнопки «Расчет».
При нажатии кнопки «Выход» работа программы прекращается.
Модель СМО с 1, 2, 3
С кнопкой «Расчет» связана процедура, которая выполняет следующие действия
Оператор 1 осуществляет перевод исходных данных из символьной формы в числовую.
Оператор 2 обнуляет глобальную переменную SNo6c — суммарное число обслуженных заявок.
Оператор 3 начинает циклический перебор случайных реализаций.
Оператор 4 в начале каждой случайной реализации обнуляет локальные переменные, к которым относятся: число заявок, поступающих в одной реализации Nz, число обслуженных заявок в каждом из имеющихся каналов Nобс.j (j= 1,Nk), начальные значения времени освобождения каналов Токj (J = 1,Nk).
Оператор 5 обращается к автономной процедуре формирования потока заявок. В результате работы этой процедуры формируется массив значений времен:
[Tз(1), Tз(2), Tз(3)… Tз(N3i)]
где N3i — общее число поступивших заявок для i-й случайной реализации;
Оператор 6 является началом цикла обслуживания заявок.
Оператор 7 производит выбор номера канала, который характеризуется наименьшим значением времени освобождения от обслуживания заявки.
Оператор 8 обращается к автономной процедуре обслуживания очередной заявки. На выходе этой процедуры определяется число обслуженных заявок в выбранном канале No6c(Jmin).
Оператор 9 служит для расчета суммарного числа обслуженных заявок во всех каналах и всех случайных реализациях.
После окончания цикла случайных реализаций оператор 10 выводит на экран значение выходной переменной — средней относительной прибыли по формуле
Сотн.ср = Nобс -1 + 0,5Nк + 0,5Nк^2
Прошу помочь разобраться с данной программкой, за ранее большое спасибо всем откликнувшимся!! С делфи столкнулась в первый раз, поэтому наверное много ошибок
вот, что у меня получилось:
Delphi |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:='1';
Edit2.Text:='5';
Edit3.Text:='9';
Edit4.Text:='12';
Edit5.Text:='30';
Edit6.Text:='60';
Edit7.Text:='5000';
Edit8.Text:='0';
Edit9.Text:='0';
Edit10.Text:='0';
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Tzcped, Tobs,DT,TogMax,Tkon,T,z,Tk,SNobc,SNz,CotnCp:real;
N,j,i,Nr,p,Cont,f,w,Nz,e,u,l,min:integer;
Tz:array[1..1000]of real;
TOK:array[1..3] of real;
Nobc:array[1..3] of real;
begin
Randomize;
Nz:=StrToInt(Edit1.Text);
Tzcped:=StrToFloat(Edit2.Text);
Tobs:=StrToFloat(Edit3.Text);
DT:=StrToFloat(Edit4.Text);
TogMax:=StrToFloat(Edit5.Text);
Tkon:=StrToFloat(Edit6.Text);
Nr:=StrToInt(Edit7.Text);
//находится время обслуживания заявки и заносится в массив
For i:=1 to Nr do
begin
SNz:=0;
SNobc:=0;
T:=0;
while T<Tkon do
begin
z:=1-random;
DT:=-Tzcped*Ln(z);
T:=T+DT;
if T<Tkon then
begin
N:=N+1;
Tz[N]:=T
end
else
break;
end;
Nz:=0;
for p:=1 to Nz do Nobc[p]:=0;
for l:=1 to Nz do TOK[l]:=0;
begin
for f:=1 to Nz do
begin
// выбор канала
min:=1;
TOK[min]:= TOK[1];
for u:=2 to Nz do
if TOK[u]<TOK[min] then
TOK[min]:=TOK[u];
min:=u;
Tk:=0;
end;
SNobc:=SNobc+Nobc[1]+Nobc[2]+Nobc[3];
//определение минимального времени ожидания на одном из каналов
for j:=1 to N do
begin
if Tz[j]<TOK[min] then
if TOK[min]-Tz[j]>TogMax then continue else Tz[j]:=TOK[min];
z:=random;
Tk:=Tz[j]+ Tobs+DT*(z-0.5);
if Tk>Tkon then
begin
TOK[min]:=Tkon; break;
end;
Nobc[j]:=Nobc[j]+1;
TOK[min]:=Tk;
end;
end;
SNz:=SNz+N;
//SNobc:=SNobc+Nobc;
Edit8.Text:=IntToStr(N);
//Edit9.Text:=IntToStr(Nobc[j]);
// write(Nobc[j],'');
//readln;
CotnCp:=(SNobc/Nr)-1+0.5*SNz+0.5*SNz*SNz;
Edit10.Text:=FloatToStr(CotnCp);
end;
end;
end. |
|
Добавлено через 20 минут
Delphi |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
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;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label21: TLabel;
Label22: TLabel;
Edit11: TEdit;
Edit12: TEdit;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1.Text:='1';
Edit2.Text:='5';
Edit3.Text:='9';
Edit4.Text:='12';
Edit5.Text:='30';
Edit6.Text:='60';
Edit7.Text:='5000';
Edit8.Text:='0';
Edit9.Text:='0';
Edit10.Text:='0';
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Tzcped, Tobs,DT,TogMax,Tkon,T,z,Tk,SNobc,SNz,CotnCp:real;
N,j,i,Nobc,Nr,q,f,w,Nz,e,u,l,min:integer;
Tz:array[1..1000]of real;
TOK:array[1..5] of real;
begin
Randomize;
Nz:=StrToInt(Edit1.Text);
Tzcped:=StrToFloat(Edit2.Text);
Tobs:=StrToFloat(Edit3.Text);
DT:=StrToFloat(Edit4.Text);
TogMax:=StrToFloat(Edit5.Text);
Tkon:=StrToFloat(Edit6.Text);
Nr:=StrToInt(Edit7.Text);
For i:=1 to Nr do
begin
SNz:=0;
SNobc:=0;
T:=0;
N:=0;
while T<Tkon do
begin
z:=1-random;
DT:=-Tzcped*Ln(z);
T:=T+DT;
if T<Tkon then
begin
N:=N+1;
Tz[N]:=T
end
else
break;
end;
Nobc:=0;
for l:=1 to Nz do TOK[l]:=0;
for e:=1 to N do
begin
for f:=1 to Nz do
begin
min:=1;
for u:=2 to Nz do
if TOK[u]<TOK[min] then
min:=u;
Tk:=0;
for j:=1 to N do
begin
if Tz[j]<TOK[min] then
if TOK[min]-Tz[j]>TogMax then continue else Tz[j]:=TOK[min];
z:=random;
Tk:=Tz[j]+ Tobs+DT*(z-0.5);
if Tk>Tkon then
begin
TOK[min]:=Tkon; break;
end;
Nobc:=Nobc+1;
TOK[min]:=Tk;
end;
q:=q+N;
w:=w+Nobc;
end;
SNz:=q/Nr;
SNobc:=w/Nr;
Edit8.Text:=IntToStr(N);
Edit9.Text:=IntToStr(Nobc);
CotnCp:=SNobc-1+0.5*SNz+0.5*SNz*SNz;
Edit10.Text:=FloatToStr(CotnCp);
Edit11.Text:= FloatToStr(SNobc);
Edit12.Text:= FloatToStr(SNz);
end;
end;
end;
end. |
|
Для одного канала все работает нормально, вот этот код. Код, который выше пыталась сделать для нескольких каналов