Skip to content

Instantly share code, notes, and snippets.

@jerrylususu
Created October 22, 2023 13:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jerrylususu/2d8f7099a1c4af37160179b12ce13895 to your computer and use it in GitHub Desktop.
Save jerrylususu/2d8f7099a1c4af37160179b12ce13895 to your computer and use it in GitHub Desktop.
gym_wait_sim.py
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