Reworked some plots

This commit is contained in:
Philipp committed 2023-02-18 00:03:13 +01:00
1 parent dfe3b3aa59
commit e199c9ab55
1 file changed
+515 -84
+515 -84
View File
@@ -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": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABeGElEQVR4nO3dfZCddX03/vdJFlYg2RUQJDEBQWioQBhFLcqIoGKNJMWON22deMtDe/9ajU9FbE1ntFor0REYehdNWxsJHcCnTrFKb1BRCXaQR+XBVmNSi1lIKE4LuyTYleye3x+nedokZM/Z3ev6bs7rNXPGTfac/bzNtefN5pPrXKfRbDabAQAAAIAKzag7AAAAAADdx1IKAAAAgMpZSgEAAABQOUspAAAAACpnKQUAAABA5SylAAAAAKicpRQAAAAAlbOUAgAAAKByPVUPHB0dzcaNGzN79uw0Go2qxwMFajabeeqppzJ37tzMmFHfrlw/AXtSQkfpJ2BP9BNQqvH2U+VLqY0bN2b+/PlVjwWmgYGBgcybN6+2+foJeDZ1dpR+Ap6NfgJKta9+qnwpNXv27O0fHzyn6unJ048laSZpJAcfVf18GWQoLUPd85Pk6U2t/925H+pQdz8lhRwP35MyyLBrhgI6Sj/JUMp8GQrLoJ+SFHIsZJChkPnFZBhnP1W+lNp2SufBc5K3bax6enL9vGTLo8khc5Olj1Q/XwYZSstQ9/wkuW5uq7TqPuW77n5KyjgedWeoe74MMoxVQkfpJxlKmS9DWRn0U0sJx0IGGUqZX0qG8faTC50DAAAAUDlLKQAAAAAqZykFAAAAQOUspQAAAAConKUUAAAAAJWzlAIAAACgcpZSAAAAAFTOUgoAAACAyrW9lLr99tuzZMmSzJ07N41GI1/5ylemIBZA+/QTUCr9BJRKPwF1ansptWXLlpx66qn59Kc/PRV5ADqmn4BS6SegVPoJqFNPuw9YtGhRFi1aNBVZACZEPwGl0k9AqfQTUCfXlAIAAACgcm2fKdWu4eHhDA8Pb//10NDQVI8EGBf9BJRKPwGl0k/AZJryM6VWrFiR/v7+7bf58+dP9UiAcdFPQKn0E1Aq/QRMpilfSi1fvjyDg4PbbwMDA1M9EmBc9BNQKv0ElEo/AZNpyl++19vbm97e3qkeA9A2/QSUSj8BpdJPwGRqeym1efPmrF+/fvuv//3f/z33339/DjvssBx99NGTGg6gHfoJKJV+Akqln4A6tb2Uuvfee3P22Wdv//Ull1ySJLnggguyevXqSQsG0C79BJRKPwGl0k9AndpeSp111llpNptTkQVgQvQTUCr9BJRKPwF1mvILnQMAAADAWJZSAAAAAFTOUgoAAACAyllKAQAAAFA5SykAAAAAKmcpBQAAAEDlLKUAAAAAqJylFAAAAACVs5QCAAAAoHKNZrPZrHLg0NBQ+vv7k0ZyyNwqJ7c8vSlpjiaNGcnBc6qfL4MMpWWoe36SbNmYpJkMDg6mr6+vnhCpv5+SMo5H3Rnqni+DDGOV0FH6SYZS5stQVgb91FLCsZBBhlLml5JhvP1U31IKYIxillIAe1DEX/oA9kA/AaXaVz/1VJhlV86UkkGGIjLUPT/ZsUUvhn/p6/rvSRlk2FlRHaWfuj5D3fNlKCuDfmop4VjIIEMp80vJMN5+qm0pdfBRydJHqp97/bxky6OtA1PHfBlkKC1D3fOT5Lq5reIsRV39lJRxPOrOUPd8GWQYq6SO0k8y1D1fhrIy6KeWEo6FDDKUMr+UDOPtJxc6BwAAAKByllIAAAAAVM5SCgAAAIDKWUoBAAAAUDlLKQAAAAAqZykFAAAAQOUspQAAAAConKUUAAAAAJVraym1YsWKvPzlL8/s2bNz5JFH5s1vfnPWrl07VdkAxk0/ASXTUUCp9BNQp7aWUmvWrMmyZcty55135pvf/GaeeeaZvOENb8iWLVumKh/AuOgnoGQ6CiiVfgLq1NPOnW+55ZZdfr169eoceeSRue+++3LmmWdOajCAdugnoGQ6CiiVfgLqNKFrSg0ODiZJDjvssEkJAzBZ9BNQMh0FlEo/AVVq60ypnY2OjuZ973tfzjjjjJx88sl7vd/w8HCGh4e3/3poaKjTkQDjop+Ako2no/QTUAf9BFSt4zOlli1blh/+8If5whe+8Kz3W7FiRfr7+7ff5s+f3+lIgHHRT0DJxtNR+gmog34CqtbRUupd73pXbrrppnznO9/JvHnznvW+y5cvz+Dg4PbbwMBAR0EBxkM/ASUbb0fpJ6Bq+gmoQ1sv32s2m3n3u9+dG2+8MbfddluOPfbYfT6mt7c3vb29HQcEGA/9BJSs3Y7ST0BV9BNQp7aWUsuWLcsNN9yQf/zHf8zs2bPz2GOPJUn6+/tz0EEHTUlAgPHQT0DJdBRQKv0E1Kmtl++tXLkyg4ODOeusszJnzpztty9+8YtTlQ9gXPQTUDIdBZRKPwF1avvlewAl0k9AyXQUUCr9BNSp43ffAwAAAIBOWUoBAAAAUDlLKQAAAAAqZykFAAAAQOUspQAAAAConKUUAAAAAJWzlAIAAACgcpZSAAAAAFSu0Ww2m1UOHBoaSn9/f9JIDplb5eSWpzclzdGkMSM5eE7182WQobQMdc9Pki0bkzSTwcHB9PX11RMi9fdTUsbxqDtD3fNlkGGsEjpKP8lQynwZysqgn1pKOBYyyFDK/FIyjLef6ltKAYxRzFIKYA+K+EsfwB7oJ6BU++qnngqz7MqZUjLIUESGuucnO7boxfAvfV3/PSmDDDsrqqP0U9dnqHu+DGVl0E8tJRwLGWQoZX4pGcbbT7UtpQ4+Kln6SPVzr5+XbHm0dWDqmC+DDKVlqHt+klw3t1Wcpairn5IyjkfdGeqeL4MMY5XUUfpJhrrny1BWBv3UUsKxkEGGUuaXkmG8/eRC5wAAAABUzlIKAAAAgMpZSgEAAABQOUspAAAAACpnKQUAAABA5SylAAAAAKicpRQAAAAAlbOUAgAAAKByllIAAAAAVK6tpdTKlSuzcOHC9PX1pa+vL6985Stz8803T1U2gHHTT0DJdBRQKv0E1KmtpdS8efPyiU98Ivfdd1/uvffevPa1r815552Xf/mXf5mqfADjop+AkukooFT6CahTTzt3XrJkyS6//vjHP56VK1fmzjvvzEknnTSpwQDaoZ+AkukooFT6CahTW0upnY2MjOTLX/5ytmzZkle+8pV7vd/w8HCGh4e3/3poaKjTkQDjop+Ako2no/QTUAf9BFSt7QudP/TQQ5k1a1Z6e3vzB3/wB7nxxhvz4he/eK/3X7FiRfr7+7ff5s+fP6HAAHujn4CStdNR+gmokn4C6tL2UmrBggW5//77c9ddd+Ud73hHLrjggvzrv/7rXu+/fPnyDA4Obr8NDAxMKDDA3ugnoGTtdJR+Aqqkn4C6tP3yvQMPPDDHH398kuS0007LPffck7/4i7/IX//1X+/x/r29vent7Z1YSoBx0E9AydrpKP0EVEk/AXVp+0ypsUZHR3d5TTFAKfQTUDIdBZRKPwFVaetMqeXLl2fRokU5+uij89RTT+WGG27Ibbfdlq9//etTlQ9gXPQTUDIdBZRKPwF1amsp9fjjj+ftb397Nm3alP7+/ixcuDBf//rXc84550xVPoBx0U9AyXQUUCr9BNSpraXUqlWrpioHwIToJ6BkOgoolX4C6jTha0oBAAAAQLsspQAAAAConKUUAAAAAJWzlAIAAACgcpZSAAAAAFTOUgoAAACAyllKAQAAAFA5SykAAAAAKtdoNpvNKgcODQ2lv78/aSSHzK1ycsvTm5LmaNKYkRw8p/r5MshQWoa65yfJlo1Jmsng4GD6+vrqCZH6+ykp43jUnaHu+TLIMFYJHaWfZChlvgxlZdBPLSUcCxlkKGV+KRnG20/1LaUAxihmKQWwB0X8pQ9gD/QTUKp99VNPhVl25UwpGWQoIkPd85MdW/Ri+Je+rv+elEGGnRXVUfqp6zPUPV+GsjLop5YSjoUMMpQyv5QM4+2n2pZSBx+VLH2k+rnXz0u2PNo6MHXMl0GG0jLUPT9JrpvbKs5S1NVPSRnHo+4Mdc+XQYaxSuoo/SRD3fNlKCuDfmop4VjIIEMp80vJMN5+cqFzAAAAACpnKQUAAABA5SylAAAAAKicpRQAAAAAlavv3feYtg7N/LwqF+bInJDnZHb+O0/l8azLHVmdJzIw5fM3b0jWrk4G1yXPPJUcMDvpPyFZcGEy6+gpHw8UrO5+SnQUsGf6CSiVfqJOllKM2wk5M+fk/Tkli9PMaJJkRmZk9H8+XpyP5MF8LbfmiqzLdyd9/sY1yYNXJBtuar21ZZI0R5LGzNbH930kOWZxsvDSZM6Zkz4eKFjd/ZToKGDP9BNQKv1ECbx8j3E5J+/PpVmTk7MoMzIjM9OTmelJY6ePZ2RGTsmbcmluz+tzyaTNbjaTBy5PbjorGbg5SbNVVM2R//n8to+byYabk6+9plVszeakRQAKVmc/JToK2Dv9BJRKP1EKSyn26fW5JP8rlydJZuaAZ73vts+fnysmrbgeujK56wOtj5tbn/2+2z5/56WtxwH7t7r7KdFRwJ7pJ6BU+omSWErxrE7ImTk/V3T02PNzRU7Iqyc0f+OaVvl04s5Lk023T2g8ULC6+ynRUcCe6SegVPqJ0kxoKfWJT3wijUYj73vf+yYpDqU5J+/PSJ7p6LEjeWbC2/QHr0gaHV75rNHTejzdST/t/+rup0RH0Rn9tP/TT0xnOmr/pp8oTcdLqXvuuSd//dd/nYULF05mHgpyaObnlCze5ymdezMzB2RhfiOHZl5Hj9+8oXXBu32dzrk3za3Jz76WbK7mDSMoiH7a/9XdT4mOojP6af+nn5jOdNT+TT9Roo6WUps3b87SpUvz2c9+NoceeuhkZ6IQr8qF29+FoVPNjOZVuaijx65dveMdGDrVmJGsvWZiX4PpRT91h7rLine 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",