258 lines
22 KiB
Plaintext
258 lines
22 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# cadCAD Template: Robot and the Marbles - Part 3\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"### Asynchronous Subsystems\n",
|
|
"We have defined that the robots operate simultaneously on the boxes of marbles. But it is often the case that agents within a system operate asynchronously, each having their own operation frequencies or conditions.\n",
|
|
"\n",
|
|
"Suppose that instead of acting simultaneously, the robots in our examples operated in the following manner:\n",
|
|
"\n",
|
|
"* Robot 1: acts once every 2 timesteps\n",
|
|
"* Robot 2: acts once every 3 timesteps\n",
|
|
"\n",
|
|
"One way to simulate the system with this change is to introduce a check of the current timestep before the robots act, with the definition of separate policy functions for each robot arm."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# import libraries\n",
|
|
"import pandas as pd\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib \n",
|
|
"from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n",
|
|
"import config\n",
|
|
"from cadCAD import configs\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"\n",
|
|
"%matplotlib inline\n",
|
|
"\n",
|
|
"exec_mode = ExecutionMode()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"single_proc: [<cadCAD.configuration.Configuration object at 0x113582860>]\n",
|
|
"[<cadCAD.configuration.Configuration object at 0x113582860>]\n"
|
|
]
|
|
},
|
|
{
|
|
"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=\"11\" 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>10</td>\n",
|
|
" <td>0</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <th>1</th>\n",
|
|
" <td>9</td>\n",
|
|
" <td>1</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>7</td>\n",
|
|
" <td>3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <th>1</th>\n",
|
|
" <td>7</td>\n",
|
|
" <td>3</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\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",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" box_A box_B\n",
|
|
"run timestep substep \n",
|
|
"1 0 0 10 0\n",
|
|
" 1 1 10 0\n",
|
|
" 2 1 9 1\n",
|
|
" 3 1 8 2\n",
|
|
" 4 1 7 3\n",
|
|
" 5 1 7 3\n",
|
|
" 6 1 5 5\n",
|
|
" 7 1 5 5\n",
|
|
" 8 1 5 5\n",
|
|
" 9 1 5 5\n",
|
|
" 10 1 5 5"
|
|
]
|
|
},
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# Run Cad^2\n",
|
|
"\n",
|
|
"first_config = configs # only contains config1\n",
|
|
"single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n",
|
|
"run = Executor(exec_context=single_proc_ctx, configs=first_config)\n",
|
|
"\n",
|
|
"raw_result, tensor_field = run.execute()\n",
|
|
"df = pd.DataFrame(raw_result)\n",
|
|
"df.set_index(['run', 'timestep', 'substep'])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"df.plot('timestep', ['box_A', 'box_B'], grid=True, \n",
|
|
" colormap = 'RdYlGn',\n",
|
|
" xticks=list(df['timestep'].drop_duplicates()), \n",
|
|
" yticks=list(range(1+(df['box_A']+df['box_B']).max())));"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Let's take a step-by-step look at what the simulation tells us:\n",
|
|
"\n",
|
|
"* Timestep 1: the number of marbles in the boxes does not change, as none of the robots act\n",
|
|
"* Timestep 2: Robot 1 acts, Robot 2 doesn't; resulting in one marble being moved from box A to box B\n",
|
|
"* Timestep 3: Robot 2 acts, Robot 1 doesn't; resulting in one marble being moved from box A to box B\n",
|
|
"* Timestep 4: Robot 1 acts, Robot 2 doesn't; resulting in one marble being moved from box A to box B\n",
|
|
"* Timestep 5: the number of marbles in the boxes does not change, as none of the robots act\n",
|
|
"* Timestep 6: Robots 1 and 2 act, as 6 is a multiple of 2 and 3; resulting in two marbles being moved from box A to box B and an equilibrium being reached."
|
|
]
|
|
}
|
|
],
|
|
"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.7.0"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|