Added a first network

This commit is contained in:
Philipp committed 2023-02-18 23:40:00 +01:00
1 parent fc65735bca
commit 7cc8b6c025
3 files changed
+202 -379

No files matched your search

+4
View File
@@ -2,3 +2,7 @@
A Deep Learning implementation of the game Reversi aka. Otello.
This is a Jupyter implementation only because it was requested in such a format for a class in my master’s degree. Enjoy the read or ignore it.
## Comments from Gawron
- Use Zobrist hashing for symetry
+198 -207
View File
@@ -89,11 +89,6 @@
"metadata": {},
"outputs": [],
"source": [
"\n",
"import os.path\n",
"import warnings\n",
"\n",
"\n",
"%load_ext blackcellmagic"
]
},
@@ -130,22 +125,25 @@
"metadata": {},
"outputs": [],
"source": [
"import itertools\n",
"import numpy as np\n",
"import abc\n",
"from typing import Final\n",
"from scipy.ndimage import binary_dilation\n",
"import itertools\n",
"import os.path\n",
"import warnings\n",
"from abc import ABC\n",
"from tqdm.notebook import tqdm\n",
"from ipywidgets import interact\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import pandas as pd\n",
"from enum import Enum\n",
"from typing import Final\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"import torch.optim as optim"
"import torch.optim as optim\n",
"from ipywidgets import interact\n",
"from scipy.ndimage import binary_dilation\n",
"from tqdm.notebook import tqdm"
]
},
{
@@ -348,7 +346,7 @@
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 300x300 with 1 Axes>"
]
@@ -379,7 +377,7 @@
" plot_all = True\n",
" fig, ax = plt.subplots(figsize=(fig_size, fig_size))\n",
"\n",
" ax.set_facecolor(\"#66FF00\")\n",
" ax.set_facecolor(\"#0f6b28\")\n",
" if action is not None:\n",
" ax.scatter(action[0], action[1], s=350 if plot_all else 200, c=\"red\")\n",
" for x_pos, y_pos in itertools.product(range(BOARD_SIZE), range(BOARD_SIZE)):\n",
@@ -448,7 +446,7 @@
},
{
"cell_type": "code",
"execution_count": 58,
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
@@ -527,8 +525,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
"9.82 ms ± 375 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"984 ms ± 20.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
"8.75 ms ± 34.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
"905 ms ± 28.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
},
{
@@ -596,8 +594,8 @@
" BOARD_SIZE,\n",
" ), \"The input dimensions do not fit.\"\n",
"\n",
" _poss_turns = boards == 0 # checks where fields are empty.\n",
" _poss_turns &= binary_dilation(\n",
" poss_turns = boards == 0 # checks where fields are empty.\n",
" poss_turns &= binary_dilation(\n",
" boards == -1, SURROUNDING\n",
" ) # checks where fields are next to an enemy filed an empty\n",
" iterate_over = itertools.product(\n",
@@ -606,13 +604,13 @@
" if tqdm_on:\n",
" iterate_over = tqdm(iterate_over, total=np.prod(boards.shape))\n",
" for game, idx, idy in iterate_over:\n",
" if _poss_turns[game, idx, idy]:\n",
" if poss_turns[game, idx, idy]:\n",
" position = idx, idy\n",
" _poss_turns[game, idx, idy] = any(\n",
" poss_turns[game, idx, idy] = any(\n",
" _recursive_steps(boards[game, :, :], direction, position) > 0\n",
" for direction in DIRECTIONS\n",
" )\n",
" return _poss_turns\n",
" return poss_turns\n",
"\n",
"\n",
"# some simple testing to ensure the function works after simple changes\n",
@@ -752,9 +750,9 @@
"name": "stdout",
"output_type": "stream",
"text": [
"193 µs ± 2.65 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"35.1 µs ± 335 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n",
"38 µs ± 1.58 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
"197 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
"32.6 µs ± 267 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n",
"35.8 µs ± 141 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
]
}
],
@@ -844,12 +842,12 @@
"name": "stdout",
"output_type": "stream",
"text": [
"101 ms ± 2.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
"97 ms ± 3.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
},
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 300x300 with 1 Axes>"
]
@@ -1141,13 +1139,13 @@
"name": "stdout",
"output_type": "stream",
"text": [
"1.11 s ± 35.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"1.14 s ± 73.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
"1.02 s ± 11.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
"1.04 s ± 5.07 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
},
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1200x600 with 8 Axes>"
]
@@ -1188,9 +1186,9 @@
"VERIFY_POLICY = False # type: ignore\n",
"%timeit single_turn(get_new_games(EXAMPLE_STACK_SIZE), RandomPolicy(1))\n",
"VERIFY_POLICY = True # type: ignore\n",
"plot_othello_boards(\n",
" single_turn(get_new_games(EXAMPLE_STACK_SIZE), RandomPolicy(1))[0][:8]\n",
")"
"_turn_result = single_turn(get_new_games(EXAMPLE_STACK_SIZE), RandomPolicy(1))\n",
"plot_othello_boards(_turn_result[0][:8], _turn_result[1][:8])\n",
"del _turn_result"
]
},
{
@@ -1203,14 +1201,12 @@
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"scrolled": false
},
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1200x4800 with 61 Axes>"
]
@@ -1262,7 +1258,7 @@
},
{
"cell_type": "code",
"execution_count": 24,
"execution_count": 23,
"metadata": {},
"outputs": [
{
@@ -1271,7 +1267,7 @@
"(70, 8, 8)"
]
},
"execution_count": 24,
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
@@ -1282,7 +1278,7 @@
},
{
"cell_type": "code",
"execution_count": 25,
"execution_count": 24,
"metadata": {},
"outputs": [
{
@@ -1291,7 +1287,7 @@
"(70, 2)"
]
},
"execution_count": 25,
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
@@ -1302,14 +1298,14 @@
},
{
"cell_type": "code",
"execution_count": 26,
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10.4 s ± 244 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
"9.83 s ± 240 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
@@ -1343,7 +1339,7 @@
},
{
"cell_type": "code",
"execution_count": 28,
"execution_count": 26,
"metadata": {},
"outputs": [
{
@@ -1378,7 +1374,7 @@
},
{
"cell_type": "code",
"execution_count": 29,
"execution_count": 27,
"metadata": {},
"outputs": [
{
@@ -1387,7 +1383,7 @@
"(70, 10000, 8, 8)"
]
},
"execution_count": 29,
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
@@ -1423,13 +1419,13 @@
},
{
"cell_type": "code",
"execution_count": 34,
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "ced6183663884763a686b1939c31603b",
"model_id": "490d626986f04f2ab5c7149b3199081d",
"version_major": 2,
"version_minor": 0
},
@@ -1504,7 +1500,7 @@
},
{
"cell_type": "code",
"execution_count": 35,
"execution_count": 29,
"metadata": {},
"outputs": [
{
@@ -1550,7 +1546,7 @@
"black 3.753117e+20"
]
},
"execution_count": 35,
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
@@ -1573,13 +1569,13 @@
},
{
"cell_type": "code",
"execution_count": 36,
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "a72e7227de764a69be1984db759e554f",
"model_id": "ac8ca8dc22b5490fba9241640ed87287",
"version_major": 2,
"version_minor": 0
},
@@ -1610,7 +1606,7 @@
},
{
"cell_type": "code",
"execution_count": 68,
"execution_count": 31,
"metadata": {},
"outputs": [
{
@@ -1638,13 +1634,13 @@
},
{
"cell_type": "code",
"execution_count": 38,
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c0a2aea84ef34cfb840d16e53d72c691",
"model_id": "da049b98f9ad40c2a22e00968b63f7cc",
"version_major": 2,
"version_minor": 0
},
@@ -1663,7 +1659,7 @@
"\n",
"@interact(turn=(0, 59))\n",
"def hist_direct_score(turn):\n",
" fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 7))\n",
" fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))\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",
@@ -1692,7 +1688,7 @@
},
{
"cell_type": "code",
"execution_count": 39,
"execution_count": 33,
"metadata": {},
"outputs": [
{
@@ -1714,14 +1710,14 @@
"\n",
"assert len(calculate_final_evaluation_for_history(_board_history).shape) == 1\n",
"_final_eval = calculate_final_evaluation_for_history(_board_history)\n",
"plt.title(\"Histogram over the score distribtuion\")\n",
"plt.title(\"Histogram over the score distribution\")\n",
"plt.hist((_final_eval * 64), density=True)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"execution_count": 34,
"metadata": {},
"outputs": [
{
@@ -1751,10 +1747,8 @@
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"scrolled": false
},
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
@@ -1784,7 +1778,7 @@
},
{
"cell_type": "code",
"execution_count": 42,
"execution_count": 36,
"metadata": {},
"outputs": [
{
@@ -1793,7 +1787,7 @@
"(70, 10000)"
]
},
"execution_count": 42,
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
@@ -1811,85 +1805,9 @@
},
{
"cell_type": "code",
"execution_count": 69,
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"69\n",
"68\n",
"67\n",
"66\n",
"65\n",
"64\n",
"63\n",
"62\n",
"61\n",
"60\n",
"59\n",
"58\n",
"57\n",
"56\n",
"55\n",
"54\n",
"53\n",
"52\n",
"51\n",
"50\n",
"49\n",
"48\n",
"47\n",
"46\n",
"45\n",
"44\n",
"43\n",
"42\n",
"41\n",
"40\n",
"39\n",
"38\n",
"37\n",
"36\n",
"35\n",
"34\n",
"33\n",
"32\n",
"31\n",
"30\n",
"29\n",
"28\n",
"27\n",
"26\n",
"25\n",
"24\n",
"23\n",
"22\n",
"21\n",
"20\n",
"19\n",
"18\n",
"17\n",
"16\n",
"15\n",
"14\n",
"13\n",
"12\n",
"11\n",
"10\n",
"9\n",
"8\n",
"7\n",
"6\n",
"5\n",
"4\n",
"3\n",
"2\n",
"1\n",
"0\n"
]
},
{
"data": {
"text/plain": [
@@ -1906,10 +1824,10 @@
" 0.28810459, -0.22580677, -0.16507096, -0.5579012 , -0.033314 ,\n",
" -0.15883 , 0.23115 , -0.45325 , -0.37125 , -0.58125 ,\n",
" -0.21875 , -0.21875 , -0.21875 , -0.21875 , -0.21875 ,\n",
" -0.21875 , -0.21875 , -0.21875 , -0.21875 , -0.14133253])"
" -0.21875 , -0.21875 , -0.21875 , -0.21875 , -0.21875 ])"
]
},
"execution_count": 69,
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
@@ -1934,7 +1852,7 @@
" calculate_final_evaluation_for_history(board_history) * final_score_fraction\n",
" )\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, 0, -1):\n",
" values = gama_table[turn] * combined_score[turn]\n",
" combined_score[turn - 1] += values\n",
"\n",
@@ -1948,7 +1866,7 @@
},
{
"cell_type": "code",
"execution_count": 60,
"execution_count": 38,
"metadata": {},
"outputs": [
{
@@ -1971,10 +1889,10 @@
" -4.09600000e-01, -5.12000000e-01, -6.40000000e-01, -8.00000000e-01,\n",
" -1.00000000e+00, -1.00000000e+00, -1.00000000e+00, -1.00000000e+00,\n",
" -1.00000000e+00, -1.00000000e+00, -1.00000000e+00, -1.00000000e+00,\n",
" -1.00000000e+00, -1.00000123e+00])"
" -1.00000000e+00, -1.00000000e+00])"
]
},
"execution_count": 60,
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
@@ -1987,7 +1905,7 @@
},
{
"cell_type": "code",
"execution_count": 65,
"execution_count": 39,
"metadata": {},
"outputs": [
{
@@ -2010,10 +1928,10 @@
" 10.264 , -10.92 , -7.4 , -13. ,\n",
" 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. ,\n",
" 0. , 2.47736775])"
" 0. , 0. ])"
]
},
"execution_count": 65,
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
@@ -2026,52 +1944,7 @@
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 1200x4800 with 61 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"_unique_bords = drop_duplicate_boards(_board_history[:, 0].reshape(-1, 8, 8), None)\n",
"plot_othello_boards(_unique_bords[0], None)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"rewords\n",
"evaluate_boards(boards).shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"import torch.optim as optim"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
@@ -2081,18 +1954,15 @@
"class DQLNet(nn.Module):\n",
" def __init__(self):\n",
" super().__init__()\n",
" self.fc1 = nn.Linear(BATCH_SIZE, 64)\n",
" self.fc2 = nn.Linear(BATCH_SIZE, 64)\n",
" self.fc1 = nn.Linear(BATCH_SIZE, 8 * 8 * 2)\n",
" self.fc2 = nn.Linear(BATCH_SIZE, 1)\n",
"\n",
" def forward(self, x):\n",
" if isinstance(x, np.ndarray):\n",
" x = torch.from_numpy(x).float()\n",
" x = torch.flatten(x, 1)\n",
" print(x)\n",
" x = self.fc1(x)\n",
" print(x)\n",
" x = F.relu(x)\n",
" print(x)\n",
" # x = self.dropout1(x)\n",
" x = self.fc2(x)\n",
" x = F.relu(x)\n",
@@ -2101,13 +1971,134 @@
" return x"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"class SymmetryMode(Enum):\n",
" MULTIPLY = \"MULTIPLY\"\n",
" BREAK_SEQUENCE = \"BREAK_SEQUENCE\""
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(8, 8)\n"
]
},
{
"ename": "TypeError",
"evalue": "cannot unpack non-iterable int object",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mTypeError\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[42], line 51\u001B[0m\n\u001B[0;32m 40\u001B[0m \u001B[38;5;28;01mpass\u001B[39;00m\n\u001B[0;32m 43\u001B[0m ql_policy \u001B[38;5;241m=\u001B[39m QLPoicy(\n\u001B[0;32m 44\u001B[0m \u001B[38;5;241m0.95\u001B[39m,\n\u001B[0;32m 45\u001B[0m neural_netwerk\u001B[38;5;241m=\u001B[39mDQLNet(),\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 49\u001B[0m final_score_fraction\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0\u001B[39m,\n\u001B[0;32m 50\u001B[0m )\n\u001B[1;32m---> 51\u001B[0m \u001B[43mql_policy\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mtrain_epoch\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m100\u001B[39;49m\u001B[43m)\u001B[49m\n",
"Cell \u001B[1;32mIn[42], line 36\u001B[0m, in \u001B[0;36mQLPoicy.train_epoch\u001B[1;34m(self, generate_data_size)\u001B[0m\n\u001B[0;32m 34\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mtrain_epoch\u001B[39m(\u001B[38;5;28mself\u001B[39m, generate_data_size: \u001B[38;5;28mint\u001B[39m):\n\u001B[0;32m 35\u001B[0m \u001B[38;5;66;03m# generate trainings data\u001B[39;00m\n\u001B[1;32m---> 36\u001B[0m train_boards, train_actions \u001B[38;5;241m=\u001B[39m \u001B[43msimulate_game\u001B[49m\u001B[43m(\u001B[49m\u001B[43mgenerate_data_size\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43m \u001B[49m\u001B[38;5;241;43m2\u001B[39;49m\u001B[43m)\u001B[49m\n",
"Cell \u001B[1;32mIn[22], line 25\u001B[0m, in \u001B[0;36msimulate_game\u001B[1;34m(nr_of_games, policies, tqdm_on)\u001B[0m\n\u001B[0;32m 23\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m policy_index \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[0;32m 24\u001B[0m current_boards \u001B[38;5;241m=\u001B[39m current_boards \u001B[38;5;241m*\u001B[39m \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m\n\u001B[1;32m---> 25\u001B[0m current_boards, action_taken \u001B[38;5;241m=\u001B[39m \u001B[43msingle_turn\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcurrent_boards\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mpolicy\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 26\u001B[0m action_history_stack[turn_index, :] \u001B[38;5;241m=\u001B[39m action_taken\n\u001B[0;32m 28\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m policy_index \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m0\u001B[39m:\n",
"Cell \u001B[1;32mIn[21], line 15\u001B[0m, in \u001B[0;36msingle_turn\u001B[1;34m(current_boards, policy)\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21msingle_turn\u001B[39m(\n\u001B[0;32m 2\u001B[0m current_boards: np, policy: GamePolicy\n\u001B[0;32m 3\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mtuple\u001B[39m[np\u001B[38;5;241m.\u001B[39mndarray, np\u001B[38;5;241m.\u001B[39mndarray]:\n\u001B[0;32m 4\u001B[0m \u001B[38;5;250m \u001B[39m\u001B[38;5;124;03m\"\"\"Execute a single turn on a board.\u001B[39;00m\n\u001B[0;32m 5\u001B[0m \n\u001B[0;32m 6\u001B[0m \u001B[38;5;124;03m Places a new stone on the board. Turns captured enemy stones.\u001B[39;00m\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 13\u001B[0m \u001B[38;5;124;03m The new game board and the policy vector containing the index of the action used.\u001B[39;00m\n\u001B[0;32m 14\u001B[0m \u001B[38;5;124;03m \"\"\"\u001B[39;00m\n\u001B[1;32m---> 15\u001B[0m policy_results \u001B[38;5;241m=\u001B[39m \u001B[43mpolicy\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_policy\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcurrent_boards\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 17\u001B[0m \u001B[38;5;66;03m# if the constant VERIFY_POLICY is set to true the policy is verified. Should be good though.\u001B[39;00m\n\u001B[0;32m 18\u001B[0m \u001B[38;5;66;03m# todo deactivate the policy verification after some testing.\u001B[39;00m\n\u001B[0;32m 19\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m VERIFY_POLICY:\n",
"Cell \u001B[1;32mIn[18], line 56\u001B[0m, in \u001B[0;36mGamePolicy.get_policy\u001B[1;34m(self, boards)\u001B[0m\n\u001B[0;32m 54\u001B[0m policies \u001B[38;5;241m=\u001B[39m np\u001B[38;5;241m.\u001B[39mrandom\u001B[38;5;241m.\u001B[39mrand(\u001B[38;5;241m*\u001B[39mboards\u001B[38;5;241m.\u001B[39mshape)\n\u001B[0;32m 55\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m---> 56\u001B[0m policies \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_internal_policy\u001B[49m\u001B[43m(\u001B[49m\u001B[43mboards\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 57\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mepsilon \u001B[38;5;241m<\u001B[39m \u001B[38;5;241m1\u001B[39m:\n\u001B[0;32m 58\u001B[0m policies \u001B[38;5;241m=\u001B[39m policies \u001B[38;5;241m*\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mepsilon \u001B[38;5;241m+\u001B[39m np\u001B[38;5;241m.\u001B[39mrandom\u001B[38;5;241m.\u001B[39mrand(\u001B[38;5;241m*\u001B[39mboards\u001B[38;5;241m.\u001B[39mshape) \u001B[38;5;241m*\u001B[39m (\n\u001B[0;32m 59\u001B[0m \u001B[38;5;241m1\u001B[39m \u001B[38;5;241m-\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mepsilon\n\u001B[0;32m 60\u001B[0m )\n",
"Cell \u001B[1;32mIn[42], line 31\u001B[0m, in \u001B[0;36mQLPoicy._internal_policy\u001B[1;34m(self, boards)\u001B[0m\n\u001B[0;32m 29\u001B[0m \u001B[38;5;28mprint\u001B[39m(turn_possible\u001B[38;5;241m.\u001B[39mshape)\n\u001B[0;32m 30\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m action_x, action_y \u001B[38;5;129;01min\u001B[39;00m itertools\u001B[38;5;241m.\u001B[39mproduct(\u001B[38;5;28mrange\u001B[39m(\u001B[38;5;241m8\u001B[39m), \u001B[38;5;28mrange\u001B[39m(\u001B[38;5;241m8\u001B[39m)):\n\u001B[1;32m---> 31\u001B[0m boards, action \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m0\u001B[39m\n\u001B[0;32m 32\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mneural_network\u001B[38;5;241m.\u001B[39mforword(boards)\n",
"\u001B[1;31mTypeError\u001B[0m: cannot unpack non-iterable int object"
]
}
],
"source": [
"class QLPoicy(GamePolicy):\n",
" def __init__(\n",
" self,\n",
" epsilon: float,\n",
" neural_netwerk: DQLNet,\n",
" symmetry_mode: SymmetryMode,\n",
" gamma: float = 0.8,\n",
" who_won_fraction: float = 0,\n",
" final_score_fraction: float = 0,\n",
" ):\n",
" super().__init__(epsilon)\n",
" assert 0 <= gamma <= 1\n",
" self.gamma = gamma\n",
" self.symmetry_mode = symmetry_mode\n",
" self.neural_network = neural_netwerk\n",
" self.who_won_fraction = who_won_fraction\n",
" self.final_score_fraction = final_score_fraction\n",
"\n",
" @property\n",
" def policy_name(self) -> str:\n",
" return \"greedy_policy\"\n",
"\n",
" def _internal_policy(self, boards: np.ndarray) -> np.ndarray:\n",
" q_learning_board = np.zeros((boards.shape[0], 2, 8, 8))\n",
" q_learning_board[:, 0, :, :] = boards\n",
" poss_turns = boards == 0 # checks where fields are empty.\n",
" poss_turns &= binary_dilation(boards == -1, SURROUNDING)\n",
" turn_possible = np.any(poss_turns, axis=0)\n",
" print(turn_possible.shape)\n",
" for action_x, action_y in itertools.product(range(8), range(8)):\n",
" boards, action = 0\n",
" return self.neural_network.forword(boards)\n",
"\n",
" def train_epoch(self, generate_data_size: int):\n",
" # generate trainings data\n",
" train_boards, train_actions = simulate_game(generate_data_size, [self] * 2)\n",
"\n",
" def evaluate_model(compare_models: list[GamePolicy]):\n",
" for i in range(compare_models):\n",
" pass\n",
"\n",
"\n",
"ql_policy = QLPoicy(\n",
" 0.95,\n",
" neural_netwerk=DQLNet(),\n",
" symmetry_mode=SymmetryMode.MULTIPLY,\n",
" gamma=0.8,\n",
" who_won_fraction=0,\n",
" final_score_fraction=0,\n",
")\n",
"ql_policy.train_epoch(100)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"?simulate_game"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"DQLNet().fc1"
"?simulate_game"
]
},
{
-172
View File
@@ -1,172 +0,0 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"outputs": [
{
"data": {
"text/plain": "array([[0., 0., 0., 0., 0.],\n [0., 0., 0., 0., 0.],\n [0., 0., 0., 0., 0.],\n [0., 0., 0., 0., 0.],\n [0., 0., 0., 0., 0.]])"
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = np.zeros((5,5))\n",
"a"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 3,
"outputs": [
{
"data": {
"text/plain": "array([[ 0., 0., 0., 0., 0.],\n [ 0., 0., 0., 0., 0.],\n [ 0., 0., 10., 0., 0.],\n [ 0., 0., 0., 0., 0.],\n [ 0., 0., 0., 0., 0.]])"
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a[2,2] = 10\n",
"a"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 4,
"outputs": [],
"source": [
"index_array = np.array([2,2], dtype=int)"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 5,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"234 ns ± 7.47 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n",
"311 ns ± 2.15 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n"
]
}
],
"source": [
"%timeit a[tuple(index_array.tolist())]\n",
"%timeit a[index_array[0], index_array[1]]"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 6,
"outputs": [],
"source": [
"def array_change(array):\n",
" array[1] = 1"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 12,
"outputs": [
{
"data": {
"text/plain": "array([[ 0., 0., 0., 0., 0.],\n [ 1., 1., 1., 1., 1.],\n [ 0., 1., 10., 0., 0.],\n [ 1., 1., 1., 1., 1.],\n [ 0., 0., 0., 0., 0.]])"
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"array_change(a[2:])\n",
"a"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": 10,
"outputs": [
{
"data": {
"text/plain": "array([[ 0., 0., 0., 0., 0.],\n [ 1., 1., 1., 1., 1.],\n [ 0., 1., 10., 0., 0.],\n [ 0., 0., 0., 0., 0.],\n [ 0., 0., 0., 0., 0.]])"
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a"
],
"metadata": {
"collapsed": false
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
}
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}