cadCAD/tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb

716 lines
197 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# cadCAD Tutorials: The Robot and the Marbles, part 4\n",
"In parts [1](../robot-marbles-part-1/robot-marbles-part-1.ipynb) and [2](../robot-marbles-part-2/robot-marbles-part-2.ipynb) we introduced the 'language' in which a system must be described in order for it to be interpretable by cadCAD and some of the basic concepts of the library:\n",
"* State Variables\n",
"* Timestep\n",
"* State Update Functions\n",
"* Partial State Update Blocks\n",
"* Simulation Configuration Parameters\n",
"* Policies\n",
"\n",
"In [part 3](../robot-marbles-part-3/robot-marbles-part-3.ipynb) we covered how to describe the presence of asynchronous subsystems within the system being modeled in cadCAD.\n",
"\n",
"So far, all the examples referred to deterministic systems: no matter how many times you ran one of those simulations, the results would be the same. However, systems are more commonly non-deterministic, and modelling them as deterministic might be an oversimplification sometimes. \n",
"\n",
"In this notebook, we'll cover cadCAD's support for modelling non-deterministic systems and Monte Carlo simulations. But first let's copy the base configuration with which we ended Part 3. Here's the description of that system:\n",
"\n",
"__The robot and the marbles__ \n",
"* Picture a box (`box_A`) with ten marbles in it; an empty box (`box_B`) next to the first one; and __two__ robot arms capable of taking a marble from any one of the boxes and dropping it into the other one. \n",
"* The robots are programmed to take one marble at a time from the box containing the largest number of marbles and drop it in the other box. They repeat that process until the boxes contain an equal number of marbles.\n",
"* The robots act __asynchronously__; robot 1 acts once every two timesteps, and robot 2 acts once every three timesteps."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# List of all the state variables in the system and their initial values\n",
"initial_conditions = {\n",
" 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it\n",
" 'box_B': 0 # as per the description of the example, box_B starts out empty\n",
"}\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# Settings of general simulation parameters, unrelated to the system itself\n",
"# `T` is a range with the number of discrete units of time the simulation will run for;\n",
"# `N` is the number of times the simulation will be run (Monte Carlo runs)\n",
"# In this example, we'll run the simulation once (N=1) and its duration will be of 10 timesteps\n",
"# We'll cover the `M` key in a future article. For now, let's leave it empty\n",
"simulation_parameters = {\n",
" 'T': range(10),\n",
" 'N': 1,\n",
" 'M': {}\n",
"}\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# We specify the robot arm's logic in a Policy Function\n",
"def robot_arm(params, step, sL, s):\n",
" add_to_A = 0\n",
" if (s['box_A'] > s['box_B']):\n",
" add_to_A = -1\n",
" elif (s['box_A'] < s['box_B']):\n",
" add_to_A = 1\n",
" return({'add_to_A': add_to_A, 'add_to_B': -add_to_A})\n",
" \n",
"robots_periods = [2,3] # Robot 1 acts once every 2 timesteps; Robot 2 acts once every 3 timesteps\n",
"\n",
"def robot_arm_1(params, step, sL, s):\n",
" _robotId = 1\n",
" if s['timestep']%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 2, Robot 1 acts\n",
" return robot_arm(params, step, sL, s)\n",
" else:\n",
" return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 1 doesn't interfere with the system\n",
"\n",
"def robot_arm_2(params, step, sL, s):\n",
" _robotId = 2\n",
" if s['timestep']%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 3, Robot 2 acts\n",
" return robot_arm(params, step, sL, s)\n",
" else:\n",
" return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 2 doesn't interfere with the system\n",
"\n",
" \n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# We make the state update functions less \"intelligent\",\n",
"# ie. they simply add the number of marbles specified in _input \n",
"# (which, per the policy function definition, may be negative)\n",
"def increment_A(params, step, sL, s, _input):\n",
" y = 'box_A'\n",
" x = s['box_A'] + _input['add_to_A']\n",
" return (y, x)\n",
"\n",
"def increment_B(params, step, sL, s, _input):\n",
" y = 'box_B'\n",
" x = s['box_B'] + _input['add_to_B']\n",
" return (y, x)\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# In the Partial State Update Blocks, \n",
"# the user specifies if state update functions will be run in series or in parallel\n",
"# and the policy functions that will be evaluated in that block\n",
"partial_state_update_blocks = [\n",
" { \n",
" 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n",
" 'robot_arm_1': robot_arm_1,\n",
" 'robot_arm_2': robot_arm_2\n",
" },\n",
" 'variables': { # The following state variables will be updated simultaneously\n",
" 'box_A': increment_A,\n",
" 'box_B': increment_B\n",
" }\n",
" }\n",
"]\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"\n",
"\n",
"from cadCAD.configuration import Configuration\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# The configurations above are then packaged into a `Configuration` object\n",
"config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n",
" partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n",
" sim_config=simulation_parameters #dict containing simulation parameters\n",
" )\n",
"\n",
"from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n",
"exec_mode = ExecutionMode()\n",
"exec_context = ExecutionContext(exec_mode.single_proc)\n",
"executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n",
"raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n",
"\n",
"%matplotlib inline\n",
"import pandas as pd\n",
"df = pd.DataFrame(raw_result)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.plot('timestep', ['box_A', 'box_B'], grid=True, \n",
" xticks=list(df['timestep'].drop_duplicates()), \n",
" colormap = 'RdYlGn',\n",
" yticks=list(range(1+(df['box_A']+df['box_B']).max())));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Non-determinism\n",
"Non-deterministic systems exhibit different behaviors on different runs for the same input. The order of heads and tails in a series of 3 coin tosses, for example, is non deterministic. \n",
"\n",
"Our robots and marbles system is currently modelled as a deterministic system. Meaning that every time we run the simulation: none of the robots act on timestep 1; robot 1 acts on timestep 2; robot 2 acts on timestep 3; an so on. \n",
"\n",
"If however we were to define that at every timestep each robot would act with a probability P, then we would have a non-deterministic (probabilistic) system. Let's make the following changes to our system.\n",
"* Robot 1: instead of acting once every two timesteps, there's a 50% chance it will act in any given timestep\n",
"* Robot 2: instead of acting once every three timesteps, there's a 33.33% chance it will act in any given timestep"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"from numpy.random import rand\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# We specify each of the robots logic in a Policy Function\n",
"robots_probabilities = [0.5,1/3] # Robot 1 acts with a 50% probability; Robot 2, 33.33%\n",
"\n",
"def robot_arm_1(params, step, sL, s):\n",
" _robotId = 1\n",
" if rand()<robots_probabilities[_robotId-1]: # draw a random number between 0 and 1; if it's smaller than the robot's parameter, it acts\n",
" return robot_arm(params, step, sL, s)\n",
" else:\n",
" return({'add_to_A': 0, 'add_to_B': 0}) # otherwise, the robot doesn't interfere with the system\n",
"\n",
"def robot_arm_2(params, step, sL, s):\n",
" _robotId = 2\n",
" if rand()<robots_probabilities[_robotId-1]: # draw a random number between 0 and 1; if it's smaller than the robot's parameter, it acts\n",
" return robot_arm(params, step, sL, s)\n",
" else:\n",
" return({'add_to_A': 0, 'add_to_B': 0}) # otherwise, the robot doesn't interfere with the system\n",
"\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# In the Partial State Update Blocks, \n",
"# the user specifies if state update functions will be run in series or in parallel\n",
"# and the policy functions that will be evaluated in that block\n",
"partial_state_update_blocks = [\n",
" { \n",
" 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n",
" 'robot_arm_1': robot_arm_1,\n",
" 'robot_arm_2': robot_arm_2\n",
" },\n",
" 'variables': { # The following state variables will be updated simultaneously\n",
" 'box_A': increment_A,\n",
" 'box_B': increment_B\n",
" }\n",
" }\n",
"]\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we run the simulation with those configurations, the system is unlikely to exhibit the same behavior as it did in its deterministic version"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# The configurations above are then packaged into a `Configuration` object\n",
"config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n",
" partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n",
" sim_config=simulation_parameters #dict containing simulation parameters\n",
" )\n",
"\n",
"exec_mode = ExecutionMode()\n",
"exec_context = ExecutionContext(exec_mode.single_proc)\n",
"executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n",
"raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n",
"\n",
"df = pd.DataFrame(raw_result)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.plot('timestep', ['box_A', 'box_B'], grid=True, \n",
" xticks=list(df['timestep'].drop_duplicates()), \n",
" colormap = 'RdYlGn',\n",
" yticks=list(range(1+(df['box_A']+df['box_B']).max())));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And if we run it again, it returns yet another result"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# The configurations above are then packaged into a `Configuration` object\n",
"config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n",
" partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n",
" sim_config=simulation_parameters #dict containing simulation parameters\n",
" )\n",
"\n",
"exec_mode = ExecutionMode()\n",
"exec_context = ExecutionContext(exec_mode.single_proc)\n",
"executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n",
"raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n",
"\n",
"df = pd.DataFrame(raw_result)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.plot('timestep', ['box_A', 'box_B'], grid=True, \n",
" xticks=list(df['timestep'].drop_duplicates()), \n",
" colormap = 'RdYlGn',\n",
" yticks=list(range(1+(df['box_A']+df['box_B']).max())));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to take advantage of cadCAD's Monte Carlo simulation features, we should modify the configuration file so as to define the number of times we want the same simulation to be run. This is done in the `N` key of the `simulation_parameters` dict."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# Settings of general simulation parameters, unrelated to the system itself\n",
"# `T` is a range with the number of discrete units of time the simulation will run for;\n",
"# `N` is the number of times the simulation will be run (Monte Carlo runs)\n",
"# In this example, we'll run the simulation once (N=1) and its duration will be of 10 timesteps\n",
"# We'll cover the `M` key in a future article. For now, let's leave it empty\n",
"simulation_parameters = {\n",
" 'T': range(10),\n",
" 'N': 50, # We'll run the same simulation 50 times; the random events in each simulation are independent\n",
" 'M': {}\n",
"}\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# The configurations above are then packaged into a `Configuration` object\n",
"config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n",
" partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n",
" sim_config=simulation_parameters #dict containing simulation parameters\n",
" )\n",
"\n",
"exec_mode = ExecutionMode()\n",
"exec_context = ExecutionContext(exec_mode.single_proc)\n",
"executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n",
"raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n",
"\n",
"df = pd.DataFrame(raw_result)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>box_A</th>\n",
" <th>box_B</th>\n",
" </tr>\n",
" <tr>\n",
" <th>run</th>\n",
" <th>timestep</th>\n",
" <th>substep</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">1</th>\n",
" <th>0</th>\n",
" <th>0</th>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <th>1</th>\n",
" <td>9</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <th>1</th>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <th>1</th>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <th>1</th>\n",
" <td>6</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">50</th>\n",
" <th>6</th>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>550 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" box_A box_B\n",
"run timestep substep \n",
"1 0 0 10 0\n",
" 1 1 9 1\n",
" 2 1 8 2\n",
" 3 1 8 2\n",
" 4 1 6 4\n",
"... ... ...\n",
"50 6 1 5 5\n",
" 7 1 5 5\n",
" 8 1 5 5\n",
" 9 1 5 5\n",
" 10 1 5 5\n",
"\n",
"[550 rows x 2 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from IPython.display import display\n",
"tmp_rows = pd.options.display.max_rows\n",
"pd.options.display.max_rows = 10\n",
"display(df.set_index(['run', 'timestep', 'substep']))\n",
"pd.options.display.max_rows = tmp_rows"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plotting two of those runs allows us to see the different behaviors over time."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df[df['run']==1].plot('timestep', ['box_A', 'box_B'], grid=True,\n",
" xticks=list(df['timestep'].drop_duplicates()), \n",
" yticks=list(range(11)),\n",
" colormap = 'RdYlGn');\n",
"df[df['run']==9].plot('timestep', ['box_A', 'box_B'], grid=True,\n",
" xticks=list(df['timestep'].drop_duplicates()), \n",
" yticks=list(range(11)),\n",
" colormap = 'RdYlGn');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we plot all those runs onto a single chart, we can see every possible trajectory for the number of marbles in each box."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = None\n",
"for i in range(simulation_parameters['N']):\n",
" ax = df[df['run']==i+1].plot('timestep', ['box_A', 'box_B'],\n",
" grid=True,\n",
" xticks=list(df['timestep'].drop_duplicates()), \n",
" yticks=list(range(1+max(df['box_A'].max(),df['box_B'].max()))),\n",
" legend = (ax == None),\n",
" colormap = 'RdYlGn',\n",
" ax = ax\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For some analyses, it might make sense to look at the data in aggregate. Take the median for example:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x108868b00>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dfmc_median = df.groupby(['timestep', 'substep']).median().reset_index()\n",
"dfmc_median.plot('timestep', ['box_A', 'box_B'], \n",
" grid=True,\n",
" xticks=list(dfmc_median['timestep'].drop_duplicates()), \n",
" yticks=list(range(int(1+max(dfmc_median['box_A'].max(),dfmc_median['box_B'].max())))),\n",
" colormap = 'RdYlGn'\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Or look at edge cases"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"max_final_A = df[df['timestep']==df['timestep'].max()]['box_A'].max()\n",
"# max_final_A\n",
"slow_runs = df[(df['timestep']==df['timestep'].max()) & \n",
" (df['box_A']==max_final_A)]['run']\n",
"slow_runs = list(slow_runs)\n",
"slow_runs\n",
"\n",
"ax = None\n",
"for i in slow_runs:\n",
" ax = df[df['run']==i].plot('timestep', ['box_A', 'box_B'],\n",
" grid=True,\n",
" xticks=list(df['timestep'].drop_duplicates()), \n",
" yticks=list(range(1+max(df['box_A'].max(),df['box_B'].max()))),\n",
" legend = (ax == None),\n",
" colormap = 'RdYlGn',\n",
" ax = ax\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We invite the reader to fork this code and come up with answers for their other questions that might be interesting to look at. For example:\n",
"* How often does box B momentarily contain more marbles than box A?\n",
"* What's the frequency distribution of the time to reach equilibrium?\n",
"* What's the probability distribution of the waiting times of each one of the robots?"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}