most-queue 1.25__tar.gz → 1.27__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of most-queue might be problematic. Click here for more details.
- {most_queue-1.25 → most_queue-1.27}/PKG-INFO +1 -1
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/qs_sim.py +121 -65
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/rand_destribution.py +62 -34
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mg1_warm_calc.py +3 -2
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmn_with_h2_cold_and_h2_warmup.py +7 -3
- {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/PKG-INFO +1 -1
- {most_queue-1.25 → most_queue-1.27}/pyproject.toml +1 -1
- {most_queue-1.25 → most_queue-1.27}/setup.py +1 -1
- {most_queue-1.25 → most_queue-1.27}/LICENSE +0 -0
- {most_queue-1.25 → most_queue-1.27}/README.md +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/__init__.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/__init__.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/batch_sim.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/fj_delta_sim.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/fj_sim.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/flow_sum_sim.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/impatient_queue_sim.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/priority_network.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/priority_queue_sim.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/sim/queue_finite_source_sim.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/__init__.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/ek_d_n.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/fj_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/fj_im.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/flow_sum.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/gi_m_1_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/gi_m_n_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/m_d_n_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/m_h2_h2warm.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/m_ph_n_prty.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mg1_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mg1_warm_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mgn_tt.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mmn3_pnz_cox_approx.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/mmn_prty_pnz_approx.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/network_im_prty.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/smo_im.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/smo_im_prty.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/tests/weibull.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/__init__.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/batch_mm1.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/convolution_sum_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/diff5dots.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/ek_d_n_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/engset_model.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/fj_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/flow_sum.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/generate_pareto_noise.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/gi_m_1_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/gi_m_n_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/impatience_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_d_n_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_h2_h2warm.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_h2_n_with_h2_cold_and_h2_warmup.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/m_ph_n_prty.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mg1_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mgn_tt.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mgn_with_h2_delay_cold_warm.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmn3_pnz_cox_approx.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmn_prty_pnz_approx.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/mmnr_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/network_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/network_viewer.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/passage_time.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/priority_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/q_poisson_arrival_calc.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/student_stat.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/theory/weibull.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/utils/__init__.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/utils/approx_cdf_make.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/utils/binom_probs.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/utils/tables.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/__init__.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/smo_im_vis.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/__init__.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/result_table.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/settings_window.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue/visualisation/utils/splash_screen.py +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/SOURCES.txt +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/dependency_links.txt +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/not-zip-safe +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/requires.txt +0 -0
- {most_queue-1.25 → most_queue-1.27}/most_queue.egg-info/top_level.txt +0 -0
- {most_queue-1.25 → most_queue-1.27}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import numpy as np
|
|
2
2
|
|
|
3
|
-
import rand_destribution as rd
|
|
3
|
+
import most_queue.sim.rand_destribution as rd
|
|
4
4
|
import math
|
|
5
5
|
from tqdm import tqdm
|
|
6
6
|
import time
|
|
@@ -39,6 +39,8 @@ class QueueingSystemSimulator:
|
|
|
39
39
|
self.verbose = verbose # выводить ли текстовые сообщения о работе
|
|
40
40
|
self.cuda = cuda # использование CUDA при ИМ для генерации ПСЧ
|
|
41
41
|
|
|
42
|
+
self.generator = np.random.default_rng()
|
|
43
|
+
|
|
42
44
|
self.free_channels = self.n
|
|
43
45
|
self.num_of_states = 100000
|
|
44
46
|
self.load = 0 # коэффициент загрузки системы
|
|
@@ -85,14 +87,25 @@ class QueueingSystemSimulator:
|
|
|
85
87
|
self.is_set_warm = False
|
|
86
88
|
self.is_start_warm = False
|
|
87
89
|
self.end_warm_time = 1e16
|
|
90
|
+
self.warm_prob = 0
|
|
91
|
+
self.warm_start_mom = 0
|
|
92
|
+
self.warm_starts_times = 0
|
|
93
|
+
self.warm_after_cold_starts = 0
|
|
88
94
|
# Cold
|
|
89
95
|
self.is_set_cold = False
|
|
90
96
|
self.is_start_cold = False
|
|
91
97
|
self.end_cold_time = 1e16
|
|
98
|
+
self.cold_start_mom = 0
|
|
99
|
+
self.cold_prob = 0
|
|
100
|
+
self.cold_starts_times = 0
|
|
92
101
|
# Delay
|
|
93
102
|
self.is_set_cold_delay = False
|
|
94
103
|
self.is_start_cold_delay = False
|
|
95
104
|
self.end_cold_delay_time = 1e16
|
|
105
|
+
self.cold_delay_start_mom = 0
|
|
106
|
+
self.cold_delay_prob = 0
|
|
107
|
+
self.cold_delay_starts_times = 0
|
|
108
|
+
|
|
96
109
|
|
|
97
110
|
def set_warm(self, params, types):
|
|
98
111
|
"""
|
|
@@ -108,22 +121,23 @@ class QueueingSystemSimulator:
|
|
|
108
121
|
Равномерное 'Uniform' [mean, half_interval]
|
|
109
122
|
Нормальное 'Norm' [mean, standard_deviation]
|
|
110
123
|
"""
|
|
124
|
+
|
|
111
125
|
if types == "M":
|
|
112
|
-
self.warm_dist = rd.Exp_dist(params)
|
|
126
|
+
self.warm_dist = rd.Exp_dist(params, generator=self.generator)
|
|
113
127
|
elif types == "H":
|
|
114
|
-
self.warm_dist = rd.H2_dist(params)
|
|
128
|
+
self.warm_dist = rd.H2_dist(params, generator=self.generator)
|
|
115
129
|
elif types == "E":
|
|
116
|
-
self.warm_dist = rd.Erlang_dist(params)
|
|
130
|
+
self.warm_dist = rd.Erlang_dist(params, generator=self.generator)
|
|
117
131
|
elif types == "Gamma":
|
|
118
|
-
self.warm_dist = rd.Gamma(params)
|
|
132
|
+
self.warm_dist = rd.Gamma(params, generator=self.generator)
|
|
119
133
|
elif types == "C":
|
|
120
|
-
self.warm_dist = rd.Cox_dist(params)
|
|
134
|
+
self.warm_dist = rd.Cox_dist(params, generator=self.generator)
|
|
121
135
|
elif types == "Pa":
|
|
122
|
-
self.warm_dist = rd.Pareto_dist(params)
|
|
136
|
+
self.warm_dist = rd.Pareto_dist(params, generator=self.generator)
|
|
123
137
|
elif types == "Unifrorm":
|
|
124
|
-
self.warm_dist = rd.Uniform_dist(params)
|
|
138
|
+
self.warm_dist = rd.Uniform_dist(params, generator=self.generator)
|
|
125
139
|
elif types == "Norm":
|
|
126
|
-
self.warm_dist = rd.Normal_dist(params)
|
|
140
|
+
self.warm_dist = rd.Normal_dist(params, generator=self.generator)
|
|
127
141
|
elif types == "D":
|
|
128
142
|
self.warm_dist = rd.Det_dist(params)
|
|
129
143
|
else:
|
|
@@ -150,21 +164,21 @@ class QueueingSystemSimulator:
|
|
|
150
164
|
"""
|
|
151
165
|
|
|
152
166
|
if types == "M":
|
|
153
|
-
self.cold_dist = rd.Exp_dist(params)
|
|
167
|
+
self.cold_dist = rd.Exp_dist(params, generator=self.generator)
|
|
154
168
|
elif types == "H":
|
|
155
|
-
self.cold_dist = rd.H2_dist(params)
|
|
169
|
+
self.cold_dist = rd.H2_dist(params, generator=self.generator)
|
|
156
170
|
elif types == "E":
|
|
157
|
-
self.cold_dist = rd.Erlang_dist(params)
|
|
171
|
+
self.cold_dist = rd.Erlang_dist(params, generator=self.generator)
|
|
158
172
|
elif types == "Gamma":
|
|
159
|
-
self.cold_dist = rd.Gamma(params)
|
|
173
|
+
self.cold_dist = rd.Gamma(params, generator=self.generator)
|
|
160
174
|
elif types == "C":
|
|
161
|
-
self.cold_dist = rd.Cox_dist(params)
|
|
175
|
+
self.cold_dist = rd.Cox_dist(params, generator=self.generator)
|
|
162
176
|
elif types == "Pa":
|
|
163
|
-
self.cold_dist = rd.Pareto_dist(params)
|
|
177
|
+
self.cold_dist = rd.Pareto_dist(params, generator=self.generator)
|
|
164
178
|
elif types == "Unifrorm":
|
|
165
|
-
self.cold_dist = rd.Uniform_dist(params)
|
|
179
|
+
self.cold_dist = rd.Uniform_dist(params, generator=self.generator)
|
|
166
180
|
elif types == "Norm":
|
|
167
|
-
self.cold_dist = rd.Normal_dist(params)
|
|
181
|
+
self.cold_dist = rd.Normal_dist(params, generator=self.generator)
|
|
168
182
|
elif types == "D":
|
|
169
183
|
self.cold_dist = rd.Det_dist(params)
|
|
170
184
|
else:
|
|
@@ -195,21 +209,21 @@ class QueueingSystemSimulator:
|
|
|
195
209
|
"Необходимо сперва задать время охлаждения. Используйте метод set_cold()")
|
|
196
210
|
|
|
197
211
|
if types == "M":
|
|
198
|
-
self.cold_delay_dist = rd.Exp_dist(params)
|
|
212
|
+
self.cold_delay_dist = rd.Exp_dist(params, generator=self.generator)
|
|
199
213
|
elif types == "H":
|
|
200
|
-
self.cold_delay_dist = rd.H2_dist(params)
|
|
214
|
+
self.cold_delay_dist = rd.H2_dist(params, generator=self.generator)
|
|
201
215
|
elif types == "E":
|
|
202
|
-
self.cold_delay_dist = rd.Erlang_dist(params)
|
|
216
|
+
self.cold_delay_dist = rd.Erlang_dist(params, generator=self.generator)
|
|
203
217
|
elif types == "Gamma":
|
|
204
|
-
self.cold_delay_dist = rd.Gamma(params)
|
|
218
|
+
self.cold_delay_dist = rd.Gamma(params, generator=self.generator)
|
|
205
219
|
elif types == "C":
|
|
206
|
-
self.cold_delay_dist = rd.Cox_dist(params)
|
|
220
|
+
self.cold_delay_dist = rd.Cox_dist(params, generator=self.generator)
|
|
207
221
|
elif types == "Pa":
|
|
208
|
-
self.cold_delay_dist = rd.Pareto_dist(params)
|
|
222
|
+
self.cold_delay_dist = rd.Pareto_dist(params, generator=self.generator)
|
|
209
223
|
elif types == "Unifrorm":
|
|
210
|
-
self.cold_delay_dist = rd.Uniform_dist(params)
|
|
224
|
+
self.cold_delay_dist = rd.Uniform_dist(params, generator=self.generator)
|
|
211
225
|
elif types == "Norm":
|
|
212
|
-
self.cold_delay_dist = rd.Normal_dist(params)
|
|
226
|
+
self.cold_delay_dist = rd.Normal_dist(params, generator=self.generator)
|
|
213
227
|
elif types == "D":
|
|
214
228
|
self.cold_delay_dist = rd.Det_dist(params)
|
|
215
229
|
else:
|
|
@@ -239,21 +253,21 @@ class QueueingSystemSimulator:
|
|
|
239
253
|
self.is_set_source_params = True
|
|
240
254
|
|
|
241
255
|
if self.source_types == "M":
|
|
242
|
-
self.source = rd.Exp_dist(self.source_params)
|
|
256
|
+
self.source = rd.Exp_dist(self.source_params, generator=self.generator)
|
|
243
257
|
elif self.source_types == "H":
|
|
244
|
-
self.source = rd.H2_dist(self.source_params)
|
|
258
|
+
self.source = rd.H2_dist(self.source_params, generator=self.generator)
|
|
245
259
|
elif self.source_types == "E":
|
|
246
|
-
self.source = rd.Erlang_dist(self.source_params)
|
|
260
|
+
self.source = rd.Erlang_dist(self.source_params, generator=self.generator)
|
|
247
261
|
elif self.source_types == "C":
|
|
248
|
-
self.source = rd.Cox_dist(self.source_params)
|
|
262
|
+
self.source = rd.Cox_dist(self.source_params, generator=self.generator)
|
|
249
263
|
elif self.source_types == "Pa":
|
|
250
|
-
self.source = rd.Pareto_dist(self.source_params)
|
|
264
|
+
self.source = rd.Pareto_dist(self.source_params, generator=self.generator)
|
|
251
265
|
elif self.source_types == "Gamma":
|
|
252
|
-
self.source = rd.Gamma(self.source_params)
|
|
266
|
+
self.source = rd.Gamma(self.source_params, generator=self.generator)
|
|
253
267
|
elif self.source_types == "Uniform":
|
|
254
|
-
self.source = rd.Uniform_dist(self.source_params)
|
|
268
|
+
self.source = rd.Uniform_dist(self.source_params, generator=self.generator)
|
|
255
269
|
elif self.source_types == "Norm":
|
|
256
|
-
self.source = rd.Normal_dist(self.source_params)
|
|
270
|
+
self.source = rd.Normal_dist(self.source_params, generator=self.generator)
|
|
257
271
|
elif self.source_types == "D":
|
|
258
272
|
self.source = rd.Det_dist(self.source_params)
|
|
259
273
|
else:
|
|
@@ -281,7 +295,7 @@ class QueueingSystemSimulator:
|
|
|
281
295
|
self.is_set_server_params = True
|
|
282
296
|
|
|
283
297
|
for i in range(self.n):
|
|
284
|
-
self.servers.append(Server(self.server_params, self.server_types))
|
|
298
|
+
self.servers.append(Server(self.server_params, self.server_types, generator=self.generator))
|
|
285
299
|
|
|
286
300
|
def calc_load(self):
|
|
287
301
|
|
|
@@ -376,12 +390,13 @@ class QueueingSystemSimulator:
|
|
|
376
390
|
|
|
377
391
|
return l * b1 / self.n
|
|
378
392
|
|
|
379
|
-
def send_task_to_channel(self, is_warm_start):
|
|
393
|
+
def send_task_to_channel(self, is_warm_start=False):
|
|
380
394
|
# Отправляет заявку в канал обслуживания
|
|
381
395
|
# is_warm_start- нужен ли разогрев
|
|
382
396
|
for s in self.servers:
|
|
383
397
|
if s.is_free:
|
|
384
398
|
self.taked += 1
|
|
399
|
+
self.refresh_w_stat(0)
|
|
385
400
|
|
|
386
401
|
s.start_service(Task(self.ttek), self.ttek, is_warm_start)
|
|
387
402
|
self.free_channels -= 1
|
|
@@ -443,7 +458,8 @@ class QueueingSystemSimulator:
|
|
|
443
458
|
# Заявка пришла раньше окончания времени задержки начала охлаждения
|
|
444
459
|
self.is_start_cold_delay = False
|
|
445
460
|
self.end_cold_delay_time = 1e16
|
|
446
|
-
self.
|
|
461
|
+
self.cold_delay_prob += self.ttek - self.cold_delay_start_mom
|
|
462
|
+
self.send_task_to_channel()
|
|
447
463
|
return
|
|
448
464
|
|
|
449
465
|
if self.is_set_warm:
|
|
@@ -459,23 +475,37 @@ class QueueingSystemSimulator:
|
|
|
459
475
|
# 1. В режиме разогрева -> отправляем заявку в очередь
|
|
460
476
|
self.send_task_to_queue()
|
|
461
477
|
else:
|
|
462
|
-
if
|
|
463
|
-
# 2. Она пустая и была
|
|
478
|
+
if self.free_channels == self.n:
|
|
479
|
+
# 2. Она пустая и была выключена после охлаждения. Запускаем разогрев
|
|
464
480
|
self.start_warm()
|
|
465
481
|
# Отправляем заявку в очередь
|
|
466
482
|
self.send_task_to_queue()
|
|
467
483
|
else:
|
|
468
484
|
# 3. Не пустая и разогретая -> тогда оправляем на обслуживание
|
|
469
|
-
self.send_task_to_channel(
|
|
485
|
+
self.send_task_to_channel()
|
|
470
486
|
|
|
471
487
|
else:
|
|
472
488
|
# Без разогрева. Отправляем заявку в канал обслуживания
|
|
473
|
-
self.send_task_to_channel(
|
|
489
|
+
self.send_task_to_channel()
|
|
474
490
|
|
|
475
491
|
def start_warm(self):
|
|
476
492
|
self.is_start_warm = True
|
|
493
|
+
self.warm_start_mom = self.ttek
|
|
494
|
+
self.warm_starts_times += 1
|
|
477
495
|
self.end_warm_time = self.ttek + self.warm_dist.generate()
|
|
478
496
|
|
|
497
|
+
def start_cold(self):
|
|
498
|
+
self.is_start_cold = True
|
|
499
|
+
self.cold_start_mom = self.ttek
|
|
500
|
+
self.cold_starts_times += 1
|
|
501
|
+
self.end_cold_time = self.ttek + self.cold_dist.generate()
|
|
502
|
+
|
|
503
|
+
def start_cold_delay(self):
|
|
504
|
+
self.is_start_cold_delay = True
|
|
505
|
+
self.cold_delay_start_mom = self.ttek
|
|
506
|
+
self.cold_delay_starts_times += 1
|
|
507
|
+
self.end_cold_delay_time = self.ttek + self.cold_delay_dist.generate()
|
|
508
|
+
|
|
479
509
|
def serving(self, c):
|
|
480
510
|
"""
|
|
481
511
|
Дейтсвия по поступлению заявки на обслуживание
|
|
@@ -492,26 +522,26 @@ class QueueingSystemSimulator:
|
|
|
492
522
|
self.total += 1
|
|
493
523
|
self.free_channels += 1
|
|
494
524
|
self.refresh_v_stat(self.ttek - end_ts.arr_time)
|
|
495
|
-
|
|
525
|
+
|
|
496
526
|
self.in_sys -= 1
|
|
497
527
|
|
|
528
|
+
# ПНЗ
|
|
498
529
|
if len(self.queue) == 0 and self.free_channels == 1:
|
|
499
530
|
if self.in_sys == self.n - 1:
|
|
500
531
|
# Конец ПНЗ
|
|
501
532
|
self.ppnz_moments += 1
|
|
502
533
|
self.refresh_ppnz_stat(self.ttek - self.start_ppnz)
|
|
503
534
|
|
|
535
|
+
# COLD
|
|
504
536
|
if self.is_set_cold:
|
|
505
537
|
if len(self.queue) == 0 and self.free_channels == self.n:
|
|
506
538
|
# Система стала пустой.
|
|
507
539
|
# 1. Если задана задержка начала охлаждения - разыгрываем время ее окончания
|
|
508
540
|
# 2. Если нет - запускаем охлаждение
|
|
509
541
|
if self.is_set_cold_delay:
|
|
510
|
-
self.
|
|
511
|
-
self.end_cold_delay_time = self.ttek + self.cold_delay_dist.generate()
|
|
542
|
+
self.start_cold_delay()
|
|
512
543
|
else:
|
|
513
|
-
self.
|
|
514
|
-
self.end_cold_time = self.ttek + self.cold_dist.generate()
|
|
544
|
+
self.start_cold()
|
|
515
545
|
|
|
516
546
|
if len(self.queue) != 0:
|
|
517
547
|
self.send_head_of_queue_to_channel(c)
|
|
@@ -523,13 +553,16 @@ class QueueingSystemSimulator:
|
|
|
523
553
|
self.start_ppnz = self.ttek
|
|
524
554
|
|
|
525
555
|
self.taked += 1
|
|
556
|
+
|
|
526
557
|
que_ts.wait_time += self.ttek - que_ts.start_waiting_time
|
|
558
|
+
self.refresh_w_stat(que_ts.wait_time)
|
|
559
|
+
|
|
527
560
|
self.servers[channel_num].start_service(que_ts, self.ttek)
|
|
528
561
|
self.free_channels -= 1
|
|
529
562
|
|
|
530
563
|
def calc_next_event_time(self):
|
|
531
564
|
|
|
532
|
-
serv_earl =
|
|
565
|
+
serv_earl = 1e16
|
|
533
566
|
|
|
534
567
|
for c in range(self.n):
|
|
535
568
|
if self.servers[c].time_to_end_service < serv_earl:
|
|
@@ -547,6 +580,8 @@ class QueueingSystemSimulator:
|
|
|
547
580
|
self.ttek = self.end_warm_time
|
|
548
581
|
self.t_old = self.ttek
|
|
549
582
|
|
|
583
|
+
self.warm_prob += self.ttek - self.warm_start_mom
|
|
584
|
+
|
|
550
585
|
self.is_start_warm = False
|
|
551
586
|
self.end_warm_time = 1e16
|
|
552
587
|
|
|
@@ -561,13 +596,17 @@ class QueueingSystemSimulator:
|
|
|
561
596
|
self.ttek = self.end_cold_time
|
|
562
597
|
self.t_old = self.ttek
|
|
563
598
|
|
|
599
|
+
self.cold_prob += self.ttek - self.cold_start_mom
|
|
600
|
+
|
|
564
601
|
self.is_start_cold = False
|
|
565
602
|
self.end_cold_time = 1e16
|
|
566
603
|
|
|
567
604
|
if self.is_set_warm:
|
|
568
605
|
if len(self.queue) != 0:
|
|
569
606
|
# Запускаем разогрев только если в очереди скопились заявки.
|
|
607
|
+
self.warm_after_cold_starts += 1
|
|
570
608
|
self.start_warm()
|
|
609
|
+
|
|
571
610
|
else:
|
|
572
611
|
# Отправляем n заявок из очереди в каналы
|
|
573
612
|
for i in range(self.n):
|
|
@@ -580,6 +619,8 @@ class QueueingSystemSimulator:
|
|
|
580
619
|
self.ttek = self.end_cold_delay_time
|
|
581
620
|
self.t_old = self.ttek
|
|
582
621
|
|
|
622
|
+
self.cold_delay_prob += self.ttek - self.cold_delay_start_mom
|
|
623
|
+
|
|
583
624
|
self.is_start_cold_delay = False
|
|
584
625
|
self.end_cold_delay_time = 1e16
|
|
585
626
|
|
|
@@ -671,15 +712,30 @@ class QueueingSystemSimulator:
|
|
|
671
712
|
|
|
672
713
|
self.time_spent = time.process_time() - start
|
|
673
714
|
|
|
715
|
+
def get_warmup_prob(self):
|
|
716
|
+
|
|
717
|
+
return self.warm_prob/self.ttek
|
|
718
|
+
|
|
719
|
+
def get_cold_prob(self):
|
|
720
|
+
|
|
721
|
+
return self.cold_prob / self.ttek
|
|
722
|
+
|
|
723
|
+
def get_cold_delay_prob(self):
|
|
724
|
+
|
|
725
|
+
return self.cold_delay_prob / self.ttek
|
|
726
|
+
|
|
674
727
|
def refresh_ppnz_stat(self, new_a):
|
|
728
|
+
|
|
675
729
|
for i in range(3):
|
|
676
730
|
self.ppnz[i] = self.ppnz[i] * (1.0 - (1.0 / self.ppnz_moments)) + math.pow(new_a, i + 1) / self.ppnz_moments
|
|
677
731
|
|
|
678
732
|
def refresh_v_stat(self, new_a):
|
|
733
|
+
|
|
679
734
|
for i in range(3):
|
|
680
735
|
self.v[i] = self.v[i] * (1.0 - (1.0 / self.served)) + math.pow(new_a, i + 1) / self.served
|
|
681
736
|
|
|
682
737
|
def refresh_w_stat(self, new_a):
|
|
738
|
+
|
|
683
739
|
for i in range(3):
|
|
684
740
|
self.w[i] = self.w[i] * (1.0 - (1.0 / self.taked)) + math.pow(new_a, i + 1) / self.taked
|
|
685
741
|
|
|
@@ -754,7 +810,7 @@ class Task:
|
|
|
754
810
|
"""
|
|
755
811
|
self.arr_time = arr_time
|
|
756
812
|
|
|
757
|
-
self.start_waiting_time =
|
|
813
|
+
self.start_waiting_time = 0
|
|
758
814
|
|
|
759
815
|
self.wait_time = 0
|
|
760
816
|
|
|
@@ -773,27 +829,27 @@ class Server:
|
|
|
773
829
|
"""
|
|
774
830
|
id = 0
|
|
775
831
|
|
|
776
|
-
def __init__(self, params, types):
|
|
832
|
+
def __init__(self, params, types, generator=None):
|
|
777
833
|
"""
|
|
778
834
|
params - параметры распределения
|
|
779
835
|
types - тип распределения
|
|
780
836
|
"""
|
|
781
837
|
if types == "M":
|
|
782
|
-
self.dist = rd.Exp_dist(params)
|
|
838
|
+
self.dist = rd.Exp_dist(params, generator=generator)
|
|
783
839
|
elif types == "H":
|
|
784
|
-
self.dist = rd.H2_dist(params)
|
|
840
|
+
self.dist = rd.H2_dist(params, generator=generator)
|
|
785
841
|
elif types == "E":
|
|
786
|
-
self.dist = rd.Erlang_dist(params)
|
|
842
|
+
self.dist = rd.Erlang_dist(params, generator=generator)
|
|
787
843
|
elif types == "C":
|
|
788
|
-
self.dist = rd.Cox_dist(params)
|
|
844
|
+
self.dist = rd.Cox_dist(params, generator=generator)
|
|
789
845
|
elif types == "Gamma":
|
|
790
|
-
self.dist = rd.Gamma(params)
|
|
846
|
+
self.dist = rd.Gamma(params, generator=generator)
|
|
791
847
|
elif types == "Pa":
|
|
792
|
-
self.dist = rd.Pareto_dist(params)
|
|
848
|
+
self.dist = rd.Pareto_dist(params, generator=generator)
|
|
793
849
|
elif types == "Uniform":
|
|
794
|
-
self.dist = rd.Uniform_dist(params)
|
|
850
|
+
self.dist = rd.Uniform_dist(params, generator=generator)
|
|
795
851
|
elif types == "Norm":
|
|
796
|
-
self.dist = rd.Normal_dist(params)
|
|
852
|
+
self.dist = rd.Normal_dist(params, generator=generator)
|
|
797
853
|
elif types == "D":
|
|
798
854
|
self.dist = rd.Det_dist(params)
|
|
799
855
|
else:
|
|
@@ -809,24 +865,24 @@ class Server:
|
|
|
809
865
|
self.types_warm = None
|
|
810
866
|
self.warm_dist = None
|
|
811
867
|
|
|
812
|
-
def set_warm(self, params, types):
|
|
868
|
+
def set_warm(self, params, types, generator=None):
|
|
813
869
|
|
|
814
870
|
if types == "M":
|
|
815
|
-
self.warm_dist = rd.Exp_dist(params)
|
|
871
|
+
self.warm_dist = rd.Exp_dist(params, generator=generator)
|
|
816
872
|
elif types == "H":
|
|
817
|
-
self.warm_dist = rd.H2_dist(params)
|
|
873
|
+
self.warm_dist = rd.H2_dist(params, generator=generator)
|
|
818
874
|
elif types == "E":
|
|
819
|
-
self.warm_dist = rd.Erlang_dist(params)
|
|
875
|
+
self.warm_dist = rd.Erlang_dist(params, generator=generator)
|
|
820
876
|
elif types == "Gamma":
|
|
821
|
-
self.warm_dist = rd.Gamma(params)
|
|
877
|
+
self.warm_dist = rd.Gamma(params, generator=generator)
|
|
822
878
|
elif types == "C":
|
|
823
|
-
self.warm_dist = rd.Cox_dist(params)
|
|
879
|
+
self.warm_dist = rd.Cox_dist(params, generator=generator)
|
|
824
880
|
elif types == "Pa":
|
|
825
|
-
self.warm_dist = rd.Pareto_dist(params)
|
|
881
|
+
self.warm_dist = rd.Pareto_dist(params, generator=generator)
|
|
826
882
|
elif types == "Unifrorm":
|
|
827
|
-
self.warm_dist = rd.Uniform_dist(params)
|
|
883
|
+
self.warm_dist = rd.Uniform_dist(params, generator=generator)
|
|
828
884
|
elif types == "Norm":
|
|
829
|
-
self.warm_dist = rd.Normal_dist(params)
|
|
885
|
+
self.warm_dist = rd.Normal_dist(params, generator=generator)
|
|
830
886
|
elif types == "D":
|
|
831
887
|
self.warm_dist = rd.Det_dist(params)
|
|
832
888
|
else:
|
|
@@ -62,7 +62,7 @@ def generate_e_jit(rng_states, r, mu, out):
|
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
class Normal_dist:
|
|
65
|
-
def __init__(self, params):
|
|
65
|
+
def __init__(self, params, generator=None):
|
|
66
66
|
"""
|
|
67
67
|
Принимает список параметров в следующей последовательности:
|
|
68
68
|
mean - среднее значение
|
|
@@ -72,26 +72,28 @@ class Normal_dist:
|
|
|
72
72
|
self.mean = params[0]
|
|
73
73
|
self.sko = params[1]
|
|
74
74
|
self.type = 'Normal'
|
|
75
|
+
self.generator = generator
|
|
75
76
|
|
|
76
77
|
def generate(self):
|
|
77
78
|
"""
|
|
78
79
|
Генерация псевдо-случайных чисел
|
|
79
80
|
"""
|
|
80
81
|
|
|
81
|
-
return self.generate_static(self.mean, self.sko)
|
|
82
|
+
return self.generate_static(self.mean, self.sko, self.generator)
|
|
82
83
|
|
|
83
84
|
@staticmethod
|
|
84
|
-
def generate_static(mean, sko):
|
|
85
|
+
def generate_static(mean, sko, generator=None):
|
|
85
86
|
"""
|
|
86
87
|
Генерация псевдо-случайных чисел
|
|
87
88
|
Статический метод
|
|
88
89
|
"""
|
|
89
|
-
|
|
90
|
+
if generator:
|
|
91
|
+
return generator.normal(mean, sko)
|
|
90
92
|
return np.random.normal(mean, sko)
|
|
91
93
|
|
|
92
94
|
|
|
93
95
|
class Uniform_dist:
|
|
94
|
-
def __init__(self, params):
|
|
96
|
+
def __init__(self, params, generator=None):
|
|
95
97
|
"""
|
|
96
98
|
Принимает список параметров в следующей последовательности:
|
|
97
99
|
mean - среднее значение
|
|
@@ -101,6 +103,7 @@ class Uniform_dist:
|
|
|
101
103
|
self.mean = params[0]
|
|
102
104
|
self.half_interval = params[1]
|
|
103
105
|
self.type = 'Uniform'
|
|
106
|
+
self.generator = generator
|
|
104
107
|
|
|
105
108
|
def generate(self):
|
|
106
109
|
"""
|
|
@@ -108,17 +111,17 @@ class Uniform_dist:
|
|
|
108
111
|
Вызов из экземпляра класса
|
|
109
112
|
"""
|
|
110
113
|
|
|
111
|
-
return self.generate_static(self.mean, self.half_interval)
|
|
114
|
+
return self.generate_static(self.mean, self.half_interval, self.generator)
|
|
112
115
|
|
|
113
116
|
@staticmethod
|
|
114
|
-
def generate_static(mean, half_interval):
|
|
117
|
+
def generate_static(mean, half_interval, generator=None):
|
|
115
118
|
"""
|
|
116
119
|
Генерация псевдо-случайных чисел, подчиненных равномерному распределению
|
|
117
120
|
Статический метод
|
|
118
121
|
"""
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return
|
|
122
|
+
if generator:
|
|
123
|
+
return generator.uniform(mean - half_interval, mean + half_interval)
|
|
124
|
+
return np.random.uniform(mean - half_interval, mean + half_interval)
|
|
122
125
|
|
|
123
126
|
@staticmethod
|
|
124
127
|
def calc_theory_moments(mean, half_interval, num=3):
|
|
@@ -193,7 +196,7 @@ class Uniform_dist:
|
|
|
193
196
|
|
|
194
197
|
|
|
195
198
|
class H2_dist:
|
|
196
|
-
def __init__(self, params):
|
|
199
|
+
def __init__(self, params, generator=None):
|
|
197
200
|
"""
|
|
198
201
|
Принимает список параметров в следующей последовательности - y1, mu1, mu2
|
|
199
202
|
"""
|
|
@@ -203,6 +206,7 @@ class H2_dist:
|
|
|
203
206
|
self.m2 = params[2]
|
|
204
207
|
self.params = params
|
|
205
208
|
self.type = 'H'
|
|
209
|
+
self.generator = generator
|
|
206
210
|
|
|
207
211
|
def generate(self):
|
|
208
212
|
"""
|
|
@@ -210,17 +214,22 @@ class H2_dist:
|
|
|
210
214
|
Вызов из экземпляра класса
|
|
211
215
|
"""
|
|
212
216
|
|
|
213
|
-
return self.generate_static(self.y1, self.m1, self.m2)
|
|
217
|
+
return self.generate_static(self.y1, self.m1, self.m2, self.generator)
|
|
214
218
|
|
|
215
219
|
@staticmethod
|
|
216
|
-
def generate_static(y1, m1, m2):
|
|
220
|
+
def generate_static(y1, m1, m2, generator=None):
|
|
217
221
|
"""
|
|
218
222
|
Генерация псевдо-случайных чисел, подчиненных гиперэкспоненциальному распределению 2-го порядка.
|
|
219
223
|
Статический метод
|
|
220
224
|
"""
|
|
221
225
|
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
if generator:
|
|
227
|
+
r = generator.random()
|
|
228
|
+
res = -np.log(generator.random())
|
|
229
|
+
else:
|
|
230
|
+
r = np.random.rand()
|
|
231
|
+
res = -np.log(np.random.rand())
|
|
232
|
+
|
|
224
233
|
if r < y1:
|
|
225
234
|
if m1 != 0:
|
|
226
235
|
res = res / m1
|
|
@@ -429,7 +438,7 @@ class Cox_dist:
|
|
|
429
438
|
Распределение Кокса 2-го порядка
|
|
430
439
|
"""
|
|
431
440
|
|
|
432
|
-
def __init__(self, params):
|
|
441
|
+
def __init__(self, params, generator=None):
|
|
433
442
|
"""
|
|
434
443
|
Принимает список параметров в следующей последовательности - y1, mu1, mu2
|
|
435
444
|
"""
|
|
@@ -438,22 +447,30 @@ class Cox_dist:
|
|
|
438
447
|
self.m2 = params[2]
|
|
439
448
|
self.params = params
|
|
440
449
|
self.type = 'C'
|
|
450
|
+
self.generator = generator
|
|
441
451
|
|
|
442
452
|
def generate(self):
|
|
443
453
|
"""
|
|
444
454
|
Генерация псевдо-случайных чисел, подчиненных распределению Кокса 2-го порядка. Вызов из экземпляра класса
|
|
445
455
|
"""
|
|
446
|
-
return self.generate_static(self.y1, self.m1, self.m2)
|
|
456
|
+
return self.generate_static(self.y1, self.m1, self.m2, self.generator)
|
|
447
457
|
|
|
448
458
|
@staticmethod
|
|
449
|
-
def generate_static(y1, m1, m2):
|
|
459
|
+
def generate_static(y1, m1, m2, generator):
|
|
450
460
|
"""
|
|
451
461
|
Генерация псевдо-случайных чисел, подчиненных распределению Кокса 2-го порядка. Статический метод
|
|
452
462
|
"""
|
|
453
|
-
|
|
454
|
-
|
|
463
|
+
if generator:
|
|
464
|
+
r = generator.random()
|
|
465
|
+
res = (-1.0 / m1) * np.log(generator.random())
|
|
466
|
+
else:
|
|
467
|
+
r = np.random.rand()
|
|
468
|
+
res = (-1.0 / m1) * np.log(np.random.rand())
|
|
455
469
|
if r < y1:
|
|
456
|
-
|
|
470
|
+
if generator:
|
|
471
|
+
res = res + (-1.0 / m2) * np.log(generator.random())
|
|
472
|
+
else:
|
|
473
|
+
res = res + (-1.0 / m2) * np.log(np.random.rand())
|
|
457
474
|
return res
|
|
458
475
|
|
|
459
476
|
@staticmethod
|
|
@@ -566,7 +583,7 @@ class Det_dist:
|
|
|
566
583
|
class Pareto_dist:
|
|
567
584
|
"Распределение Парето"
|
|
568
585
|
|
|
569
|
-
def __init__(self, params):
|
|
586
|
+
def __init__(self, params, generator=None):
|
|
570
587
|
"""
|
|
571
588
|
Принимает список параметров в следующей последовательности - alpha, K
|
|
572
589
|
"""
|
|
@@ -574,9 +591,10 @@ class Pareto_dist:
|
|
|
574
591
|
self.k = params[1]
|
|
575
592
|
self.params = params
|
|
576
593
|
self.type = 'Pa'
|
|
594
|
+
self.generator = generator
|
|
577
595
|
|
|
578
596
|
def generate(self):
|
|
579
|
-
return Pareto_dist.generate_static(self.a, self.k)
|
|
597
|
+
return Pareto_dist.generate_static(self.a, self.k, self.generator)
|
|
580
598
|
|
|
581
599
|
@staticmethod
|
|
582
600
|
def get_pdf(t, a, k):
|
|
@@ -621,7 +639,9 @@ class Pareto_dist:
|
|
|
621
639
|
return f
|
|
622
640
|
|
|
623
641
|
@staticmethod
|
|
624
|
-
def generate_static(a, k):
|
|
642
|
+
def generate_static(a, k, generator=None):
|
|
643
|
+
if generator:
|
|
644
|
+
return k * math.pow(generator.random(), -1 / a)
|
|
625
645
|
return k * math.pow(np.random.rand(), -1 / a)
|
|
626
646
|
|
|
627
647
|
@staticmethod
|
|
@@ -662,7 +682,7 @@ class Erlang_dist:
|
|
|
662
682
|
Распределение Эрланга r-го порядка
|
|
663
683
|
"""
|
|
664
684
|
|
|
665
|
-
def __init__(self, params):
|
|
685
|
+
def __init__(self, params, generator=None):
|
|
666
686
|
""""
|
|
667
687
|
Принимает список параметров в следующей последовательности - r, mu
|
|
668
688
|
"""
|
|
@@ -670,21 +690,25 @@ class Erlang_dist:
|
|
|
670
690
|
self.mu = params[1]
|
|
671
691
|
self.params = params
|
|
672
692
|
self.type = 'E'
|
|
693
|
+
self.generator = generator
|
|
673
694
|
|
|
674
695
|
def generate(self):
|
|
675
696
|
"""
|
|
676
697
|
Генератор псевдо-случайных чисел
|
|
677
698
|
"""
|
|
678
|
-
return self.generate_static(self.r, self.mu)
|
|
699
|
+
return self.generate_static(self.r, self.mu, self.generator)
|
|
679
700
|
|
|
680
701
|
@staticmethod
|
|
681
|
-
def generate_static(r, mu):
|
|
702
|
+
def generate_static(r, mu, generator=None):
|
|
682
703
|
"""
|
|
683
704
|
Генератор псевдо-случайных чисел. Статический метод
|
|
684
705
|
"""
|
|
685
706
|
prod = 1
|
|
686
707
|
for i in range(r):
|
|
687
|
-
|
|
708
|
+
if generator:
|
|
709
|
+
prod *= generator.random()
|
|
710
|
+
else:
|
|
711
|
+
prod *= np.random.rand()
|
|
688
712
|
|
|
689
713
|
return -(1.0 / mu) * np.log(prod)
|
|
690
714
|
|
|
@@ -750,17 +774,18 @@ class Exp_dist:
|
|
|
750
774
|
Экспоненциальное распределение
|
|
751
775
|
"""
|
|
752
776
|
|
|
753
|
-
def __init__(self, mu):
|
|
777
|
+
def __init__(self, mu, generator=None):
|
|
754
778
|
self.erl = Erlang_dist([1, mu])
|
|
755
779
|
self.params = mu
|
|
756
780
|
self.type = 'M'
|
|
781
|
+
self.generator = generator
|
|
757
782
|
|
|
758
783
|
def generate(self):
|
|
759
784
|
return self.erl.generate()
|
|
760
785
|
|
|
761
786
|
@staticmethod
|
|
762
|
-
def generate_static(mu):
|
|
763
|
-
return Erlang_dist.generate_static(1, mu)
|
|
787
|
+
def generate_static(mu, generator=None):
|
|
788
|
+
return Erlang_dist.generate_static(1, mu, generator)
|
|
764
789
|
|
|
765
790
|
@staticmethod
|
|
766
791
|
def calc_theory_moments(mu, count=3):
|
|
@@ -776,7 +801,7 @@ class Gamma:
|
|
|
776
801
|
Гамма-распределение
|
|
777
802
|
"""
|
|
778
803
|
|
|
779
|
-
def __init__(self, params):
|
|
804
|
+
def __init__(self, params, generator=None):
|
|
780
805
|
self.mu = params[0]
|
|
781
806
|
self.alpha = params[1]
|
|
782
807
|
self.is_corrective = False
|
|
@@ -787,6 +812,7 @@ class Gamma:
|
|
|
787
812
|
self.g.append(params[i])
|
|
788
813
|
self.params = params
|
|
789
814
|
self.type = 'Gamma'
|
|
815
|
+
self.generator = generator
|
|
790
816
|
|
|
791
817
|
@staticmethod
|
|
792
818
|
def get_mu_alpha(b):
|
|
@@ -839,11 +865,13 @@ class Gamma:
|
|
|
839
865
|
return mu, alpha
|
|
840
866
|
|
|
841
867
|
def generate(self):
|
|
842
|
-
return self.generate_static(self.mu, self.alpha)
|
|
868
|
+
return self.generate_static(self.mu, self.alpha, self.generator)
|
|
843
869
|
|
|
844
870
|
@staticmethod
|
|
845
|
-
def generate_static(mu, alpha):
|
|
871
|
+
def generate_static(mu, alpha, generator=None):
|
|
846
872
|
theta = 1 / mu
|
|
873
|
+
if generator:
|
|
874
|
+
return generator.gamma(alpha, theta)
|
|
847
875
|
return np.random.gamma(alpha, theta)
|
|
848
876
|
|
|
849
877
|
@staticmethod
|
|
@@ -32,8 +32,9 @@ if __name__ == '__main__':
|
|
|
32
32
|
from most_queue.utils.tables import times_print, probs_print
|
|
33
33
|
|
|
34
34
|
l = 1
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
ro = 0.2 # коэфф загрузки
|
|
36
|
+
b1 = n * ro / l # ср время обслуживания
|
|
37
|
+
b1_warm = n * 0.3 / l # ср время разогрева
|
|
37
38
|
coev = 1.3
|
|
38
39
|
b_params = rd.H2_dist.get_params_by_mean_and_coev(b1, coev)
|
|
39
40
|
b = rd.H2_dist.calc_theory_moments(*b_params, 4)
|
|
@@ -593,9 +593,9 @@ if __name__ == "__main__":
|
|
|
593
593
|
b1_cold = n * 0.0001 / l # ср время охлаждения
|
|
594
594
|
num_of_jobs = 1000000 # число обсл заявок ИМ
|
|
595
595
|
b_coev_warm = 1.2 # коэфф вариации времени разогрева
|
|
596
|
-
b_coev_cold = 1.
|
|
596
|
+
b_coev_cold = 1.2 # коэфф вариации времени охлаждения
|
|
597
597
|
buff = None
|
|
598
|
-
verbose =
|
|
598
|
+
verbose = False
|
|
599
599
|
|
|
600
600
|
b_w = [0.0] * 3
|
|
601
601
|
b_w[0] = b1_warm
|
|
@@ -618,7 +618,7 @@ if __name__ == "__main__":
|
|
|
618
618
|
|
|
619
619
|
smo.set_servers(mu, 'M')
|
|
620
620
|
smo.set_warm(gamma_params_warm, 'Gamma')
|
|
621
|
-
smo.set_cold(gamma_params_cold, 'Gamma')
|
|
621
|
+
# smo.set_cold(gamma_params_cold, 'Gamma')
|
|
622
622
|
|
|
623
623
|
smo.run(num_of_jobs)
|
|
624
624
|
p = smo.get_p()
|
|
@@ -640,6 +640,10 @@ if __name__ == "__main__":
|
|
|
640
640
|
tt_time = time.process_time() - tt_start
|
|
641
641
|
num_of_iter = tt.num_of_iter_
|
|
642
642
|
|
|
643
|
+
print('warms starts', smo.warm_starts_times)
|
|
644
|
+
print('warms after cold starts', smo.warm_after_cold_starts)
|
|
645
|
+
print('cold starts', smo.cold_starts_times)
|
|
646
|
+
|
|
643
647
|
print("\nСравнение результатов расчета методом Такахаси-Таками и ИМ.\n"
|
|
644
648
|
"ИМ - M/Gamma/{0:^2d} с Gamma разогревом\nТакахаси-Таками - M/M/{0:^2d} c H2-разогревом и H2-охлаждением "
|
|
645
649
|
"с комплексными параметрами\n"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|