Notes on The Hugging Face Deep RL Class Pt.2

ai
huggingface
reinforcement-learning
notes
Unit 2 introduces monte carlo, temporal difference learning, and Q-learning.
Author

Christian Mills

Published

May 26, 2022

Types of Value-Based Methods

  • The value of a state is the expected discounted return from starting in that state and following the policy.
  • Value-based methods involve learning a value function that maps a state to the expected value of being in that state.
  • Finding an optimal value function leads to having an optimal policy.
  • \(\pi^{*}(s) = argmax_{a} Q^{*}(s,a)\)
  • Value-based methods require us to define how the agent acts (i.e., the policy) based on the predicted value map.
  • Greedy policies always take the action that leads to the biggest reward.
  • Epsilon-Greedy policies switch between exploring random actions and taking actions with the highest known reward.
    • The probability of exploring random actions is high at the beginning of training and decreases as training progresses.

The State-Value function

  • The state-value function, for each state \(S_{t}\), outputs the expected return \(E_{\pi}\left[ G_{t} \right]\) if the agent starts in that state \(S_{t}\) and then follows the policy \(\pi\) forever.
  • \[V_{\pi}(s) = E_{\pi}\left[ G _{t} \vert S_{t} = s \right]\]

The Action-Value function

  • The action-value function outputs the expected return $E_{}$ for each state-action pair \(\left( S_{t}, A_{t} \right)\) if the agent takes a given action \(A_{t}\) when starting in a given state \(S_{t}\) and then follows the policy \(\pi\) forever.
  • \[Q_{\pi} (s,a) = E_{\pi} \left[ G_{t} \vert S_{t} = s, A_{t} = a \right]\]

The Bellman Equation

  • The Bellman equation simplifies our value estimation.
  • The Bellman equation is a recursive equation that allows us to consider the value of any state \(S_{t}\) as the immediate reward \(R_{t+1}\) plus the discounted value of the state that follows \(gamma \cdot V(S_{t+1})\).
  • \(V_{\pi}(s) = E_{\pi} \left[ R_{t+1} + \gamma \cdot V_{\pi}(S_{t+1}) \vert S_{t} = s \right]\)

Monte Carlo vs Temporal Difference Learning

  • Monte Carlo uses an entire episode of experience before learning.
  • Temporal difference learning learns after each step.

Monte Carlo: learning at the end of the episode

  • Monte Carlo waits until the end of the episode, calculates the total rewards \(G_{t}\), and uses it as a target for updating the value function \(V(S_{t})\) using a learning rate \(\alpha\).
  • \(V(S_{t}) \leftarrow V(S_{t}) + \alpha \left[G_{t} - V(S_{t}) \right]\)
  • At the end of each episode, we have a list of States, Actions, Rewards, and new States.
  • The agent improves by running more and more episodes.
  • Monte Carlo uses the actual accurate discounted return of an episode.

Temporal Difference Learning: learning at each step

  • Temporal difference waits for one interaction \(S_{t+1}\), forms a TD target \(R_{t+1} + \gamma \cdot V(S_{t+1})\), and updates the value function \(V(S_{t})\) using the immediate reward plus \(R_{t+1}\) the discounted value of the following state \(gamma \cdot V(S_{t+1})\) scaled by a learning rate \(\alpha\).
  • \(V(S_{t}) \leftarrow V(S_{t}) + \alpha \left[R_{t+1} + \gamma \cdot V(S_{t+1}) - V(S_{t}) \right]\)
  • TD Learning that waits for one step is TD(0) or one-step TD.
  • The agent improves by running more and more steps.
  • TD Learning uses an estimated return called TD target.

Introducing Q-Learning

What is Q-Learning?

  • Q-Learning (a.k.a. Sarsamax) is an off-policy value-based method that uses a TD approach to train its action-value function called the Q-Function.
  • Off-policy refers to using a different policy for acting and updating.
    • We use a greedy policy for updating the action-value function and an epsilon-greedy function for choosing actions.
  • The “Q” refers to the quality of a given action in a given state.
  • The Q-Function maintains a Q-table that tracks the value of each possible state-action pair.
  • Each cell in the Q-table stores the value from taking a given action in a given state.
  • We initialize the values for each state-action pair in the Q-table to 0.

The Q-Learning algorithm

  • Q Learning waits for one interaction, forms a TD target \(R_{t+1} + \gamma max_{a} Q(S_{t+1} , a)\), and updates the Q-value \(Q(S_{t} , A_{t} )\) for the state-action pair $(S_{t} , A_{t} ) $ in the Q-table using the immediate reward \(R_{t+1}\) plus the discounted optimal (i.e., greedy) Q-Value of the following state \(\gamma max_{a} Q(S_{t+1} , a)\) scaled by a learning rate \(\alpha\).
  • The Q-Values in the Q-table become more accurate with more steps.
  • Input: policy \(\pi\), positive integer \(num\_episodes\), small positive fraction \(\alpha\), \(GLIE\) \(\{\epsilon_{i}\}\)
  • Output: value function \(Q (\approx q_{\pi})\) if num_episodes is large enough
  • Steps:
    1. Initialize \(Q\) arbitrarily \((\)e.g. \(Q(s,a) = 0\) for all \(s \ \epsilon S A(s)\), and \(Q(terminal-state, \cdot) = 0 )\)
    2. for \(i \leftarrow 1\) to num_episodes
      1. \(\epsilon \leftarrow \epsilon_{i}\)
      2. Observe \(S_{0}\)
      3. \(t \leftarrow 0\)
      4. repeat until \(S_{t}\) is terminal
        1. Choose action \(A_{t}\) using policy derived from \(Q(e.g., \epsilon\)-greedy\()\)
        2. Take action \(A_{t}\) and observe \(R_{t+1},S_{t+1}\)
        3. \(Q(S_{t},A_{t}) \leftarrow Q(S_{t},A_{t}) + \alpha (R_{t+1} + \gamma \cdot max_{a}Q(S_{t+1}, a) - Q(S_{t}, A_{t}))\)
        4. \(t \leftarrow t + 1\)
    3. return \(Q\)

Off-policy vs On-policy

  • Off-policy refers to using a different policy for acting and updating.
  • On-policy refers to using the same policy for acting and updating.

Lab

  • Objective: Code a Reinforcement Learning agent from scratch to play FrozenLake and Taxi using Q-Learning, share it to the community, and experiment with different configurations.
  • Environments:
    • FrozenLake-v1: The agent needs to go from the starting state (S) to the goal state (G) by walking only on frozen tiles (F) and avoiding holes (H).
    • Taxi-v3: The agent needs to learn to navigate a city to transport its passengers from point A to point B.
  • Syllabus
  • Discord server
  • #study-group-unit2 discord channel

Prerequisites

Objectives

  • Be able to use Gym, the environment library.
  • Be able to code a Q-Learning agent from scratch.
  • Be able to push your trained agent and the code to the Hub with a video replay and an evaluation score.

Create and run a virual screen

# Virtual display
from pyvirtualdisplay import Display

virtual_display = Display(visible=0, size=(1400, 900))
virtual_display.start()
<pyvirtualdisplay.display.Display at 0x7fea103d3b20>

Import the packages - random: To generate random numbers (that will be useful for Epsilon-Greedy Policy). - imageio: To generate a replay video

import numpy as np
import gym
import random
import imageio
import os

