Created
October 22, 2023 13:05
-
-
Save jerrylususu/2d8f7099a1c4af37160179b12ce13895 to your computer and use it in GitHub Desktop.
gym_wait_sim.py
This file contains 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 numpy as np | |
import csv | |
from tqdm import tqdm | |
import seaborn as sns | |
import matplotlib.pyplot as plt | |
import pandas as pd | |
def simulate_wait_times(num_machines, num_simulations, mean, std_dev): | |
wait_times = [] | |
for _ in range(num_simulations): | |
total_workout_times = [] | |
for _ in range(num_machines): | |
sampled_time = -1 | |
while sampled_time < 0: | |
sampled_time = np.random.normal(mean, std_dev) | |
total_workout_times.append(sampled_time) | |
remaining_times = [np.random.uniform(0, workout_time) for workout_time in total_workout_times] | |
wait_time = np.min(remaining_times) | |
wait_times.append(wait_time) | |
wait_times_array = np.array(wait_times) | |
mean_wait = np.mean(wait_times_array) | |
quantiles = [50, 75, 90, 95] | |
quantile_values = np.percentile(wait_times_array, quantiles) | |
return { | |
'wait_times': wait_times_array, | |
'mean': mean_wait, | |
'p50': quantile_values[0], | |
'p75': quantile_values[1], | |
'p90': quantile_values[2], | |
'p95': quantile_values[3], | |
'num_machines': num_machines, | |
'num_simulations': num_simulations, | |
'mean_param': mean, | |
'std_dev_param': std_dev | |
} | |
param_sets = [{'num_machines': 10, 'num_simulations': 10000, 'mean': 30, 'std_dev': 10}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 25, 'std_dev': 10}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 20, 'std_dev': 10}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 30, 'std_dev': 5}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 20, 'std_dev': 5}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 25, 'std_dev': 5}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 30, 'std_dev': 15}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 20, 'std_dev': 15}, | |
{'num_machines': 10, 'num_simulations': 10000, 'mean': 25, 'std_dev': 15},] | |
results = [] | |
for param_set in tqdm(param_sets, desc='Simulations'): | |
num_machines = param_set['num_machines'] | |
num_simulations = param_set['num_simulations'] | |
mean = param_set['mean'] | |
std_dev = param_set['std_dev'] | |
simulation_result = simulate_wait_times(num_machines, num_simulations, mean, std_dev) | |
results.append(simulation_result) | |
# Generate and save figure for each param set | |
fig, axes = plt.subplots() | |
sns.distplot(simulation_result['wait_times'], ax=axes) | |
axes.set_title(f'num_machines={num_machines}, num_simulations={num_simulations}, mean={mean}, std_dev={std_dev}') | |
plt.savefig(f'num_machines={num_machines}_num_simulations={num_simulations}_mean={mean}_std_dev={std_dev}.png') | |
plt.close() | |
# Generate final figure | |
fig, axes = plt.subplots() | |
for param_set, simulation_result in zip(param_sets, results): | |
num_machines = param_set['num_machines'] | |
num_simulations = param_set['num_simulations'] | |
mean = param_set['mean'] | |
std_dev = param_set['std_dev'] | |
sns.distplot(simulation_result['wait_times'], ax=axes, | |
label=f'num_machines={num_machines}, num_simulations={num_simulations}, mean={mean}, std_dev={std_dev}') | |
axes.set_title('Combined Simulation Results') | |
plt.legend() | |
plt.show() | |
csv_filename = 'simulation_results.csv' | |
with open(csv_filename, mode='w', newline='') as file: | |
fieldnames = ['num_machines', 'num_simulations', 'mean_param', 'std_dev_param', 'mean', 'p50', 'p75', 'p90', 'p95'] | |
writer = csv.DictWriter(file, fieldnames=fieldnames) | |
writer.writeheader() | |
writer.writerows([{k: v for k, v in i.items() if k in fieldnames} for i in results]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment