pdppo / code /Lot-sizing /plot_figure.py
leokana's picture
include experiment results and updated code
ff58990
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 6 16:30:32 2023
@author: leona
"""
import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
def save_graph():
print("============================================================================================")
# experiment_name = '15items_5machines_t100_i100'
# experiment_name = '20items_10machines_t100_i100'
# experiment_name = '25items_10machines_t100_i100'
experiment_name = '25items_15machines_t100_i100'
env_name = experiment_name
rolling_window = 10
# make directory for saving figures
figures_dir = "results"
if not os.path.exists(figures_dir):
os.makedirs(figures_dir)
# make environment directory for saving figures
figures_dir = figures_dir + '/' + env_name + '_PPO'+'/'
if not os.path.exists(figures_dir):
os.makedirs(figures_dir)
#fig_save_path = figures_dir + '/PPO_' + env_name + '_fig_' + str(fig_num) + '.png'
# get number of log files in directory
BASE_DIR = os.path.dirname(os.path.abspath('__file__'))
# Use the logs file in the root path of the main.
LOG_DIR = os.path.join(BASE_DIR,'logs')
log_dir = LOG_DIR + '/' + env_name + '_PPO' + '/'
# Check if the directory exists
if not os.path.exists(log_dir):
print(f"Directory not found: {log_dir}")
else:
# Attempt to walk through the directory
try:
current_num_files = next(os.walk(log_dir))[2]
print(f"Number of files in the directory: {len(current_num_files)}")
except StopIteration:
print("No files in the directory.")
num_runs = len(current_num_files)-1
all_runs_ppo = []
print(num_runs)
########################################################################################
for run_num in range(num_runs):
run_num = run_num + 1
log_f_name = log_dir + '/PPO_' + env_name + "_log_" + str(run_num) + ".csv"
print("loading data from : " + log_f_name)
data = pd.read_csv(log_f_name)
data = pd.DataFrame(data)
print("data shape : ", data.shape)
all_runs_ppo.append(data)
print("--------------------------------------------------------------------------------------------")
# average all runs
df_concat = pd.concat(all_runs_ppo)
#Apply rolling mean to reward values
df_concat['reward_mean'] = df_concat['reward'].rolling(window=rolling_window, win_type='triang', min_periods=1).mean()
# Drop NaN values from beginning of rolling mean
df_concat = df_concat.dropna().reset_index(drop=True)
# Calculate mean and standard deviation of reward values
reward_mean = df_concat.groupby('timestep')['reward_mean'].mean().iloc[rolling_window:]
reward_std = df_concat.groupby('timestep')['reward_mean'].std().iloc[rolling_window:]
# Set up plot using seaborn
sns.set_style("whitegrid")
fig, ax = plt.subplots(figsize=(10, 6))
sns.set_style("whitegrid")
# Plot mean reward with shaded confidence interval
sns.lineplot(x=reward_mean.index, y=reward_mean, ax=ax,label='PPO')
ax.fill_between(reward_mean.index, reward_mean - reward_std, reward_mean + reward_std, alpha=0.2)
# keep only reward_smooth in the legend and rename it
########################################################################################
log_dir = LOG_DIR + '/' + env_name + '_PDPPO' + '/'
current_num_files = next(os.walk(log_dir))[2]
num_runs = len(current_num_files)-1
all_runs = []
for run_num in range(num_runs):
run_num = run_num + 1
log_f_name = log_dir + 'PDPPO_' + env_name + "_log_" + str(run_num) + ".csv"
print("loading data from : " + log_f_name)
data = pd.read_csv(log_f_name)
data = pd.DataFrame(data)
print("data shape : ", data.shape)
all_runs.append(data)
print("--------------------------------------------------------------------------------------------")
# average all runs
df_concat = pd.concat(all_runs)
#Apply rolling mean to reward values
df_concat['reward_mean'] = df_concat['reward'].rolling(window=rolling_window, win_type='triang', min_periods=1).mean()
# Drop NaN values from beginning of rolling mean
df_concat = df_concat.dropna().reset_index(drop=True)
# Calculate mean and standard deviation of reward values
reward_mean = df_concat.groupby('timestep')['reward_mean'].mean().iloc[rolling_window:]
reward_std = df_concat.groupby('timestep')['reward_mean'].std().iloc[rolling_window:]
# Plot mean reward with shaded confidence interval
sns.lineplot(x=reward_mean.index, y=reward_mean, ax=ax,label='PDPPO')
ax.fill_between(reward_mean.index, reward_mean - reward_std, reward_mean + reward_std, alpha=0.2)
#ax.set(xlabel='Timestep', ylabel='Mean Reward', title='Average Reward with Confidence Interval')
ax.legend()
########################################################################################
# ax.set_yticks(np.arange(0, 1800, 200))
# ax.set_xticks(np.arange(0, int(4e6), int(5e5)))
ax.grid(color='gray', linestyle='-', linewidth=1, alpha=0.2)
ax.set_xlabel("Timesteps", fontsize=12)
ax.set_ylabel("Rewards", fontsize=12)
fig = plt.gcf()
print("============================================================================================")
fig.savefig(os.path.join(figures_dir, f'{experiment_name}.pdf'), dpi=300, bbox_inches='tight')
print("figure saved at : ", figures_dir)
print("============================================================================================")
if __name__ == '__main__':
save_graph()