-
-
Save Sinabon2004/400a3619d3d830806b772a3ca7455412 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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