import pickle5 as pickle
/home/innom-dt/mambaforge/envs/hf-drl-class-unit2/lib/python3.9/site-packages/gym/envs/registration.py:398: UserWarning: WARN: Custom namespace `ALE` is being overridden by namespace `ALE`. If you are developing a plugin you shouldn't specify a namespace in `register` calls. The namespace is specified through the entry point package metadata.
  logger.warn(

Create and understand FrozenLake environment ⛄

  • Documentation
  • The Q-Learning agent needs to navigate from the starting state (S) to the goal state (G) by walking only on frozen tiles (F) and avoid holes (H).
  • We can have two sizes of environment:
    • map_name="4x4": a 4x4 grid version
    • map_name="8x8": a 8x8 grid version
  • The environment has two modes:
    • is_slippery=False: The agent always moves in the intended direction due to the non-slippery nature of the frozen lake.
    • is_slippery=True: The agent may not always move in the intended direction due to the slippery nature of the frozen lake (stochastic).

Create a FrozenLake-v1 environment with a 4x4 non-slippery map

env = gym.make("FrozenLake-v1", map_name=f"4x4", is_slippery=False)

(Optional) Define a custom grid: * “S”: start position * “F”: frozen tile * “H”: hole tile * “G”: gift tile

# Custom 4x4 grid
desc=["SFFF", "FHFH", "FFFH", "HFFG"]
gym.make('FrozenLake-v1', desc=desc, is_slippery=True)

Note: This custom grid arrangement would like like the map below.

Inspect the environment

env.reset()
print("_____OBSERVATION SPACE_____ \n")
print("Observation Space", env.observation_space)
print("Sample observation", env.observation_space.sample()) # Get a random observation
_____OBSERVATION SPACE_____ 

Observation Space Discrete(16)
Sample observation 9

Note: The observation is a value representing the agent’s current position as \(current\_row \cdot nrows + current\_col\), where both the row and col start at 0.

print("\n _____ACTION SPACE_____ \n")
print("Action Space Shape", env.action_space.n)
print("Action Space Sample", env.action_space.sample()) # Take a random action
 _____ACTION SPACE_____ 

Action Space Shape 4
Action Space Sample 3

Action Space: * 0: GO LEFT * 1: GO DOWN * 2: GO RIGHT * 3: GO UP

Reward Function: * Reach goal: +1 * Reach hole: 0 * Reach frozen: 0

Create and Initialize the Q-table

state_space = env.observation_space.n
action_space = env.action_space.n
print(f"There are {state_space} possible states and {action_space} possible actions")
There are 16 possible states and 4 possible actions

Define a function to initialize a Q-table

def initialize_q_table(state_space, action_space):
    return np.zeros((state_space, action_space))
import pandas as pd
pd.set_option('max_colwidth', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
def display_qtable(qtable, actions, num_rows, num_cols):
    indices = np.array(np.meshgrid(*np.indices((num_rows, num_cols), sparse=True))).T.reshape(-1, 2)
    map_coords = [f"({r},{c})" for r,c in indices]
    return pd.DataFrame(qtable, index=map_coords, columns=actions)
Qtable_frozenlake = initialize_q_table(state_space, action_space)
action_names = ['Left', 'Down', 'Right', 'Up']
display_qtable(Qtable_frozenlake, action_names, 4, 4)
Left Down Right Up
(0,0) 0.0 0.0 0.0 0.0
(0,1) 0.0 0.0 0.0 0.0
(0,2) 0.0 0.0 0.0 0.0
(0,3) 0.0 0.0 0.0 0.0
(1,0) 0.0 0.0 0.0 0.0
(1,1) 0.0 0.0 0.0 0.0
(1,2) 0.0 0.0 0.0 0.0
(1,3) 0.0 0.0 0.0 0.0
(2,0) 0.0 0.0 0.0 0.0
(2,1) 0.0 0.0 0.0 0.0
(2,2) 0.0 0.0 0.0 0.0
(2,3) 0.0 0.0 0.0 0.0
(3,0) 0.0 0.0 0.0 0.0
(3,1) 0.0 0.0 0.0 0.0
(3,2) 0.0 0.0 0.0 0.0
(3,3) 0.0 0.0 0.0 0.0

Define the greedy policy

def greedy_policy(Qtable, state):
    # Exploitation: take the action with the highest state, action value
    return np.argmax(Qtable[state])

Define the epsilon-greedy policy

def epsilon_greedy_policy(Qtable, state):
    # Generate a random number in the interval [0, 1)
    random_num = random.random()
    # if random_num > greater than epsilon --> exploitation, else --> exploration
    return greedy_policy(Qtable, state) if random_num > epsilon else env.action_space.sample()

Define the hyperparameters

  • We can use a progressive decay of the epsilon to make sure our agent explores enough of the state space to learn a good value approximation.
  • Decreasing the epsilon too quickly might cause the agent to get stuck by not exploring enough of the state space.
# Training parameters
n_training_episodes = 10000  # Total training episodes
learning_rate = 0.7          # Learning rate

# Evaluation parameters
n_eval_episodes = 100        # Total number of test episodes

# Environment parameters
env_id = "FrozenLake-v1"     # Name of the environment
max_steps = 99               # Max steps per episode
gamma = 0.95                 # Discounting rate
eval_seed = []               # The evaluation seed of the environment

# Exploration parameters
epsilon = 1.0                 # Exploration rate
max_epsilon = 1.0             # Exploration probability at start
min_epsilon = 0.05            # Minimum exploration probability 
decay_rate = 0.005            # Exponential decay rate for exploration prob

Create the training loop method

def train(n_training_episodes, min_epsilon, max_epsilon, decay_rate, env, max_steps, Qtable):
    for episode in range(n_training_episodes):
        # Reduce epsilon (because we need less and less exploration)
        epsilon = min_epsilon + (max_epsilon - min_epsilon)*np.exp(-decay_rate*episode)
        # Reset the environment
        state = env.reset()
        step = 0
        done = False
        
        # repeat
        for step in range(max_steps):
            # Choose the action At using epsilon greedy policy
            action = epsilon_greedy_policy(Qtable, state)
            
            # Take action At and observe Rt+1 and St+1
            # Take the action (a) and observe the outcome state(s') and reward (r)
            new_state, reward, done, info = env.step(action)
            # Update Q(s,a):= Q(s,a) + lr [R(s,a) + gamma * max Q(s',a') - Q(s,a)]
            td_target = reward + gamma * np.max(Qtable[new_state])
            Qtable[state][action] = Qtable[state][action] + learning_rate * (td_target - Qtable[state][action])
            
            # If done, finish the episode
            if done:
                break
            
            # Our state is the new state
            state = new_state
    return Qtable

Train the Q-Learning agent

Qtable_frozenlake = train(n_training_episodes, min_epsilon, max_epsilon, decay_rate, env, max_steps, Qtable_frozenlake)

Inspect the updated Q-Learning table

display_qtable(Qtable_frozenlake, action_names, 4, 4)
Left Down Right Up
(0,0) 0.735092 0.773781 0.773781 0.735092
(0,1) 0.735092 0.000000 0.814506 0.773781
(0,2) 0.773781 0.857375 0.773781 0.814506
(0,3) 0.814506 0.000000 0.773781 0.773781
(1,0) 0.773781 0.814506 0.000000 0.735092
(1,1) 0.000000 0.000000 0.000000 0.000000
(1,2) 0.000000 0.902500 0.000000 0.814506
(1,3) 0.000000 0.000000 0.000000 0.000000
(2,0) 0.814506 0.000000 0.857375 0.773781
(2,1) 0.814506 0.902500 0.902500 0.000000
(2,2) 0.857375 0.950000 0.000000 0.857375
(2,3) 0.000000 0.000000 0.000000 0.000000
(3,0) 0.000000 0.000000 0.000000 0.000000
(3,1) 0.000000 0.902500 0.950000 0.857375
(3,2) 0.902500 0.950000 1.000000 0.902500
(3,3) 0.000000 0.000000 0.000000 0.000000

Define the evaluation method

def evaluate_agent(env, max_steps, n_eval_episodes, Q, seed):
    """
    Evaluate the agent for ``n_eval_episodes`` episodes and returns average reward and std of reward.
    :param env: The evaluation environment
    :param n_eval_episodes: Number of episode to evaluate the agent
    :param Q: The Q-table
    :param seed: The evaluation seed array (for taxi-v3)
    """
    episode_rewards = []
    for episode in range(n_eval_episodes):
        if seed:
            state = env.reset(seed=seed[episode])
        else:
            state = env.reset()
        step = 0
        done = False
        total_rewards_ep = 0
    
        for step in range(max_steps):
            # Take the action (index) that have the maximum expected future reward given that state
            action = np.argmax(Q[state][:])
            new_state, reward, done, info = env.step(action)
            total_rewards_ep += reward
        
            if done:
                break
            state = new_state
        episode_rewards.append(total_rewards_ep)
    mean_reward = np.mean(episode_rewards)
    std_reward = np.std(episode_rewards)
    
    return mean_reward, std_reward

Evaluate theQ-Learning agent

mean_reward, std_reward = evaluate_agent(env, max_steps, n_eval_episodes, Qtable_frozenlake, eval_seed)
print(f"Mean_reward={mean_reward:.2f} +/- {std_reward:.2f}")
Mean_reward=1.00 +/- 0.00

Note: * The mean reward should be 1.0 * Try using the slippery version of the map.

Publish our trained model on the Hub

%%capture
from huggingface_hub import HfApi, HfFolder, Repository
from huggingface_hub.repocard import metadata_eval_result, metadata_save

from pathlib import Path
import datetime
import json
def record_video(env, Qtable, out_directory, fps=1):
    images = []
    done = False
    state = env.reset(seed=random.randint(0,500))
    img = env.render(mode='rgb_array')
    images.append(img)
    while not done:
        # Take the action (index) that have the maximum expected future reward given that state
        action = np.argmax(Qtable[state][:])
        state, reward, done, info = env.step(action) # We directly put next_state = state for recording logic
        img = env.render(mode='rgb_array')
        images.append(img)
    imageio.mimsave(out_directory, [np.array(img) for i, img in enumerate(images)], fps=fps)

Leaderboard

Log into Hugging Face account

from huggingface_hub import notebook_login
notebook_login()
Login successful
Your token has been saved to /home/innom-dt/.huggingface/token

Create a model dictionnary that contains the hyperparameters and the Q_table

model = {
    "env_id": env_id,
    "max_steps": max_steps,
    "n_training_episodes": n_training_episodes,
    "n_eval_episodes": n_eval_episodes,
    "eval_seed": eval_seed,

    "learning_rate": learning_rate,
    "gamma": gamma,

    "epsilon": epsilon,
    "max_epsilon": max_epsilon,
    "min_epsilon": min_epsilon,
    "decay_rate": decay_rate,

    "qtable": Qtable_frozenlake
}
model
{'env_id': 'FrozenLake-v1',
 'max_steps': 99,
 'n_training_episodes': 10000,
 'n_eval_episodes': 100,
 'eval_seed': [],
 'learning_rate': 0.7,
 'gamma': 0.95,
 'epsilon': 1.0,
 'max_epsilon': 1.0,
 'min_epsilon': 0.05,
 'decay_rate': 0.005,
 'qtable': array([[0.73509189, 0.77378094, 0.77378094, 0.73509189],
        [0.73509189, 0.        , 0.81450625, 0.77378094],
        [0.77378094, 0.857375  , 0.77378094, 0.81450625],
        [0.81450625, 0.        , 0.77378094, 0.77378094],
        [0.77378094, 0.81450625, 0.        , 0.73509189],
        [0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.9025    , 0.        , 0.81450625],
        [0.        , 0.        , 0.        , 0.        ],
        [0.81450625, 0.        , 0.857375  , 0.77378094],
        [0.81450625, 0.9025    , 0.9025    , 0.        ],
        [0.857375  , 0.95      , 0.        , 0.857375  ],
        [0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.        , 0.        , 0.        ],
        [0.        , 0.9025    , 0.95      , 0.857375  ],
        [0.9025    , 0.95      , 1.        , 0.9025    ],
        [0.        , 0.        , 0.        , 0.        ]])}

Publish the trained model on the Hub

username = "cj-mills"
repo_name = "q-FrozenLake-v1-4x4-noSlippery"
push_to_hub(
    repo_id=f"{username}/{repo_name}",
    model=model,
    env=env)
{'env_id': 'FrozenLake-v1', 'max_steps': 99, 'n_training_episodes': 10000, 'n_eval_episodes': 100, 'eval_seed': [], 'learning_rate': 0.7, 'gamma': 0.95, 'epsilon': 1.0, 'max_epsilon': 1.0, 'min_epsilon': 0.05, 'decay_rate': 0.005, 'qtable': array([[0.73509189, 0.77378094, 0.77378094, 0.73509189],
       [0.73509189, 0.        , 0.81450625, 0.77378094],
       [0.77378094, 0.857375  , 0.77378094, 0.81450625],
       [0.81450625, 0.        , 0.77378094, 0.77378094],
       [0.77378094, 0.81450625, 0.        , 0.73509189],
       [0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.9025    , 0.        , 0.81450625],
       [0.        , 0.        , 0.        , 0.        ],
       [0.81450625, 0.        , 0.857375  , 0.77378094],
       [0.81450625, 0.9025    , 0.9025    , 0.        ],
       [0.857375  , 0.95      , 0.        , 0.857375  ],
       [0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.9025    , 0.95      , 0.857375  ],
       [0.9025    , 0.95      , 1.        , 0.9025    ],
       [0.        , 0.        , 0.        , 0.        ]]), 'map_name': '4x4', 'slippery': False}
Pushing repo q-FrozenLake-v1-4x4-noSlippery to the Hugging Face Hub
Your model is pushed to the hub. You can view your model here: https://huggingface.co/cj-mills/q-FrozenLake-v1-4x4-noSlippery

Create and understand Taxi-v3

  • Documentation
  • There are four designated locations in the grid world indicated by R(ed), G(reen), Y(ellow), and B(lue).
  • The taxi starts off at a random square and the passenger is at a random location.
  • The taxi drives to the passenger’s location, picks up the passenger, drives to the passenger’s destination (another one of the four specified locations), and then drops off the passenger.
  • The episode ends once the taxi drops off the passenger.

env = gym.make("Taxi-v3")

Note: There are 25 taxi positions, five possible passenger locations (including when the passenger is in the taxi), and four destination locations, meaning 500 discrete states.

state_space = env.observation_space.n
action_space = env.action_space.n
print(f"There are {state_space} possible states and {action_space} possible actions")
There are 500 possible states and 6 possible actions

Action space: * 0: move south * 1: move north * 2: move east * 3: move west * 4: pickup passenger * 5: drop off passenger

Reward function: * -1 per step unless other reward is triggered. * +20 delivering passenger. * -10 executing pickup and drop-off actions illegally.

# Create our Q table with state_size rows and action_size columns (500x6)
Qtable_taxi = initialize_q_table(state_space, action_space)
print("Q-table shape: ", Qtable_taxi .shape)
indices = np.array(np.meshgrid(*np.indices((25, 5, 4), sparse=True))).T.reshape(-1, 3)
map_coords = [f"TaxiPos: {tp}, PassLoc: {pl}, DestLoc: {dl}" for tp,pl,dl in indices]
action_names = ['move south', 'move north', 'move east', 'move west', 'pickup passenger', 'drop off passenger']
pd.DataFrame(Qtable_taxi, index=map_coords, columns=action_names)
Q-table shape:  (500, 6)
move south move north move east move west pickup passenger drop off passenger
TaxiPos: 0, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 0, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 1, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 2, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 3, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 4, DestLoc: 0 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 0, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 1, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 2, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 3, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 4, DestLoc: 1 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 0, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 1, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 2, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 3, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 4, DestLoc: 2 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 0, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 1, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 2, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 3, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 4, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 5, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 6, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 7, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 8, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 9, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 10, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 11, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 12, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 13, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 14, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 15, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 16, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 17, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 18, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 19, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 20, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 21, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 22, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 23, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 0, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 1, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 2, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 3, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0
TaxiPos: 24, PassLoc: 4, DestLoc: 3 0.0 0.0 0.0 0.0 0.0 0.0

Define the hyperparameters

# Training parameters
n_training_episodes = 25000   # Total training episodes
learning_rate = 0.7           # Learning rate

# Evaluation parameters
n_eval_episodes = 100        # Total number of test episodes

# Environment parameters
env_id = "Taxi-v3"           # Name of the environment
max_steps = 99               # Max steps per episode
gamma = 0.95                 # Discounting rate

# Exploration parameters
epsilon = 1.0                 # Exploration rate
max_epsilon = 1.0             # Exploration probability at start
min_epsilon = 0.05           # Minimum exploration probability 
decay_rate = 0.005            # Exponential decay rate for exploration prob

DO NOT MODIFY EVAL_SEED

# DO NOT MODIFY EVAL_SEED
eval_seed = [16,54,165,177,191,191,120,80,149,178,48,38,6,125,174,73,50,172,100,148,146,6,25,40,68,148,49,167,9,97,164,176,61,7,54,55,
 161,131,184,51,170,12,120,113,95,126,51,98,36,135,54,82,45,95,89,59,95,124,9,113,58,85,51,134,121,169,105,21,30,11,50,65,12,43,82,145,152,97,106,55,31,85,38,
 112,102,168,123,97,21,83,158,26,80,63,5,81,32,11,28,148] # Evaluation seed, this ensures that all classmates agents are trained on the same taxi starting position
                                                          # Each seed has a specific starting state

Train a Q-Learning agent

Qtable_taxi = train(n_training_episodes, min_epsilon, max_epsilon, decay_rate, env, max_steps, Qtable_taxi)
indices = np.array(np.meshgrid(*np.indices((25, 5, 4), sparse=True))).T.reshape(-1, 3)
map_coords = [f"TaxiPos: {tp}, PassLoc: {pl}, DestLoc: {dl}" for tp,pl,dl in indices]
action_names = ['move south', 'move north', 'move east', 'move west', 'pickup passenger', 'drop off passenger']
pd.DataFrame(Qtable_taxi, index=map_coords, columns=action_names)
move south move north move east move west pickup passenger drop off passenger
TaxiPos: 0, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 0, PassLoc: 1, DestLoc: 0 2.752004 3.949478 2.752004 3.949478 5.209976 -5.050522
TaxiPos: 0, PassLoc: 2, DestLoc: 0 7.933492 9.403676 7.933492 9.403676 10.951237 0.403676
TaxiPos: 0, PassLoc: 3, DestLoc: 0 3.949478 5.209976 3.949478 5.209976 6.536817 -3.790024
TaxiPos: 0, PassLoc: 4, DestLoc: 0 -3.275187 -4.111427 -3.275187 -4.111427 -13.111427 -13.111427
TaxiPos: 1, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 1, PassLoc: 1, DestLoc: 0 -3.275187 -4.111427 -3.275187 -4.111427 -13.111427 -13.111427
TaxiPos: 1, PassLoc: 2, DestLoc: 0 -0.493001 -1.468351 -0.493001 -1.468351 -10.468351 -10.468351
TaxiPos: 1, PassLoc: 3, DestLoc: 0 5.209976 3.949478 2.752004 3.949478 -5.050522 -5.050522
TaxiPos: 1, PassLoc: 4, DestLoc: 0 0.533683 -0.493001 -1.468351 -0.493001 -9.493001 -9.493001
TaxiPos: 2, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 2, PassLoc: 1, DestLoc: 0 1.614404 0.533683 -0.493001 0.533683 -8.466317 -8.466317
TaxiPos: 2, PassLoc: 2, DestLoc: 0 -1.468351 -2.394933 -1.468351 -2.394933 -11.394933 -11.394933
TaxiPos: 2, PassLoc: 3, DestLoc: 0 0.533683 -0.493001 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 2, PassLoc: 4, DestLoc: 0 -1.468351 -2.394933 -1.468351 -2.394933 -11.394933 -11.394933
TaxiPos: 3, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 3, PassLoc: 1, DestLoc: 0 16.100000 18.000000 16.100000 18.000000 9.000000 20.000000
TaxiPos: 3, PassLoc: 2, DestLoc: 0 6.536817 5.209976 6.536817 5.209976 -3.790024 3.949478
TaxiPos: 3, PassLoc: 3, DestLoc: 0 12.580250 10.951237 9.403676 10.951237 1.951237 9.403676
TaxiPos: 3, PassLoc: 4, DestLoc: 0 7.933492 6.536817 7.933492 6.536817 -2.463183 5.209976
TaxiPos: 4, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 4, PassLoc: 1, DestLoc: 0 1.614404 2.752004 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 4, PassLoc: 2, DestLoc: 0 6.536817 7.933492 7.933492 9.403676 -1.066508 -1.066508
TaxiPos: 4, PassLoc: 3, DestLoc: 0 2.752004 3.949478 3.949478 5.209976 -5.050522 -5.050522
TaxiPos: 4, PassLoc: 4, DestLoc: 0 -2.394933 -3.275187 -3.275187 -4.111427 -12.275187 -12.275187
TaxiPos: 5, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 5, PassLoc: 1, DestLoc: 0 -2.394933 -3.275187 -3.275187 -4.111427 -12.275187 -12.275187
TaxiPos: 5, PassLoc: 2, DestLoc: 0 0.533683 -0.493001 -0.493001 -1.468351 -9.493001 -9.493001
TaxiPos: 5, PassLoc: 3, DestLoc: 0 3.949478 2.752004 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 5, PassLoc: 4, DestLoc: 0 -0.493001 -1.468351 -1.468351 -0.493001 -10.468351 -10.468351
TaxiPos: 6, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 6, PassLoc: 1, DestLoc: 0 0.533683 -0.493001 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 6, PassLoc: 2, DestLoc: 0 -0.493001 -1.468351 -1.468351 -2.394933 -10.468351 -10.468351
TaxiPos: 6, PassLoc: 3, DestLoc: 0 1.614404 0.533683 0.533683 -0.493001 -8.466317 -8.466317
TaxiPos: 6, PassLoc: 4, DestLoc: 0 -0.493001 -1.468351 -1.468351 -2.394933 -10.468351 -10.468351
TaxiPos: 7, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 7, PassLoc: 1, DestLoc: 0 14.295000 16.100000 16.100000 18.000000 7.100000 7.100000
TaxiPos: 7, PassLoc: 2, DestLoc: 0 7.933492 6.536817 6.536817 5.209976 -2.463183 -2.463183
TaxiPos: 7, PassLoc: 3, DestLoc: 0 10.951237 9.403676 9.403676 10.951237 0.403676 0.403676
TaxiPos: 7, PassLoc: 4, DestLoc: 0 9.403676 7.933492 7.933492 6.536817 -1.066508 -1.066508
TaxiPos: 8, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 8, PassLoc: 1, DestLoc: 0 -1.468351 -2.394933 -3.275187 -2.394933 -11.394933 -11.394933
TaxiPos: 8, PassLoc: 2, DestLoc: 0 2.752004 1.614404 0.533683 1.614404 -7.385596 -7.385596
TaxiPos: 8, PassLoc: 3, DestLoc: 0 -0.493001 -1.468351 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 8, PassLoc: 4, DestLoc: 0 0.533683 1.614404 2.752004 1.614404 -7.385596 -7.385596
TaxiPos: 9, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 9, PassLoc: 1, DestLoc: 0 0.533683 1.614404 2.752004 1.614404 -7.385596 -7.385596
TaxiPos: 9, PassLoc: 2, DestLoc: 0 3.949478 5.209976 6.536817 5.209976 -3.790024 -3.790024
TaxiPos: 9, PassLoc: 3, DestLoc: 0 2.752004 1.614404 0.533683 1.614404 -7.385596 -7.385596
TaxiPos: 9, PassLoc: 4, DestLoc: 0 -1.468351 -2.394933 -3.275187 -2.394933 -11.394933 -11.394933
TaxiPos: 10, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 10, PassLoc: 1, DestLoc: 0 -0.493001 -1.468351 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 10, PassLoc: 2, DestLoc: 0 0.533683 -0.493001 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 10, PassLoc: 3, DestLoc: 0 2.752004 1.614404 2.752004 1.614404 -7.385596 -7.385596
TaxiPos: 10, PassLoc: 4, DestLoc: 0 0.533683 -0.493001 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 11, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 11, PassLoc: 1, DestLoc: 0 9.403676 7.933492 6.536817 7.933492 -1.066508 -1.066508
TaxiPos: 11, PassLoc: 2, DestLoc: 0 12.580250 14.295000 16.100000 14.295000 5.295000 5.295000
TaxiPos: 11, PassLoc: 3, DestLoc: 0 9.403676 7.933492 6.536817 7.933492 -1.066508 -1.066508
TaxiPos: 11, PassLoc: 4, DestLoc: 0 10.951237 9.403676 10.951237 9.403676 0.403676 0.403676
TaxiPos: 12, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 12, PassLoc: 1, DestLoc: 0 -2.394933 -3.275187 -4.111427 -2.394933 -12.275187 -12.275187
TaxiPos: 12, PassLoc: 2, DestLoc: 0 1.614404 0.533683 -0.493001 1.614404 -8.466317 -8.466317
TaxiPos: 12, PassLoc: 3, DestLoc: 0 -1.468351 -2.394933 -3.275187 -1.468351 -11.394933 -11.394933
TaxiPos: 12, PassLoc: 4, DestLoc: 0 1.614404 2.752004 3.949478 1.614404 -6.247996 -6.247996
TaxiPos: 13, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 13, PassLoc: 1, DestLoc: 0 1.614404 2.752004 3.949478 1.614404 -6.247996 -6.247996
TaxiPos: 13, PassLoc: 2, DestLoc: 0 5.209976 6.536817 7.933492 5.209976 -2.463183 -2.463183
TaxiPos: 13, PassLoc: 3, DestLoc: 0 1.614404 0.533683 -0.493001 1.614404 -8.466317 -8.466317
TaxiPos: 13, PassLoc: 4, DestLoc: 0 -2.394933 -3.275187 -4.111427 -2.394933 -12.275187 -12.275187
TaxiPos: 14, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 14, PassLoc: 1, DestLoc: 0 -1.468351 -2.394933 -3.275187 -1.468351 -11.394933 -11.394933
TaxiPos: 14, PassLoc: 2, DestLoc: 0 1.614404 0.533683 -0.493001 -0.493001 -8.466317 -8.466317
TaxiPos: 14, PassLoc: 3, DestLoc: 0 3.949478 2.752004 1.614404 1.614404 -6.247996 -6.247996
TaxiPos: 14, PassLoc: 4, DestLoc: 0 1.614404 0.533683 -0.493001 -0.493001 -8.466317 -8.466317
TaxiPos: 15, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 15, PassLoc: 1, DestLoc: 0 7.933492 6.536817 5.209976 7.933492 -2.463183 -2.463183
TaxiPos: 15, PassLoc: 2, DestLoc: 0 14.295000 16.100000 18.000000 14.295000 7.100000 7.100000
TaxiPos: 15, PassLoc: 3, DestLoc: 0 7.933492 6.536817 5.209976 7.933492 -2.463183 -2.463183
TaxiPos: 15, PassLoc: 4, DestLoc: 0 12.580250 10.951237 9.403676 9.403676 1.951237 1.951237
TaxiPos: 16, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 16, PassLoc: 1, DestLoc: 0 -3.275187 -4.111427 -4.111427 -3.275187 -13.111427 -13.111427
TaxiPos: 16, PassLoc: 2, DestLoc: 0 0.533683 -0.493001 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 16, PassLoc: 3, DestLoc: 0 -2.394933 -3.275187 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 16, PassLoc: 4, DestLoc: 0 2.752004 3.949478 3.949478 2.752004 5.209976 -5.050522
TaxiPos: 17, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 17, PassLoc: 1, DestLoc: 0 2.752004 3.949478 3.949478 2.752004 5.209976 -5.050522
TaxiPos: 17, PassLoc: 2, DestLoc: 0 6.536817 7.933492 7.933492 6.536817 9.403676 -1.066508
TaxiPos: 17, PassLoc: 3, DestLoc: 0 0.533683 -0.493001 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 17, PassLoc: 4, DestLoc: 0 -3.275187 -4.111427 -4.111427 -3.275187 -13.111427 -13.111427
TaxiPos: 18, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 18, PassLoc: 1, DestLoc: 0 -2.394933 -3.275187 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 18, PassLoc: 2, DestLoc: 0 0.533683 -0.493001 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 18, PassLoc: 3, DestLoc: 0 2.752004 1.614404 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 18, PassLoc: 4, DestLoc: 0 0.533683 -0.493001 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 19, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 19, PassLoc: 1, DestLoc: 0 6.536817 5.209976 5.209976 6.536817 -3.790024 3.949478
TaxiPos: 19, PassLoc: 2, DestLoc: 0 16.100000 18.000000 18.000000 16.100000 9.000000 20.000000
TaxiPos: 19, PassLoc: 3, DestLoc: 0 6.536817 5.209976 5.209976 6.536817 -3.790024 3.949478
TaxiPos: 19, PassLoc: 4, DestLoc: 0 10.951237 9.403676 9.403676 10.951237 0.403676 7.933492
TaxiPos: 20, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 20, PassLoc: 1, DestLoc: 0 1.614404 3.949478 1.614404 2.752004 -6.247996 -6.247996
TaxiPos: 20, PassLoc: 2, DestLoc: 0 6.536817 9.403676 6.536817 7.933492 -1.066508 -1.066508
TaxiPos: 20, PassLoc: 3, DestLoc: 0 2.752004 5.209976 2.752004 3.949478 -5.050522 -5.050522
TaxiPos: 20, PassLoc: 4, DestLoc: 0 -2.394933 -4.111427 -2.394933 -3.275187 -12.275187 -12.275187
TaxiPos: 21, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 21, PassLoc: 1, DestLoc: 0 -2.394933 -4.111427 -2.394933 -3.275187 -12.275187 -12.275187
TaxiPos: 21, PassLoc: 2, DestLoc: 0 0.533683 -1.468351 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 21, PassLoc: 3, DestLoc: 0 6.536817 3.949478 3.949478 5.209976 -3.790024 -3.790024
TaxiPos: 21, PassLoc: 4, DestLoc: 0 1.614404 -0.493001 -0.493001 0.533683 -8.466317 -8.466317
TaxiPos: 22, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 22, PassLoc: 1, DestLoc: 0 2.752004 0.533683 0.533683 1.614404 -7.385596 -7.385596
TaxiPos: 22, PassLoc: 2, DestLoc: 0 -0.493001 -2.394933 -0.493001 -1.468351 -10.468351 -10.468351
TaxiPos: 22, PassLoc: 3, DestLoc: 0 1.614404 -0.493001 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 22, PassLoc: 4, DestLoc: 0 -0.493001 -2.394933 -0.493001 -1.468351 -10.468351 -10.468351
TaxiPos: 23, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 23, PassLoc: 1, DestLoc: 0 14.295000 18.000000 14.295000 16.100000 7.100000 7.100000
TaxiPos: 23, PassLoc: 2, DestLoc: 0 7.933492 5.209976 7.933492 6.536817 -2.463183 -2.463183
TaxiPos: 23, PassLoc: 3, DestLoc: 0 14.295000 10.951237 10.951237 12.580250 3.580250 3.580250
TaxiPos: 23, PassLoc: 4, DestLoc: 0 9.403676 6.536817 9.403676 7.933492 -1.066508 -1.066508
TaxiPos: 24, PassLoc: 0, DestLoc: 0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 24, PassLoc: 1, DestLoc: 0 0.533683 2.752004 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 24, PassLoc: 2, DestLoc: 0 5.209976 7.933492 6.536817 7.933492 -2.463183 -2.463183
TaxiPos: 24, PassLoc: 3, DestLoc: 0 1.614404 3.949478 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 24, PassLoc: 4, DestLoc: 0 -1.468351 -3.275187 -2.394933 -3.275187 -11.394933 -11.394933
TaxiPos: 0, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 0, PassLoc: 1, DestLoc: 1 -1.468351 -3.275187 -2.394933 -3.275187 -11.394933 -11.394933
TaxiPos: 0, PassLoc: 2, DestLoc: 1 1.614404 -0.493001 0.533683 -0.493001 -8.466317 -8.466317
TaxiPos: 0, PassLoc: 3, DestLoc: 1 5.209976 2.752004 3.949478 5.209976 -5.050522 -5.050522
TaxiPos: 0, PassLoc: 4, DestLoc: 1 0.533683 -1.468351 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 1, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 1, PassLoc: 1, DestLoc: 1 1.614404 -0.493001 0.533683 1.614404 -8.466317 -8.466317
TaxiPos: 1, PassLoc: 2, DestLoc: 1 0.533683 -1.468351 -0.493001 -1.468351 -9.493001 -9.493001
TaxiPos: 1, PassLoc: 3, DestLoc: 1 2.752004 0.533683 1.614404 0.533683 -7.385596 -7.385596
TaxiPos: 1, PassLoc: 4, DestLoc: 1 0.533683 -1.468351 -0.493001 -1.468351 -9.493001 -9.493001
TaxiPos: 2, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 2, PassLoc: 1, DestLoc: 1 12.580250 16.100000 14.295000 16.100000 5.295000 5.295000
TaxiPos: 2, PassLoc: 2, DestLoc: 1 9.403676 6.536817 7.933492 6.536817 -1.066508 -1.066508
TaxiPos: 2, PassLoc: 3, DestLoc: 1 12.580250 9.403676 10.951237 12.580250 1.951237 1.951237
TaxiPos: 2, PassLoc: 4, DestLoc: 1 10.951237 7.933492 9.403676 7.933492 0.403676 0.403676
TaxiPos: 3, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 3, PassLoc: 1, DestLoc: 1 -0.493001 -2.394933 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 3, PassLoc: 2, DestLoc: 1 3.949478 1.614404 1.614404 2.752004 -6.247996 -6.247996
TaxiPos: 3, PassLoc: 3, DestLoc: 1 0.533683 -1.468351 -1.468351 -0.493001 -9.493001 -9.493001
TaxiPos: 3, PassLoc: 4, DestLoc: 1 -0.493001 1.614404 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 4, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 4, PassLoc: 1, DestLoc: 1 -0.493001 1.614404 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 4, PassLoc: 2, DestLoc: 1 2.752004 5.209976 5.209976 3.949478 -5.050522 -5.050522
TaxiPos: 4, PassLoc: 3, DestLoc: 1 3.949478 1.614404 1.614404 2.752004 -6.247996 -6.247996
TaxiPos: 4, PassLoc: 4, DestLoc: 1 -0.493001 -2.394933 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 5, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 5, PassLoc: 1, DestLoc: 1 0.533683 -1.468351 -1.468351 -0.493001 -9.493001 -9.493001
TaxiPos: 5, PassLoc: 2, DestLoc: 1 1.614404 -0.493001 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 5, PassLoc: 3, DestLoc: 1 3.949478 1.614404 3.949478 2.752004 -6.247996 -6.247996
TaxiPos: 5, PassLoc: 4, DestLoc: 1 1.614404 -0.493001 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 6, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 6, PassLoc: 1, DestLoc: 1 10.951237 7.933492 7.933492 9.403676 0.403676 0.403676
TaxiPos: 6, PassLoc: 2, DestLoc: 1 10.951237 14.295000 14.295000 12.580250 3.580250 3.580250
TaxiPos: 6, PassLoc: 3, DestLoc: 1 10.951237 7.933492 7.933492 9.403676 0.403676 0.403676
TaxiPos: 6, PassLoc: 4, DestLoc: 1 12.580250 9.403676 12.580250 10.951237 1.951237 1.951237
TaxiPos: 7, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 7, PassLoc: 1, DestLoc: 1 -1.468351 -3.275187 -3.275187 -1.468351 -11.394933 -11.394933
TaxiPos: 7, PassLoc: 2, DestLoc: 1 2.752004 0.533683 0.533683 2.752004 -7.385596 -7.385596
TaxiPos: 7, PassLoc: 3, DestLoc: 1 -0.493001 -2.394933 -2.394933 -0.493001 -10.468351 -10.468351
TaxiPos: 7, PassLoc: 4, DestLoc: 1 0.533683 2.752004 2.752004 0.533683 -7.385596 -7.385596
TaxiPos: 8, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 8, PassLoc: 1, DestLoc: 1 0.533683 2.752004 2.752004 0.533683 -7.385596 -7.385596
TaxiPos: 8, PassLoc: 2, DestLoc: 1 3.949478 6.536817 6.536817 3.949478 -3.790024 -3.790024
TaxiPos: 8, PassLoc: 3, DestLoc: 1 2.752004 0.533683 0.533683 2.752004 -7.385596 -7.385596
TaxiPos: 8, PassLoc: 4, DestLoc: 1 -1.468351 -3.275187 -3.275187 -1.468351 -11.394933 -11.394933
TaxiPos: 9, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 9, PassLoc: 1, DestLoc: 1 -0.493001 -2.394933 -2.394933 -0.493001 -10.468351 -10.468351
TaxiPos: 9, PassLoc: 2, DestLoc: 1 2.752004 0.533683 0.533683 0.533683 -7.385596 -7.385596
TaxiPos: 9, PassLoc: 3, DestLoc: 1 5.209976 2.752004 2.752004 2.752004 -5.050522 -5.050522
TaxiPos: 9, PassLoc: 4, DestLoc: 1 2.752004 0.533683 0.533683 0.533683 -7.385596 -7.385596
TaxiPos: 10, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 10, PassLoc: 1, DestLoc: 1 9.403676 6.536817 6.536817 9.403676 -1.066508 -1.066508
TaxiPos: 10, PassLoc: 2, DestLoc: 1 12.580250 16.100000 16.100000 12.580250 5.295000 5.295000
TaxiPos: 10, PassLoc: 3, DestLoc: 1 9.403676 6.536817 6.536817 9.403676 -1.066508 -1.066508
TaxiPos: 10, PassLoc: 4, DestLoc: 1 14.295000 10.951237 10.951237 10.951237 3.580250 3.580250
TaxiPos: 11, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 11, PassLoc: 1, DestLoc: 1 -2.394933 -4.111427 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 11, PassLoc: 2, DestLoc: 1 1.614404 -0.493001 0.533683 1.614404 -8.466317 -8.466317
TaxiPos: 11, PassLoc: 3, DestLoc: 1 -1.468351 -3.275187 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 11, PassLoc: 4, DestLoc: 1 1.614404 3.949478 2.752004 1.614404 -6.247996 -6.247996
TaxiPos: 12, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 12, PassLoc: 1, DestLoc: 1 1.614404 3.949478 2.752004 1.614404 -6.247996 -6.247996
TaxiPos: 12, PassLoc: 2, DestLoc: 1 5.209976 7.933492 6.536817 5.209976 -2.463183 -2.463183
TaxiPos: 12, PassLoc: 3, DestLoc: 1 1.614404 -0.493001 0.533683 1.614404 -8.466317 -8.466317
TaxiPos: 12, PassLoc: 4, DestLoc: 1 -2.394933 -4.111427 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 13, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 13, PassLoc: 1, DestLoc: 1 -1.468351 -3.275187 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 13, PassLoc: 2, DestLoc: 1 1.614404 -0.493001 0.533683 1.614404 -8.466317 -8.466317
TaxiPos: 13, PassLoc: 3, DestLoc: 1 3.949478 1.614404 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 13, PassLoc: 4, DestLoc: 1 1.614404 -0.493001 0.533683 1.614404 -8.466317 -8.466317
TaxiPos: 14, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 14, PassLoc: 1, DestLoc: 1 7.933492 5.209976 6.536817 7.933492 -2.463183 -2.463183
TaxiPos: 14, PassLoc: 2, DestLoc: 1 14.295000 18.000000 16.100000 14.295000 7.100000 7.100000
TaxiPos: 14, PassLoc: 3, DestLoc: 1 7.933492 5.209976 6.536817 7.933492 -2.463183 -2.463183
TaxiPos: 14, PassLoc: 4, DestLoc: 1 12.580250 9.403676 10.951237 12.580250 1.951237 1.951237
TaxiPos: 15, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 15, PassLoc: 1, DestLoc: 1 0.533683 2.752004 0.533683 1.614404 -7.385596 -7.385596
TaxiPos: 15, PassLoc: 2, DestLoc: 1 5.209976 7.933492 5.209976 6.536817 -2.463183 -2.463183
TaxiPos: 15, PassLoc: 3, DestLoc: 1 1.614404 3.949478 1.614404 2.752004 -6.247996 -6.247996
TaxiPos: 15, PassLoc: 4, DestLoc: 1 -3.275187 -3.275187 -1.468351 -2.394933 -11.394933 -11.394933
TaxiPos: 16, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 16, PassLoc: 1, DestLoc: 1 -3.275187 -3.275187 -1.468351 -2.394933 -11.394933 -11.394933
TaxiPos: 16, PassLoc: 2, DestLoc: 1 -0.493001 -0.493001 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 16, PassLoc: 3, DestLoc: 1 7.933492 5.209976 5.209976 6.536817 -2.463183 -2.463183
TaxiPos: 16, PassLoc: 4, DestLoc: 1 2.752004 0.533683 0.533683 1.614404 -7.385596 -7.385596
TaxiPos: 17, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 17, PassLoc: 1, DestLoc: 1 3.949478 1.614404 1.614404 2.752004 -6.247996 -6.247996
TaxiPos: 17, PassLoc: 2, DestLoc: 1 -1.468351 -1.468351 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 17, PassLoc: 3, DestLoc: 1 0.533683 0.533683 2.752004 1.614404 -7.385596 -7.385596
TaxiPos: 17, PassLoc: 4, DestLoc: 1 -1.468351 -1.468351 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 18, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 18, PassLoc: 1, DestLoc: 1 12.580250 16.100000 12.580250 14.295000 5.295000 5.295000
TaxiPos: 18, PassLoc: 2, DestLoc: 1 6.536817 6.536817 9.403676 7.933492 -1.066508 -1.066508
TaxiPos: 18, PassLoc: 3, DestLoc: 1 16.100000 12.580250 12.580250 14.295000 5.295000 5.295000
TaxiPos: 18, PassLoc: 4, DestLoc: 1 7.933492 7.933492 10.951237 9.403676 0.403676 0.403676
TaxiPos: 19, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 19, PassLoc: 1, DestLoc: 1 -0.493001 1.614404 -0.493001 1.614404 -8.466317 -8.466317
TaxiPos: 19, PassLoc: 2, DestLoc: 1 3.949478 6.536817 3.949478 6.536817 -3.790024 -3.790024
TaxiPos: 19, PassLoc: 3, DestLoc: 1 0.533683 2.752004 0.533683 2.752004 -7.385596 -7.385596
TaxiPos: 19, PassLoc: 4, DestLoc: 1 -2.394933 -2.394933 -0.493001 -2.394933 -10.468351 -10.468351
TaxiPos: 20, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 20, PassLoc: 1, DestLoc: 1 -2.394933 -2.394933 -0.493001 -2.394933 -10.468351 -10.468351
TaxiPos: 20, PassLoc: 2, DestLoc: 1 0.533683 0.533683 2.752004 0.533683 -7.385596 -7.385596
TaxiPos: 20, PassLoc: 3, DestLoc: 1 3.949478 3.949478 3.949478 6.536817 -3.790024 -3.790024
TaxiPos: 20, PassLoc: 4, DestLoc: 1 -0.493001 -0.493001 -0.493001 1.614404 -8.466317 -8.466317
TaxiPos: 21, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 21, PassLoc: 1, DestLoc: 1 0.533683 0.533683 0.533683 2.752004 -7.385596 -7.385596
TaxiPos: 21, PassLoc: 2, DestLoc: 1 -0.493001 -0.493001 1.614404 -0.493001 -8.466317 -8.466317
TaxiPos: 21, PassLoc: 3, DestLoc: 1 1.614404 1.614404 3.949478 1.614404 -6.247996 -6.247996
TaxiPos: 21, PassLoc: 4, DestLoc: 1 -0.493001 -0.493001 1.614404 -0.493001 -8.466317 -8.466317
TaxiPos: 22, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 22, PassLoc: 1, DestLoc: 1 10.951237 14.295000 10.951237 14.295000 3.580250 3.580250
TaxiPos: 22, PassLoc: 2, DestLoc: 1 7.933492 7.933492 10.951237 7.933492 0.403676 0.403676
TaxiPos: 22, PassLoc: 3, DestLoc: 1 10.951237 10.951237 10.951237 14.295000 3.580250 3.580250
TaxiPos: 22, PassLoc: 4, DestLoc: 1 9.403676 9.403676 12.580250 9.403676 1.951237 1.951237
TaxiPos: 23, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 23, PassLoc: 1, DestLoc: 1 -1.468351 -1.468351 -1.468351 0.533683 -9.493001 -9.493001
TaxiPos: 23, PassLoc: 2, DestLoc: 1 2.752004 2.752004 2.752004 5.209976 -5.050522 -5.050522
TaxiPos: 23, PassLoc: 3, DestLoc: 1 -0.493001 -0.493001 -0.493001 1.614404 -8.466317 -8.466317
TaxiPos: 23, PassLoc: 4, DestLoc: 1 -1.468351 0.533683 0.533683 -1.468351 -9.493001 -9.493001
TaxiPos: 24, PassLoc: 0, DestLoc: 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 24, PassLoc: 1, DestLoc: 1 -1.468351 0.533683 0.533683 -1.468351 -9.493001 -9.493001
TaxiPos: 24, PassLoc: 2, DestLoc: 1 1.614404 3.949478 3.949478 1.614404 -6.247996 -6.247996
TaxiPos: 24, PassLoc: 3, DestLoc: 1 2.752004 2.752004 2.752004 5.209976 -5.050522 -5.050522
TaxiPos: 24, PassLoc: 4, DestLoc: 1 -1.468351 -1.468351 -1.468351 0.533683 -9.493001 -9.493001
TaxiPos: 0, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 0, PassLoc: 1, DestLoc: 2 -0.493001 -0.493001 -0.493001 1.614404 -8.466317 -8.466317
TaxiPos: 0, PassLoc: 2, DestLoc: 2 0.533683 0.533683 2.752004 0.533683 -7.385596 -7.385596
TaxiPos: 0, PassLoc: 3, DestLoc: 2 2.752004 2.752004 5.209976 2.752004 -5.050522 -5.050522
TaxiPos: 0, PassLoc: 4, DestLoc: 2 0.533683 0.533683 2.752004 0.533683 -7.385596 -7.385596
TaxiPos: 1, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 1, PassLoc: 1, DestLoc: 2 9.403676 9.403676 9.403676 12.580250 1.951237 1.951237
TaxiPos: 1, PassLoc: 2, DestLoc: 2 9.403676 12.580250 12.580250 9.403676 1.951237 1.951237
TaxiPos: 1, PassLoc: 3, DestLoc: 2 9.403676 9.403676 9.403676 12.580250 1.951237 1.951237
TaxiPos: 1, PassLoc: 4, DestLoc: 2 10.951237 10.951237 14.295000 10.951237 3.580250 3.580250
TaxiPos: 2, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 2, PassLoc: 1, DestLoc: 2 -2.394933 -2.394933 -2.394933 -0.493001 -10.468351 -10.468351
TaxiPos: 2, PassLoc: 2, DestLoc: 2 1.614404 1.614404 1.614404 3.949478 -6.247996 -6.247996
TaxiPos: 2, PassLoc: 3, DestLoc: 2 -1.468351 -1.468351 -1.468351 0.533683 -9.493001 -9.493001
TaxiPos: 2, PassLoc: 4, DestLoc: 2 -0.493001 1.614404 1.614404 -0.493001 -8.466317 -8.466317
TaxiPos: 3, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 3, PassLoc: 1, DestLoc: 2 -0.493001 1.614404 1.614404 -0.493001 -8.466317 -8.466317
TaxiPos: 3, PassLoc: 2, DestLoc: 2 2.752004 5.209976 5.209976 2.752004 -5.050522 -5.050522
TaxiPos: 3, PassLoc: 3, DestLoc: 2 1.614404 1.614404 1.614404 3.949478 -6.247996 -6.247996
TaxiPos: 3, PassLoc: 4, DestLoc: 2 -2.394933 -2.394933 -2.394933 -0.493001 -10.468351 -10.468351
TaxiPos: 4, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 4, PassLoc: 1, DestLoc: 2 -1.468351 -1.468351 -1.468351 0.533683 -9.493001 -9.493001
TaxiPos: 4, PassLoc: 2, DestLoc: 2 3.949478 1.614404 1.614404 1.614404 -6.247996 -6.247996
TaxiPos: 4, PassLoc: 3, DestLoc: 2 6.536817 3.949478 3.949478 3.949478 -3.790024 -3.790024
TaxiPos: 4, PassLoc: 4, DestLoc: 2 3.949478 1.614404 1.614404 1.614404 -6.247996 -6.247996
TaxiPos: 5, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 5, PassLoc: 1, DestLoc: 2 7.933492 7.933492 7.933492 10.951237 0.403676 0.403676
TaxiPos: 5, PassLoc: 2, DestLoc: 2 10.951237 14.295000 14.295000 10.951237 3.580250 3.580250
TaxiPos: 5, PassLoc: 3, DestLoc: 2 7.933492 7.933492 7.933492 10.951237 0.403676 0.403676
TaxiPos: 5, PassLoc: 4, DestLoc: 2 16.100000 12.580250 12.580250 12.580250 5.295000 5.295000
TaxiPos: 6, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 6, PassLoc: 1, DestLoc: 2 -3.275187 -3.275187 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 6, PassLoc: 2, DestLoc: 2 0.533683 0.533683 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 6, PassLoc: 3, DestLoc: 2 -2.394933 -2.394933 -1.468351 -0.493001 -10.468351 -10.468351
TaxiPos: 6, PassLoc: 4, DestLoc: 2 0.533683 2.752004 1.614404 0.533683 -7.385596 -7.385596
TaxiPos: 7, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 7, PassLoc: 1, DestLoc: 2 0.533683 2.752004 1.614404 0.533683 -7.385596 -7.385596
TaxiPos: 7, PassLoc: 2, DestLoc: 2 3.949478 6.536817 5.209976 3.949478 -3.790024 -3.790024
TaxiPos: 7, PassLoc: 3, DestLoc: 2 0.533683 0.533683 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 7, PassLoc: 4, DestLoc: 2 -3.275187 -3.275187 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 8, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 8, PassLoc: 1, DestLoc: 2 -2.394933 -2.394933 -1.468351 -0.493001 -10.468351 -10.468351
TaxiPos: 8, PassLoc: 2, DestLoc: 2 2.752004 0.533683 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 8, PassLoc: 3, DestLoc: 2 5.209976 2.752004 3.949478 5.209976 -5.050522 -5.050522
TaxiPos: 8, PassLoc: 4, DestLoc: 2 2.752004 0.533683 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 9, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 9, PassLoc: 1, DestLoc: 2 6.536817 6.536817 7.933492 9.403676 -1.066508 -1.066508
TaxiPos: 9, PassLoc: 2, DestLoc: 2 12.580250 16.100000 14.295000 12.580250 5.295000 5.295000
TaxiPos: 9, PassLoc: 3, DestLoc: 2 6.536817 6.536817 7.933492 9.403676 -1.066508 -1.066508
TaxiPos: 9, PassLoc: 4, DestLoc: 2 14.295000 10.951237 12.580250 14.295000 3.580250 3.580250
TaxiPos: 10, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 10, PassLoc: 1, DestLoc: 2 -0.493001 1.614404 0.533683 0.533683 -8.466317 -8.466317
TaxiPos: 10, PassLoc: 2, DestLoc: 2 3.949478 6.536817 5.209976 5.209976 -3.790024 -3.790024
TaxiPos: 10, PassLoc: 3, DestLoc: 2 0.533683 2.752004 1.614404 1.614404 -7.385596 -7.385596
TaxiPos: 10, PassLoc: 4, DestLoc: 2 -4.111427 -2.394933 -3.275187 -3.275187 -12.275187 -12.275187
TaxiPos: 11, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 11, PassLoc: 1, DestLoc: 2 -4.111427 -2.394933 -3.275187 -3.275187 -12.275187 -12.275187
TaxiPos: 11, PassLoc: 2, DestLoc: 2 -1.468351 0.533683 -0.493001 -0.493001 -9.493001 -9.493001
TaxiPos: 11, PassLoc: 3, DestLoc: 2 9.403676 6.536817 7.933492 7.933492 -1.066508 -1.066508
TaxiPos: 11, PassLoc: 4, DestLoc: 2 3.949478 1.614404 2.752004 2.752004 -6.247996 -6.247996
TaxiPos: 12, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 12, PassLoc: 1, DestLoc: 2 5.209976 2.752004 3.949478 3.949478 -5.050522 -5.050522
TaxiPos: 12, PassLoc: 2, DestLoc: 2 -2.394933 -0.493001 -1.468351 -1.468351 -10.468351 -10.468351
TaxiPos: 12, PassLoc: 3, DestLoc: 2 -0.493001 1.614404 0.533683 0.533683 -8.466317 -8.466317
TaxiPos: 12, PassLoc: 4, DestLoc: 2 -2.394933 -0.493001 -1.468351 -1.468351 -10.468351 -10.468351
TaxiPos: 13, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 13, PassLoc: 1, DestLoc: 2 10.951237 14.295000 12.580250 12.580250 3.580250 3.580250
TaxiPos: 13, PassLoc: 2, DestLoc: 2 5.209976 7.933492 6.536817 6.536817 -2.463183 -2.463183
TaxiPos: 13, PassLoc: 3, DestLoc: 2 18.000000 14.295000 16.100000 16.100000 7.100000 7.100000
TaxiPos: 13, PassLoc: 4, DestLoc: 2 6.536817 9.403676 7.933492 7.933492 -1.066508 -1.066508
TaxiPos: 14, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 14, PassLoc: 1, DestLoc: 2 -1.468351 0.533683 -1.468351 -0.493001 -9.493001 -9.493001
TaxiPos: 14, PassLoc: 2, DestLoc: 2 2.752004 5.209976 2.752004 3.949478 -5.050522 -5.050522
TaxiPos: 14, PassLoc: 3, DestLoc: 2 -0.493001 1.614404 -0.493001 0.533683 -8.466317 -8.466317
TaxiPos: 14, PassLoc: 4, DestLoc: 2 -3.275187 -1.468351 -1.468351 -2.394933 -11.394933 -11.394933
TaxiPos: 15, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 15, PassLoc: 1, DestLoc: 2 -3.275187 -1.468351 -1.468351 -2.394933 -11.394933 -11.394933
TaxiPos: 15, PassLoc: 2, DestLoc: 2 -0.493001 1.614404 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 15, PassLoc: 3, DestLoc: 2 2.752004 5.209976 2.752004 3.949478 -5.050522 -5.050522
TaxiPos: 15, PassLoc: 4, DestLoc: 2 -1.468351 0.533683 -1.468351 -0.493001 -9.493001 -9.493001
TaxiPos: 16, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 16, PassLoc: 1, DestLoc: 2 -0.493001 1.614404 -0.493001 0.533683 -8.466317 -8.466317
TaxiPos: 16, PassLoc: 2, DestLoc: 2 -1.468351 0.533683 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 16, PassLoc: 3, DestLoc: 2 0.533683 2.752004 2.752004 1.614404 -7.385596 -7.385596
TaxiPos: 16, PassLoc: 4, DestLoc: 2 -1.468351 0.533683 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 17, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 17, PassLoc: 1, DestLoc: 2 9.403676 12.580250 9.403676 10.951237 1.951237 1.951237
TaxiPos: 17, PassLoc: 2, DestLoc: 2 6.536817 9.403676 9.403676 7.933492 -1.066508 -1.066508
TaxiPos: 17, PassLoc: 3, DestLoc: 2 9.403676 12.580250 9.403676 10.951237 1.951237 1.951237
TaxiPos: 17, PassLoc: 4, DestLoc: 2 7.933492 10.951237 10.951237 9.403676 0.403676 0.403676
TaxiPos: 18, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 18, PassLoc: 1, DestLoc: 2 -2.394933 -0.493001 -1.468351 -0.493001 -10.468351 -10.468351
TaxiPos: 18, PassLoc: 2, DestLoc: 2 1.614404 3.949478 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 18, PassLoc: 3, DestLoc: 2 -1.468351 0.533683 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 18, PassLoc: 4, DestLoc: 2 -2.394933 -0.493001 -1.468351 -2.394933 -10.468351 -10.468351
TaxiPos: 19, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 19, PassLoc: 1, DestLoc: 2 -2.394933 -0.493001 -1.468351 -2.394933 -10.468351 -10.468351
TaxiPos: 19, PassLoc: 2, DestLoc: 2 0.533683 2.752004 1.614404 0.533683 -7.385596 -7.385596
TaxiPos: 19, PassLoc: 3, DestLoc: 2 1.614404 3.949478 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 19, PassLoc: 4, DestLoc: 2 -2.394933 -0.493001 -1.468351 -0.493001 -10.468351 -10.468351
TaxiPos: 20, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 20, PassLoc: 1, DestLoc: 2 -1.468351 0.533683 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 20, PassLoc: 2, DestLoc: 2 -0.493001 1.614404 0.533683 -0.493001 -8.466317 -8.466317
TaxiPos: 20, PassLoc: 3, DestLoc: 2 1.614404 3.949478 2.752004 1.614404 -6.247996 -6.247996
TaxiPos: 20, PassLoc: 4, DestLoc: 2 -0.493001 1.614404 0.533683 -0.493001 -8.466317 -8.466317
TaxiPos: 21, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 21, PassLoc: 1, DestLoc: 2 7.933492 10.951237 9.403676 10.951237 0.403676 0.403676
TaxiPos: 21, PassLoc: 2, DestLoc: 2 7.933492 10.951237 9.403676 7.933492 0.403676 0.403676
TaxiPos: 21, PassLoc: 3, DestLoc: 2 7.933492 10.951237 9.403676 10.951237 0.403676 0.403676
TaxiPos: 21, PassLoc: 4, DestLoc: 2 9.403676 12.580250 10.951237 9.403676 1.951237 1.951237
TaxiPos: 22, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 22, PassLoc: 1, DestLoc: 2 -3.275187 -1.468351 -3.275187 -2.394933 -11.394933 -11.394933
TaxiPos: 22, PassLoc: 2, DestLoc: 2 0.533683 2.752004 0.533683 1.614404 -7.385596 -7.385596
TaxiPos: 22, PassLoc: 3, DestLoc: 2 -2.394933 -0.493001 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 22, PassLoc: 4, DestLoc: 2 -1.468351 0.533683 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 23, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 23, PassLoc: 1, DestLoc: 2 -1.468351 0.533683 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 23, PassLoc: 2, DestLoc: 2 1.614404 3.949478 3.949478 2.752004 -6.247996 -6.247996
TaxiPos: 23, PassLoc: 3, DestLoc: 2 0.533683 2.752004 0.533683 1.614404 -7.385596 -7.385596
TaxiPos: 23, PassLoc: 4, DestLoc: 2 -3.275187 -1.468351 -3.275187 -2.394933 -11.394933 -11.394933
TaxiPos: 24, PassLoc: 0, DestLoc: 2 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 24, PassLoc: 1, DestLoc: 2 -2.394933 -0.493001 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 24, PassLoc: 2, DestLoc: 2 5.209976 2.752004 2.752004 3.949478 -5.050522 -5.050522
TaxiPos: 24, PassLoc: 3, DestLoc: 2 7.933492 5.209976 5.209976 6.536817 -2.463183 -2.463183
TaxiPos: 24, PassLoc: 4, DestLoc: 2 5.209976 2.752004 2.752004 3.949478 -5.050522 -5.050522
TaxiPos: 0, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 0, PassLoc: 1, DestLoc: 3 6.536817 9.403676 6.536817 7.933492 -1.066508 -1.066508
TaxiPos: 0, PassLoc: 2, DestLoc: 3 9.403676 12.580250 12.580250 10.951237 1.951237 1.951237
TaxiPos: 0, PassLoc: 3, DestLoc: 3 6.536817 9.403676 6.536817 7.933492 -1.066508 -1.066508
TaxiPos: 0, PassLoc: 4, DestLoc: 3 18.000000 14.295000 14.295000 16.100000 7.100000 7.100000
TaxiPos: 1, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 1, PassLoc: 1, DestLoc: 3 -4.111427 -2.394933 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 1, PassLoc: 2, DestLoc: 3 -0.493001 1.614404 0.533683 1.614404 -8.466317 -8.466317
TaxiPos: 1, PassLoc: 3, DestLoc: 3 -3.275187 -1.468351 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 1, PassLoc: 4, DestLoc: 3 -0.493001 1.614404 0.533683 -0.493001 -8.466317 -8.466317
TaxiPos: 2, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 2, PassLoc: 1, DestLoc: 3 -0.493001 1.614404 0.533683 -0.493001 -8.466317 -8.466317
TaxiPos: 2, PassLoc: 2, DestLoc: 3 2.752004 5.209976 3.949478 2.752004 -5.050522 -5.050522
TaxiPos: 2, PassLoc: 3, DestLoc: 3 -0.493001 1.614404 0.533683 1.614404 -8.466317 -8.466317
TaxiPos: 2, PassLoc: 4, DestLoc: 3 -4.111427 -2.394933 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 3, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 3, PassLoc: 1, DestLoc: 3 -3.275187 -1.468351 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 3, PassLoc: 2, DestLoc: 3 3.949478 1.614404 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 3, PassLoc: 3, DestLoc: 3 6.536817 3.949478 5.209976 6.536817 -3.790024 -3.790024
TaxiPos: 3, PassLoc: 4, DestLoc: 3 3.949478 1.614404 2.752004 3.949478 -6.247996 -6.247996
TaxiPos: 4, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 4, PassLoc: 1, DestLoc: 3 5.209976 7.933492 6.536817 7.933492 -2.463183 -2.463183
TaxiPos: 4, PassLoc: 2, DestLoc: 3 10.951237 14.295000 12.580250 10.951237 3.580250 3.580250
TaxiPos: 4, PassLoc: 3, DestLoc: 3 5.209976 7.933492 6.536817 7.933492 -2.463183 -2.463183
TaxiPos: 4, PassLoc: 4, DestLoc: 3 16.100000 12.580250 14.295000 16.100000 5.295000 5.295000
TaxiPos: 5, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 5, PassLoc: 1, DestLoc: 3 -0.493001 0.533683 -0.493001 -0.493001 -9.493001 -9.493001
TaxiPos: 5, PassLoc: 2, DestLoc: 3 3.949478 5.209976 3.949478 3.949478 -5.050522 -5.050522
TaxiPos: 5, PassLoc: 3, DestLoc: 3 0.533683 1.614404 0.533683 0.533683 -8.466317 -8.466317
TaxiPos: 5, PassLoc: 4, DestLoc: 3 -4.111427 -3.275187 -4.111427 -4.111427 -13.111427 -13.111427
TaxiPos: 6, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 6, PassLoc: 1, DestLoc: 3 -4.111427 -3.275187 -4.111427 -4.111427 -13.111427 -13.111427
TaxiPos: 6, PassLoc: 2, DestLoc: 3 -1.468351 -0.493001 -1.468351 -1.468351 -10.468351 -10.468351
TaxiPos: 6, PassLoc: 3, DestLoc: 3 9.403676 7.933492 9.403676 9.403676 10.951237 0.403676
TaxiPos: 6, PassLoc: 4, DestLoc: 3 3.949478 2.752004 3.949478 3.949478 5.209976 -5.050522
TaxiPos: 7, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 7, PassLoc: 1, DestLoc: 3 5.209976 3.949478 5.209976 5.209976 6.536817 -3.790024
TaxiPos: 7, PassLoc: 2, DestLoc: 3 -2.394933 -1.468351 -2.394933 -2.394933 -11.394933 -11.394933
TaxiPos: 7, PassLoc: 3, DestLoc: 3 -0.493001 0.533683 -0.493001 -0.493001 -9.493001 -9.493001
TaxiPos: 7, PassLoc: 4, DestLoc: 3 -2.394933 -1.468351 -2.394933 -2.394933 -11.394933 -11.394933
TaxiPos: 8, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 8, PassLoc: 1, DestLoc: 3 10.951237 12.580250 10.951237 10.951237 1.951237 9.403676
TaxiPos: 8, PassLoc: 2, DestLoc: 3 5.209976 6.536817 5.209976 5.209976 -3.790024 3.949478
TaxiPos: 8, PassLoc: 3, DestLoc: 3 18.000000 16.100000 18.000000 18.000000 9.000000 20.000000
TaxiPos: 8, PassLoc: 4, DestLoc: 3 6.536817 7.933492 6.536817 6.536817 -2.463183 5.209976
TaxiPos: 9, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 9, PassLoc: 1, DestLoc: 3 -1.468351 -0.493001 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 9, PassLoc: 2, DestLoc: 3 2.752004 3.949478 1.614404 2.752004 -6.247996 -6.247996
TaxiPos: 9, PassLoc: 3, DestLoc: 3 -0.493001 0.533683 -1.468351 -0.493001 -9.493001 -9.493001
TaxiPos: 9, PassLoc: 4, DestLoc: 3 -3.275187 -2.394933 -2.394933 -3.275187 -12.275187 -12.275187
TaxiPos: 10, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 10, PassLoc: 1, DestLoc: 3 -3.275187 -2.394933 -2.394933 -3.275187 -12.275187 -12.275187
TaxiPos: 10, PassLoc: 2, DestLoc: 3 -0.493001 0.533683 0.533683 -0.493001 -9.493001 -9.493001
TaxiPos: 10, PassLoc: 3, DestLoc: 3 2.752004 3.949478 1.614404 2.752004 -6.247996 -6.247996
TaxiPos: 10, PassLoc: 4, DestLoc: 3 -1.468351 -0.493001 -2.394933 -1.468351 -10.468351 -10.468351
TaxiPos: 11, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 11, PassLoc: 1, DestLoc: 3 -0.493001 0.533683 -1.468351 -0.493001 -9.493001 -9.493001
TaxiPos: 11, PassLoc: 2, DestLoc: 3 -1.468351 -0.493001 -0.493001 -1.468351 -10.468351 -10.468351
TaxiPos: 11, PassLoc: 3, DestLoc: 3 0.533683 1.614404 1.614404 0.533683 -8.466317 -8.466317
TaxiPos: 11, PassLoc: 4, DestLoc: 3 -1.468351 -0.493001 -0.493001 -1.468351 -10.468351 -10.468351
TaxiPos: 12, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 12, PassLoc: 1, DestLoc: 3 9.403676 10.951237 7.933492 9.403676 0.403676 0.403676
TaxiPos: 12, PassLoc: 2, DestLoc: 3 6.536817 7.933492 7.933492 6.536817 -2.463183 -2.463183
TaxiPos: 12, PassLoc: 3, DestLoc: 3 9.403676 10.951237 7.933492 9.403676 0.403676 0.403676
TaxiPos: 12, PassLoc: 4, DestLoc: 3 7.933492 9.403676 9.403676 7.933492 -1.066508 -1.066508
TaxiPos: 13, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 13, PassLoc: 1, DestLoc: 3 -2.394933 -1.468351 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 13, PassLoc: 2, DestLoc: 3 1.614404 2.752004 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 13, PassLoc: 3, DestLoc: 3 -1.468351 -0.493001 -1.468351 -0.493001 -10.468351 -10.468351
TaxiPos: 13, PassLoc: 4, DestLoc: 3 -2.394933 -1.468351 -2.394933 -3.275187 -11.394933 -11.394933
TaxiPos: 14, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 14, PassLoc: 1, DestLoc: 3 -2.394933 -1.468351 -2.394933 -3.275187 -11.394933 -11.394933
TaxiPos: 14, PassLoc: 2, DestLoc: 3 0.533683 1.614404 0.533683 -0.493001 -8.466317 -8.466317
TaxiPos: 14, PassLoc: 3, DestLoc: 3 1.614404 2.752004 1.614404 2.752004 -7.385596 -7.385596
TaxiPos: 14, PassLoc: 4, DestLoc: 3 -2.394933 -1.468351 -2.394933 -1.468351 -11.394933 -11.394933
TaxiPos: 15, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 15, PassLoc: 1, DestLoc: 3 -1.468351 -0.493001 -1.468351 -0.493001 -10.468351 -10.468351
TaxiPos: 15, PassLoc: 2, DestLoc: 3 -0.493001 0.533683 -0.493001 -1.468351 -9.493001 -9.493001
TaxiPos: 15, PassLoc: 3, DestLoc: 3 1.614404 2.752004 1.614404 0.533683 -7.385596 -7.385596
TaxiPos: 15, PassLoc: 4, DestLoc: 3 -0.493001 0.533683 -0.493001 -1.468351 -9.493001 -9.493001
TaxiPos: 16, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 16, PassLoc: 1, DestLoc: 3 7.933492 9.403676 7.933492 9.403676 -1.066508 -1.066508
TaxiPos: 16, PassLoc: 2, DestLoc: 3 7.933492 9.403676 7.933492 6.536817 -1.066508 -1.066508
TaxiPos: 16, PassLoc: 3, DestLoc: 3 7.933492 9.403676 7.933492 9.403676 -1.066508 -1.066508
TaxiPos: 16, PassLoc: 4, DestLoc: 3 9.403676 10.951237 9.403676 7.933492 0.403676 0.403676
TaxiPos: 17, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 17, PassLoc: 1, DestLoc: 3 -3.275187 -2.394933 -4.111427 -3.275187 -12.275187 -12.275187
TaxiPos: 17, PassLoc: 2, DestLoc: 3 0.533683 1.614404 -0.493001 0.533683 -8.466317 -8.466317
TaxiPos: 17, PassLoc: 3, DestLoc: 3 -2.394933 -1.468351 -3.275187 -2.394933 -11.394933 -11.394933
TaxiPos: 17, PassLoc: 4, DestLoc: 3 -1.468351 -0.493001 -0.493001 -1.468351 -10.468351 -10.468351
TaxiPos: 18, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 18, PassLoc: 1, DestLoc: 3 -1.468351 -0.493001 -0.493001 -1.468351 -10.468351 -10.468351
TaxiPos: 18, PassLoc: 2, DestLoc: 3 1.614404 2.752004 2.752004 1.614404 -7.385596 -7.385596
TaxiPos: 18, PassLoc: 3, DestLoc: 3 0.533683 1.614404 -0.493001 0.533683 -8.466317 -8.466317
TaxiPos: 18, PassLoc: 4, DestLoc: 3 -3.275187 -2.394933 -4.111427 -3.275187 -12.275187 -12.275187
TaxiPos: 19, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 19, PassLoc: 1, DestLoc: 3 -2.394933 -1.468351 -3.275187 -2.394933 -11.394933 -11.394933
TaxiPos: 19, PassLoc: 2, DestLoc: 3 5.209976 3.949478 3.949478 5.209976 6.536817 -3.790024
TaxiPos: 19, PassLoc: 3, DestLoc: 3 7.933492 6.536817 6.536817 7.933492 9.403676 -1.066508
TaxiPos: 19, PassLoc: 4, DestLoc: 3 5.209976 3.949478 3.949478 5.209976 6.536817 -3.790024
TaxiPos: 20, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 20, PassLoc: 1, DestLoc: 3 6.536817 7.933492 5.209976 6.536817 -2.463183 5.209976
TaxiPos: 20, PassLoc: 2, DestLoc: 3 9.403676 10.951237 10.951237 9.403676 0.403676 7.933492
TaxiPos: 20, PassLoc: 3, DestLoc: 3 6.536817 7.933492 5.209976 6.536817 -2.463183 5.209976
TaxiPos: 20, PassLoc: 4, DestLoc: 3 18.000000 16.100000 16.100000 18.000000 9.000000 20.000000
TaxiPos: 21, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 21, PassLoc: 1, DestLoc: 3 -4.111427 -3.275187 -4.111427 -3.275187 -13.111427 -13.111427
TaxiPos: 21, PassLoc: 2, DestLoc: 3 -0.493001 0.533683 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 21, PassLoc: 3, DestLoc: 3 -3.275187 -2.394933 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 21, PassLoc: 4, DestLoc: 3 -0.493001 0.533683 -0.493001 -1.468351 -9.493001 -9.493001
TaxiPos: 22, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 22, PassLoc: 1, DestLoc: 3 -0.493001 0.533683 -0.493001 -1.468351 -9.493001 -9.493001
TaxiPos: 22, PassLoc: 2, DestLoc: 3 2.752004 3.949478 2.752004 1.614404 -6.247996 -6.247996
TaxiPos: 22, PassLoc: 3, DestLoc: 3 -0.493001 0.533683 -0.493001 0.533683 -9.493001 -9.493001
TaxiPos: 22, PassLoc: 4, DestLoc: 3 -4.111427 -3.275187 -4.111427 -3.275187 -13.111427 -13.111427
TaxiPos: 23, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 23, PassLoc: 1, DestLoc: 3 -3.275187 -2.394933 -3.275187 -2.394933 -12.275187 -12.275187
TaxiPos: 23, PassLoc: 2, DestLoc: 3 3.949478 2.752004 3.949478 5.209976 -5.050522 -5.050522
TaxiPos: 23, PassLoc: 3, DestLoc: 3 6.536817 5.209976 6.536817 7.933492 -2.463183 -2.463183
TaxiPos: 23, PassLoc: 4, DestLoc: 3 3.949478 2.752004 3.949478 5.209976 -5.050522 -5.050522
TaxiPos: 24, PassLoc: 0, DestLoc: 3 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
TaxiPos: 24, PassLoc: 1, DestLoc: 3 5.209976 6.536817 5.209976 6.536817 -3.790024 -3.790024
TaxiPos: 24, PassLoc: 2, DestLoc: 3 10.951237 12.580250 10.951237 9.403676 1.951237 1.951237
TaxiPos: 24, PassLoc: 3, DestLoc: 3 5.209976 6.536817 5.209976 6.536817 -3.790024 -3.790024
TaxiPos: 24, PassLoc: 4, DestLoc: 3 16.100000 14.295000 16.100000 18.000000 7.100000 7.100000

Create a model dictionary

model = {
    "env_id": env_id,
    "max_steps": max_steps,
    "n_training_episodes": n_training_episodes,
    "n_eval_episodes": n_eval_episodes,
    "eval_seed": eval_seed,

    "learning_rate": learning_rate,
    "gamma": gamma,

    "epsilon": epsilon,
    "max_epsilon": max_epsilon,
    "min_epsilon": min_epsilon,
    "decay_rate": decay_rate,

    "qtable": Qtable_taxi
}

Publish the trained model on the Hub

username = "cj-mills"
repo_name = "q-Taxi-v3"
push_to_hub(
    repo_id=f"{username}/{repo_name}",
    model=model,
    env=env)
IMAGEIO FFMPEG_WRITER WARNING: input image is not divisible by macro_block_size=16, resizing from (550, 350) to (560, 352) to ensure video compatibility with most codecs and players. To prevent resizing, make your input image divisible by the macro_block_size or set the macro_block_size to 1 (risking incompatibility).
{'env_id': 'Taxi-v3', 'max_steps': 99, 'n_training_episodes': 25000, 'n_eval_episodes': 100, 'eval_seed': [16, 54, 165, 177, 191, 191, 120, 80, 149, 178, 48, 38, 6, 125, 174, 73, 50, 172, 100, 148, 146, 6, 25, 40, 68, 148, 49, 167, 9, 97, 164, 176, 61, 7, 54, 55, 161, 131, 184, 51, 170, 12, 120, 113, 95, 126, 51, 98, 36, 135, 54, 82, 45, 95, 89, 59, 95, 124, 9, 113, 58, 85, 51, 134, 121, 169, 105, 21, 30, 11, 50, 65, 12, 43, 82, 145, 152, 97, 106, 55, 31, 85, 38, 112, 102, 168, 123, 97, 21, 83, 158, 26, 80, 63, 5, 81, 32, 11, 28, 148], 'learning_rate': 0.7, 'gamma': 0.95, 'epsilon': 1.0, 'max_epsilon': 1.0, 'min_epsilon': 0.05, 'decay_rate': 0.005, 'qtable': array([[ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         0.        ],
       [ 2.75200369,  3.94947757,  2.75200369,  3.94947757,  5.20997639,
        -5.05052243],
       [ 7.93349184,  9.40367562,  7.93349184,  9.40367562, 10.9512375 ,
         0.40367562],
       ...,
       [10.9512375 , 12.58025   , 10.9512375 ,  9.40367562,  1.9512375 ,
         1.9512375 ],
       [ 5.20997639,  6.53681725,  5.20997639,  6.53681725, -3.79002361,
        -3.79002361],
       [16.1       , 14.295     , 16.1       , 18.        ,  7.1       ,
         7.1       ]])}
Pushing repo q-Taxi-v3 to the Hugging Face Hub
[swscaler @ 0x5936a80] Warning: data is not aligned! This can lead to a speed loss
Upload file replay.mp4:  27%|##7       | 32.0k/118k [00:00<?, ?B/s]
Your model is pushed to the hub. You can view your model here: https://huggingface.co/cj-mills/q-Taxi-v3

Leaderboard

Load from Hub

  1. Go to https://huggingface.co/models?other=q-learning to see the list of all the q-learning saved models.
  2. Select one and copy its repo_id.
  3. Use load_from_hub with the repo_id and the filename.

Do not modify this code

from urllib.error import HTTPError

from huggingface_hub import hf_hub_download


def load_from_hub(repo_id: str, filename: str) -> str:
    """
    Download a model from Hugging Face Hub.
    :param repo_id: id of the model repository from the Hugging Face Hub
    :param filename: name of the model zip file from the repository
    """
    try:
        from huggingface_hub import cached_download, hf_hub_url
    except ImportError:
        raise ImportError(
            "You need to install huggingface_hub to use `load_from_hub`. "
            "See https://pypi.org/project/huggingface-hub/ for installation."
        )

    # Get the model from the Hub, download and cache the model on your local disk
    pickle_model = hf_hub_download(
        repo_id=repo_id,
        filename=filename
    )

    with open(pickle_model, 'rb') as f:
        downloaded_model_file = pickle.load(f)
    
    return downloaded_model_file
model = load_from_hub(repo_id="cj-mills/q-Taxi-v3", filename="q-learning.pkl")

print(model)
env = gym.make(model["env_id"])

evaluate_agent(env, model["max_steps"], model["n_eval_episodes"], model["qtable"], model["eval_seed"])
{'env_id': 'Taxi-v3', 'max_steps': 99, 'n_training_episodes': 25000, 'n_eval_episodes': 100, 'eval_seed': [16, 54, 165, 177, 191, 191, 120, 80, 149, 178, 48, 38, 6, 125, 174, 73, 50, 172, 100, 148, 146, 6, 25, 40, 68, 148, 49, 167, 9, 97, 164, 176, 61, 7, 54, 55, 161, 131, 184, 51, 170, 12, 120, 113, 95, 126, 51, 98, 36, 135, 54, 82, 45, 95, 89, 59, 95, 124, 9, 113, 58, 85, 51, 134, 121, 169, 105, 21, 30, 11, 50, 65, 12, 43, 82, 145, 152, 97, 106, 55, 31, 85, 38, 112, 102, 168, 123, 97, 21, 83, 158, 26, 80, 63, 5, 81, 32, 11, 28, 148], 'learning_rate': 0.7, 'gamma': 0.95, 'epsilon': 1.0, 'max_epsilon': 1.0, 'min_epsilon': 0.05, 'decay_rate': 0.005, 'qtable': array([[ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         0.        ],
       [ 2.75200369,  3.94947757,  2.75200369,  3.94947757,  5.20997639,
        -5.05052243],
       [ 7.93349184,  9.40367562,  7.93349184,  9.40367562, 10.9512375 ,
         0.40367562],
       ...,
       [10.9512375 , 12.58025   , 10.9512375 ,  9.40367562,  1.9512375 ,
         1.9512375 ],
       [ 5.20997639,  6.53681725,  5.20997639,  6.53681725, -3.79002361,
        -3.79002361],
       [16.1       , 14.295     , 16.1       , 18.        ,  7.1       ,
         7.1       ]])}
(7.56, 2.706732347314747)

Some additional challenges

  • Train for more steps.
  • Try different hyperparameters by looking at what your classmates have done.
  • Try using FrozenLake-v1 slippery version and other environments.

References