Skip to content

Instantly share code, notes, and snippets.

@Sinabon2004
Created September 20, 2025 19:11
Show Gist options
  • Select an option

  • Save Sinabon2004/400a3619d3d830806b772a3ca7455412 to your computer and use it in GitHub Desktop.

Select an option

Save Sinabon2004/400a3619d3d830806b772a3ca7455412 to your computer and use it in GitHub Desktop.
import math
import numpy as np
import matplotlib.pyplot as plt
# ==========================
# СЧИТАЕМ МЕТРИКИ
# ==========================
def stationary_distribution(c: int, ro_1: float, ro_2: float):
"""Стационарное распределение вероятностей."""
ro_sum = ro_1 + ro_2
sigma = sum((ro_sum**i) / math.factorial(i) for i in range(c + 1))
return [(ro_sum**n) / math.factorial(n) / sigma for n in range(c + 1)]
def time_blocking(pn: list):
"""Вероятность блокировки по времени (последнее состояние)."""
return pn[-1]
def average_number(pn: list):
"""Среднее число обслуживаемых заявок."""
return sum(n * pn[n] for n in range(len(pn)))
def metrics(c: int, lam_1: float, lam_2: float, mu: float):
"""Вычисление всех основных метрик."""
ro_1 = lam_1 / mu
ro_2 = lam_2 / mu
pn = stationary_distribution(c, ro_1, ro_2)
t_b = time_blocking(pn)
av_num = average_number(pn)
blocking_on_calls_1 = (lam_1 / (lam_1 + lam_2)) * t_b if lam_1 + lam_2 > 0 else 0
blocking_on_calls_2 = (lam_2 / (lam_1 + lam_2)) * t_b if lam_1 + lam_2 > 0 else 0
return {
"pn": pn,
"time_block": t_b,
"average_number": av_num,
"blocking_calls": (blocking_on_calls_1, blocking_on_calls_2),
"blocking_load": (t_b, t_b),
}
# ==========================
# СЧИТАЕМ РАЗМЕТКУ И РИСУЕМ ГРАФИКИ
# ==========================
def plot_blocking_vs_lambda(c, lam_2, mu, lam_range):
t_b_range = [
time_blocking(stationary_distribution(c, lam / mu, lam_2 / mu)) for lam in lam_range
]
plt.figure(figsize=(10, 6))
plt.plot(lam_range, t_b_range, label="Вероятность блокировки", linewidth=2, color="crimson")
plt.title("Зависимость вероятности блокировки от интенсивности запросов", fontsize=16)
plt.xlabel("Интенсивность запросов (λ1)", fontsize=14)
plt.ylabel("Вероятность блокировки", fontsize=14)
plt.grid(True, linestyle="--", alpha=0.7)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()
def plot_average_number_vs_lambda(c, lam_2, mu, lam_range):
av_num_range = [
average_number(stationary_distribution(c, lam / mu, lam_2 / mu)) for lam in lam_range
]
plt.figure(figsize=(10, 6))
plt.plot(lam_range, av_num_range, label="Среднее число обслуживаемых заявок", linewidth=2, color="navy")
plt.title("Среднее число обслуживаемых заявок от интенсивности запросов", fontsize=16)
plt.xlabel("Интенсивность запросов (λ1)", fontsize=14)
plt.ylabel("Среднее число заявок", fontsize=14)
plt.grid(True, linestyle="--", alpha=0.7)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()
# ==========================
# ЗАПУСКАЕМ!!!
# ==========================
if __name__ == "__main__":
# АРГУМЕНТЫ ИЗ ПРИМЕРА ВЫПОЛНЕНИЯ
C = 121
MU = 0.5
LAMBDA_1 = 50
LAMBDA_2 = 40
result = metrics(C, LAMBDA_1, LAMBDA_2, MU)
print("\n--- Результаты --- 📊✨")
for n, p in enumerate(result["pn"]):
print(f"P(n={n}) = {p:.5f} 🎲")
print(f"Сумма вероятностей = {sum(result['pn']):.5f} ➕")
print(f"Вероятность блокировки (по времени) = {result['time_block']:.5f} ⏳🚫")
print(f"Среднее число заявок = {result['average_number']:.5f} 👥")
print(f"Вероятность блокировки по вызовам: B1 = {result['blocking_calls'][0]:.5f} 📞🚫, B2 = {result['blocking_calls'][1]:.5f} 📞🚫")
print(f"Вероятность блокировки по нагрузке: C1 = {result['blocking_load'][0]:.5f} 📦🚫, C2 = {result['blocking_load'][1]:.5f} 📦🚫")
# Диапазон для графиков
lam_1_range = np.arange(0.1, C, 0.5)
# Построение графиков
plot_blocking_vs_lambda(C, LAMBDA_2, MU, lam_1_range)
plot_average_number_vs_lambda(C, LAMBDA_2, MU, lam_1_range)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment