Reworked some plots
This commit is contained in:
1 file changed
+515
-84
+515
-84
@@ -85,7 +85,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 27,
|
"execution_count": 1,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 28,
|
"execution_count": 97,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -138,7 +138,9 @@
|
|||||||
"from abc import ABC\n",
|
"from abc import ABC\n",
|
||||||
"from tqdm.notebook import tqdm\n",
|
"from tqdm.notebook import tqdm\n",
|
||||||
"from ipywidgets import interact\n",
|
"from ipywidgets import interact\n",
|
||||||
"import matplotlib.pyplot as plt"
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"import seaborn as sns\n",
|
||||||
|
"import pandas as pd"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -152,7 +154,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 29,
|
"execution_count": 98,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -176,9 +178,27 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 30,
|
"execution_count": 4,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"array([[-1, -1],\n",
|
||||||
|
" [-1, 0],\n",
|
||||||
|
" [-1, 1],\n",
|
||||||
|
" [ 0, -1],\n",
|
||||||
|
" [ 0, 1],\n",
|
||||||
|
" [ 1, -1],\n",
|
||||||
|
" [ 1, 0],\n",
|
||||||
|
" [ 1, 1]])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 4,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"DIRECTIONS: Final[np.ndarray] = np.array(\n",
|
"DIRECTIONS: Final[np.ndarray] = np.array(\n",
|
||||||
" [[i, j] for i in range(-1, 2) for j in range(-1, 2) if j != 0 or i != 0],\n",
|
" [[i, j] for i in range(-1, 2) for j in range(-1, 2) if j != 0 or i != 0],\n",
|
||||||
@@ -197,9 +217,21 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 31,
|
"execution_count": 5,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"array([[-1, 1],\n",
|
||||||
|
" [ 1, -1]])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 5,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"START_SQUARE: Final[np.ndarray] = np.array(\n",
|
"START_SQUARE: Final[np.ndarray] = np.array(\n",
|
||||||
" [[ENEMY, PLAYER], [PLAYER, ENEMY]], dtype=int\n",
|
" [[ENEMY, PLAYER], [PLAYER, ENEMY]], dtype=int\n",
|
||||||
@@ -220,9 +252,27 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 32,
|
"execution_count": 6,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"array([[ 0, 0, 0, 0, 0, 0, 0, 0],\n",
|
||||||
|
" [ 0, 0, 0, 0, 0, 0, 0, 0],\n",
|
||||||
|
" [ 0, 0, 0, 0, 0, 0, 0, 0],\n",
|
||||||
|
" [ 0, 0, 0, -1, 1, 0, 0, 0],\n",
|
||||||
|
" [ 0, 0, 0, 1, -1, 0, 0, 0],\n",
|
||||||
|
" [ 0, 0, 0, 0, 0, 0, 0, 0],\n",
|
||||||
|
" [ 0, 0, 0, 0, 0, 0, 0, 0],\n",
|
||||||
|
" [ 0, 0, 0, 0, 0, 0, 0, 0]])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 6,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def get_new_games(number_of_games: int) -> np.ndarray:\n",
|
"def get_new_games(number_of_games: int) -> np.ndarray:\n",
|
||||||
" \"\"\"Generates a stack of initialised game boards.\n",
|
" \"\"\"Generates a stack of initialised game boards.\n",
|
||||||
@@ -243,7 +293,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 33,
|
"execution_count": 7,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -288,9 +338,20 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 34,
|
"execution_count": 8,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "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 truncated
|
||||||
|
"text/plain": [
|
||||||
|
"<Figure size 300x300 with 1 Axes>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def plot_othello_board(board: np.ndarray, ax=None) -> None:\n",
|
"def plot_othello_board(board: np.ndarray, ax=None) -> None:\n",
|
||||||
" \"\"\"Plots a single otello board.\n",
|
" \"\"\"Plots a single otello board.\n",
|
||||||
@@ -337,7 +398,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 35,
|
"execution_count": 9,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -367,7 +428,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 36,
|
"execution_count": 10,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -404,11 +465,24 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 37,
|
"execution_count": 11,
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"tags": []
|
"tags": []
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"array([[[1, 1, 1],\n",
|
||||||
|
" [1, 0, 1],\n",
|
||||||
|
" [1, 1, 1]]])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"SURROUNDING: Final = np.array(\n",
|
"SURROUNDING: Final = np.array(\n",
|
||||||
" [[[1, 1, 1], [1, 0, 1], [1, 1, 1]]]\n",
|
" [[[1, 1, 1], [1, 0, 1], [1, 1, 1]]]\n",
|
||||||
@@ -418,9 +492,35 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 38,
|
"execution_count": 12,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"8.86 ms ± 584 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
|
||||||
|
"860 ms ± 12.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"array([[[False, False, False, False, False, False, False, False],\n",
|
||||||
|
" [False, False, False, False, False, False, False, False],\n",
|
||||||
|
" [False, False, False, True, False, False, False, False],\n",
|
||||||
|
" [False, False, True, False, False, False, False, False],\n",
|
||||||
|
" [False, False, False, False, False, True, False, False],\n",
|
||||||
|
" [False, False, False, False, True, False, False, False],\n",
|
||||||
|
" [False, False, False, False, False, False, False, False],\n",
|
||||||
|
" [False, False, False, False, False, False, False, False]]])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 12,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def _recursive_steps(\n",
|
"def _recursive_steps(\n",
|
||||||
" board: np.ndarray,\n",
|
" board: np.ndarray,\n",
|
||||||
@@ -513,7 +613,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 13,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -548,7 +648,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 14,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -617,9 +717,19 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 15,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"182 µs ± 6.7 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n",
|
||||||
|
"34.4 µs ± 1.82 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n",
|
||||||
|
"32.2 µs ± 743 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def final_boards_evaluation(boards: np.ndarray) -> np.ndarray:\n",
|
"def final_boards_evaluation(boards: np.ndarray) -> np.ndarray:\n",
|
||||||
" \"\"\"Evaluates the board at the end of the game.\n",
|
" \"\"\"Evaluates the board at the end of the game.\n",
|
||||||
@@ -687,7 +797,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 16,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -699,9 +809,27 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 17,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"86.7 ms ± 1.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "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 truncated
|
||||||
|
"text/plain": [
|
||||||
|
"<Figure size 300x300 with 1 Axes>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def do_moves(boards: np.ndarray, moves: np.ndarray) -> np.ndarray:\n",
|
"def do_moves(boards: np.ndarray, moves: np.ndarray) -> np.ndarray:\n",
|
||||||
" \"\"\"Executes a single move on a stack o Othello boards.\n",
|
" \"\"\"Executes a single move on a stack o Othello boards.\n",
|
||||||
@@ -801,7 +929,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 18,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -895,7 +1023,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 19,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@@ -926,7 +1054,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 20,
|
||||||
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"class GreedyPolicy(GamePolicy):\n",
|
"class GreedyPolicy(GamePolicy):\n",
|
||||||
@@ -955,10 +1084,7 @@
|
|||||||
" for direction in DIRECTIONS\n",
|
" for direction in DIRECTIONS\n",
|
||||||
" )\n",
|
" )\n",
|
||||||
" return policies"
|
" return policies"
|
||||||
],
|
]
|
||||||
"metadata": {
|
|
||||||
"collapsed": false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
@@ -979,9 +1105,28 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 21,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"1.02 s ± 31.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
|
||||||
|
"1.01 s ± 35 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "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 truncated
|
||||||
|
"text/plain": [
|
||||||
|
"<Figure size 1200x600 with 8 Axes>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def single_turn(\n",
|
"def single_turn(\n",
|
||||||
" current_boards: np, policy: GamePolicy\n",
|
" current_boards: np, policy: GamePolicy\n",
|
||||||
@@ -1029,11 +1174,22 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 22,
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"scrolled": false
|
"scrolled": false
|
||||||
},
|
},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "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 truncated
|
||||||
|
"text/plain": [
|
||||||
|
"<Figure size 1200x4800 with 61 Axes>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def simulate_game(\n",
|
"def simulate_game(\n",
|
||||||
" nr_of_games: int,\n",
|
" nr_of_games: int,\n",
|
||||||
@@ -1076,9 +1232,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 23,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"10.5 s ± 737 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"%timeit simulate_game(100, (RandomPolicy(1), RandomPolicy(1)))"
|
"%timeit simulate_game(100, (RandomPolicy(1), RandomPolicy(1)))"
|
||||||
]
|
]
|
||||||
@@ -1092,17 +1256,35 @@
|
|||||||
"\n",
|
"\n",
|
||||||
"1. What is the expected distribution of scores\n",
|
"1. What is the expected distribution of scores\n",
|
||||||
"2. What is the expected distribution of possible actions\n",
|
"2. What is the expected distribution of possible actions\n",
|
||||||
|
"\n",
|
||||||
" a. over time\n",
|
" a. over time\n",
|
||||||
|
" \n",
|
||||||
" b. ober space\n",
|
" b. ober space\n",
|
||||||
"\n",
|
"\n",
|
||||||
"The easiest and most robust way to analyse this is when analyzing randomly played games."
|
"The easiest and robustest way to analyse this is when analyzing randomly played games."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"For this pupose we played a sample of 10k games and saved them for later analysis."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 99,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"(70, 10000, 8, 8)\n",
|
||||||
|
"(70, 10000, 2)\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"if not os.path.exists(\"rnd_history.npy\") and not os.path.exists(\"rnd_action.npy\"):\n",
|
"if not os.path.exists(\"rnd_history.npy\") and not os.path.exists(\"rnd_action.npy\"):\n",
|
||||||
" rnds = RandomPolicy(1), RandomPolicy(1)\n",
|
" rnds = RandomPolicy(1), RandomPolicy(1)\n",
|
||||||
@@ -1119,26 +1301,27 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "markdown",
|
"cell_type": "markdown",
|
||||||
"source": [],
|
|
||||||
"metadata": {
|
|
||||||
"collapsed": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cell_type": "code",
|
|
||||||
"execution_count": null,
|
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
|
||||||
"source": [
|
"source": [
|
||||||
"print(_board_history.shape)\n",
|
"For those 10k games the possible actions where evaluated and saved for each and every turn in the game."
|
||||||
"print(_action_history.shape)"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 107,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"(70, 10000, 8, 8)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 107,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"if not os.path.exists(\"turn_possible.npy\"):\n",
|
"if not os.path.exists(\"turn_possible.npy\"):\n",
|
||||||
" __board_history = _board_history.copy()\n",
|
" __board_history = _board_history.copy()\n",
|
||||||
@@ -1146,45 +1329,246 @@
|
|||||||
"\n",
|
"\n",
|
||||||
" _poss_turns = get_possible_turns(\n",
|
" _poss_turns = get_possible_turns(\n",
|
||||||
" __board_history.reshape((-1, 8, 8)), tqdm_on=True\n",
|
" __board_history.reshape((-1, 8, 8)), tqdm_on=True\n",
|
||||||
" ).reshape((70, -1, 8, 8))\n",
|
" ).reshape((SIMULATE_TURNS, -1, 8, 8))\n",
|
||||||
" np.save(_poss_turns, \"turn_possible.npy\")\n",
|
" np.save(\"turn_possible.npy\", _poss_turns)\n",
|
||||||
" del __board_history\n",
|
" del __board_history\n",
|
||||||
"_poss_turns = np.load(\"turn_possible.npy\")\n",
|
"_poss_turns = np.load(\"turn_possible.npy\")\n",
|
||||||
"poss_turn = np.sum(_poss_turns, axis=(2, 3))\n",
|
"_poss_turns.shape"
|
||||||
"poss_turn.shape"
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Those possible turms then where counted for all games in the history stack."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 108,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"(70, 10000)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 108,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"mean_possibilities = np.mean(poss_turn, axis=1)\n",
|
"count_poss_turns = np.sum(_poss_turns, axis=(2, 3))\n",
|
||||||
"plt.title(\n",
|
"count_poss_turns.shape"
|
||||||
" f\"Mean turn possible per turn {np.prod(np.extract(mean_possibilities, mean_possibilities))}\"\n",
|
]
|
||||||
")\n",
|
},
|
||||||
"plt.plot(mean_possibilities)\n",
|
{
|
||||||
"plt.show()\n",
|
"cell_type": "markdown",
|
||||||
"del mean_possibilities"
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"And the po"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 119,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"application/vnd.jupyter.widget-view+json": {
|
||||||
|
"model_id": "d4dc3ee2dff24deaaacebbf4e7e9dddf",
|
||||||
|
"version_major": 2,
|
||||||
|
"version_minor": 0
|
||||||
|
},
|
||||||
|
"text/plain": [
|
||||||
|
"interactive(children=(IntSlider(value=34, description='turn', max=69), Output()), _dom_classes=('widget-intera…"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
|
"mean_possibilitie_count = np.mean(count_poss_turns, axis=1)\n",
|
||||||
|
"std_possibilitie_count = np.std(count_poss_turns, axis=1)\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
"@interact(turn=(0, 69))\n",
|
"@interact(turn=(0, 69))\n",
|
||||||
"def poss_turn_count(turn):\n",
|
"def poss_turn_count(turn):\n",
|
||||||
" plt.hist(poss_turn[turn])"
|
" fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 7))\n",
|
||||||
|
" fig.suptitle(\n",
|
||||||
|
" f\"Action space size analysis\\nThe total size is estimated to be around {np.prod(np.extract(mean_possibilitie_count, mean_possibilitie_count)):.4g}\"\n",
|
||||||
|
" )\n",
|
||||||
|
" ax1.hist(count_poss_turns[turn], density=True)\n",
|
||||||
|
" ax1.set_title(f\"Histogram of the action space size for turn {turn}\")\n",
|
||||||
|
" ax1.set_xlabel(\"Action space size\")\n",
|
||||||
|
" ax1.set_ylabel(\"Action space size probability\")\n",
|
||||||
|
" ax2.set_title(f\"Mean size of the action space per turn\")\n",
|
||||||
|
" ax2.set_xlabel(\"Turn\")\n",
|
||||||
|
" ax2.set_ylabel(\"Average possible moves\")\n",
|
||||||
|
"\n",
|
||||||
|
" ax2.errorbar(\n",
|
||||||
|
" range(70),\n",
|
||||||
|
" mean_possibilitie_count,\n",
|
||||||
|
" yerr=std_possibilitie_count,\n",
|
||||||
|
" label='=\"Mean action space size with error bars',\n",
|
||||||
|
" )\n",
|
||||||
|
" ax2.scatter(turn, mean_possibilitie_count[turn], marker=\"x\")\n",
|
||||||
|
" ax2.legend()\n",
|
||||||
|
" plt.show()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"It is interesting to see that the action space for the first player (white) is much smaller than for the second palyer."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": 124,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"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>Total mean actionspace</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>white</th>\n",
|
||||||
|
" <td>5.687159e+18</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>black</th>\n",
|
||||||
|
" <td>3.753117e+20</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" Total mean actionspace\n",
|
||||||
|
"white 5.687159e+18\n",
|
||||||
|
"black 3.753117e+20"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 124,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"white = mean_possibilitie_count[::2]\n",
|
||||||
|
"black = mean_possibilitie_count[1::2]\n",
|
||||||
|
"df = pd.DataFrame(\n",
|
||||||
|
" [\n",
|
||||||
|
" {\n",
|
||||||
|
" \"white\": np.prod(np.extract(white, white)),\n",
|
||||||
|
" \"black\": np.prod(np.extract(black, black)),\n",
|
||||||
|
" }\n",
|
||||||
|
" ],\n",
|
||||||
|
" index=[\"Total mean actionspace\"],\n",
|
||||||
|
").T\n",
|
||||||
|
"del white, black\n",
|
||||||
|
"df"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 125,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"application/vnd.jupyter.widget-view+json": {
|
||||||
|
"model_id": "7002a64f4eb740c7bcbb4810783e70fa",
|
||||||
|
"version_major": 2,
|
||||||
|
"version_minor": 0
|
||||||
|
},
|
||||||
|
"text/plain": [
|
||||||
|
"interactive(children=(IntSlider(value=34, description='turn', max=69), Output()), _dom_classes=('widget-intera…"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"@interact(turn=(0, 69))\n",
|
||||||
|
"def turn_distribution_heatmap(turn):\n",
|
||||||
|
" turn_possibility_on_field = np.mean(_poss_turns[turn], axis=0)\n",
|
||||||
|
"\n",
|
||||||
|
" uniform_data = np.random.rand(10, 12)\n",
|
||||||
|
" sns.heatmap(\n",
|
||||||
|
" turn_possibility_on_field,\n",
|
||||||
|
" linewidth=0.5,\n",
|
||||||
|
" square=True,\n",
|
||||||
|
" annot=True,\n",
|
||||||
|
" xticklabels=\"ABCDEFGH\",\n",
|
||||||
|
" yticklabels=list(range(1, 9)),\n",
|
||||||
|
" )\n",
|
||||||
|
" plt.title(f\"Headmap of where stones can be placed on turn {turn}\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 126,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"(70, 10000)\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"array([[ 0.046875, 0.046875, 0.046875, ..., 0.046875, 0.046875,\n",
|
||||||
|
" 0.046875],\n",
|
||||||
|
" [-0.046875, -0.046875, -0.046875, ..., -0.046875, -0.046875,\n",
|
||||||
|
" -0.046875],\n",
|
||||||
|
" [ 0.046875, 0.046875, 0.046875, ..., 0.078125, 0.046875,\n",
|
||||||
|
" 0.046875],\n",
|
||||||
|
" ...,\n",
|
||||||
|
" [ 0. , 0. , 0. , ..., 0. , 0. ,\n",
|
||||||
|
" 0. ],\n",
|
||||||
|
" [ 0. , 0. , 0. , ..., 0. , 0. ,\n",
|
||||||
|
" 0. ],\n",
|
||||||
|
" [ 0. , 0. , 0. , ..., 0. , 0. ,\n",
|
||||||
|
" 0. ]])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 126,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"def calculate_direct_score(board_history: np.ndarray) -> np.ndarray:\n",
|
"def calculate_direct_score(board_history: np.ndarray) -> np.ndarray:\n",
|
||||||
" boards_evaluated = np.reshape(\n",
|
" boards_evaluated = np.reshape(\n",
|
||||||
@@ -1201,21 +1585,66 @@
|
|||||||
"calculate_direct_score(_board_history)"
|
"calculate_direct_score(_board_history)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 130,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"application/vnd.jupyter.widget-view+json": {
|
||||||
|
"model_id": "679fea405f704503ae407321cab3779a",
|
||||||
|
"version_major": 2,
|
||||||
|
"version_minor": 0
|
||||||
|
},
|
||||||
|
"text/plain": [
|
||||||
|
"interactive(children=(IntSlider(value=34, description='turn', max=69), Output()), _dom_classes=('widget-intera…"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"score_history = calculate_direct_score(_board_history) * 64\n",
|
||||||
|
"score_history[1::2] = score_history[1::2] * -1\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"@interact(turn=(0, 69))\n",
|
||||||
|
"def hist_direct_score(turn):\n",
|
||||||
|
" fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 7))\n",
|
||||||
|
" fig.suptitle(\n",
|
||||||
|
" f\"Action space size analysis\\nThe total size is estimated to be around {np.prod(np.extract(mean_possibilitie_count, mean_possibilitie_count)):.4g}\"\n",
|
||||||
|
" )\n",
|
||||||
|
"\n",
|
||||||
|
" ax1.set_title(\n",
|
||||||
|
" f\"Histogram of turn {turn} by {'white' if turn % 2 == 0 else 'black'}\"\n",
|
||||||
|
" )\n",
|
||||||
|
"\n",
|
||||||
|
" ax1.hist(score_history[turn], density=True)\n",
|
||||||
|
" ax1.set_xlabel(\"Action space size\")\n",
|
||||||
|
" ax1.set_ylabel(\"Action space size probability\")\n",
|
||||||
|
" ax2.set_title(f\"Mean size of the action space per turn\")\n",
|
||||||
|
" ax2.set_xlabel(\"Turn\")\n",
|
||||||
|
" ax2.set_ylabel(\"Average possible moves\")\n",
|
||||||
|
"\n",
|
||||||
|
" ax2.errorbar(\n",
|
||||||
|
" range(70),\n",
|
||||||
|
" mean_possibilitie_count,\n",
|
||||||
|
" yerr=std_possibilitie_count,\n",
|
||||||
|
" label='=\"Mean action space size with error bars',\n",
|
||||||
|
" )\n",
|
||||||
|
" ax2.scatter(turn, mean_possibilitie_count[turn], marker=\"x\")\n",
|
||||||
|
" ax2.legend()\n",
|
||||||
|
" plt.show()"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": null,
|
"execution_count": null,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": []
|
||||||
"@interact(turn=(0, 69))\n",
|
|
||||||
"def hist_direct_score(turn):\n",
|
|
||||||
" score_history = calculate_direct_score(_board_history) * 64\n",
|
|
||||||
" score_history[1::2] = score_history[1::2] * -1\n",
|
|
||||||
" # print(score_history[turn])\n",
|
|
||||||
" plt.title(f\"Histogram of turn {turn} by {'white' if turn % 2 == 0 else 'black'}\")\n",
|
|
||||||
" plt.hist(score_history[turn], density=True)\n",
|
|
||||||
" plt.show()"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
@@ -1309,7 +1738,9 @@
|
|||||||
" combined_score += calculate_direct_score(board_history) * (\n",
|
" combined_score += calculate_direct_score(board_history) * (\n",
|
||||||
" 1 - who_won_fraction + final_score_fraction\n",
|
" 1 - who_won_fraction + final_score_fraction\n",
|
||||||
" )\n",
|
" )\n",
|
||||||
" combined_score[-1] += calulate_final_score(board_history) * final_score_fraction\n",
|
" combined_score[-1] += (\n",
|
||||||
|
" calculate_final_evaluation_for_history(board_history) * final_score_fraction\n",
|
||||||
|
" )\n",
|
||||||
" combined_score[-1] += calculate_who_won(board_history) * who_won_fraction\n",
|
" combined_score[-1] += calculate_who_won(board_history) * who_won_fraction\n",
|
||||||
" for turn in range(SIMULATE_TURNS - 1, -1, -1):\n",
|
" for turn in range(SIMULATE_TURNS - 1, -1, -1):\n",
|
||||||
" values = gama_table[turn] * combined_score[turn]\n",
|
" values = gama_table[turn] * combined_score[turn]\n",
|
||||||
|
|||||||
Reference in new issue
Block a user