config['gamma'], config['max_steps'],
                            config['green_duration'],
                            config['yellow_duration'], config['num_states'],
                            config['num_actions'], config['training_epochs'])

    episode = 0
    timestamp_start = datetime.datetime.now()
    gui_episodes = config['gui_episodes']

    while episode < config['total_episodes']:
        print('\n----- Episode', str(episode + 1), 'of',
              str(config['total_episodes']))
        epsilon = 1.0 - (
            episode / config['total_episodes']
        )  # set the epsilon for this episode according to epsilon-greedy policy
        simulation_time, training_time = Simulation.run(
            episode, epsilon, episode in gui_episodes)  # run the simulation
        print('Simulation time:', simulation_time, 's - Training time:',
              training_time, 's - Total:',
              round(simulation_time + training_time, 1), 's')
        episode += 1

    print("\n----- Start time:", timestamp_start)
    print("----- End time:", datetime.datetime.now())
    print("----- Session info saved at:", path)

    Model.save_model(path)

    copyfile(src='training_settings.ini',
             dst=os.path.join(path, 'training_settings.ini'))

    Visualization.save_data_and_plot(data=Simulation.reward_store,
                            config['gamma'], config['max_steps'],
                            config['green_duration'],
                            config['yellow_duration'], config['num_states'],
                            config['num_actions'], config['training_epochs'])

    episode = 0
    timestamp_start = datetime.datetime.now()

    # Start of simulation
    while episode < config['total_episodes']:
        print('\n----- Episode', str(episode + 1), 'of',
              str(config['total_episodes']))
        epsilon = 1.0 - (
            episode / config['total_episodes']
        )  # set the epsilon for this episode according to epsilon-greedy policy
        simulation_time, training_time = Simulation.run(
            episode, epsilon)  # run the simulation
        print('Simulation time:', simulation_time, 's - Training time:',
              training_time, 's - Total:',
              round(simulation_time + training_time, 1), 's')
        episode += 1

    print("\n----- Start time:", timestamp_start)
    print("----- End time:", datetime.datetime.now())
    print("----- Session info saved at:", path)

    Model.save_model(path)

    copyfile(src='training_settings.ini',
             dst=os.path.join(path, 'training_settings.ini'))

    Visualization.save_data_and_plot(data=Simulation.reward_store,