Skip to content

Instantly share code, notes, and snippets.

@AustinRochford
Last active September 10, 2021 11:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AustinRochford/6e21325d33b2be35cdf835f2ddaa9f3b to your computer and use it in GitHub Desktop.
Save AustinRochford/6e21325d33b2be35cdf835f2ddaa9f3b to your computer and use it in GitHub Desktop.
Playing Battleship with Bayesian Search Theory, Thompson Sampling, and Approximate Bayesian Computation
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "cf1bddf3",
"metadata": {},
"source": [
"---\n",
"title: Playing Battleship with Bayesian Search Theory, Thompson Sampling, and Approximate Bayesian Computation\n",
"tags: Battleship, Search Theory, Thompson Sampling, Approximate Bayesian Computation, Bayesian Statistics\n",
"---"
]
},
{
"cell_type": "markdown",
"id": "0cf8f35b",
"metadata": {},
"source": [
"As a child, I spent many hours playing [Battleship](https://en.wikipedia.org/wiki/Battleship_(game)) against my Mom or brother to pass the time.\n",
"\n",
"<center><img src=\"https://s3.us-east-2.amazonaws.com/boardashell/battleship.jpeg\" width=500></center>\n",
"\n",
"Battleship is a classic game of [incomplete information](https://en.wikipedia.org/wiki/Complete_information) that involves placing ships of different lengths on a square grid ($10 \\times 10$ in the most popular version) and trying to guess the location of all of the opponent's ships (sinking them) before the opponent does the same.\n",
"\n",
"Many years after I stopped playing Battleship with my family, I developed an interest in [Bayesian search theory](https://en.wikipedia.org/wiki/Bayesian_search_theory) after learning about a firm that specializes in search consulting for the US government at jobs-in-industry panel in graduate school. I had already happily lined up a [job](https://kibocommerce.com/personalization-software/) in e-commerce optimization, but the idea of using statistics to guide the potentially expensive searches piqued my intellectual curiosity. I e-mailed the presenter afterward for more information and he recommended [_Theory of Optimal Search_]^(Stone, Lawrence D. _Theory of optimal search._ Elsevier, 1976.) as the sessential reference in the field. The book is interesting if a bit dry, it is about mathematical optimization after all, and I was always curious about the connection with the search theory it develops and Battleship, which has always stood out in my mind as a basic search problem. Though most of the theory in this book is not directly applicable to Battleship for various reasons, a continuing theme is allocating search in areas with the largest posterior probability of containing the target object given the search results so far. A 1985 result of [Assaf and Zamir]^(Assaf, David, and Shmuel Zamir. \"Optimal sequential search: a Bayesian approach.\" _The Annals of Statistics_ 13, no. 3 (1985): 1213-1221.) shows the optimality of this strategy in a situation much closer to that of Battleship.\n",
"\n",
"Inspired by these forays into search theory I have thought idly for many years about constructing a near-optimal Bayesian approach to playing Battleship. This post is the culmination of these thoughts, showing how to use ideas from Bayesian search theory, [approximate Bayesian computation](https://en.wikipedia.org/wiki/Approximate_Bayesian_computation) (ABC), and [Thompson sampling](https://en.wikipedia.org/wiki/Thompson_sampling) to construct an easily tractable, near optimal strategy for Battleship that only requires simulating random Battleship boards and not reasoning through hard-coded special cases to achieve strong play."
]
},
{
"cell_type": "markdown",
"id": "12ad8364",
"metadata": {},
"source": [
"## Playing Battleship\n",
"\n",
"First we make the necessary Python imports and do a bit of housekeeping."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "2016d5ab",
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "3c7a9aa8",
"metadata": {},
"outputs": [],
"source": [
"from abc import ABC, abstractmethod\n",
"import datetime\n",
"from IPython.display import HTML\n",
"from itertools import product\n",
"import multiprocessing as mp\n",
"from tqdm import tqdm, trange"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "1b4322c2",
"metadata": {},
"outputs": [],
"source": [
"from empiricaldist import Pmf\n",
"import matplotlib as mpl\n",
"from matplotlib import pyplot as plt\n",
"from matplotlib.animation import FuncAnimation\n",
"from matplotlib.colors import LinearSegmentedColormap\n",
"from matplotlib.ticker import IndexLocator, StrMethodFormatter\n",
"import numpy as np\n",
"from scipy import linalg, stats\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "22e327ac",
"metadata": {},
"outputs": [],
"source": [
"FIG_WIDTH = 8\n",
"FIG_HEIGHT = 6\n",
"mpl.rcParams['figure.figsize'] = (FIG_WIDTH, FIG_HEIGHT)\n",
"\n",
"CMAP = LinearSegmentedColormap.from_list(\n",
" 'battleship',\n",
" [\n",
" (0.0, 'blue'),\n",
" (0.2, 'orange'),\n",
" (1., 'red')\n",
" ]\n",
")\n",
"CMAP.set_bad('w')\n",
"\n",
"sns.set(color_codes=True)\n",
"\n",
"pct_formatter = StrMethodFormatter('{x:.1%}')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "32f2b811",
"metadata": {},
"outputs": [],
"source": [
"SEED = 123456789 # for reproducibility\n",
"\n",
"rng = np.random.default_rng(SEED)"
]
},
{
"cell_type": "markdown",
"id": "3a4faea3",
"metadata": {},
"source": [
"We represent a Battleship board as a sequence of rectangular grids, one per ship. For standard Battleship, that means a game consists of five $10 \\times 10$ grids, the first grid containing a ship of length five, the seconding containing a ship of length four, and so on.\n",
"\n",
"The following constants are useful for defining a standard game of Battleship. (Note that we are using Hasbro's [names](https://en.wikipedia.org/wiki/Battleship_(game)#Description) for the ships, revised in 2002.)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "529672e2",
"metadata": {},
"outputs": [],
"source": [
"GRID_LENGTH = 10\n",
"SHIP_NAMES = [\n",
" \"Carrier\",\n",
" \"Battleship\",\n",
" \"Destroyer\",\n",
" \"Submarine\",\n",
" \"Patrol boat\"\n",
"]\n",
"SHIP_SIZES = np.array([\n",
" 5, \n",
" 4,\n",
" 3,\n",
" 3,\n",
" 2\n",
"])\n",
"\n",
"n_ships = SHIP_SIZES.size"
]
},
{
"cell_type": "markdown",
"id": "199b2c50",
"metadata": {},
"source": [
"The following plots show how a Battleship board is represented as a sequence of five grids, one per ship."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "1debfb1d",
"metadata": {},
"outputs": [],
"source": [
"ships = np.zeros((n_ships, GRID_LENGTH, GRID_LENGTH))\n",
"ships[0, 0, :5] = 1\n",
"ships[1, 4:8, 7] = 1\n",
"ships[2, 9, 3:6] = 1\n",
"ships[3, 3:6, 1] = 1\n",
"ships[4, 5, 8:10] = 1"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "564e9c5c",
"metadata": {},
"outputs": [],
"source": [
"def plot_board(board, cmap=CMAP,\n",
" cbar=False, cbar_kwargs=None,\n",
" ax=None, **heatmap_kwargs):\n",
" if ax is None:\n",
" _, ax = plt.subplots(figsize=(FIG_WIDTH, FIG_WIDTH))\n",
" \n",
" heatmap_kwargs.setdefault('vmin', 0)\n",
" heatmap_kwargs.setdefault('vmax', 1)\n",
" \n",
" board_ = np.atleast_2d(board)\n",
" mask = board_.mask if np.ma.is_masked(board_) else None\n",
" \n",
" if cbar_kwargs is None:\n",
" cbar_kwargs = {}\n",
" \n",
" cbar_kwargs.setdefault('format', pct_formatter)\n",
" cbar_kwargs.setdefault('label', \"Posterior probability of a hit\")\n",
" \n",
" sns.heatmap(board_, mask=mask, cmap=cmap,\n",
" cbar=cbar, square=True,\n",
" linewidths=1.5, linecolor='k',\n",
" cbar_kws=cbar_kwargs,\n",
" ax=ax, **heatmap_kwargs)\n",
" \n",
" if board_.shape[0] == 1:\n",
" ax.set_yticklabels([])\n",
" \n",
" if cbar:\n",
" cbar = ax.figure.axes[-1]\n",
" cbar.set_ylabel(cbar.get_ylabel(), rotation=270)\n",
" \n",
" return ax"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "6d232a79",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA2UAAACwCAYAAACPbcZSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAb9klEQVR4nO3de3RU1RXH8V/eCNGCWFJmsK5WCyoqTEhCAkFeKe+HoBhkgYpWCIuHrQpGK9gFVKlGsUSF4gNtq1aoiArUBy5QfCF0gYGKBVEQZyBUHgohZJJw+gcrsxLJkGQmyeFOvp+/yNy77z65d8/J2fdOQpQxxggAAAAAYEW07QEAAAAAQFNGUwYAAAAAFtGUAQAAAIBFNGUAAAAAYBFNGQAAAABYRFMGAAAAABbRlDWATZs2qX///raHAZwmNzdX8+fPD+sY+fn5uuuuu4JuHzx4sDZs2BBWDgBwknHjxmnZsmXW8jPv4mzQoUMH7dmzp9pttt8jTtBkm7I33nhDI0eOlMfjUWZmpn7zm99o06ZN9XLslJQUvfXWW/VyLDQtffr00VVXXSWPx6PU1FRNmDBB+/btqzHu22+/VYcOHVRWVhZ4bfny5brhhhsacrjVWrVqlbp27droeXH2qFzHKSkpGj16tF566SWdPHky7ON+9NFH9TRK4HSbNm3S6NGj1aVLF6WlpWn06NEqKCiwPawaMe+iQuX5t1u3brrnnntUVFRUY5xTmyZba52G0CSbsiVLluiBBx5QTk6OPvzwQ61du1ZjxozRu+++W6fjVF4An+m1cI+JpmXRokXavHmzPvjgA7Vu3Vpz5syxPSSgzirqeO3atbrtttv01FNP6fe//32D5mzM+bO8vLzRcqFxHDt2TDk5ORo7dqw+/fRTvf/++5oyZYri4+NtDy0o1gyoTsX8++qrr2rr1q1auHBh2Mek1hpek2vKjh49qgULFmjWrFnq16+fmjdvrri4OPXp00d33323CgoKlJ2drZSUFGVmZmr27Nny+/2B+A4dOuiFF15Qv3791K9fP23YsEFXX321Fi9erO7du+uee+4JvFahsLBQU6dOVXp6uvr06aO//vWvgW35+fmaNm2a7rrrLiUnJ+vVV19t1POBs1dCQoIGDBigXbt2SZLWrVuna665RsnJyerZs6fy8/MD+44dO1aSlJqaKo/Ho82bN+v+++/Xli1bAk8rqrN27VoNHz488DTjiy++CGxbvHixevToIY/Ho/79++vjjz8ObCstLdWMGTPk8Xg0ePBgbd26NbCt8tOMivr+7W9/K4/HoxEjRlTJgch37rnnqm/fvnrsscf06quvaseOHfL7/frTn/6kXr16qVu3bpo1a5ZOnDghSTp06JAmTpyolJQUpaWlacyYMTp58qSmT58un8+nnJwceTwePfXUU4EnxMuWLVOvXr1000036eTJk3ryySfVu3dvZWRkaMaMGTp69KgkacKECfrb3/5WZXxDhw7VmjVrJEm7du3S+PHjlZaWpv79+2v16tWB/XJzc3X//ffrtttuU+fOnfmoWAT6+uuvJUlDhgxRTEyMmjVrpszMTF166aWnfWy7uk8nfPPNN7ruuuvUpUsXTZo0SUeOHKmy7yuvvKKePXsqNTVVL730kgoKCjR06FClpKRo9uzZVY5z4403qmvXruratavuvPNO/fDDD4Htffr00eLFizV06FB17txZZWVlp827t99+e9A5+kxrEkSWpKQk9ejRQzt37tT333+viRMnKj09XampqZo4caL2798vSZo/f742bdqk2bNny+PxBOrxx2teSVq6dKl+/etfKy0tTTk5OSosLKz1eIK9RyTp3Xff1eDBg5WSkqJx48YF1j7SqfVIVlaWPB6PBg0apHfeeUfSqTm7NmsdxzBNzHvvvWcuu+wyU1paWu32rVu3ms2bN5vS0lKzd+9eM2DAALNkyZLA9vbt25ubb77ZHD582BQXF5tPPvnEXHbZZeahhx4yJSUlgdd69OhhjDGmvLzcjBgxwuTn55uSkhLzzTffmD59+pj333/fGGPMggULzOWXX27eeecdU15eboqLixv8HODs1bt3b/Phhx8aY4w5fvy4mTFjhpk+fboxxphPPvnEfPHFF6a8vNxs377dZGRkmHfeeccYY8zevXtN+/btq9T1K6+8YkaPHl3l+Hfffbd59NFHjTHGbNu2zaSnp5stW7aYsrIys3z5ctO7d29TUlJidu3aZa6++mqzf//+wPH37NljjDlVs1dccYVZt26dKSsrM3l5eWbUqFHVfg8V9f2vf/3L+P1+8/TTT5vevXsbv9/fEKcPZ4nKNVBZz549zQsvvGDmzp1rJk6caA4fPmyOHj1qJk6caPLy8owxxuTl5ZmZM2cav99v/H6/2bhx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\n",
"text/plain": [
"<Figure size 900x180 with 5 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(ncols=n_ships, sharex=True, sharey=True,\n",
" figsize=(n_ships * 2.5, 2.5))\n",
"\n",
"for (ship, name, ax) in zip(ships, SHIP_NAMES, axes):\n",
" plot_board(ship, ax=ax);\n",
" \n",
" ax.set_xticklabels([]);\n",
" ax.set_yticklabels([]);\n",
" ax.set_title(name);\n",
" \n",
"fig.tight_layout();"
]
},
{
"cell_type": "markdown",
"id": "c56df9dc",
"metadata": {},
"source": [
"Adding these ship grids gives us the two-dimensional board familiar to anyone who has played battleship."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "2511dfdd",
"metadata": {},
"outputs": [],
"source": [
"def to_board(ships, ship_axis=0):\n",
" return ships.sum(axis=ship_axis)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "b9a77fdf",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHUCAYAAACDJ9lsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAYrElEQVR4nO3de7DVdb3/8ffeblEhuYmAe+URL+MtMwYdmdJEUcxpgMyaRk2nGS1sVDSQUFFDBS84TUiJly42NRnTTJoj5qQWOg5UyngrkppEElwbEJS7V+D7+4MR6+diRee811r7e87j8dfe3+XM5zV7tjz9fhd721YURREAwP9Ie6sHAMD/BoIKAAkEFQASCCoAJBBUAEjQ0czDKpVKM48DgHTVarXm9aYGNSKi2tXV7CP/Y5XOzogox9aIcu0t09aIcu19f2tXV+1/2bubzs7t/4Fdhr1l2hpRrr1l2hrxwd5aPPIFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJOnblH1q7dm2sXLkyIiIGDx4c/fr1a+goACibukFdtmxZXHvttfHiiy/GwIEDIyLitddeiyOPPDKuv/76GDJkSDM2AkC3VzeokydPjnPOOSd+/OMfR3v79qfD27Zti7lz58YVV1wRv/jFL5oyEgC6u7rvoa5bty7Gjh27I6YREe3t7fG5z30u1q9f3/BxAFAWdYPat2/feOihh6Ioih3XiqKIBx98MHr37t3wcQBQFnUf+d5yyy0xderUuOGGG2LQoEEREbFq1ao4/PDD45ZbbmnKQAAog7pBHTJkSPzkJz+JN954I1asWBEREfvtt1/079+/KeMAoCx26cdm+vfvL6IAUIdf7AAACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQIK2oiiKZh1WqVSadRQANES1Wq153R0qACToaPaBXV21y96ddHZuv5Muw9aIcu0t09aIcu0t09aIcu0t09aIcu0t09aID/bW4g4VABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASPDfDuqYMWMydwBAqXXUe/Gll17a6Wtr165NHwMAZVU3qKNHj45KpRJFUXzotXXr1jVqEwCUTt2gViqV+PnPfx6DBg360GsjRoxo2CgAKJu676GedtppUa1Wa742atSohgwCgDKqe4d6xRVX7PS1a665Jn0MAJSVH5sBgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASBBW1EURbMOq1QqzToKABqiWq3WvO4OFQASdDT7wK6u2mXvTjo7t99Jl2FrRLn2lmlrRLn2lmlrRLn2lmlrRLn2lmlrxAd7a3GHCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACSoG9S1a9fG1VdfHeeff37ce++9//La+PHjGzoMAMqkblCnTp0affr0ibPOOit++9vfxiWXXBJbtmyJiIjly5c3ZSAAlEHdoL7yyisxefLkOO200+Kee+6JfffdNy688MJ45513mrUPAEqhblDffffdHR+3tbXF1KlT49BDD41x48aJKgD8k7pB3X///WPhwoX/cu2KK66IoUOHxj/+8Y9G7gKAUumo9+Ktt94abW1tH7o+YcKEGDNmTMNGAUDZ1A1q3759d/raIYcckr0FAErLz6ECQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJCgrSiKolmHVSqVZh0FAA1RrVZrXneHCgAJOpp9YFdX7bJ3J52d2++kq11dLV6yayqdnRFRrq9tGbZGlGtvmbZGlGtvmbZGlGtvmbZGfLC3FneoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJDgPw7q+vXrG7EDAEqtblD/+te/xplnnhlf/OIXY8mSJTFu3Lg48cQTY8SIEbF48eJmbQSAbq9uUKdPnx4XX3xxnHvuufHVr341Ro8eHS+88EJMnTo1ZsyY0ayNANDt1Q3q5s2b45RTTokzzjgjIiLGjh0bEREjR46MdevWNXobAJRG3aAWRbHj4+OPP/5fXtu2bVtjFgFACdUNaqVSiU2bNkXE9se/71u5cmXstddejV0GACXSUe/F2bNn17zeu3fvuOOOOxoyCADKqG5Qd6Znz57Rs2fP7C0AUFp+sQMAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAnaiqIomnVYpVJp1lEA0BDVarXmdXeoAJCgo9kHdnXVLnt30tm5/U662tXV4iW7ptLZGRHl+tqWYWtEufaWaWtEufb6M6FxyvR9EPHB3lrcoQJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgAT/cVB///vfN2IHAJRaR70XX3rppQ9du+qqq+Kee+6JoijikEMOadgwACiTukEdPXp0dHZ2/su1NWvWxNe+9rVoa2uL3/3udw0dBwBlUTeol1xySbzwwgtx3XXXRaVSiYiIkSNHxrx585oyDgDKou57qJdccklMmDAhLr/88pgzZ05ERLS1tTVlGACUyb/9S0lHHnlk/PSnP41qtRpf+cpX4r333mvGLgAolbqPfN/Xo0ePmDRpUjz//PPx9NNPN3oTAJTOLgX1fUOHDo2hQ4c2aAoAlJdf7AAACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQIK2oiiKZh1WqVSadRQANES1Wq153R0qACToaPaBXV21y96ddHZuv5OudnW1eMmuqXR2RkS5vrZl2BpRrr1l2hpRrr1l/TOhDHvLtDXig721uEMFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJ6gZ1wYIFOz7euHFjfPOb34xTTz01xo8fH2vWrGn4OAAoi7pB/fa3v73j45kzZ0avXr3ijjvuiIMOOiimT5/e8HEAUBYd9V4simLHx88880z88pe/jN133z0OPfTQGDNmTMPHAUBZ1A3qu+++G0uWLImiKKKtrS123333Ha+1t3v7FQDeVzeob7/9dowbN27HneqqVati0KBBsWnTJkEFgH9SN6jz5s2reX233XaL7373uw0ZBABl9N+6zdxrr71i//33z94CAKXluS0AJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAnaiqIomnVYpVJp1lEA0BDVarXmdXeoAJCgo9kHdnXVLnt30tm5/U66DFsjyrW3TFsjyrW3TFsjyrX3/a3Vrq4WL9k1lc7OiCjX17YMWyM+2FuLO1QASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJDgPwrq5s2b4y9/+Uts2rSpUXsAoJTqBvVb3/pWvPHGGxER8cwzz8SoUaNi8uTJMWrUqJg/f35TBgJAGXTUe/H555+P/v37R0TErFmz4q677oqjjz46li5dGpdffnmccMIJTRkJAN1d3TvUd955Z8fHmzdvjqOPPjoiIg488MB47733GrsMAEqkblA/+clPxi233BJvvfVWDB8+PB5++OGIiFiwYEH07du3GfsAoBTqBnXKlCmxZcuWOPHEE+Oxxx6LiRMnxlFHHRX33HNP3HTTTc3aCADdXt33UHv06BHXXHNNTJw4MZYtWxZbt26Nzs7O6NevX7P2AUAp1A3q+3r27BmHH354o7cAQGn5xQ4AkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACRoK4qiaNZhlUqlWUcBQENUq9Wa192hAkCCjmYf2NVVu+zdSWfn9jvpMmyNKNfeMm2NKNfeMm2NKNfe97dWu7pavGTXVDo7I6JcX9sybI34YG8t7lABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkCCukEdPnx4TJ8+PRYvXtysPQBQSnWD2qtXr2hvb4/zzz8/Pv/5z8fPfvazWL9+fbO2AUBp1A1qnz59YsqUKfHkk0/GhRdeGE8++WScdNJJMWHChFiwYEGzNgJAt7dL76Huvvvucfrpp8f3v//9eOSRR+Kwww6LadOmNXobAJRG3aAWRfGhawMHDoyvf/3r8Zvf/KZhowCgbOoGdfbs2c3aAQClVjeolUqlWTsAoNT8HCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAnaiqIomnWY/78qAGVXrVZrXneHCgAJOpp9YFdX7bJ3J52d2++ky7A1olx7y7Q1olx7y7Q1olx7y7Q1olx7y7Q14oO9tbhDBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACf6joL711luxaNGi2LBhQ6P2AEAp1Q3qY489FsOGDYvTTz89XnjhhfjsZz8bkydPjlGjRsW8efOatREAur2Oei/efvvtMWfOnNiwYUOMGzcu7rzzzhg2bFgsWbIkLr/88hg5cmSzdgJAt1Y3qG1tbXHYYYdFRESvXr1i2LBhERFx8MEHN34ZAJRI3Ue+bW1tsWTJknjuuefizTffjOeffz4iIpYuXRpbt25txj4AKIW6d6iXXnppnH322dHe3h4zZ86MWbNmxerVq2PlypVx3XXXNWkiAHR/dYN68sknx9NPP73j8+OOOy4WL14cgwcPjgEDBjR8HACURd2g/v922223OOqooxq1BQBKyy92AIAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEgQVtRFEWzDqtUKs06CgAaolqt1rzuDhUAEnQ0+8Curtpl7046O7ffSZdha0S59r6/tdrV1eIlu6bS2RkR5dhbpq0RH+wt0/dtGbZGlGtvmbZGfLC3FneoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJCgY1f+oXXr1sWKFSuio6Mj9t9//9hzzz0bvQsASqVuUKvVakydOjXmz58fbW1t0bt373j77bfj7LPPjokTJ0aPHj2atRMAurW6j3yvvPLKGDt2bDz11FMxZcqU+PKXvxzz5s2LjRs3xs0339ysjQDQ7dUN6vr162Ps2LHRp0+fOO+88+LJJ5+MffbZJ6ZNmxYLFixo1kYA6PbqBrWjoyOWLVsWERGLFi3a8Yi3vb09Ojp26e1XAPg/oW4VL7300vjSl74U++67b6xevTpmzpwZERFr1qyJYcOGNWUgAJRB3aCedNJJ8eijj8Yrr7wSBx54YHzkIx+JiIgBAwbE9OnTmzIQAMrg3z637d27d3z84x9vxhYAKC2/2AEAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgARtRVEUzTqsUqk06ygAaIhqtVrzelODCgD/W3nkCwAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEnS0esD/xNKlS+PKK6+MdevWRd++fWPGjBkxZMiQVs+qacaMGfHII49EtVqNuXPnxqGHHtrqSTu1du3amDx5cixbtix69OgRBxxwQNxwww3Rv3//Vk+r6aKLLopXX3012tvbo2fPnnHttdfGEUcc0epZdd1+++3xve99r9t/L4wcOTJ69OgRe+yxR0RETJo0KT796U+3eNXOvfPOO3HTTTfFH/7wh9hjjz1i6NChMW3atFbP+pBXX301Lr744h2fb9y4MTZt2hRPP/10C1fV9/jjj8esWbOiKIrYtm1bjB8/Pk477bRWz6rpiSeeiFmzZsWWLVuiT58+cfPNN8f+++/f+IOLEjvvvPOKBx54oCiKonjggQeK8847r8WLdm7hwoVFV1dXcfLJJxd/+9vfWj2nrrVr1xZ//OMfd3x+yy23FFdddVULF9W3YcOGHR8/9thjxRlnnNHCNf/eokWLigsuuKA46aSTuv33Qhm+X//ZtGnTihtvvLHYtm1bURRFsXr16hYv2jXTp08vrr/++lbP2Klt27YVxx577I7vhcWLFxdDhw4ttm7d2uJlH7Zu3briuOOOK15++eWiKLa34fzzz2/K2aV95Pv666/Hiy++GKNHj46IiNGjR8eLL74Yb7zxRouX1XbsscfGfvvt1+oZu6Rv374xfPjwHZ8PHTo0urq6Wriovr333nvHx5s2bYq2trYWrqnv3XffjRtuuCGmTp3arXeW0ebNm+OBBx6Iyy67bMfXdsCAAS1e9e+9++67MXfu3PjCF77Q6il1tbe3x8aNGyNi+x31wIEDo729+yXklVdeiQEDBsSBBx4YEREjRoyI+fPnN6UNpX3ku2LFihg0aFDstttuERGx2267xcCBA2PFihXd9tFkGW3bti3mzJkTI0eObPWUuq6++upYsGBBFEURP/zhD1s9Z6dmzZoVY8eObc7jpySTJk2KoijimGOOiYkTJ0bv3r1bPamm5cuXR9++feP222+Pp556Knr16hWXXXZZHHvssa2eVte8efNi0KBB8bGPfazVU3aqra0tbrvttrjooouiZ8+esXnz5rj77rtbPaumAw88MNasWRN/+tOf4uijj465c+dGRDSlDd3vPy/oVqZNmxY9e/aMc889t9VT6rrxxhvjiSeeiAkTJsStt97a6jk1Pffcc/HnP/85zjnnnFZP2WX33ntvPPjgg3HfffdFURRxww03tHrSTm3ZsiWWL18eRx55ZNx///0xadKkGD9+fGzatKnV0+q67777uv3d6ZYtW+Luu++OO+64Ix5//PG48847Y8KECbF58+ZWT/uQvffeO2bOnBk333xznHnmmfH6669H7969o6Oj8fePpQ3qfvvtF6tWrYqtW7dGRMTWrVvjtddeK81j1TKYMWNGvPLKK3Hbbbd1y0c7tZxxxhnx1FNPxdq1a1s95UMWLlwYL7/8cpxyyikxcuTIWLlyZVxwwQUxf/78Vk/bqff/ferRo0ecc8458eyzz7Z40c51dnZGR0fHjreBPvGJT0S/fv1i6dKlLV62c6tWrYqFCxfGmDFjWj2lrsWLF8drr70WxxxzTEREHHPMMbHXXnvFkiVLWrystk996lMxZ86cuP/+++Pcc8+Nt99+uylPhcrxp2QN++yzTxxxxBHx0EMPRUTEQw89FEcccYTHvUlmzpwZixYtitmzZ0ePHj1aPWenNm/eHCtWrNjx+bx586JPnz7Rt2/f1o3aiXHjxsX8+fNj3rx5MW/evBg8eHD86Ec/ihNOOKHV02p68803d7xnVhRFPPzww936b0/3798/hg8fHgsWLIiI7T8F8Prrr8cBBxzQ4mU796tf/SpGjBgR/fr1a/WUugYPHhwrV66Ml19+OSIilixZEmvWrIn/+q//avGy2lavXh0R29+y+s53vhNnnXVW9OzZs+HnthVFUTT8lAZZsmRJXHnllbFhw4bo3bt3zJgxIw466KBWz6pp+vTp8eijj8aaNWuiX79+0bdv3/j1r3/d6lk1/f3vf4/Ro0fHkCFDYs8994yIiI9+9KMxe/bsFi/7sDVr1sRFF10Ub731VrS3t0efPn3iiiuu6NbvR71v5MiRcdddd3XbH5tZvnx5jB8/PrZu3Rrbtm2Lgw8+OK655poYOHBgq6ft1PLly2PKlCmxbt266OjoiG984xsxYsSIVs/aqc985jNx9dVXx4knntjqKf/Wgw8+GD/4wQ92/IWvSy+9NE499dQWr6rt6quvjmeffTbee++9OP7442PKlCk7fvSrkUodVADoLkr7yBcAuhNBBYAEggoACQQVABIIKgAkEFQASCCoAJDg/wFkk7JhIg5qhwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(to_board(ships));"
]
},
{
"cell_type": "markdown",
"id": "601cab2e",
"metadata": {},
"source": [
"The following class implements most of the basics necessary to track the state of a game of Battleship, make guesses, and reveal the contents of guessed spaces."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "3e5186d1",
"metadata": {},
"outputs": [],
"source": [
"class Battleship:\n",
" def __init__(self, ships):\n",
" self._ships = ships\n",
" self._turn_revealed = []\n",
" \n",
" @property\n",
" def _board(self):\n",
" return to_board(self._ships)\n",
" \n",
" @property\n",
" def grid_length(self):\n",
" return self._board.shape[0]\n",
" \n",
" @property\n",
" def is_solved(self):\n",
" return self.revealed.sum() == self._board.sum()\n",
" \n",
" @property\n",
" def revealed(self):\n",
" return to_board(self._revealed_ships)\n",
" \n",
" @property\n",
" def _revealed_ships(self):\n",
" if self.turns > 0:\n",
" return self._turn_revealed[-1]\n",
" else:\n",
" return np.ma.masked_all_like(self._ships)\n",
" \n",
" @property\n",
" def ship_sizes(self):\n",
" return self._ships.sum(axis=(1, 2))\n",
" \n",
" @property\n",
" def sunk(self):\n",
" ship_sizes = self._ships.sum(axis=(1, 2))\n",
" revealed_sizes = (self._revealed_ships\n",
" .sum(axis=(1, 2))\n",
" .filled(0))\n",
" \n",
" return ship_sizes == revealed_sizes\n",
" \n",
" @property\n",
" def turn_revealed(self):\n",
" return [np.ma.masked_all_like(self._board)] \\\n",
" + [to_board(revealed) for revealed in self._turn_revealed]\n",
" \n",
" @property\n",
" def turns(self):\n",
" return len(self._turn_revealed)"
]
},
{
"cell_type": "markdown",
"id": "ddc83d0d",
"metadata": {},
"source": [
"These bookkeeping methods are fairly self-explanatory. An instance of `Battleship` tracks which squares have been revealed to the opponent using `numpy`'s [masked arrays](https://numpy.org/doc/stable/reference/maskedarray.generic.html). The `revealed` grid is masked wherever the opponent has not yet guessed.\n",
"\n",
"The heart of our `Battleship` class is the `guess` method, which takes the coordinates to guess, and returns a tuple containing whether or not the guess resulted in a hit or miss, and the index of the ship sunk as a result of that guess (`None` if no ship was sunk). (Here we use a [dirty trick](https://www.cgranade.com/blog/2016/10/07/documenting-long-classes-jupyter-notebook.html) to add a method to the `Battleship` class after it has already been defined for expository clarity. **Don't do this in practice!**)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "13deb20c",
"metadata": {},
"outputs": [],
"source": [
"class Battleship(Battleship):\n",
" def guess(self, i, j):\n",
" if not self.revealed.mask[i, j]:\n",
" raise ValueError(f\"{i}, {j} already guessed\")\n",
" else:\n",
" prev_sunk = self.sunk\n",
"\n",
" next_ships = self._revealed_ships.copy()\n",
" next_ships[:, i, j] = self._ships[:, i, j]\n",
" self._turn_revealed.append(next_ships)\n",
" \n",
" curr_sunk = self.sunk\n",
" \n",
" if (curr_sunk == prev_sunk).all():\n",
" sunk = None\n",
" else:\n",
" sunk = (curr_sunk & ~prev_sunk).argmax()\n",
" \n",
" return self._board[i, j], sunk"
]
},
{
"cell_type": "markdown",
"id": "0678527b",
"metadata": {},
"source": [
"In addition to this class representing game state and history, we define an abstract class `Strategy` that generates the guesses necessary to play a game."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b902f8fc",
"metadata": {},
"outputs": [],
"source": [
"class Strategy(ABC):\n",
" @abstractmethod\n",
" def next_guess(self, revealed):\n",
" pass\n",
"\n",
" def reveal(self, i, j, hit_or_miss, sunk):\n",
" pass"
]
},
{
"cell_type": "markdown",
"id": "75a3b0e0",
"metadata": {},
"source": [
"The `next_guess` method takes a masked array of the board as revealed so far and should return the coordinates of the next spot to guess. The `reveal` method takes guessed coordinates, an indicator of whether the guess resulted in a hit or miss, and the index of the ship sunk as a result of that guess (or `None`, as with `guess` above). This method allows a `Strategy` to update internal state based on the result of guesses. While some simple strategies can infer the next guess purely based on the state of the revealed board, we will see that it is useful when taking a Bayesian approach to maintain state inside a strategy.\n",
"\n",
"The `play` function take a configuration of ships and a `Strategy` and plays the corresponding game of Battleship."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "530b317d",
"metadata": {},
"outputs": [],
"source": [
"def play(ships, strategy, progress_bar=False):\n",
" game = Battleship(ships)\n",
" \n",
" if progress_bar:\n",
" pbar = tqdm(total=int(ships.sum()))\n",
" \n",
" while not game.is_solved:\n",
" i, j = strategy.next_guess(game.revealed)\n",
" hit_or_miss, sunk = game.guess(i, j)\n",
" strategy.reveal(i, j, hit_or_miss, sunk)\n",
" \n",
" if progress_bar and hit_or_miss == 1:\n",
" pbar.update()\n",
" \n",
" if progress_bar:\n",
" pbar.close()\n",
" \n",
" return game"
]
},
{
"cell_type": "markdown",
"id": "affecbc2",
"metadata": {},
"source": [
"The rest of this post progresses from strategies for simplified versions of Battleship to finally showing how to use ABC and Thompson sampling to achieve near optimal play."
]
},
{
"cell_type": "markdown",
"id": "06002f9d",
"metadata": {},
"source": [
"### Manual guessing\n",
"\n",
"This framework allows us to manually play Battleship by inputting user guesses and watching how the board evolves."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "055656d0",
"metadata": {},
"outputs": [],
"source": [
"class ManualStrategy(Strategy):\n",
" def next_guess(self, revealed):\n",
" ax = plot_board(revealed)\n",
" ax.set_title(\"Currently revealed\")\n",
" plt.show()\n",
"\n",
" i = int(input(\"Enter row to guess: \"))\n",
" j = int(input(\"Enter column to guess: \"))\n",
" \n",
" return i, j"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "f613d609",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Zs6cqV69eoWuZNPT0/XNN99owYIFKisrU1lZmbZu3aqCggJJUmlpqRISElSnTh1t3br1nNdiv69p06bq2rWrpkyZopKSElVWVmr37t2h28O33HKL/vznP+vAgQM6duyY8vLyLur3B0QLQcWPzr333qsxY8Zozpw5uv7665Wenq7XX39dPXr0kPTdF/20a9dOGRkZGjBggHr16nXR58jMzNR9992n4cOHq2PHjsrKytKaNWsu6Nf+/Oc/1xVXXKHU1NTQ1eG/q1u3rnr27Km9e/de9BdY/fa3vw393jp06KA777xTW7duDT0fGxurzMxMffTRR8rKygodv+SSS/Tiiy9q6dKl6tatm1JTUzVt2rRQ+HNycjRz5kx16NBBs2fP1i233FLthqlTp6qsrEy9evVSly5dNHToUB0+fFiSdOeddyo1NVW33nqrbrvtNvXs2fOifn9AtPj4H4wD3jRr1ix98803mjZtWrSnABBXqIAnFRcXa/78+fr1r38d7SkA/hdBBTzmzTffVHp6urp166YuXbpEew6A/8UtXwAADHCFCgCAgYh+H+rZb2gHAMCrvv8Tz74v4j/YobohNcnZ8Hthq+StvV7aKnlrr5e2St7a66Wtkrf2emmr5H5hyC1fAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADPgv5J2Kiop04MABSVKzZs3UoEGDsI4CAMBrXIO6e/duPf7449q+fbuaNm0qSTp06JCuuuoqjR8/Xq1atYrERgAAajzXoI4aNUp33323Xn75ZcXEfHd3uLKyUosWLdLo0aP1xhtvRGQkAAA1netrqMXFxcrOzg7FVJJiYmJ066236tixY2EfBwCAV7gGNTExUYsXL5bjOKFjjuNo4cKFio+PD/s4AAC8wvWW75QpU5STk6MJEyYoKSlJknTw4EG1a9dOU6ZMichAAAC8wDWorVq10iuvvKKjR49q//79kqTmzZurYcOGERkHAIBXXNC3zTRs2JCIAgDggh/sAACAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGf4zhOpE4W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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"Enter row to guess: 5\n",
"Enter column to guess: 4\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHkCAYAAACHXd7BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgRElEQVR4nO3deXRUhd3G8WfCECBoEtYAUyqIR0CtDZupJZgYCSoNEbXHioVaQdGjgGUpIKiRRSQcjggCSupytFrqgqVsCmJYBBVQWUrBHo3IMqyBBEhkyXLfP3yZV0pyhfY3M7mv389fkzsh9yGiX+6dJPocx3EEAAD+KzHRHgAAwP8HBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQV8IDRo0dr2rRp0Z7xH9uzZ4/atm2r8vLyiP5aIJIIKn6UFi5cqNtuu00dOnRQamqq7r33Xn366afRniVJeuedd9SnT59ozwBwgfzRHgBE2ssvv6y8vDyNGzdOqampql27tj788EN98MEH6ty58wV9rPLycvn9/h88VlPU5G2A13GFih+V48ePa8aMGXr88cfVo0cPxcXFqXbt2srIyNCoUaMknXt7dd26dbruuutCb2dkZCgvL0+9evVScnKydu7cqbZt2+qtt95Senq67r77bknS22+/rZtvvlldunTRgAEDFAwGQx+jbdu2mjt3rnr06KEuXbpo3LhxchxHBQUFysnJ0aZNm9ShQ4cqA5+VlaX8/PzQ22VlZUpJSdH27dvPed8z2/Py8tS1a1c98sgjqqysVF5enrp3766UlBQ9/PDDKi4uliQNGDBAr7322lkfIzs7W8uWLZMkFRQU6J577tE111yjG2+8UUuWLAm938qVK9W7d2917NhRaWlpevbZZ13/OYwZM0apqanq1q2bpk2bpoqKCklSRUWFcnNzlZKSohtuuEGrVq2q9uMANQlBxY/Kxo0bderUKWVmZv5XH2fx4sXKy8vTp59+qlq1akmSNmzYoCVLlujFF1/U8uXLNWfOHM2cOVMff/yxOnXqpOHDh5/1MVauXKm3335bf//73/Xuu+/qww8/VJs2bTRu3DglJydr48aNVd6GvuWWW7RgwYLQ26tWrVLTpk3Vvn37KrcWFhbq6NGjWrFihSZMmKBXX31Vy5cv12uvvaYPP/xQCQkJGj9+vCSpV69eWrRoUejXfvXVV9q7d6/S09P17bffqn///srKytJHH32kp59+WuPGjdOXX34pSapXr55yc3P16aefas6cOZo7d66WL19e5aZRo0bJ7/dr2bJlmj9/vtauXau33npLkvTmm29qxYoVmj9/vubNm6f33nvvfP+xAFFFUPGjUlxcrAYNGvzXtz379eun5s2bq27duqFjgwcPVlxcnOrWrau//vWvGjhwoNq0aSO/368HHnhA27dvP+sq9b777lN8fLxatGihlJQUffHFF+d17uzsbK1atUolJSWSpAULFig7O7va94+JidGQIUMUGxurunXr6o033tDQoUPVrFkzxcbGatCgQVq6dKnKy8vVvXt3ffHFF6GdCxcuVGZmpmJjY7Vy5UoFAgHdfvvt8vv9uvLKK3XjjTdq6dKlkqSUlBS1bdtWMTExateunX71q19p/fr15+wpLCzU6tWrNWbMGMXFxalRo0b6/e9/r8WLF0uS3n33Xd19991q3ry5EhMTdf/995/X5wWINl5MwY9KYmKiioqK/uvXEps3b37OsWbNmoUe7927V5MmTVJubm7omOM4OnDggAKBgCSpSZMmoefq1aun0tLS8zp3UlKSOnbsqKVLlyozM1OrV6/W2LFjq33/Bg0aqE6dOmdte+ihhxQT839/n46JidHhw4eVlJSktLQ0LV68WAMHDtTixYs1YcIESVIwGNSWLVvOug1dUVERivnmzZs1depUffnllyorK9Pp06d10003nbNn7969Ki8vV2pqauhYZWVl6HN68ODBsz6/LVq0OK/PCxBtBBU/Kh06dFCdOnW0fPnyKv9jL30Xt5MnT4beLiwsPOd9fD6f67HmzZvrgQcecL1yrE5VH/vf3XrrrXrrrbdUUVGh5ORkJSUlnffHa9asmSZNmqROnTpV+f5ZWVmaOXOmunTpopMnTyolJUXSd7+nLl266OWXX67y1w0fPlx9+/bVCy+8oDp16ujJJ59UUVHROe935sr4k08+qfIvNU2aNNG+fftCb3//MVCTccsXPyoXX3yxhgwZovHjx2v58uU6ceKEysrKtGrVKk2ZMkWS1L59e61atUrFxcU6dOiQXnnllQs+z5133qm8vLzQ64vHjx/Xu+++e16/tlGjRjpw4IBOnz5d7ft0795d27Zt06uvvqrevXtf0LY+ffromWeeCd3WPXLkyFmvdaalpWnv3r2aMWOGevbsGbqSTU9P1zfffKP58+errKxMZWVl2rJliwoKCiRJpaWlSkhIUJ06dbRly5azXov9vqZNm6pr166aPHmySkpKVFlZqV27doVuD998883685//rP379+vo0aPKy8u7oN8fEC0EFT8699xzj0aPHq3Zs2fr2muvVXp6ul5//XV1795d0ndf9NOuXTtlZGSof//+6tmz5wWfIzMzU/fee6+GDRumjh07KisrS6tXrz6vX/uLX/xCl112mVJTU0NXh/+ubt266tGjh/bs2XPBX2D1u9/9LvR769Chg+644w5t2bIl9HxsbKwyMzP10UcfKSsrK3T8oosu0osvvqglS5aoW7duSk1N1dSpU0Phz8nJ0YwZM9ShQwfNmjVLN998c7UbpkyZorKyMvXs2VNdunTRkCFDdOjQIUnSHXfcodTUVN1yyy269dZb1aNHjwv6/QHR4uN/MA5408yZM/XNN99o6tSp0Z4CQFyhAp5UXFysefPm6Te/+U20pwD4XwQV8Jg333xT6enp6tatm7p06RLtOQD+F7d8AQAwwBUqAAAGIvp9qGe+oR0AAK/6/k88+76I/2CH6obUJGfC74Wtkrf2emmr5K29XtoqeWuvl7ZK3trrpa2S+4Uht3wBADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAw4D+fdyoqKtL+/fslSc2aNVODBg3COgoAAK9xDequXbv02GOPadu2bWratKkk6eDBg7riiis0btw4tWrVKhIbAQCo8VyDOnLkSN111116+eWXFRPz3d3hyspKLVy4UKNGjdIbb7wRkZEAANR0rq+hFhcXKzs7OxRTSYqJidEtt9yio0ePhn0cAABe4RrUxMRELVq0SI7jhI45jqMFCxYoPj4+7OMAAPAK11u+kydPVk5OjsaPH6+kpCRJ0oEDB9SuXTtNnjw5IgMBAPAC16C2atVKr7zyio4cOaJ9+/ZJkpo3b66GDRtGZBwAAF5xXt8207BhQyIKAIALfrADAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABnyO4ziROlkgEIjUqQAACItgMFjlca5QAQAw4I/0Casre01y5kraC1slb+310lbJW3u9tFXy1l4vbZW8tddLWyX3O61coQIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYOA/DmqvXr0sdwAA4Gl+tye/+uqrap8rKioyHwMAgFe5BjUrK0uBQECO45zzXHFxcbg2AQDgOa5BDQQC+stf/qKkpKRznktLSwvbKAAAvMb1NdQePXooGAxW+VxmZmZYBgEA4EWuV6ijRo2q9rlHH33UfAwAAF7Ft80AAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBgwOc4jhOpkwUCgUidCgCAsAgGg1Ue5woVAAAD/kifsLqy1yRnrqS9sFXy1l4vbZW8tddLWyVv7fXSVslbe720VXK/08oVKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABlyDWlRUpLFjx6p///56/fXXz3pu8ODBYR0GAICXuAY1JydHCQkJuvPOO7V8+XINGjRI5eXlkqTdu3dHZCAAAF7gGtSdO3dq5MiR6tGjh1566SU1adJE999/v06dOhWpfQAAeIJrUE+fPh167PP5lJOTo8svv1wDBw4kqgAAfI9rUFu2bKkNGzacdWzUqFFKTk7WN998E85dAAB4it/tySlTpsjn851zfOjQoerVq1fYRgEA4DWuQU1MTKz2ucsuu8x6CwAAnsX3oQIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGDA5ziOE6mTBQKBSJ0KAICwCAaDVR7nChUAAAP+SJ+wurLXJGeupL2wVfLWXi9tlby110tbJW/t9dJWyVt7vbRVcr/TyhUqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggq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q1rnzp3VvHnzaM84L4mJiUpJSQm9nZycrL1790ZxkbuLL7449LikpEQ+ny+Ka9ydPn1a48ePV05OTo3e6UWlpaWaP3++Hn744dDntnHjxlFe9cNOnz6thQsX6vbbb4/2FFcxMTE6fvy4pO+uqJs2baqYmJqXkJ07d6px48Zq3bq1JCktLU1r1qyJSBs8e8t33759SkpKUq1atSRJtWrVUtOmTbVv374ae2vSiyorKzV37lxlZGREe4qrsWPHau3atXIcRy+88EK051Rr+vTpys7OjsztJyMjRoyQ4zjq1KmThg0bpvj4+GhPqtLu3buVmJiomTNnat26dapfv74efvhhde7cOdrTXOXn5yspKUlXXnlltKdUy+fz6ZlnntGDDz6ouLg4lZaWas6cOdGeVaXWrVursLBQW7Zs0dVXX62FCxdKUkTaUPP+eoEaZcKECYqLi1Pfvn2jPcXVk08+qZUrV2ro0KGaMmVKtOdUaePGjfrHP/6hu+66K9pTztvrr7+uBQsWaN68eXIcR+PHj4/2pGqVl5dr9+7duuKKK/TOO+9oxIgRGjx4sEpKSqI9zdW8efNq/NVpeXm55syZo9mzZ2vFihV67rnnNHToUJWWlkZ72jkuvvhiTZs2TU899ZRuu+02HT58WPHx8fL7w3/96NmgNm/eXAcOHFBFRYUkqaKiQgcPHvTMbVUvyM3N1c6dO/XMM8/UyFs7Vendu7fWrVunoqKiaE85x4YNG/T111/rhhtuUEZGhvbv368BAwZozZo10Z5WrTP/PsXGxuquu+7S559/HuVF1WvRooX8fn/oZaCf//znatCggXbs2BHlZdU7cOCANmzYoF69ekV7iqvt27fr4MGD6tSpkySpU6dOqlevngoKCqK8rGq//OUvNXfuXL3zzjvq27evTp48GZG7Qt74r2QVGjVqpPbt22vRokWSpEWLFql9+/bc7jUybdo0bd26VbNmzVJsbGy051SrtLRU+/btC72dn5+vhIQEJSYmRm9UNQYOHKg1a9YoPz9f+fn5atasmV588UWlpqZGe1qVvv3229BrZo7jaMmSJTX6q6cbNmyolJQUrV27VtJ33wVw+PBhXXLJJVFeVr2//e1vSktLU4MGDaI9xVWzZs20f/9+ff3115KkgoICFRYW6qc//WmUl1Xt0KFDkr57yerpp5/WnXfeqbi4uLCf1+c4jhP2s4RJQUGBRo8erWPHjik+Pl65ubm69NJLoz2rShMnTtSyZctUWFioBg0aKDExUYsXL472rCp9+eWXysrKUqtWrVS3bl1J0k9+8hPNmjUrysvOVVhYqAcffFAnTpxQTEyMEhISNGrUqBr9etQZGRkZev7552vst83s3r1bgwcPVkVFhSorK9WmTRs9+uijatq0abSnVWv37t0aM2aMiouL5ff79Yc//EFpaWnRnlWtG2+8UWPHjtV1110X7Sk/aMGCBfrTn/4U+oKvIUOGqHv37lFeVbWxY8fq888/V1lZmbp27aoxY8aEvvUrnDwdVAAAagrP3vIFAKAmIagAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAY+B/9v2n7pAeEwgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"Enter row to guess: 0\n",
"Enter column to guess: 3\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHkCAYAAACHXd7BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgT0lEQVR4nO3deXRUhd3G8WfCECBoEtYAUyqIR0CtDZupJZgYCSoNEbXHioVaQdGjgGUpIKiRRSQcjggCSupytFrqgqVsCmJYBBVQWUrBHo3IMqyBBEhkyXLfP3yZV0pyhfY3M7mv389fkzsh9yGiX+6dJPocx3EEAAD+KzHRHgAAwP8HBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQV8IDRo0dr2rRp0Z7xH9uzZ4/atm2r8vLyiP5aIJIIKn6UFi5cqNtuu00dOnRQamqq7r33Xn366afRniVJeuedd9SnT59ozwBwgfzRHgBE2ssvv6y8vDyNGzdOqampql27tj788EN98MEH6ty58wV9rPLycvn9/h88VlPU5G2A13GFih+V48ePa8aMGXr88cfVo0cPxcXFqXbt2srIyNCoUaMknXt7dd26dbruuutCb2dkZCgvL0+9evVScnKydu7cqbZt2+qtt95Senq67r77bknS22+/rZtvvlldunTRgAEDFAwGQx+jbdu2mjt3rnr06KEuXbpo3LhxchxHBQUFysnJ0aZNm9ShQ4cqA5+VlaX8/PzQ22VlZUpJSdH27dvPed8z2/Py8tS1a1c98sgjqqysVF5enrp3766UlBQ9/PDDKi4uliQNGDBAr7322lkfIzs7W8uWLZMkFRQU6J577tE111yjG2+8UUuWLAm938qVK9W7d2917NhRaWlpevbZZ13/OYwZM0apqanq1q2bpk2bpoqKCklSRUWFcnNzlZKSohtuuEGrVq2q9uMANQlBxY/Kxo0bderUKWVmZv5XH2fx4sXKy8vTp59+qlq1akmSNmzYoCVLlujFF1/U8uXLNWfOHM2cOVMff/yxOnXqpOHDh5/1MVauXKm3335bf//73/Xuu+/qww8/VJs2bTRu3DglJydr48aNVd6GvuWWW7RgwYLQ26tWrVLTpk3Vvn37KrcWFhbq6NGjWrFihSZMmKBXX31Vy5cv12uvvaYPP/xQCQkJGj9+vCSpV69eWrRoUejXfvXVV9q7d6/S09P17bffqn///srKytJHH32kp59+WuPGjdOXX34pSapXr55yc3P16aefas6cOZo7d66WL19e5aZRo0bJ7/dr2bJlmj9/vtauXau33npLkvTmm29qxYoVmj9/vubNm6f33nvvfP+xAFFFUPGjUlxcrAYNGvzXtz379eun5s2bq27duqFjgwcPVlxcnOrWrau//vWvGjhwoNq0aSO/368HHnhA27dvP+sq9b777lN8fLxatGihlJQUffHFF+d17uzsbK1atUolJSWSpAULFig7O7va94+JidGQIUMUGxurunXr6o033tDQoUPVrFkzxcbGatCgQVq6dKnKy8vVvXt3ffHFF6GdCxcuVGZmpmJjY7Vy5UoFAgHdfvvt8vv9uvLKK3XjjTdq6dKlkqSUlBS1bdtWMTExateunX71q19p/fr15+wpLCzU6tWrNWbMGMXFxalRo0b6/e9/r8WLF0uS3n33Xd19991q3ry5EhMTdf/995/X5wWINl5MwY9KYmKiioqK/uvXEps3b37OsWbNmoUe7927V5MmTVJubm7omOM4OnDggAKBgCSpSZMmoefq1aun0tLS8zp3UlKSOnbsqKVLlyozM1OrV6/W2LFjq33/Bg0aqE6dOmdte+ihhxQT839/n46JidHhw4eVlJSktLQ0LV68WAMHDtTixYs1YcIESVIwGNSWLVvOug1dUVERivnmzZs1depUffnllyorK9Pp06d10003nbNn7969Ki8vV2pqauhYZWVl6HN68ODBsz6/LVq0OK/PCxBtBBU/Kh06dFCdOnW0fPnyKv9jL30Xt5MnT4beLiwsPOd9fD6f67HmzZvrgQcecL1yrE5VH/vf3XrrrXrrrbdUUVGh5ORkJSUlnffHa9asmSZNmqROnTpV+f5ZWVmaOXOmunTpopMnTyolJUXSd7+nLl266OWXX67y1w0fPlx9+/bVCy+8oDp16ujJJ59UUVHROe935sr4k08+qfIvNU2aNNG+fftCb3//MVCTccsXPyoXX3yxhgwZovHjx2v58uU6ceKEysrKtGrVKk2ZMkWS1L59e61atUrFxcU6dOiQXnnllQs+z5133qm8vLzQ64vHjx/Xu+++e16/tlGjRjpw4IBOnz5d7ft0795d27Zt06uvvqrevXtf0LY+ffromWeeCd3WPXLkyFmvdaalpWnv3r2aMWOGevbsGbqSTU9P1zfffKP58+errKxMZWVl2rJliwoKCiRJpaWlSkhIUJ06dbRly5azXov9vqZNm6pr166aPHmySkpKVFlZqV27doVuD998883685//rP379+vo0aPKy8u7oN8fEC0EFT8699xzj0aPHq3Zs2fr2muvVXp6ul5//XV1795d0ndf9NOuXTtlZGSof//+6tmz5wWfIzMzU/fee6+GDRumjh07KisrS6tXrz6vX/uLX/xCl112mVJTU0NXh/+ubt266tGjh/bs2XPBX2D1u9/9LvR769Chg+644w5t2bIl9HxsbKwyMzP10UcfKSsrK3T8oosu0osvvqglS5aoW7duSk1N1dSpU0Phz8nJ0YwZM9ShQwfNmjVLN998c7UbpkyZorKyMvXs2VNdunTRkCFDdOjQIUnSHXfcodTUVN1yyy269dZb1aNHjwv6/QHR4uN/MA5408yZM/XNN99o6tSp0Z4CQFyhAp5UXFysefPm6Te/+U20pwD4XwQV8Jg333xT6enp6tatm7p06RLtOQD+F7d8AQAwwBUqAAAGIvp9qGe+oR0AAK/6/k88+76I/2CH6obUJGfC74Wtkrf2hrbu3RvlJecn8L8/pcdTn1sPbJW8tddLWyVv7fXSVsn9wpBbvgAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABjwn887FRUVaf/+/ZKkZs2aqUGDBmEdBQCA17gGddeuXXrssce0bds2NW3aVJJ08OBBXXHFFRo3bpxatWoViY0AANR4rkEdOXKk7rrrLr388suKifnu7nBlZaUWLlyoUaNG6Y033ojISAAAajrX11CLi4uVnZ0diqkkxcTE6JZbbtHRo0fDPg4AAK9wDWpiYqIWLVokx3FCxxzH0YIFCxQfHx/2cQAAeIXrLd/JkycrJydH48ePV1JSkiTpwIEDateunSZPnhyRgQAAeIFrUFu1aqVXXnlFR44c0b59+yRJzZs3V8OGDSMyDgAArzivb5tp2LAhEQUAwAU/2AEAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQV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CgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIAB16CuXbs29Pj48eP64x//qO7du2vw4MEqLCwM+zgAALzCNahTp04NPZ42bZrq16+v2bNn69JLL9XEiRPDPg4AAK/wuz3pOE7o8Weffaa3335btWvX1uWXX65evXqFfRwAAF7hGtTTp0+roKBAjuPI5/Opdu3aoediYnj5FQCAM1yDevLkSQ0cODB0pXrgwAElJSWppKSEoAIA8D2uQc3Pz6/yeK1atTRjxoywDAIAwIv+o8vMevXqqWXLltZbAADwLO7bAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYMDnOI4TqZMFAoFInQoAgLAIBoNVHucKFQAAA/5In7C6stckZ66kvbBV8tZeL22VvLXXS1slb+310lbJW3u9tFVyv9PKFSoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGLiiopaWl+uc//6mSkpJw7QEAwJNcg/r444/ryJEjkqTPPvtMmZmZGjlypDIzM7VmzZqIDAQAwAv8bk9u2rRJDRs2lCRNnz5dzz//vK6++mrt2LFDw4cPV2pqakRGAgBQ07leoZ46dSr0uLS0VFdffbUkqXXr1iorKwvvMgAAPMQ1qNdee60mT56sEydOKCUlRUuWLJEkrV27VomJiZHYBwCAJ7gGdcyYMSovL9d1112n999/X8OGDdNVV12ll156SZMmTYrURgAAajzX11BjY2P16KOPatiwYdq1a5cqKirUokULNWjQIFL7AADwBNegnhEXF6d27dqFewsAAJ7FD3YAAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAgM9xHCdSJwsEApE6FQAAYREMBqs8zhUqAAAG/JE+YXVlr0nOXEl7Yavkrb1e2ip5a6+Xtkre2uulrZK39nppq+R+p5UrVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBU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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"Enter row to guess: 1\n",
"Enter column to guess: 3\n"
]
},
{
"data": {
"image/png": "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CCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGggZ13bp1gcfHjx/XH//4R/Xo0UNDhgxRUVFRyMcBAOAWQYM6bdq0wOPp06erfv36mjNnji699FJNmjQp5OMAAHALb7AnHccJPP7000/11ltvqXbt2rr88svVu3fvkI8DAMAtggb19OnTKigokOM48ng8ql27duC5mBhefgUA4IygQT158qQGDRoUuFI9cOCAkpKSVFpaSlABAPiOoEHNz8+v9nitWrU0c+bMkAwCAMCN/qvLzHr16qlly5bWWwAAcC3u2wIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGDA4ziOE66T+Xy+cJ0KAICQ8Pv91R7nChUAAAPecJ+wprJHkzNX0m7YKrlrr5u2Su7a66atkrv2ummr5K69btoqBb/TyhUqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABi4oqGVlZfrnP/+p0tLSUO0BAMCVggb1scce05EjRyRJn376qTIzMzVq1ChlZmZq7dq1YRkIAIAbeIM9uXnzZjVs2FCSNGPGDD333HO6+uqrtXPnTo0YMUKpqalhGQkAQLQLeoV66tSpwOOysjJdffXVkqTWrVurvLw8tMsAAHCRoEG99tprNWXKFJ04cUIpKSlaunSpJGndunVKTEwMxz4AAFwhaFDHjh2riooKde/eXe+9956GDx+uq666Si+++KImT54cro0AAES9oK+hxsbG6pFHHtHw4cO1e/duVVZWqkWLFmrQoEG49gEA4ApBg3pGXFyc2rVrF+otAAC4Fj/YAQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMex3GccJ3M5/OF61QAAISE3++v9jhXqAAAGPCG+4Q1lT2anLmSdsNWyV173bRVctdeN22V3LXXTVsld+1101Yp+J1WrlABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwEDSoKSkpmjRpknbs2BGuPQAAuFLQoNavX18xMTEaMGCAbrnlFr366qs6evRouLYBAOAaQYOakJCgsWPHas2aNbrvvvu0Zs0apaena9iwYVq3bl24NgIAEPXO6zXU2rVr68Ybb1ReXp6WLVumtm3bauLEiaHeBgCAawQNquM45xxr2rSp7r//fr377rshGwUAgNsEDers2bPDtQMAAFcLGlSfzxeuHQAAuBrfhwoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABj+M4TrhOxv9fFQDgdn6/v9rjXKECAGDAG+4T1lT2aHLmStoNWyV37XXTVslde920VXLXXjdtldy1101bpeB3WrlCBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwMAFBfXEiRPatm2bjh07Fqo9AAC4UtCgvvfee+rYsaNuvPFGbdmyRb169dKoUaOUmZmp/Pz8cG0EACDqeYM9OWvWLM2bN0/Hjh3ToEGD9Oyzz6pjx44qKCjQiBEjlJGREa6dAABEtaBB9Xg8atu2rSSpfv366tixoySpTZs2oV8GAICLBL3l6/F4VFBQoE2bNumbb77R5s2bJUk7d+5UZWVlOPYBAOAKQa9Qhw4dqr59+yomJkbTp0/XjBkzdOjQIe3fv1+PP/54mCYCABD9ggb1uuuu04YNGwJvX3PNNdqxY4eaNWumxo0bh3wcAABuETSo/6lWrVq66qqrQrUFAADX4gc7AABggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYMDjOI4TrpP5fL5wnQoAgJDw+/3VHucKFQAAA95wn7CmskeTM1fSbtgquWuvm7ZK7trrpq2Su/a6aavkrr1u2ioFv9PKFSoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABrzn804lJSXat2+fvF6vWrZsqbp164Z6FwAArhI0qH6/Xzk5OVq7dq08Ho/i4+N18uRJ9e3bV8OHD1dsbGy4dgIAENWC3vIdM2aMsrOztX79eo0dO1a//e1vlZ+fr+PHj+vJJ58M10YAAKJe0KAePXpU2dnZSkhIUP/+/bVmzRo1atRIEydO1Lp168K1EQCAqBc0qF6vV7t375Ykbdu2LXCLNyYmRl7veb38CgDAj0LQKg4dOlS33367mjRpokOHDmn69OmSpKKiInXs2DEsAwEAcIOgQU1PT9fy5cu1a9cutW7dWhdddJEkqXHjxpo0aVJYBgIA4Abfe982Pj5eP/vZz8KxBQAA1+IHOwAAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGDA4ziOE66T+Xy+cJ0KAICQ8Pv91R4Pa1ABAPhfxS1fAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMeCM94IfYuXOnxowZo5KSEiUmJio3N1etWrWK9Kxq5ebmatmyZfL7/Vq0aJEuv/zySE+qUXFxsUaNGqXdu3crNjZWl1xyiSZMmKCGDRtGelq1HnjgAe3du1cxMTGKi4vTo48+qvbt20d6VlCzZs3SM888E/V/FjIyMhQbG6s6depIkkaOHKlu3bpFeFXNTp06pcmTJ+ujjz5SnTp1lJycrIkTJ0Z61jn27t2rBx98MPD28ePHVVpaqg0bNkRwVXArV67UjBkz5DiOqqqqNGTIEPXs2TPSs6q1atUqzZgxQxUVFUpISNCTTz6pli1bhv7Ejov179/fWbBggeM4jrNgwQKnf//+EV5Us40bNzqFhYXOdddd5/zrX/+K9JygiouLnY8//jjw9pQpU5yHH344gouCO3bsWODxe++95/Tp0yeCa77ftm3bnIEDBzrp6elR/2fBDX9ev2vixInOE0884VRVVTmO4ziHDh2K8KLzM2nSJGf8+PGRnlGjqqoqp3PnzoE/Czt27HCSk5OdysrKCC87V0lJiXPNNdc4X331leM437ZhwIABYTm3a2/5Hj58WNu3b1dWVpYkKSsrS9u3b9eRI0civKx6nTt3VvPmzSM947wkJiYqJSUl8HZycrIKCwsjuCi4iy++OPC4tLRUHo8ngmuCO336tCZMmKCcnJyo3ulGZWVlWrBggR566KHA57Zx48YRXvX9Tp8+rUWLFum2226L9JSgYmJidPz4cUnfXlE3bdpUMTHRl5Bdu3apcePGat26tSQpLS1Na9euDUsbXHvLd9++fUpKSlKtWrUkSbVq1VLTpk21b9++qL016UZVVVWaN2+eMjIyIj0lqHHjxmndunVyHEfPP/98pOfUaMaMGcrOzg7P7ScjI0eOlOM46tSpk4YPH674+PhIT6rWnj17lJiYqFmzZmn9+vWqX7++HnroIXXu3DnS04LKz89XUlKSrrzyykhPqZHH49HTTz+tBx54QHFxcSorK9PcuXMjPatarVu3VlFRkbZu3aqrr75aixYtkqSwtCH6/nqBqDJx4kTFxcWpX79+kZ4S1BNPPKFVq1Zp2LBhmjp1aqTnVGvTpk36xz/+oTvvvDPSU87ba6+9poULF2r+/PlyHEcTJkyI9KQaVVRUaM+ePbriiiv09ttva+TIkRoyZIhKS0sjPS2o+fPnR/3VaUVFhebOnas5c+Zo5cqVevbZZzVs2DCVlZVFeto5Lr74Yk2fPl1PPvmkbr31Vh0+fFjx8fHyekN//ejaoDZv3lwHDhxQZWWlJKmyslIHDx50zW1VN8jNzdWuXbv09NNPR+Wtner06dNH69evV3FxcaSnnGPjxo366quvdP311ysjI0P79+/XwIEDtXbt2khPq9GZf59iY2N155136rPPPovwopq1aNFCXq838DLQz3/+czVo0EA7d+6M8LKaHThwQBs3blTv3r0jPSWoHTt26ODBg+rUqZMkqVOnTqpXr54KCgoivKx6v/zlLzVv3jy9/fbb6tevn06ePBmWu0Lu+K9kNRo1aqT27dtr8eLFkqTFixerffv23O41Mn36dG3btk2zZ89WbGxspOfUqKysTPv27Qu8nZ+fr4SEBCUmJkZuVA0GDRqktWvXKj8/X/n5+WrWrJleeOEFpaamRnpatb755pvAa2aO42jp0qVR/dXTDRs2VEpKitatWyfp2+8COHz4sC655JIIL6vZ3/72N6WlpalBgwaRnhJUs2bNtH//fn311VeSpIKCAhUVFemnP/1phJdV79ChQ5K+fcnqqaee0h133KG4uLiQn9fjOI4T8rOESEFBgcaMGaNjx44pPj5eubm5uvTSSyM9q1qTJk3S8uXLVVRUpAYNGigxMVFLliyJ9KxqffHFF8rKylKrVq1Ut25dSdJPfvITzZ49O8LLzlVUVKQHHnhAJ06cUExMjBISEjR69Oiofj3qjIyMDD333HNR+20ze/bs0ZAhQ1RZWamqqiq1adNGjzzyiJo2bRrpaTXas2ePxo4dq5KSEnm9Xv3hD39QWlpapGfV6IYbbtC4cePUvXv3SE/5XgsXLtSf/vSnwBd8DR06VD169IjwquqNGzdOn332mcrLy9W1a1eNHTs28K1foeTqoAIAEC1ce8sXAIBoQlABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAw8H8Abmn7uJLk7QAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"Enter row to guess: 0\n",
"Enter column to guess: 2\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHkCAYAAACHXd7BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgW0lEQVR4nO3daXRUhf2H8e+EIUDQJKwBplQQj4BaGzZTSyAxElQaImqPFQu1gqJHActSQFAji0g4HBEElNTlaLXUBUvZFMSwCCqgspSCPRqRZcIWSIBEliz3/8IyfynJCPU3y63P51VyJ8n9EqMP904SPY7jOAIAAD9ITKQHAADwv4CgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIuMGbMGE2fPj3SM/5re/fuVdu2bVVRURHW9wXCiaDiR2nRokW69dZb1aFDB6Wmpuqee+7RJ598EulZkqS3335bffv2jfQMABfIG+kBQLi99NJLysvL0/jx45WamqratWvrgw8+0Pvvv6/OnTtf0MeqqKiQ1+v93mPRIpq3AW7HFSp+VI4fP66ZM2fqscceU8+ePRUXF6fatWsrIyNDo0ePlnTu7dX169ere/fugdczMjKUl5en3r17Kzk5Wbt27VLbtm315ptvKj09XXfddZck6a233tJNN92kLl26aODAgfL7/YGP0bZtW82bN089e/ZUly5dNH78eDmOo4KCAuXk5Gjz5s3q0KFDtYHPyspSfn5+4PXy8nKlpKRox44d57ztme15eXnq2rWrHn74YVVVVSkvL089evRQSkqKHnroIZWUlEiSBg4cqFdfffWsj5Gdna3ly5dLkgoKCnT33Xfrmmuu0Q033KClS5cG3m7VqlXq06ePOnbsqLS0ND3zzDNB/zmMHTtWqamp6tatm6ZPn67KykpJUmVlpXJzc5WSkqLrr79eq1evrvHjANGEoOJHZdOmTTp16pQyMzN/0MdZsmSJ8vLy9Mknn6hWrVqSpI0bN2rp0qV64YUXtGLFCs2dO1ezZs3SRx99pE6dOmnEiBFnfYxVq1bprbfe0t///ne98847+uCDD9SmTRuNHz9eycnJ2rRpU7W3oW+++WYtXLgw8Prq1avVtGlTtW/fvtqtRUVFOnr0qFauXKmJEyfqlVde0YoVK/Tqq6/qgw8+UEJCgiZMmCBJ6t27txYvXhx43y+//FKFhYVKT0/XN998owEDBigrK0sffvihnnrqKY0fP15ffPGFJKlevXrKzc3VJ598orlz52revHlasWJFtZtGjx4tr9er5cuXa8GCBVq3bp3efPNNSdIbb7yhlStXasGCBZo/f77efffd8/3HAkQUQcWPSklJiRo0aPCDb3v2799fzZs3V926dQPHhgwZori4ONWtW1d//etfNWjQILVp00Zer1f333+/duzYcdZV6r333qv4+Hi1aNFCKSkp+vzzz8/r3NnZ2Vq9erVKS0slSQsXLlR2dnaNbx8TE6OhQ4cqNjZWdevW1euvv65hw4apWbNmio2N1eDBg7Vs2TJVVFSoR48e+vzzzwM7Fy1apMzMTMXGxmrVqlXy+Xy67bbb5PV6deWVV+qGG27QsmXLJEkpKSlq27atYmJi1K5dO/3qV7/Shg0bztlTVFSkNWvWaOzYsYqLi1OjRo30+9//XkuWLJEkvfPOO7rrrrvUvHlzJSYm6r777juvzwsQaTyZgh+VxMREFRcX/+DnEps3b37OsWbNmgVeLiws1OTJk5Wbmxs45jiODhw4IJ/PJ0lq0qRJ4LF69eqprKzsvM6dlJSkjh07atmyZcrMzNSaNWs0bty4Gt++QYMGqlOnzlnbHnzwQcXE/P/fp2NiYnT48GElJSUpLS1NS5Ys0aBBg7RkyRJNnDhRkuT3+7V169azbkNXVlYGYr5lyxZNmzZNX3zxhcrLy3X69GndeOON5+wpLCxURUWFUlNTA8eqqqoCn9ODBw+e9flt0aLFeX1egEgjqPhR6dChg+rUqaMVK1ZU+x976du4nTx5MvB6UVHROW/j8XiCHmvevLnuv//+oFeONanuY/+nW265RW+++aYqKyuVnJyspKSk8/54zZo10+TJk9WpU6dq3z4rK0uzZs1Sly5ddPLkSaWkpEj69s/UpUsXvfTSS9W+34gRI9SvXz89//zzqlOnjp544gkVFxef83Znrow//vjjav9S06RJE+3bty/w+ndfBqIZt3zxo3LxxRdr6NChmjBhglasWKETJ06ovLxcq1ev1tSpUyVJ7du31+rVq1VSUqJDhw7p5ZdfvuDz3HHHHcrLyws8v3j8+HG988475/W+jRo10oEDB3T69Oka36ZHjx7avn27XnnlFfXp0+eCtvXt21dPP/104LbukSNHznquMy0tTYWFhZo5c6Z69eoVuJJNT0/X119/rQULFqi8vFzl5eXaunWrCgoKJEllZWVKSEhQnTp1tHXr1rOei/2upk2bqmvXrpoyZYpKS0tVVVWl3bt3B24P33TTTfrzn/+s/fv36+jRo8rLy7ugPx8QKQQVPzp33323xowZozlz5ujaa69Venq6XnvtNfXo0UPSt9/0065dO2VkZGjAgAHq1avXBZ8jMzNT99xzj4YPH66OHTsqKytLa9asOa/3/cUvfqHLLrtMqampgavD/1S3bl317NlTe/fuveBvsPrd734X+LN16NBBt99+u7Zu3Rp4PDY2VpmZmfrwww+VlZUVOH7RRRfphRde0NKlS9WtWzelpqZq2rRpgfDn5ORo5syZ6tChg2bPnq2bbrqpxg1Tp05VeXm5evXqpS5dumjo0KE6dOiQJOn2229Xamqqbr75Zt1yyy3q2bPnBf35gEjx8D8YB9xp1qxZ+vrrrzVt2rRITwEgrlABVyopKdH8+fP1m9/8JtJTAPwbQQVc5o033lB6erq6deumLl26RHoOgH/jli8AAAa4QgUAwEBYfw71zA+0AwDgVt/9jWffFfZf7FDTkGhyJvxu2Cp9Z29hYYSXfD/fv3/rjRu2St/Z64KvBdd+3bpgr5u2Su7a66atUvALQ275AgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYMB7Pm9UXFys/fv3S5KaNWumBg0ahHQUAABuEzSou3fv1qOPPqrt27eradOmkqSDBw/qiiuu0Pjx49WqVatwbAQAIOoFDeqoUaN055136qWXXlJMzLd3h6uqqrRo0SKNHj1ar7/+elhGAgAQ7YI+h1pSUqLs7OxATCUpJiZGN998s44ePRrycQAAuEXQoCYmJmrx4sVyHCdwzHEcLVy4UPHx8SEfBwCAWwS95TtlyhTl5ORowoQJSkpKkiQdOHBA7dq105QpU8IyEAAANwga1FatWunll1/WkSNHtG/fPklS8+bN1bBhw7CMAwDALc7rx2YaNmxIRAEACIJf7AAAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABj+M4TrhO5vP5wnUqAABCwu/3V3ucK1QAAAx4w33CmsoeTc5cSbthq+SuvWe2FhZG/1ZJatHCfZ9bN2yV3LXXTVsld+1101Yp+J1WrlABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADDwXwe1d+/eljsAAHA1b7AHv/zyyxofKy4uNh8DAIBbBQ1qVlaWfD6fHMc557GSkpJQbQIAwHWCBtXn8+kvf/mLkpKSznksLS0tZKMAAHCboM+h9uzZU36/v9rHMjMzQzIIAAA3CnqFOnr06Bofe+SRR8zHAADgVvzYDAAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAY8juM44TqZz+cL16kAAAgJv99f7XGuUAEAMOAN9wlrKns0OXMl7Yatkrv2ummr5K69btoquWuvm7ZK7trrpq1S8DutXKECAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGAgaFCLi4s1btw4DRgwQK+99tpZjw0ZMiSkwwAAcJOgQc3JyVFCQoLuuOMOrVixQoMHD1ZFRYUkac+ePWEZCACAGwQN6q5duzRq1Cj17NlTL774opo0aaL77rtPp06dCtc+AABcIWhQT58+HXjZ4/EoJydHl19+uQYNGkRUAQD4jqBBbdmypTZu3HjWsdGjRys5OVlff/11KHcBAOAq3mAPTp06VR6P55zjw4YNU+/evUM2CgAAtwka1MTExBofu+yyy6y3AADgWvwcKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAY8juM44TqZz+cL16kAAAgJv99f7XGuUAEAMOAN9wlrKns0OXMl7Yatkrv2ummr5K69btoquWuvm7ZK7trrpq1S8DutXKECAGCAoAIAYICgAgBggKACAGCAoAIAYICg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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdin",
"output_type": "stream",
"text": [
"Enter row to guess: 0\n",
"Enter column to guess: 4\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHkCAYAAACHXd7BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgWUlEQVR4nO3daXRUhf2H8e+EIUDQJKwBplQQj4BaGzZTSyAxElQaImqPFQu1gqJHActSQFAji0g4HBEElNTlaLXUBUvZFMSwCCqgspSCPRqRZcIWSIBEliz3/8IyfynJCPU3y63P51VyJ8n9EqMP904SPY7jOAIAAD9ITKQHAADwv4CgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIuMGbMGE2fPj3SM/5re/fuVdu2bVVRURHW9wXCiaDiR2nRokW69dZb1aFDB6Wmpuqee+7RJ598EulZkqS3335bffv2jfQMABfIG+kBQLi99NJLysvL0/jx45WamqratWvrgw8+0Pvvv6/OnTtf0MeqqKiQ1+v93mPRIpq3AW7HFSp+VI4fP66ZM2fqscceU8+ePRUXF6fatWsrIyNDo0ePlnTu7dX169ere/fugdczMjKUl5en3r17Kzk5Wbt27VLbtm315ptvKj09XXfddZck6a233tJNN92kLl26aODAgfL7/YGP0bZtW82bN089e/ZUly5dNH78eDmOo4KCAuXk5Gjz5s3q0KFDtYHPyspSfn5+4PXy8nKlpKRox44d57ztme15eXnq2rWrHn74YVVVVSkvL089evRQSkqKHnroIZWUlEiSBg4cqFdfffWsj5Gdna3ly5dLkgoKCnT33Xfrmmuu0Q033KClS5cG3m7VqlXq06ePOnbsqLS0ND3zzDNB/zmMHTtWqamp6tatm6ZPn67KykpJUmVlpXJzc5WSkqLrr79eq1evrvHjANGEoOJHZdOmTTp16pQyMzN/0MdZsmSJ8vLy9Mknn6hWrVqSpI0bN2rp0qV64YUXtGLFCs2dO1ezZs3SRx99pE6dOmnEiBFnfYxVq1bprbfe0t///ne98847+uCDD9SmTRuNHz9eycnJ2rRpU7W3oW+++WYtXLgw8Prq1avVtGlTtW/fvtqtRUVFOnr0qFauXKmJEyfqlVde0YoVK/Tqq6/qgw8+UEJCgiZMmCBJ6t27txYvXhx43y+//FKFhYVKT0/XN998owEDBigrK0sffvihnnrqKY0fP15ffPGFJKlevXrKzc3VJ598orlz52revHlasWJFtZtGjx4tr9er5cuXa8GCBVq3bp3efPNNSdIbb7yhlStXasGCBZo/f77efffd8/3HAkQUQcWPSklJiRo0aPCDb3v2799fzZs3V926dQPHhgwZori4ONWtW1d//etfNWjQILVp00Zer1f333+/duzYcdZV6r333qv4+Hi1aNFCKSkp+vzzz8/r3NnZ2Vq9erVKS0slSQsXLlR2dnaNbx8TE6OhQ4cqNjZWdevW1euvv65hw4apWbNmio2N1eDBg7Vs2TJVVFSoR48e+vzzzwM7Fy1apMzMTMXGxmrVqlXy+Xy67bbb5PV6deWVV+qGG27QsmXLJEkpKSlq27atYmJi1K5dO/3qV7/Shg0bztlTVFSkNWvWaOzYsYqLi1OjRo30+9//XkuWLJEkvfPOO7rrrrvUvHlzJSYm6r777juvzwsQaTyZgh+VxMREFRcX/+DnEps3b37OsWbNmgVeLiws1OTJk5Wbmxs45jiODhw4IJ/PJ0lq0qRJ4LF69eqprKzsvM6dlJSkjh07atmyZcrMzNSaNWs0bty4Gt++QYMGqlOnzlnbHnzwQcXE/P/fp2NiYnT48GElJSUpLS1NS5Ys0aBBg7RkyRJNnDhRkuT3+7V169azbkNXVlYGYr5lyxZNmzZNX3zxhcrLy3X69GndeOON5+wpLCxURUWFUlNTA8eqqqoCn9ODBw+e9flt0aLFeX1egEgjqPhR6dChg+rUqaMVK1ZU+x976du4nTx5MvB6UVHROW/j8XiCHmvevLnuv//+oFeONanuY/+nW265RW+++aYqKyuVnJyspKSk8/54zZo10+TJk9WpU6dq3z4rK0uzZs1Sly5ddPLkSaWkpEj69s/UpUsXvfTSS9W+34gRI9SvXz89//zzqlOnjp544gkVFxef83Znrow//vjjav9S06RJE+3bty/w+ndfBqIZt3zxo3LxxRdr6NChmjBhglasWKETJ06ovLxcq1ev1tSpUyVJ7du31+rVq1VSUqJDhw7p5ZdfvuDz3HHHHcrLyws8v3j8+HG988475/W+jRo10oEDB3T69Oka36ZHjx7avn27XnnlFfXp0+eCtvXt21dPP/104LbukSNHznquMy0tTYWFhZo5c6Z6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AMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMBA0KCuW7cu8PLx48f1xz/+UT169NCQIUNUVFQU8nEAALhF0KBOmzYt8PL06dNVv359zZkzR5deeqkmTZoU8nEAALiFN9iDjuMEXv7000/11ltvqXbt2rr88svVu3fvkI8DAMAtggb19OnTKigokOM48ng8ql27duCxmBiefgUA4IygQT158qQGDRoUuFI9cOCAkpKSVFpaSlABAPiOoEHNz8+v9nitWrU0c+bMkAwCAMCN/qvLzHr16qlly5bWWwAAcC3u2wIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGDA4ziOE66T+Xy+cJ0KAICQ8Pv91R7nChUAAAPecJ+wprJHkzNX0m7YKrlrr5u2Su7a66atkrv2ummr5K69btoqBb/TyhUqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABi4oqGVlZfrnP/+p0tLSUO0BAMCVggb1scce05EjRyRJn376qTIzMzVq1ChlZmZq7dq1YRkIAIAbeIM9uHnzZjVs2FCSNGPGDD333HO6+uqrtXPnTo0YMUKpqalhGQkAQLQLeoV66tSpwMtlZWW6+uqrJUmtW7dWeXl5aJcBAOAiQYN67bXXasqUKTpx4oRSUlK0dOlSSdK6deuUmJgYjn0AALhC0KCOHTtWFRUV6t69u9577z0NHz5cV111lV588UVNnjw5XBsBAIh6QZ9DjY2N1SOPPKLhw4dr9+7dqqysVIsWLdSgQYNw7QMAwBWCBvWMuLg4tWvXLtRbAABwLX6xAwAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAY8juM44TqZz+cL16kAAAgJv99f7XGuUAEAMOAN9wlrKns0OXMl7Yatkrv2ummr5K69btoquWuvm7ZK7trrpq1S8DutXKECAGCAoAIAYICgAgBggKACAGCAoAIAYICg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1vbt25WVlSVJysrK0vbt23XkyJEIL6te586d1bx580jPOC+JiYlKSUkJvJ6cnKzCwsIILgru4osvDrxcWloqj8cTwTXBnT59WhMmTFBOTk5U73SjsrIyLViwQA899FDgc9u4ceMIr/p+p0+f1qJFi3TbbbdFekpQMTExOn78uKRvr6ibNm2qmJjoS8iuXbvUuHFjtW7dWpKUlpamtWvXhqUNrr3lu2/fPiUlJalWrVqSpFq1aqlp06bat29f1N6adKOqqirNmzdPGRkZkZ4S1Lhx47Ru3To5jqPnn38+0nNqNGPGDGVnZ4fn9pORkSNHynEcderUScOHD1d8fHykJ1Vrz549SkxM1KxZs7R+/XrVr19fDz30kDp37hzpaUHl5+crKSlJV155ZaSn1Mjj8ejpp5/WAw88oLi4OJWVlWnu3LmRnlWt1q1bq6ioSFu3btXVV1+tRYsWSVJY2hB9f71AVJk4caLi4uLUr1+/SE8J6oknntCqVas0bNgwTZ06NdJzqrVp0yb94x//0J133hnpKefttdde08KFCzV//nw5jqMJEyZEelKNKioqtGfPHl1xxRV6++23NXLkSA0ZMkSlpaWRnhbU/Pnzo/7qtKKiQnPnztWcOXO0cuVKPfvssxo2bJjKysoiPe0cF198saZPn64nn3xSt956qw4fPqz4+Hh5vaG/fnRtUJs3b64DBw6osrJSklRZWamDBw+65raqG+Tm5mrXrl16+umno/LWTnX69Omj9evXq7i4ONJTzrFx40Z99dVXuv7665WRkaH9+/dr4MCBWrt2baSn1ejMv0+xsbG688479dlnn0V4Uc1atGghr9cbeBro5z//uRo0aKCdO3dGeFnNDhw4oI0bN6p3796RnhLUjh07dPDgQXXq1EmS1KlTJ9WrV08FBQURXla9X/7yl5o3b57efvtt9evXTydPngzLXSF3/FeyGo0aNVL79u21ePFiSdLixYvVvn17bvcamT59urZt26bZs2crNjY20nNqVFZWpn379gVez8/PV0JCghITEyM3qgaDBg3S2rVrlZ+fr/z8fDVr1kwvvPCCUlNTIz2tWt98803gOTPHcbR06dKo/u7phg0bKiUlRevWrZP07U8BHD58WJdcckmEl9Xsb3/7m9LS0tSgQYNITwmqWbNm2r9/v7766itJUkFBgYqKivTTn/40wsuqd+jQIUnfPmX11FNP6Y477lBcXFzIz+txHMcJ+VlCpKCgQGPGjNGxY8cUHx+v3NxcXXrppZGeVa1JkyZp+fLlKioqUoMGDZSYmKglS5ZEela1vvjiC2VlZalVq1aqW7euJOknP/mJZs+eHeFl5yoqKtIDDzygEydOKCYmRgkJCRo9enRUPx91RkZGhp577rmo/bGZPXv2aMiQIaqsrFRVVZXatGmjRx55RE2bNo30tBrt2bNHY8eOVUlJibxer/7whz8oLS0t0rNqdMMNN2jcuHHq3r17pKd8r4ULF+pPf/pT4Bu+hg4dqh49ekR4VfXGjRunzz77TOXl5eratavGjh0b+NGvUHJ1UAEAiBauveULAEA0IagAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAY+D8C/mn7ifjFEAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Game ended\n"
]
}
],
"source": [
"try:\n",
" play(ships, ManualStrategy())\n",
"except KeyboardInterrupt:\n",
" print(\"Game ended\")"
]
},
{
"cell_type": "markdown",
"id": "6e567320",
"metadata": {},
"source": [
"This strategy is not really useful for our purposes, but it provides a good illustration of how the game is usually played. The white squares here indicate the cells whose contents are unknown because we have not yet guessed them."
]
},
{
"cell_type": "markdown",
"id": "52b6fa13",
"metadata": {},
"source": [
"### Row with one ship\n",
"\n",
"We begin by simplifying the idea of Battleship to the most basic possible setting of a single row containing a single ship.\n",
"\n",
"The following function generates all possible rows of a given length containing a ship of a given size."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "f64a6df6",
"metadata": {},
"outputs": [],
"source": [
"def get_all_ship_rows(grid_length, ship_size):\n",
" i, j = np.indices((grid_length, grid_length))[:, :-ship_size + 1]\n",
" \n",
" return 1 * (i <= j) & (j < i + ship_size)"
]
},
{
"cell_type": "markdown",
"id": "401e1edb",
"metadata": {},
"source": [
"For a row of length three and a ship of size two (3/2), there are only two such rows."
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "2b2970d6",
"metadata": {},
"outputs": [],
"source": [
"all_rows_3_2 = get_all_ship_rows(3, 2)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "60a8f8df",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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BBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACkz8X560d+/ePPvss0mSd77znTnjjDNGdSgAGO9GDPDTTz+dr3/969m6dWumT5+eJNm9e3fe85735Lbbbsvs2bPHYkYAGHdGDPBNN92UJUuW5Ac/+EEmTDh0tvrgwYNZt25dvvKVr+Tee+8dkyEBYLwZ8Rrwvn37csUVVwzHN0kmTJiQK6+8Mvv37x/14QBgvBoxwG1tbVm/fn2azebwnzWbzTzwwAM5/fTTR304ABivRjwFfccdd+SWW27JN7/5zcyYMSNJMjg4mPPOOy933HHHmAwIAOPRiAGePXt2fvjDH+b555/Prl27kiQzZ87M1KlTx2Q4ABiv/qfbkKZOnSq6AHAC+SIOACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0ABAQaAAgIMAAUEGAAKCDAAFBBgACggwABQQIABoIAAA0CBlmaz2RyrjTUajbHaFACU6+/vP+oyR8AAUGDiWG9wYODo7wbgWLS3Hzqj0j8wUDwJ40GjvT2J1xMnzr9fU0fjCBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgALHHeCenp4TOQcAvKFMHGnhX//616Mu27t37wkfBgDeKEYMcHd3dxqNRprN5mHL9u3bN1ozAcC4N2KAG41GfvSjH2XGjBmHLZs/f/6oDQUA492I14AXLVqU/v7+Iy5buHDhqAwEAG8ELc0jnV8eJY1GIwMDRw46HKv29kaSpH9goHgSxoNGe3sSrydOnEZ7+1EPYhO3IQFACQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaCAAANAAQEGgAICDAAFBBgACrQ0m83mWG2s0WiM1aYAoFx/f/9Rl41pgAGAQ5yCBoACAgwABQQYAAoIMAAUEGAAKCDAAFBAgAGggAADQAEBBoACAnwS+fvf/55rrrkml19+ea655pps3769eiROcStWrMiCBQty7rnn5s9//nP1OJzi9u7dm+uvvz6XX355enp6snTp0jz//PPVY52yBPgkcsstt2TJkiV56KGHsmTJknzjG9+oHolT3Ac/+MGsXr3a97BzQrS0tOS6667LQw89lHXr1uXMM8/Mt7/97eqxTlkCfJJ47rnnsnXr1nR3dydJuru7s3XrVu8ueV06Ozszc+bM6jEYJ9ra2nLxxRcPP77ooosyMDBQONGpTYBPErt27cqMGTPS2tqaJGltbc306dOza9eu4skADnfw4MGsWbMmCxYsqB7llCXAAByz22+/PW9961tz7bXXVo9yyppYPQCHzJw5M4ODgxkaGkpra2uGhoaye/dupw+Bk86KFSuyY8eO3HPPPZkwwXHc8fIvd5J4+9vfnvPPPz/r169Pkqxfvz7nn39+pk6dWjwZwH/ceeedefLJJ7Nq1apMmjSpepxTWkuz2WxWD8Ehf/vb37J8+fK88MILOf3007NixYq8613vqh6LU9i3vvWt/OxnP8uePXtyxhlnpK2tLRs2bKgei1PUX/7yl3R3d2f27NmZPHlykmTWrFlZtWpV8WSnJgEGgAJOQQNAAQEGgAICDAAFBBgACggwABQQYAAoIMAAUECAAaDA/wEnMP3OW/Oj3QAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(all_rows_3_2)\n",
"ax.set_title(\"All rows 3/2\");"
]
},
{
"cell_type": "markdown",
"id": "16076073",
"metadata": {},
"source": [
"For a row of length ten and a ship of size four (10/4), there are seven such rows."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "9537dba6",
"metadata": {},
"outputs": [],
"source": [
"all_rows_10_4 = get_all_ship_rows(10, 4)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "7e668dec",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(all_rows_10_4)\n",
"ax.set_title(\"All rows 10/4\");"
]
},
{
"cell_type": "markdown",
"id": "6d91c2cb",
"metadata": {},
"source": [
"We will compare our Bayesian strategies to several benchmark strategies, starting with the simplest possible strategy: random guessing."
]
},
{
"cell_type": "markdown",
"id": "b3c76623",
"metadata": {},
"source": [
"#### Random guessing\n",
"\n",
"The random guessing approach to Battleship is equivalent to the following urn problem from classic probability theory. Imagine an urn containing 100 balls (corresponding to cells on the board), 17 of which are red (corresponding to cells covered by ships), and 83 of which are blue. The number of turns required to solve Battleship through random guessing has the same distribution as the number of balls of any color that are drawn before all 17 red balls have been drawn. It is well known (in the right circles, at least) that this corresponds to the [negative hypergeometric distribution](https://en.wikipedia.org/wiki/Negative_hypergeometric_distribution).\n",
"\n",
"<center>\n",
"<figure>\n",
" <img src=\"https://austinrochford.com/resources/battleship_files/neg_hyp_geo.png\" width=500>\n",
" <caption>Original image credit <a href=\"https://www.johndcook.com/blog/distribution_chart/\">John D. Cook</a></caption>\n",
"</figure>\n",
"</center>\n",
"\n",
"The following function returns the probability mass function (pmf) of the appropriate negative hypergeometric distribution given a grid and ship size."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "d4a38018",
"metadata": {},
"outputs": [],
"source": [
"def get_random_guess_dist(grid_size, ship_size, n_hit=None):\n",
" if n_hit is None:\n",
" n_hit = ship_size\n",
"\n",
" support = np.arange(ship_size, grid_size + 1)\n",
" nhg = stats.nhypergeom(grid_size,\n",
" grid_size - ship_size,\n",
" n_hit)\n",
" \n",
" return Pmf(nhg.pmf(support - ship_size), support)"
]
},
{
"cell_type": "markdown",
"id": "0e8502f0",
"metadata": {},
"source": [
"We see, unsurprisingly, that random guessing will usually take near the maximum number of turns to solve the game."
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "a6f71abe",
"metadata": {},
"outputs": [],
"source": [
"std_random_pmf = get_random_guess_dist(GRID_LENGTH**2, SHIP_SIZES.sum())"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "3c07bd52",
"metadata": {},
"outputs": [],
"source": [
"def plot_turn_dist(pmf, kind='bar', mean=False, ax=None, mean_kwargs=None, **kwargs):\n",
" if ax is None:\n",
" _, ax = plt.subplots()\n",
" \n",
" if kind == 'bar':\n",
" # pandas barplot uses odd indexing, making it hard to\n",
" # mix bar and line plots if we use pandas's versions\n",
" kwargs.setdefault('width', 1)\n",
" kwargs.setdefault('alpha', 0.75)\n",
"\n",
" ax.bar(pmf.index, pmf, **kwargs)\n",
" elif kind == 'line':\n",
" pmf.plot(ax=ax, **kwargs)\n",
" else:\n",
" raise ValueError(\"kind must be one of 'bar' or 'line'\") \n",
" \n",
" if mean:\n",
" if mean_kwargs is None:\n",
" mean_kwargs = {}\n",
" \n",
" mean_kwargs.setdefault('ls', '--')\n",
" \n",
" ax.axvline(pmf.mean(), **mean_kwargs);\n",
" \n",
" ax.xaxis.grid(False)\n",
" ax.set_xlabel(\"Turns\")\n",
" \n",
" return ax"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "cfd7299e",
"metadata": {},
"outputs": [],
"source": [
"def make_pct_yaxis(ax):\n",
" ax.yaxis.set_major_formatter(pct_formatter)\n",
" ax.set_ylabel(\"Probability\")\n",
" \n",
" return ax"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "e79f2dd1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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3bsHT09PfP311wgICMCIESMQGxuL+t81d+7cwbx58zB8+HCMHDkSr732mj5ui6hbYNcDERmEvXv34pNPPoGHh4cmITh58iQSEhJQXl6OGTNmYMKECXjyySfx0UcfYfTo0fjiiy9QU1ODpKQkPUdP1HWxRYGIDMLTTz+N/v37w8TEBFKpFAAQGRmJXr16wcXFBSNHjsS1a9cAACYmJsjKykJeXh7MzMwgk8n0GTpRl8ZEgYgMQlPb4jo4OGge9+jRAxUVFQCAv/71rxAEAbNmzcK0adOQkJCgsziJuht2PRBRp+vRoweqqqo0zwsKChqVqd+hsDUcHBywdu1aAMCFCxcwf/58jBgxAv369et4sETUAFsUiKjTeXl54fz588jKykJZWRm2b9/eofq+//575OTkAACsra0hEok4S4Kok7BFgYg63ejRozF16lQEBwfD1tYWkZGROH78eLvrS0pKwvr161FeXg57e3usXr0abm5uWoyYiOpxHQUiIiJqFtvqiIiIqFlMFIiIiKhZTBSIiIioWUwUiIiIqFlMFIiIiKhZTBSIiIioWUwUiIiIqFlMFIiIiKhZTBSIiIioWf8fbxzSCJeZYo4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"std_turn_ax = plot_turn_dist(std_random_pmf, kind='line', mean=True)\n",
" \n",
"make_pct_yaxis(std_turn_ax);\n",
"std_turn_ax.set_title(\"Random guessing\\nStandard Battleship\");"
]
},
{
"cell_type": "markdown",
"id": "1074924a",
"metadata": {},
"source": [
"The dashed vertical line shows the expected number of turns to solve Battleship by randomly guessing,"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "98a69104",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"95.38888888888883"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"std_random_pmf.mean()"
]
},
{
"cell_type": "markdown",
"id": "83eb62dd",
"metadata": {},
"source": [
"Returning the the case of a row with a single ship, we visualize the turn distribution of random guessin strategies for various row lengths and a ship of size two."
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "c9c13923",
"metadata": {},
"outputs": [],
"source": [
"RANDOM_ROW_LENGTHS = [4, 5, 8, 10]"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "184538b7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAISCAYAAADbflUoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABXxklEQVR4nO3de1iUdf7/8efMCBaU4pAgHkpz02gTO2Bmu+smIZgh0BbRl0utTNwy0+rrkoSJ46nFdrMwyUPlb1vdrhY2UdDUzNqfWZq2liYdVTxxShBPEOQwvz/8ORthgsLMcA+vx3V5Xcw9933P+zN6v31xH00Oh8OBiIiIiIGZPV2AiIiISHMp0IiIiIjhKdCIiIiI4SnQiIiIiOEp0IiIiIjhKdCIiIiI4SnQiLQhffv2ZeXKlZ4uo1V7++23ue666zxdhohcoHaeLkCkrZgyZQorVqwAwGw207lzZ2699Vb+93//l+DgYA9XJ2cNHz6cwYMHe7oMEblA2kMj4kbh4eF8+OGHfPDBB/z1r3/lyy+/ZNKkSZ4uS37ikksu4YorrvB0GSJygRRoRNzIx8eHzp07ExwczIABA7jvvvvYsWMHJ0+edM4zb9487rzzTvr378/vf/97pk2bxokTJ5zvnz0k8umnn3L33XfTv39/7rnnHr744ot6n7VlyxZGjBhBv379GDFiBFu2bGlQz969exk3bhw33ngjN954I4888gj79+9v8Fln1xUWFsbIkSMpLS1l27ZtxMfHc8MNN/Dggw9SWlp63rEfPXqUiRMncsMNN3Dbbbfx4osv8vTTT/Pggw865xk1ahRpaWn1lsvKyiIiIqLetNWrVxMXF0e/fv2IiIjgueeeo6qqyvn+9u3buf/++53jio2NZdOmTc73Fy5cyB133MH111/PrbfeysMPP8wPP/xQb8wX+n1/9NFH9b7vTz75RIf4RNxIgUbEQ0pLS1m3bh0WiwWz+b+bYvv27Zk5cyarV6/mz3/+M5988gmzZs2qt2xdXR0vvPACaWlpvP3223Ts2JEnnniC06dPO9f9yCOPcP3117NixQqmTJnC7Nmz663jhx9+4OGHH6ampoa///3v/P3vf+fUqVOMHTuW2traep+1YMECZs2axZtvvklZWRlPPvkkmZmZTJ8+nX/84x+UlJTw3HPPnXe8qampfP311yxcuJC//e1vlJaWsmHDhgv+3t5++22mT5/OQw89xJo1a8jIyOCjjz4iPT0dALvdzvjx4+nfvz8rVqxgxYoVPP7441x66aUArF+/nsWLF5OWlsb69etZunQpv/vd7877mU35vh999FHCwsJYsWIFzzzzDH/+858veGwi0gwOEXGLp59+2hEaGuq44YYbHGFhYY4+ffo4+vTp4/jzn/983uXWr1/v+PWvf+2w2+0Oh8Ph+Ne//uXo06eP44svvnDOs2PHDkefPn0ce/bscTgcDscLL7zguP322x0//vijc56NGzc6+vTp48jNzXU4HA7HP//5T0dYWJijvLzcOc/333/v6Nevn2PFihX1PqugoMA5z5IlSxx9+vRx7Nq1yzlt6dKljltuueUXx7Bv3z5Hnz59HB999JFzWm1trWPw4MGOBx54wDlt5MiRjmeeeabesgsWLHAMGTLE+XrIkCGOf/zjH/Xm+eSTTxx9+vRxVFZWOiorKx19+vRxbNmy5Zy1LF261BEVFeWora095/v/+te/HKGhofVeN+X7HjJkiOP06dPOef7973/X+75FxLV0UrCIG4WFhZGRkUFNTQ3vvPMOH330UYNzaNavX8/f/vY39u/fz6lTp6irq+PHH3/k+++/d548bDKZuPbaa53LnJ1eXl7O1VdfzZ49e+jXrx/t2v13E7/55pvrfc53331H7969sVqtzmlXXHEFvXr14ttvv3VOM5lM9OnTp948cOaKqZ9Oq6ysxG63Y7FYGoz7u+++A6B///7OaT4+Plx//fWcOnWqsa/NqaKigsOHD/PnP/+ZuXPnOqc7/v8zdvfv309YWBgJCQk8/PDD3Hrrrdxyyy1ERkZy9dVXA3DnnXfyxhtvMGTIEH77299y6623EhkZyWWXXfaLn9vY9/3dd99x/fXX1xv7jTfe2ORxiUjzKdCIuNEll1zCVVddBUCfPn0oLCzEZrM5D9d8/vnnTJo0iXHjxpGSkkKHDh34/PPPefrpp/nxxx+d6zGbzfX+8zSZTMCZQyNw5j/4s9N+Pk9j036+7C99lo+PT4NpZ4PFLznX5/38/Z+v4+xhHfjv+NLS0hg4cGCD5bt06QLArFmzGD16NJs3b2bz5s289NJLPPvss9x///0EBwezdu1atmzZwpYtW3jllVf4y1/+QnZ2NiEhIeesq7Hv+1xja2ysItKydA6NiAdNmDCB3Nxcdu3aBcCnn35Kp06dePLJJ+nfvz+9evWipKTkgtf7q1/9ip07d2K3253TPv300wbzfPfdd1RUVDinHTlyhMLCQn71q19d5Ih+uR6Azz77zDnt9OnT7N69u958gYGBlJWV1ZtWUFDg/PmKK64gJCSEffv2cdVVVzX40759e+e8ffr04aGHHuLVV1/lnnvu4Z///KfzPV9fXwYPHkxKSgp5eXn88MMPF3U+z0/Ht2vXrnrf944dOy56fSJy4RRoRDyod+/e3H777bzwwgsA9OrVi4qKCrKzszl48CC5ubn84x//uOD1JiUlUVFRwbPPPsuePXv4+OOPmTdvXr15RowYgdVq5cknn2T37t188cUXPPnkkwQHBzN8+PAWGd9ZPXv2ZMiQIdhsNj755BO+++47pk2bxsmTJ+vtybjtttv4+OOPWbNmDfv372fx4sVs37693rqeeOIJ/v73v5OVlcU333zD3r172bBhA9OmTQPOHHZ6/vnn2b59O4cPH2bHjh18+umn9O7dG4Ds7Gz++c9/8tVXX3H48GFWrVrFqVOnmhXikpKSKC8vZ/r06ezZs4ctW7Y4v2/tqRFxDx1yEvGwsWPHkpSUxMcff8yQIUN45JFHmDdvHlVVVQwYMICUlBT+93//94LWGRwczMKFC5kzZw5xcXH07NmTtLS0epdIX3LJJbz22ms899xzjBw5EoBbbrmFV199FV9f35YcIgDPPfcc6enpJCcn4+fnx/33389tt91W74qq+Ph4vvnmG2bOnMmPP/7IiBEjGDVqVL1Ln+Pj47nssstYsmQJixYtwmKx0KNHD4YOHQrApZdeyv79+3nqqaeoqKggICCA22+/naeffhqAjh078vrrr/P8889TW1tLjx49mDFjBoMGDbrosQUHB/PKK68wZ84cVqxYQa9evfjTn/5EcnJyvb1GIuI6JkdjB71FRFzAbrdz5513EhERwZQpUzxdTovbtm0bI0eOZNWqVfVOoBYR19AeGhFxi23btlFeXs51113HqVOn+D//5/9w+PBh7r77bk+X1iL+8Y9/cO211xIUFMSePXuYM2cO/fv3V5gRcRMFGhFxC7vdziuvvMKBAwdo164d11xzDX/729+85j/8oqIiFi9ezJEjR+jcuTO33XYbkydP9nRZIm2GDjmJiIiI4ekqJxERETE8BRoRERExPAUaERERMTwFGhERETE8BRoRERExPAUaERERMTwFGhERETE8BRoRERExPAUaERERMTwFGhERETE8BRoRERExPAUaERERMTwFGhERETE8BRoRERExPAUaERERMTwFGhERETG8dp4uQKS5CgsLGTFiBNHR0fzlL39xTl+4cCFVVVVERETw0ksvsXv3bsxmM7fccgtTp04lKCjIg1WLSEsaNWoUn332Ge3anflvLSgoiHXr1jnfVz/wftpDI4Y3Y8YM+vXr12D6v//9bwYPHsyxY8e477772LhxI++//z7+/v6kpqZ6oFIRcaVp06axY8cOduzYUS/MgPpBW6A9NGJoq1ev5vLLL+fGG29k//79zunHjh2jsLCQG2+8EYvFUm+ZkSNHMnLkSHeXKiIeon7QNmgPjRjWyZMnyczMZMqUKQ3e+/DDDxk0aFCD5gWwbds2rrnmGneUKCJu9Ne//pWBAwdy//33s3XrVud09YO2QXtoxLBefPFF7rnnHkJCQhq898EHHzB48OAG07/66iuysrLIyspyR4ki4iaTJ0+md+/e+Pr6snr1ah555BFWrlzJlVdeqX7QRmgPjRjSl19+yccff8yDDz7Y4L26ujo++uijBg1s//79JCcn88wzzxAeHu6mSkXEHfr3789ll12Gr68vd999NzfddBP//ve/1Q/aEO2hEUPaunUrhw8fZsiQIQBUVVVht9u5++67mT59Ot26dcNqtTrnP3z4MA899BDjx48nPj7eQ1WLiLuYTCYcDge7du1SP2gjFGjEkBITE7nrrrucr19//XUOHz7M9OnT+fvf/17vt7HS0lIeeOABkpKS+J//+R9PlCsiLnT8+HE+//xzbrnlFiwWC2vWrGH79u0888wz5OXlqR+0EQo0YkiXXnopl156qfO1n58fvr6+WK1W/v3vf2Oz2ZzvZWdnc/DgQRYsWMCCBQuc03fs2OHWmkXENU6fPs2LL77I3r17sVgsXH311SxYsICrr75a/aANMTkcDoenixBpKUeOHCE+Pp5NmzZhMpk8XY6IeJD6Qduik4LFq5w4cYIpU6aoeYmI+kEboz00IiIiYnjaQyMiIiKGp0AjIiIihqdAIyIiIoany7Z/wdGjp6ir0+lFIp5mNpvo1MnfY5+vXiDSOjTWCxRofkFdnUNNTETUC0QMQoecRERExPAUaERERMTw3BZoIiIiGDZsGHFxccTFxbFp0yYA9u3bR2JiItHR0SQmJlJYWHjO5e12OzabjcjISIYOHUp2drbzvZycHIYPH058fDy7d+92Tk9NTWX79u0uHZeIiIh4nlvPocnMzKRPnz71pqWnp5OUlERcXBwrV65k2rRpvPHGGw2WzcvL48CBA6xfv57Kykri4+MZNGgQ3bt3Jysri/z8fHbv3s2iRYvIzMxk69atWCwWPRZeRESkDfDoIafy8nIKCgqIiYkBICYmhoKCAioqKhrMu2bNGhISEjCbzVitViIjI1m7di0AZrOZmpoaqqqq8PHxoba2lszMTCZPnuzW8YiIiIhnuHUPzeTJk3E4HNx888089dRTFBcXExwcjMViAcBisRAUFERxcTFWq7XessXFxXTt2tX5OiQkhJKSEgBSUlIYM2YM/v7+2Gw2Fi9eTEJCAgEBARdda2DgZRe9rMjPnayqpfZ0nafLaHV825m5zM/X02Wcl3qBiDG4LdAsX76ckJAQamtrmT17NjNmzODBBx9skXVHRUURFRUFQGFhITt37iQ5ORmbzUZ5eTnh4eGMHj36gtZZXn5Sl2pKy2lnYe4b2zxdRauTMnoA1adqzjuP2WzyaKhQLxBpHRrrBW475BQSEgKAr68vSUlJ/Oc//yEkJITS0lLsdjtw5sTfsrIy57w/X76oqMj5uri4mC5dujSYb86cOaSmprJq1SqsViuZmZm8++67HDx40EUjExEREU9zS6CpqqrixIkTADgcDtasWUNoaCiBgYGEhoaSn58PQH5+PqGhoQ0ONwEMGzaM7Oxs6urqqKioYMOGDURHR9ebJzc3l7CwMHr16kV1dbXzkfEmk4mqqioXj1JEREQ8xS2HnMrLy3n88cex2+3U1dXRu3dv0tPTAZg+fTpTpkwhKyuLDh06kJGR4VwuOTmZiRMn0q9fP+Li4vj888+dh5Yee+wxevTo4Zz32LFjZGdns3TpUgBiY2OZMGECa9eu5aabbqJv377uGKqIiIh4gMnhcOjg8DnouLm0KJ1Dc04powfAaft559E5NCICregcGhERERFXUaARERERw1OgEREREcNToBERERHDU6ARERERw1OgEREREcNToBERERHDU6ARERERw1OgEREREcNToBERERHDU6ARERERw1OgEREREcNToBERERHDU6ARERERw1OgEREREcNToBERERHDU6ARERERw1OgEREREcNToBERERHDU6ARERERw1OgEREREcNToBERERHDU6ARERERw1OgEREREcNToBERERHDU6ARERERw3N7oHn55Zfp27cv33zzDQD79u0jMTGR6OhoEhMTKSwsPOdydrsdm81GZGQkQ4cOJTs72/leTk4Ow4cPJz4+nt27dzunp6amsn37dpeOR0RERDzPrYFm9+7dfPbZZ3Tt2tU5LT09naSkJNatW0dSUhLTpk0757J5eXkcOHCA9evX89ZbbzF//nwOHToEQFZWFjk5OaSlpbFo0SIAtm7disViITw83PUDExEREY9yW6Cpra1lxowZpKenYzKZACgvL6egoICYmBgAYmJiKCgooKKiosHya9asISEhAbPZjNVqJTIykrVr154ZhNlMTU0NVVVV+Pj4UFtbS2ZmJpMnT3bX8ERERMSD2rnrg1566SViY2Pp0aOHc1pxcTHBwcFYLBYALBYLQUFBFBcXY7Va6y1fXFxcb89OSEgIJSUlAKSkpDBmzBj8/f2x2WwsXryYhIQEAgICXD8wERER8Ti3BJodO3awa9cul+0xiYqKIioqCoDCwkJ27txJcnIyNpuN8vJywsPDGT169AWtMzDwMleUKm1UxfEf8PFx2+8PhmGxmLF28vN0GeelXiCt0cmqWmpP13m6jBbj287MZX6+zVqHWzrstm3b2Lt3L3fccQcAJSUlPPzww6SmplJaWordbsdisWC32ykrKyMkJKTBOkJCQigqKiIsLAxouMfmrDlz5pCamsqqVauwWq2kp6czatQohgwZUm/vUGPKy09SV+e4yBGL/Ew7Cz/+eNrTVbQ6dnsd339/4rzzmM0mj4YK9QJpldpZmPvGNk9X0WJSRg+g+lTNeedprBe45RyacePG8eGHH7Jx40Y2btxIly5deO211xg+fDihoaHk5+cDkJ+fT2hoaIPDTQDDhg0jOzuburo6Kioq2LBhA9HR0fXmyc3NJSwsjF69elFdXe08V8dkMlFVVeX6gYqIiIhHePw+NNOnT2fZsmVER0ezbNkybDab873k5GR27doFQFxcHN27dycqKor77ruPxx57rN4el2PHjpGdnc24ceMAiI2NZcuWLcTExNCzZ0/69u3r3oGJiIiI25gcDof2pZ6DdjNLi/Ky3cMtJWX0ADhtP+88OuQkcg5e1lNaohd4fA+NiIiI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c+bMITU1lVWrVmG1WsnMzOTdd9/l4MGDrh2IiIiIeIzHA01gYCChoaHk5+cDkJ+fT2hoaL3DTQDDhg0jOzuburo6Kioq2LBhA9HR0fXmyc3NJSwsjF69elFdXY3JdOZ4m8lkoqqqyj0DEhEREbczORwOh6eL2LNnD1OmTOH48eN06NCBjIwMrr76apKTk5k4cSL9+vXDbrczY8YMNm/eDEBycjKJiYnOdRw7dozx48ezdOlSfH19qaysZMKECVRWVnLTTTcxY8YMTw1PREREXKxVBBoRERGR5vD4IScRERGR5lKgEREREcNToBERERHDU6ARERERw/OKG+u1VUePHiUlJYUDBw7g6+vLVVddxYwZMxpc8t4WjR8/nkOHDmE2m/Hz8+PZZ58lNDTU02W1Ci+//DLz588nLy+PPn36eLocaQJv3Na9dRv1lu0rIiICX19f2rc/83iFyZMn87vf/c7DVZ2frnIysMrKSr7++msGDhwIQEZGBseOHWPOnDkerszzTpw4weWXXw7Ahg0bWLBgAStWrPBwVZ63e/du5s2bx549e1i0aJGhG25b4o3bujduo960fUVERLBw4UJDjUGHnAwsICDA2eAAbrjhhnp3U27LzjZKgJMnTzpvstiW1dbWMmPGDNLT0/V9GIw3buveto1q+/I8HXLyEnV1dbz55ptERER4upRWIy0tjc2bN+NwOHj11Vc9XY7HvfTSS8TGxtKjRw9PlyLN4E3bujdto964fU2ePBmHw8HNN9/MU089RYcOHTxd0nlpD42XmDlzJn5+fowcOdLTpbQas2fP5oMPPuDJJ59k7ty5ni7Ho3bs2MGuXbtISkrydCnSTN60rXvLNuqN29fy5ctZtWoV//rXv3A4HIa4274CjRfIyMhg//79vPjii5jN+iv9ufj4eLZu3crRo0c9XYrHbNu2jb1793LHHXcQERFBSUkJDz/8MB9++KGnS5ML4K3butG3UW/cvs4+INrX15ekpCT+85//eLiixumQk8HNmzePL774gsWLF+Pr6+vpclqFU6dOcfz4cecGuXHjRjp27EhAQIBnC/OgcePGMW7cOOdrI57w19Z507bubduot21fVVVV2O12Lr/8chwOB2vWrDHEFWgKNAb27bffsnDhQnr27Mn9998PQPfu3VmwYIGHK/Os6upqJk2aRHV1NWazmY4dO7Jw4UKdqCeG5W3burbR1q28vJzHH38cu91OXV0dvXv3Jj093dNlNUqXbYuIiIjhec9BWBEREWmzFGhERETE8BRoRERExPAUaERERMTwFGhERETE8BRoRERExPB0HxpptW688Ubnz9XV1fj6+mKxWACw2WzExsZ6qjQRcTP1A2mM7kMjhhAREcGsWbO47bbbLmg5h8OBw+HwqtvEi7R16gdyLvpbFcOZP38+kydPdr4+dOgQffv25fTp0wCMGjWKefPmcf/999O/f38OHjxI3759efPNN4mKimLAgAHYbDbOZvn9+/czcuRIbr75ZgYOHMgTTzzhiWGJyEVQP5CzdMhJvNLKlStZsmQJvXr1cjaqDz74gJycHE6ePMkf/vAHhgwZwuDBg3nppZf4zW9+wxtvvMGPP/7Irl27PFy9iLQk9YO2QXtoxCvdfffdXHPNNbRr1w4fHx8AkpOT6dChA127dmXgwIF89dVXALRr146ioiLKyspo37494eHhnixdRFqY+kHboEAjXunsU3x/qnPnzs6fL730Uk6dOgXAn/70JxwOB/feey933XUXOTk5bqtTRFxP/aBt0CEnMZxLL72UH374wfn6yJEjDea5kKf2du7cmVmzZgGwfft2HnroIQYMGMBVV13V/GJFxKXUD+Qs7aERwwkNDWXbtm0UFRVx4sQJFi1a1Kz1vfPOO5SUlADQsWNHTCaTroIQMQj1AzlLe2jEcH7zm98wfPhwYmNj6dSpE8nJyWzcuPGi17dr1y7mzJnDyZMnCQwMJC0tjR49erRgxSLiKuoHcpbuQyMiIiKGp/1oIiIiYngKNCIiImJ4CjQiIiJieAo0IiIiYngKNCIiImJ4CjQiIiJieAo0IiIiYngKNCIiImJ4CjQiIiJieAo0IiIiYngKNCIiImJ4CjQiIiJieAo0IiIiYngKNCIiImJ4CjQiIiJieAo0IiIiYngKNCIiImJ4CjRiaIcOHSI5OZkBAwbwm9/8hhkzZnD69Gnn+wsXLuSFF17gs88+46GHHuKWW27h1ltvZeLEiZSVlXmwchG5WMuWLeMPf/gD119/PVOmTKn33scff8ywYcPo378/o0aN4vDhww2Wj46OZt++fbz66qvExMRw4403EhERwauvvuquIYgLKNCIodlsNgIDA/nwww/Jzc1l27Zt/OMf/3C+/+9//5vBgwdz7Ngx7rvvPjZu3Mj777+Pv78/qampHqxcRC5WUFAQ48eP55577qk3vaKiggkTJjBp0iQ++eQTrr/+ep588sl68xw4cIC6ujp69eqFw+EgIyODbdu28eqrr7J8+XJWr17tzqFIC2rn6QJEmuPQoUOMHDmS9u3b07lzZ37729/y3XffAXDs2DEKCwu58cYbsVgs9ZYbOXIkI0eO9ETJItJMUVFRAOzatYvS0lLn9HfffZdrrrmGO++8E4DHH3+cW2+9lT179tC7d28APvjgA37/+98DkJyc7Fz26quv5o477uA///kPd911l7uGIi1Ie2jE0EaPHs3q1auprq6mtLSUTZs28bvf/Q6ADz/8kEGDBjUIMwDbtm3jmmuucXe5IuJC3377LX379nW+9vPz48orr3T+kgNn9tqeDTQ/5XA42L59O7/61a/cUqu0PAUaMbRbbrmF7777jptvvpnBgwdz/fXXExkZCZz5TWzw4MENlvnqq6/IysoiJSXF3eWKiAtVVVVx+eWX15t22WWXcerUKQCqq6v54osvuOWWWxosO3/+fOrq6hocxhLjUKARw6qrq+Phhx9m6NChfPbZZ2zZsoVjx47x/PPPU1dXx0cffdQg0Ozfv5/k5GSeeeYZwsPDPVS5iLiCn58fJ0+erDft1KlT+Pv7A2dOGL7xxhtp3759vXmWLVtGbm4uixcvxtfX1231SstSoBHDqqyspLi4mJEjR+Lr60unTp245557+L//9/+ya9cuunXrhtVqdc5/+PBhHnroIcaPH098fLznChcRl7jmmmv46quvnK+rqqo4cOCA8zDSuQ435eTksHjxYv72t7/RpUsXt9YrLUuBRgzLarXSvXt33nzzTU6fPs3x48dZsWIFffv2bXC4qbS0lAceeICkpCT+53/+x4NVi0hznT59mpqaGurq6rDb7dTU1HD69GmGDh3Kt99+y7p166ipqWHBggX07dvXeULwpk2b6gWaVatWMW/ePJYuXUqPHj08NRxpISaHw+HwdBEiF+vLL79kzpw5fPXVV5jNZgYOHEh6ejrJycnYbDb69esHwMsvv8z8+fPx8/Ort/yOHTs8UbaINMP8+fN5+eWX602bMGECjz/+OB999BEzZsygqKiI/v3789xzz9G9e3e++eYbnnrqKfLz853LREREUFpaWu8w04gRI5gxY4bbxiItR4FGvM6R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\n",
"text/plain": [
"<Figure size 576x540 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(nrows=len(RANDOM_ROW_LENGTHS) // 2, ncols=2,\n",
" sharey=True,\n",
" figsize=(FIG_WIDTH, 1.25 * FIG_HEIGHT))\n",
"\n",
"for (row_length, ax) in zip(RANDOM_ROW_LENGTHS, axes.flat):\n",
" pmf = get_random_guess_dist(row_length, 2)\n",
" plot_turn_dist(pmf, ax=ax);\n",
" \n",
" make_pct_yaxis(ax);\n",
" ax.set_title(f\"{row_length}/2\");\n",
"\n",
"fig.suptitle(\"Random guessing\");\n",
"fig.tight_layout();"
]
},
{
"cell_type": "markdown",
"id": "ea06b4e7",
"metadata": {},
"source": [
"We do the same for a ship of size three."
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "ecc9b71e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAISCAYAAADbflUoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABkPElEQVR4nO3dfVxUdd7/8dfMiJaU4pDgmO5qbhLuimVYudvWaggui0DbEi0/pdbEbdXN6nJJosRRc1fb7QbLvKn1ulrbri4oEYj1Lmt/6ebddqPBtpWJYAyQQ2oKgc7M7w9/zhVhOArMcOD9fDx8PDjnfM85n+8M5+OH8z03Jo/H40FERETEwMyBDkBERESkrVTQiIiIiOGpoBERERHDU0EjIiIihqeCRkRERAxPBY2IiIgYngoakW4kIiKC9evXBzqMTu3VV19lxIgRgQ5DRM5Tj0AHINJdzJ07l3Xr1gFgNpvp378/N9xwA//xH/9BeHh4gKOTM+Lj47npppsCHYaInCedoRHxo+joaLZt28abb77Jn/70J/71r38xe/bsQIclX3PRRRdx2WWXBToMETlPKmhE/CgoKIj+/fsTHh7OmDFjuP3223n33Xc5fvy4t80TTzzBT3/6U0aNGsXNN9/MvHnz+PLLL73LzwyJ/POf/+TWW29l1KhR3HbbbXzwwQfN9rVjxw4mTZrEyJEjmTRpEjt27GgRz6effsr06dO55ppruOaaa7jnnns4ePBgi32d2VZUVBSTJ0+mpqaG3bt3k5yczNVXX81dd91FTU1Nq33/4osvuPfee7n66qv54Q9/yJNPPsmDDz7IXXfd5W0zZcoUsrOzm623fPlyxo8f32zea6+9RlJSEiNHjmT8+PH8/ve/p76+3rt8z5493HHHHd5+JSYm8tZbb3mXr1ixgltuuYUf/OAH3HDDDdx999189dVXzfp8vp/3P/7xj2af965duzTEJ+JHKmhEAqSmpoaNGzdisVgwm//3UOzVqxcLFy7ktdde4w9/+AO7du1i0aJFzdZ1u908/vjjZGdn8+qrr9K3b1/uu+8+Tp065d32Pffcww9+8APWrVvH3LlzefTRR5tt46uvvuLuu++msbGRv/zlL/zlL3/hxIkTTJs2jaampmb7euaZZ1i0aBEvvfQStbW13H///eTm5jJ//nz++te/Ul1dze9///tW+5uVlcW///1vVqxYwX/9139RU1PDli1bzvtze/XVV5k/fz6/+tWvKCkpYcmSJfzjH/8gJycHAJfLxYwZMxg1ahTr1q1j3bp1/Pa3v+Xiiy8GYNOmTaxatYrs7Gw2bdrEmjVr+PGPf9zqPn35vH/zm98QFRXFunXreOihh/jDH/5w3n0TkTbwiIhfPPjgg57IyEjP1Vdf7YmKivIMHz7cM3z4cM8f/vCHVtfbtGmT5/vf/77H5XJ5PB6P55VXXvEMHz7c88EHH3jbvPvuu57hw4d79u/f7/F4PJ7HH3/c85Of/MRz8uRJb5utW7d6hg8f7ikoKPB4PB7P//zP/3iioqI8TqfT2+bzzz/3jBw50rNu3bpm+yorK/O2Wb16tWf48OGeffv2eeetWbPGc911131rHw4cOOAZPny45x//+Id3XlNTk+emm27y3Hnnnd55kydP9jz00EPN1n3mmWc848aN806PGzfO89e//rVZm127dnmGDx/uOXLkiOfIkSOe4cOHe3bs2HHWWNasWeOJjY31NDU1nXX5K6+84omMjGw27cvnPW7cOM+pU6e8bf7+9783+7xFpGPpomARP4qKimLJkiU0Njbyt7/9jX/84x8trqHZtGkT//Vf/8XBgwc5ceIEbrebkydP8vnnn3svHjaZTFx11VXedc7MdzqdXHHFFezfv5+RI0fSo8f/HuLXXntts/188sknDBs2DKvV6p132WWXMXToUD7++GPvPJPJxPDhw5u1gdN3TH193pEjR3C5XFgslhb9/uSTTwAYNWqUd15QUBA/+MEPOHHixLk+Nq+6ujo+++wz/vCHP7B06VLvfM//f8fuwYMHiYqKIiUlhbvvvpsbbriB6667jpiYGK644goAfvrTn/LCCy8wbtw4brzxRm644QZiYmK45JJLvnW/5/q8P/nkE37wgx806/s111zjc79EpO1U0Ij40UUXXcR3v/tdAIYPH055eTl2u907XPP+++8ze/Zspk+fTmZmJn369OH999/nwQcf5OTJk97tmM3mZv95mkwm4PTQCJz+D/7MvG+2Ode8b677bfsKCgpqMe9MYfFtzra/by7/5jbODOvA//YvOzub66+/vsX6AwYMAGDRokWkp6ezfft2tm/fzlNPPcUjjzzCHXfcQXh4OBs2bGDHjh3s2LGDZ599lj/+8Y/k5eVhs9nOGte5Pu+z9e1cfRWR9qVraEQCaNasWRQUFLBv3z4A/vnPf9KvXz/uv/9+Ro0axdChQ6murj7v7X7ve99j7969uFwu77x//vOfLdp88skn1NXVeecdPnyY8vJyvve9711gj749HoD33nvPO+/UqVOUlpY2axcaGkptbW2zeWVlZd6fL7vsMmw2GwcOHOC73/1ui3+9evXyth0+fDi/+tWveO6557jtttv4n//5H++ynj17ctNNN5GZmUlRURFfffXVBV3P8/X+7du3r9nn/e67717w9kTk/KmgEQmgYcOG8ZOf/ITHH38cgKFDh1JXV0deXh6VlZUUFBTw17/+9by3m5aWRl1dHY888gj79+/n7bff5oknnmjWZtKkSVitVu6//35KS0v54IMPuP/++wkPDyc+Pr5d+nfGkCFDGDduHHa7nV27dvHJJ58wb948jh8/3uxMxg9/+EPefvttSkpKOHjwIKtWrWLPnj3NtnXffffxl7/8heXLl/PRRx/x6aefsmXLFubNmwecHnZ67LHH2LNnD5999hnvvvsu//znPxk2bBgAeXl5/M///A8ffvghn332GYWFhZw4caJNRVxaWhpOp5P58+ezf/9+duzY4f28daZGxD805CQSYNOmTSMtLY23336bcePGcc899/DEE09QX1/PmDFjyMzM5D/+4z/Oa5vh4eGsWLGCxYsXk5SUxJAhQ8jOzm52i/RFF13E888/z+9//3smT54MwHXXXcdzzz1Hz54927OLAPz+978nJyeHjIwMevfuzR133MEPf/jDZndUJScn89FHH7Fw4UJOnjzJpEmTmDJlSrNbn5OTk7nkkktYvXo1K1euxGKxMHjwYCZMmADAxRdfzMGDB3nggQeoq6sjJCSEn/zkJzz44IMA9O3blz//+c889thjNDU1MXjwYBYsWMDYsWMvuG/h4eE8++yzLF68mHXr1jF06FB+97vfkZGR0eyskYh0HJPnXIPeIiIdwOVy8dOf/pTx48czd+7cQIfT7nbv3s3kyZMpLCxsdgG1iHQMnaEREb/YvXs3TqeTESNGcOLECf7zP/+Tzz77jFtvvTXQobWLv/71r1x11VWEhYWxf/9+Fi9ezKhRo1TMiPiJChoR8QuXy8Wzzz5LRUUFPXr04Morr+S//uu/usx/+FVVVaxatYrDhw/Tv39/fvjDHzJnzpxAhyXSbWjISURERAxP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mr048/HHH6e0tBSz2UxQUBBLly6lf//+AY6+pYaGBmbPnk1DQwNms5m+ffuyYsUKTCZTs/4kJSXx/vvvExsbC8DMmTM75fizr/0xyvfTGiN+P63pat9PoLV2LIh8ndPp5Le//S0ulwu3282wYcO6zGMS9HJKERERMTxdQyMiIiKGp4JGREREDE8FjYiIiBieChoRERExPBU0IiIiYngqaERERMTw9Bwa6bS+/j6fhoYGevbsicViAcBut5OYmBio0ETEz5QP5Fz0HBoxhPHjx7No0SJ++MMfntd6Ho8Hj8dz1ldWiIgxKR/I2ehbFcNZtmwZc+bM8U4fOnSIiIgITp06BcCUKVN44oknuOOOOxg1ahSVlZVERETw0ksvERsby5gxY7Db7Zyp5Q8ePMjkyZO59tpruf7667nvvvsC0S0RuQDKB3KGhpykS1q/fj2rV69m6NCh3kT15ptvkp+fz/Hjx/n5z3/OuHHjuOmmm3jqqaf40Y9+xAsvvMDJkyfZt29fgKMXkfakfNA96AyNdEm33norV155JT169PC+yTkjI4M+ffowcOBArr/+ej788EMAevToQVVVFbW1tfTq1Yvo6OhAhi4i7Uz5oHtQQSNdks1mazHv6y88vPjiizlx4gQAv/vd7/B4PPziF7/gZz/7Gfn5+X6LU0Q6nvJB96AhJzGciy++mK+++so7ffjw4RZtzuctw/3792fRokUA7Nmzh1/96leMGTOG7373u20PVkQ6lPKBnKEzNGI4kZGR7N69m6qqKr788ktWrlzZpu397W9/o7q6GoC+fftiMpl0F4SIQSgfyBk6QyOG86Mf/Yj4+HgSExPp168fGRkZbN269YK3t2/fPhYvXszx48cJDQ0lOzubwYMHt2PEItJRlA/kDD2HRkRERAxP59FERETE8FTQiIiIiOGpoBERERHDU0EjIiIihqeCRkRERAxPBY2IiIgYngoaERERMTwVNCIiImJ4KmhERETE8FTQiIiIiOGpoBERERHDU0EjIiIihqeCRkRERAxPBY2IiIgYngoaERERMTwVNCIiImJ4KmhERETE8FTQiKEdOnSIjIwMxowZw49+9CMWLFjAqVOnvMtXrFjB448/zieffMLPf/5zxowZw5gxY7jrrrv45JNPAhi5iFyotWvX8vOf/5wf/OAHzJ07t9myt99+m4kTJzJq1CimTJnCZ5991mL9uLg4Dhw4wH/+539yyy23MHr0aG688UYWL17cLH+IsaigEUOz2+2Ehoaybds2CgoK2L17N3/961+9y//+979z0003ERYWRm5uLrt27WLHjh2MHz+e+++/P4CRi8iFCgsLY8aMGdx2223N5tfV1TFr1ixmz57Nrl27+MEPftDiOK+oqMDtdjN06FDGjx/PunXreOeddyguLubDDz/kL3/5iz+7Iu1IBY0Y2qFDh/jpT39Kr1696N+/PzfeeKP3zMvRo0cpLy/nmmuuoU+fPgwaNAiTyYTH48FisVBRURHg6EXkQsTGxhITE0NISEiz+Zs3b+bKK6/05oTf/va3fPjhh+zfv9/b5s033+Tmm28G4Dvf+Q59+vQBwOPxYDabOXjwoN/6Ie1LBY0YWnp6Oq+99hoNDQ3U1NTw1ltv8eMf/xiAbdu2MXbsWCwWi7d9dHQ0UVFRLFy4kF//+teBCltEOsDHH39MRESEd7p379585zvfaTa8/Pe//91b0AAUFRUxevRobrjhBj788EPuuOMOv8Ys7adHoAMQaYvrrruOvLw8rr32WlwuF7feeisxMTHA6b/Ebrrppmbt9+zZQ319PevWrePyyy8PRMgi0kHq6+uxWq3N5l1yySWcOHECgIaGBj744AOuu+467/JJkyYxadIkysvLKSgoIDQ01K8xS/vRGRoxLLfbzd13382ECRN477332LFjB0ePHuWxxx7D7Xbzj3/8o0VBA6f/avvlL3/Jgw8+iNPpDEDkItIRevfuzfHjx5vNO3HiBMHBwcDpC4avueYaevXq1WLdIUOGcOWVV2K32/0Sq7Q/FTRiWEeOHMHhcDB58mR69uxJv379uO222/i///f/sm/fPi6//PIWf62d4Xa7vcNUItI1XHnllXz44Yfe6fr6eioqKvje974HtBxu+qZTp07p2joDU0EjhmW1Whk0aBAvvfQSp06d4tixY6xbt46IiIgWw03bt2+nrKwMl8vF8ePH+cMf/kCfPn0YNmxYAHsgIhfi1KlTNDY24na7cblcNDY2curUKSZMmMDHH3/Mxo0baWxs5JlnniEiIsJ7nL/11lvNCpq8vDzvWdpPPvmEVatWMXbs2ID0SdpOBY0Y2tNPP81bb73F2LFjmTBhAhaLhYceeqjFX2LHjh3jgQceIDo6mpiYGA4ePMhzzz131lPPItK5Pfvss0RFRbFq1SoKCwuJiori2WefxWq1smzZMp544gnGjBnD3r17efzxxwH46KOP6N27NwMHDvRu55133mHSpElcffXVTJ8+nZtuuokHHnggUN2SNjJ5PB5PoIMQaU+HDx8mOTmZt956C5PJFOhwRKQTWL16NV988QWZmZmBDkU6iO5yki7nyy+/ZO7cuSpmRMTr8ssvZ/z48YEOQzqQztCIiIiI4ekaGhERETE8FTQiIiJieCpoRERExPB0UfC3+OKLE7jdurxIJNDMZhP9+gUHbP/KBSKdw7lygQqab+F2e5TERES5QMQgNOQkIiIihqeCRkRERAxPBY2IiIgYngoaERERMTwVNCIiImJ4KmhERETE8FTQiIiIiOGpoBERERHDU0EjIiIihqeCRkRERAxPBY2IiIgYngoaERERMTwVNCIiImJ4KmhERETE8PxS0Bw6dIikpCTvv/Hjx3PdddcBcODAAVJTU4mLiyM1NZXy8vKzbsPlcmG324mJiWHChAnk5eV5l+Xn5xMfH09ycjKlpaXe+VlZWezZs6dD+yYiIiKB18MfOxk0aBDr16/3Tj/66KO4XC4AcnJySEtLIykpifXr1zNv3jxeeOGFFtsoKiqioqKCTZs2ceTIEZKTkxk7diyDBg1i+fLlFBcXU1paysqVK8nNzWXnzp1YLBaio6P90UUREREJIL8POTU1NVFUVMRtt92G0+mkrKyMhIQEABISEigrK6Ourq7FeiUlJaSkpGA2m7FarcTExLBhwwYAzGYzjY2N1NfXExQURFNTE7m5ucyZM8evfRMREZHA8MsZmq/bunUr4eHhfP/73+eDDz4gPDwci8UCgMViISwsDIfDgdVqbbaew+Fg4MCB3mmbzUZ1dTUAmZmZTJ06leDgYOx2O6tWrSIlJYWQkJALjjM09JILXldEug7lAhFj8HtB88orr3Dbbbe16zZjY2OJjY0FoLy8nL1795KRkYHdbsfpdBIdHU16evp5bdPpPI7b7WnXOEXk/JnNpoAWFcoFIp3DuXKBX4ecampq2L17N5MmTQJOn2WpqanxXk/jcrmora3FZrO1WNdms1FVVeWddjgcDBgwoEW7xYsXk5WVRWFhIVarldzcXDZv3kxlZWUH9UpEREQCza8Fzbp167j55pvp168fAKGhoURGRlJcXAxAcXExkZGRLYabACZO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ERFpKxU0IiIiYngqaERERMTwVNCIiIiI4amgEa+nn36aiIgIPvroo0CH0ik0NjaSk5NDbGwskyZN4pFHHgl0SAH3xhtvkJycTFJSEpMmTWLTpk2BDknOoSsd113tmDT68bRkyRLGjx/f4vfrwIEDpKamEhcXR2pqKuXl5X6Jp0s8KVjarrS0lPfee4+BAwcGOpRO47HHHqNXr15s3LgRk8nE4cOHAx1SQHk8HjIzM3nxxRcZPnw4H374Ib/85S+JiYnBbNbfRp1RVzuuu9Ix2RWOp1tuuYX09HT+z//5P83mn3nhdFJSEuvXr2fevHm88MILHR6PMT416VBNTU0sWLCAnJwc78MIu7sTJ05QUFDA7NmzvZ/JZZddFuCoAs9sNvPll18C8OWXXxIWFmaY5NvddLXjuisek0Y/nqKjo1s81f/MC6cTEhKA0y+cLisro66ursPj0Rka4amnniIxMZHBgwcHOpROo7KykpCQEJ5++ml27txJcHAws2fPJjo6OtChBYzJZOLJJ59kxowZ9O7dmxMnTrBy5cpAhyXfoqsd113tmOyqx5PD4SA8PByLxQKAxWIhLCwMh8PR4g0A7c04paB0iHfffZd9+/aRlpYW6FA6lVOnTlFZWcmIESN49dVXmTNnDr/97W85fvx4oEMLmFOnTrFy5UqWL1/OG2+8wbPPPsv999/PiRMnAh2afENXPK672jGp46n9qaDp5nbv3s2nn37KLbfcwvjx46murubuu+9m27ZtgQ4toAYOHEiPHj28p01HjRpFv379OHDgQIAjC5x//etf1NbWcu211wJw7bXXcvHFF7N///4ARybf1BWP6652THbV48nXF053BBU03dz06dPZtm0bW7duZevWrQwYMIDnn3+eG2+8MdChBZTVauX666/3vjvswIEDOJ1Ovvvd7wY4ssAZMGAA1dXVfPrpp8Dpd7AdPnyY73znOwGOTL6pKx7XXe2Y7KrHk68vnO4IepeTNDN+/HhWrFjB8OHDAx1KwFVWVvLQQw9x5MgRevTowX333cfNN98c6LACqrCwkNWrV3svyrz33nuJiYkJcFRyLl3luO5qx6TRj6dFixaxadMmDh8+TL9+/QgJCeG111771hdOdzQVNCIiImJ4GnISERERw1NBIyIiIoangkZEREQMTwWNiIiIGJ4KGhERETE8FTQiIiJieHqXk3Ra11xzjffnhoYGevbs6X0/iN1uJzExMVChiYifKR/Iueg5NGII48ePZ9GiRfzwhz88r/U8Hg8ej8dQb7AVkdYpH8jZ6FsVw1m2bBlz5szxTh86dIiIiAhOnToFwJQpU3jiiSe44447GDVqFJWVlURERPDSSy8RGxvLmDFjsNvtnKnlDx48yOTJk7n22mu5/vrrue+++wLRLRG5AMoHcoaGnKRLWr9+PatXr2bo0KHeRPXmm2+Sn5/P8ePH+fnPf864ceO46aabeOqpp/jRj37ECy+8wMmTJ9m3b1+AoxeR9qR80D3oDI10SbfeeitXXnklPXr0ICgoCICMjAz69OnDwIEDuf766/nwww8B6NGjB1VVVdTW1tKrVy+io6MDGbqItDPlg+5BBY10SWd7VX3//v29P1988cWcOHECgN/97nd4PB5+8Ytf8LOf/Yz8/Hy/xSkiHU/5oHvQkJMYzsUXX8xXX33lnT58+HCLNmfeXuuL/v37s2jRIgD27NnDr371K8aMGcN3v/vdtgcrIh1K+UDO0BkaMZzIyEh2795NVVUVX375JStXrmzT9v72t79RXV0NQN++fTGZTLoLQsQglA/kDJ2hEcP50Y9+RHx8PImJifTr14+MjAy2bt16wdvbt28fixcv5vjx44SGhpKdnc3gwYPbMWIR6SjKB3KGnkMjIiIihqfzaCIiImJ4KmhERETE8FTQiIiIiOGpoBERERHDU0EjIiIihqeCRkRERAxPBY2IiIgYngoaERERMTwVNCIiImJ4/w+iuohy9ubGSQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x540 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(nrows=len(RANDOM_ROW_LENGTHS) // 2, ncols=2,\n",
" sharey=True,\n",
" figsize=(FIG_WIDTH, 1.25 * FIG_HEIGHT))\n",
"\n",
"for (row_length, ax) in zip(RANDOM_ROW_LENGTHS, axes.flat):\n",
" pmf = get_random_guess_dist(row_length, 3)\n",
" plot_turn_dist(pmf, ax=ax);\n",
" \n",
" make_pct_yaxis(ax);\n",
" ax.set_title(f\"{row_length}/3\");\n",
"\n",
"fig.suptitle(\"Random guessing\");\n",
"fig.tight_layout();"
]
},
{
"cell_type": "markdown",
"id": "4cb42129",
"metadata": {},
"source": [
"As with the case of standard Battleship, the most likely outcome is to use all the turns, and the expected value will be slightly below that."
]
},
{
"cell_type": "markdown",
"id": "1da8188a",
"metadata": {},
"source": [
"#### Optimal search\n",
"\n",
"In the simple setting of a row with a single ship, it is not too hard to work out the optimal search strategy, which consists of two phases. First we must locate the ship by getting at least one hit. Once the ship has been located, we must sink it by attacking spaces next to known hits until all of the ship has been found.\n",
"\n",
"##### After at least one hit\n",
"\n",
"We first implement optimal search after at least one hit has occurred. In this case, we guess the spot immediately to the left of the leftmost hit, unless that hit is in the first cell, or the cell to its left has already been shown to contain water. In those two cases, we guess the cell to the right of the rightmost hit until all cells containing the ship have been hit. The following function implements this strategy."
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "6ebddf5e",
"metadata": {},
"outputs": [],
"source": [
"def next_guess_1d_with_hit(row):\n",
" first = row.argmax()\n",
"\n",
" # found the left edge, fill out the ship to the right\n",
" if first == 0 or row[first - 1] == 0:\n",
" return first + row[first:].mask.argmax()\n",
" # find the left edge\n",
" else:\n",
" return first - 1"
]
},
{
"cell_type": "markdown",
"id": "81721db9",
"metadata": {},
"source": [
"We can show how this strategy works through a simple animated example. Suppose the position of a length three ship on a length ten row is as shown below."
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "9a1e79f2",
"metadata": {},
"outputs": [],
"source": [
"board = np.zeros(10)\n",
"board[6:9] = 1"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "e56427d6",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(board);"
]
},
{
"cell_type": "markdown",
"id": "1ebc8ecc",
"metadata": {},
"source": [
"Also suppose that after three guesses, the following spots have been revealed."
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "32b640ba",
"metadata": {},
"outputs": [],
"source": [
"revealed = np.ma.masked_all_like(board)\n",
"revealed[[1, 4, 7]] = board[[1, 4, 7]]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "9068a43f",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAABOCAYAAACt1CbhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAH/klEQVR4nO3dS0iUbQPG8UsTKyMdK6y0cxBYUIJS0MmyqI1F9G5CdFPQwjArpJNFpJXZopLOVMtwpUlWUIG6UMqEggolQqM8ddCU0o7O3O8iGr5Fjnd8b3M78P+tHCXmYnjqn/czYpgxxggAAAQU7noAAAChgGACAGCBYAIAYIFgAgBggWACAGCBYAIAYCEi0BcTEhKCtQMAgGGhvb39t58PGMxAf3A4+hX4jo7Q2Bwf/3NvKL7GobiZ6+LvCeXror2jw/ESOwnx8ZJC9DUOwc2/w5EsAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABYIJgAAFggmAAAWCCYAABbCjDFmsC8mJCQEcwsAAM61t7f/9vMBgwkAAH7iSBYAAAsEEwAACwQTAAALBBMAAAsEEwAACwQTAAALBBMAAAsEEwAACwQTAAALEcF+wpcvX2rv3r3q7e2Vx+NRcXGxZsyYEewZ1oqLi3Xnzh21t7ersrJSc+bMcT0poJ6eHu3evVuvX79WZGSkpk+froKCAo0bN871tICys7PV1tam8PBwRUVF6eDBg0pMTHQ9a0hnz57VmTNnQuLaSEtLU2RkpEaOHClJysvL07JlyxyvCuzbt286duyY7t+/r5EjRyopKUmFhYWuZ/1WW1ubtm3b5n/86dMn9fX16eHDhw5XDa26ulolJSUyxsjn8yknJ0dr1qxxPSugmpoalZSUaGBgQDExMSoqKtLUqVP//hObIMvKyjIVFRXGGGMqKipMVlZWsCf8kYaGBtPR0WFWrlxpnj9/7nrOkHp6esyDBw/8j48fP2727dvncJGdjx8/+j++d++e2bBhg8M1dp49e2a2bNliVqxYERLXRqhcw/+rsLDQHD161Ph8PmOMMe/fv3e8yN6RI0fM4cOHXc8IyOfzmZSUFP910dTUZJKSkozX63W8bHC9vb1m4cKFpqWlxRjzsyObN28OynMH9Ui2u7tbjY2NSk9PlySlp6ersbFRHz58COaMP5KSkqLJkye7nmHN4/Fo0aJF/sdJSUnq6OhwuMjO2LFj/R/39fUpLCzM4Zqhff/+XQUFBTp06NCw3xqq+vv7VVFRodzcXP9rPGHCBMer7Hz//l2VlZX6559/XE8ZUnh4uD59+iTp53fFcXFxCg8fvnfrXr16pQkTJmjmzJmSpNTUVNXW1galI0E9ku3s7NTEiRM1YsQISdKIESMUFxenzs7OYX9kGIp8Pp9KS0uVlpbmeoqV/Px81dXVyRijK1euuJ4TUElJidavXx+cY6D/UF5enowxSk5O1q5duxQdHe160qBaW1vl8Xh09uxZ1dfXa8yYMcrNzVVKSorraUOqqqrSxIkTNW/ePNdTAgoLC9Pp06eVnZ2tqKgo9ff369KlS65nBTRz5kx1dXXpyZMnmj9/viorKyUpKB0Zvv+NwP+tsLBQUVFRyszMdD3FytGjR1VTU6OdO3fqxIkTrucM6vHjx3r69KkyMjJcT/kj165d040bN1RWViZjjAoKClxPCmhgYECtra2aO3euysvLlZeXp5ycHPX19bmeNqSysrKQ+O5yYGBAly5d0vnz51VdXa0LFy5o586d6u/vdz1tUGPHjtWpU6dUVFSkjRs3qru7W9HR0YqI+Pvf/wU1mJMnT9bbt2/l9XolSV6vV+/evQupI89QUVxcrFevXun06dPD+njldzZs2KD6+nr19PS4nvJbDQ0Namlp0apVq5SWlqY3b95oy5Ytqq2tdT0toF9/zyIjI5WRkaFHjx45XhRYfHy8IiIi/LdwFixYoNjYWL18+dLxssDevn2rhoYGrVu3zvWUITU1Nendu3dKTk6WJCUnJ2v06NFqbm52vCywxYsXq7S0VOXl5crMzNTXr1+DctoT1H9Jx48fr8TERN28eVOSdPPmTSUmJnIc+x87deqUnj17pnPnzikyMtL1nCH19/ers7PT/7iqqkoxMTHyeDzuRgWwdetW1dbWqqqqSlVVVZo0aZKuXr2qpUuXup42qM+fP/vvUxljdPv27WH/LuRx48Zp0aJFqqurk/TzHfbd3d2aPn2642WBXb9+XampqYqNjXU9ZUiTJk3Smzdv1NLSIklqbm5WV1eXpk2b5nhZYO/fv5f087bTyZMntWnTJkVFRf315w36L5Bubm7W3r179fHjR0VHR6u4uFizZs0K5oQ/cuTIEd29e1ddXV2KjY2Vx+PRrVu3XM8a1IsXL5Senq4ZM2Zo1KhRkqQpU6bo3LlzjpcNrqurS9nZ2fry5YvCw8MVExOjPXv2DPv7P7+kpaXp4sWLw/rHSlpbW5WTkyOv1yufz6fZs2frwIEDiouLcz0toNbWVu3fv1+9vb2KiIjQjh07lJqa6npWQGvXrlV+fr6WL1/ueoqVGzdu6PLly/43Vm3fvl2rV692vCqw/Px8PXr0SD9+/NCSJUu0f/9+/49L/U1BDyYAAKEotG5uAQDgCMEEAMACwQQAwALBBADAAsEEAMACwQQAwALBBADAAsEEAMDCv6AMGgNp99rNAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed);"
]
},
{
"cell_type": "markdown",
"id": "c31bcb5f",
"metadata": {},
"source": [
"The above strategy will take three guesses to sink the ship, as shown in the animation below."
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "881e267b",
"metadata": {},
"outputs": [],
"source": [
"turn_revealed = [revealed]\n",
"\n",
"next_j = next_guess_1d_with_hit(revealed)\n",
"next_revealed = revealed.copy()\n",
"next_revealed[next_j] = board[next_j]\n",
"turn_revealed.append(next_revealed)\n",
"revealed = next_revealed\n",
"\n",
"next_j = next_guess_1d_with_hit(revealed)\n",
"next_revealed = revealed.copy()\n",
"next_revealed[next_j] = board[next_j]\n",
"turn_revealed.append(next_revealed)\n",
"revealed = next_revealed\n",
"\n",
"next_j = next_guess_1d_with_hit(revealed)\n",
"next_revealed = revealed.copy()\n",
"next_revealed[next_j] = board[next_j]\n",
"turn_revealed.append(next_revealed)\n",
"revealed = next_revealed"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "9cc6462e",
"metadata": {},
"outputs": [],
"source": [
"def animate_boards(boards,\n",
" cmap=CMAP, cbar=False, ax=None,\n",
" heatmap_kwargs=None, **ani_kwargs):\n",
" if ax is None:\n",
" fig, ax = plt.subplots(figsize=(FIG_WIDTH, FIG_WIDTH))\n",
" else:\n",
" fig = ax.figure\n",
" \n",
" if heatmap_kwargs is None:\n",
" heatmap_kwargs = {}\n",
" \n",
" plot_board(boards[0],\n",
" cmap=cmap, cbar=cbar, ax=ax,\n",
" **heatmap_kwargs)\n",
" \n",
" quadmesh, *_ = ax.get_children()\n",
" \n",
" def ani_func(i):\n",
" quadmesh.set_array(boards[i])\n",
" \n",
" return quadmesh,\n",
" \n",
" ani_kwargs.setdefault('blit', True)\n",
" ani_kwargs.setdefault('frames', len(boards))\n",
" \n",
" return FuncAnimation(fig, ani_func, **ani_kwargs)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "e9f7147e",
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"ani = animate_boards(turn_revealed, interval=300)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "b2bf9c71",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video width=\"576\" height=\"576\" controls autoplay loop>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAACgttZGF0AAACrgYF//+q\n",
"3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSByMzAzME0gOGJkNmQyOCAtIEguMjY0L01Q\n",
"RUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMjAgLSBodHRwOi8vd3d3LnZpZGVvbGFu\n",
"Lm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0xIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5h\n",
"bHlzZT0weDM6MHgxMTMgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhl\n",
"ZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTEgY3FtPTAg\n",
"ZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02\n",
"IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50\n",
"ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi\n",
"X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w\n",
"PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0zIHNjZW5lY3V0PTQwIGludHJhX3Jl\n",
"ZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAu\n",
"NjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAF\n",
"Z2WIhAAT//73sY+BTcgADZc6inof4RWx9JBRerHZoGTqAAADAAADAABOFqne+b9ctAjWAAAHoACZ\n",
"BoxnyHjmGgOknhxlCRU0gAKSx/GfJv8QAyuRIYdlbxF3Q0ZZ3nsNhTHogxkZ2QZ0H99af9E7BMkc\n",
"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\n",
"\">\n",
" Your browser does not support the video tag.\n",
"</video>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"HTML(ani.to_html5_video())"
]
},
{
"cell_type": "markdown",
"id": "d0a473a9",
"metadata": {},
"source": [
"##### Getting the first hit\n",
"\n",
"Immediately it is clear that we only have to search one of the conrguence classes of the cell index mod the ship size to guarantee a hit. In the following plot of a row of length ten, each congruence class mod three is colored differently."
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "bcef9d08",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(np.arange(10) % 3, cmap='plasma', vmin=0, vmax=2);"
]
},
{
"cell_type": "markdown",
"id": "bba5e13d",
"metadata": {},
"source": [
"A moment's consideration shows that the congruence class of -1 modulo the ship size will always have the fewest elements of any of the congruence class, so we choose to search along these cells. The following plot shows the cells to be searched until a hit is found in red."
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "cf17f1ec",
"metadata": {},
"outputs": [],
"source": [
"def get_search_cells_1d(grid_length, ship_size):\n",
" i = np.arange(grid_length)\n",
" \n",
" return i[i % ship_size == -1 % ship_size]"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "81c935dc",
"metadata": {},
"outputs": [],
"source": [
"row = np.zeros(10)\n",
"row[get_search_cells_1d(10, 3)] = 1"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "1e37ecbf",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(row);"
]
},
{
"cell_type": "markdown",
"id": "697742a9",
"metadata": {},
"source": [
"The following subclass of `Strategy` implements the optimal strategy of searching along this grid until a hit is found, then greedily filling out the ship."
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "e611002b",
"metadata": {},
"outputs": [],
"source": [
"class Single1DOptimalStrategy(Strategy):\n",
" def __init__(self, grid_length, ship_size):\n",
" self._grid_length = grid_length\n",
" self._ship_size = ship_size\n",
" \n",
" def next_guess(self, revealed):\n",
" if revealed.mask.all() or revealed.sum() == 0:\n",
" search_j = get_search_cells_1d(self._grid_length,\n",
" self._ship_size) \n",
" next_j = search_j[revealed.mask[0, search_j].argmax()]\n",
" else:\n",
" return 0, next_guess_1d_with_hit(revealed[0])\n",
" \n",
" return 0, next_j"
]
},
{
"cell_type": "markdown",
"id": "4e0578ec",
"metadata": {},
"source": [
"We now use this strategy to play all three games with a length three ship on a length five row."
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "4a5c3295",
"metadata": {},
"outputs": [],
"source": [
"all_rows_5_3 = get_all_ship_rows(5, 3)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "42742fb0",
"metadata": {},
"outputs": [],
"source": [
"opt_row_games_5_3 = [\n",
" play(ship_row[np.newaxis, np.newaxis],\n",
" Single1DOptimalStrategy(5, 3))\n",
" for ship_row in all_rows_5_3\n",
"]\n",
"opt_row_turns_5_3 = Pmf.from_seq([game.turns for game in opt_row_games_5_3])"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "ce189f1a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgoAAAGYCAYAAAAjh8qAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAA6xElEQVR4nO3dfVhUdf7/8dfMiOZNpkOKQ9Jq7Ua0l5iGmpW6IAIZClmIP66gzcJMTas1vpEpjpqbVltBmdq92d1CeQNLalqt1q4km6lBta2JN3FX3GgEgQ7z+8N1LgkPji4MiM/HdXldnDPnfM7nPdMnXnzOmXNMTqfTKQAAgFMwt3YHAABA20VQAAAAhggKAADAEEEBAAAYIigAAABDBAUAAGCIoACgWRQWFmrQoEFyOBzN3nZaWppmz559Vvs+9NBDeuqpp5q5R8D5g6AAnKfee+89jRs3TgMHDtT111+vlJQUHTlyxO39Q0JC9I9//MO17Ovrq507d8pisbREdwG0EoICcB56+eWX9cQTT+jBBx9Ubm6u3nnnHRUWFuqOO+5QXV1da3cPQBtCUADOM1VVVUpLS9MjjzyikSNHysvLS3379tXTTz+twsJCrV+/XtLx6f6ZM2fqvvvu06BBg3TzzTfr66+/liQ9+OCDKiws1NSpUzVo0CC98MILOnTokPz9/XXs2DFJUnx8vJ566ilNmjRJgwYN0tSpU1VRUaE//elPGjx4sG655RYdOnTI1a9FixZp1KhRGjx4sCZMmKDc3Fy36snJydHIkSO1fPlyDRs2TCEhIa4afu3w4cO6++67de2112rIkCG6++67VVxcLEl6//33NWHChAbbv/zyy5o2bdqZvcFAO0NQAM4zn3/+uWpraxUWFtZgfdeuXTVy5MgGpxO2bNmiiIgIffbZZ4qMjNS0adN09OhRPf744/L19dXy5cu1c+dOJSYmnvJY2dnZWrp0qbZu3aoDBw5o0qRJuuWWW/TZZ5/p8ssv13PPPefadsCAAVq7dq3rWLNmzVJtba1bNf3444+qqKjQtm3b9Nhjj2nevHn67rvvGm1XX1+vCRMm6KOPPtJHH32kTp06acGCBZKk0aNH69ChQ9q7d69r+/Xr1ysqKsqtPgDtFUEBOM9UVFSoZ8+e6tChQ6PXevXqpYqKCtfy73//e0VERMjLy8t1WmLXrl1uH2vChAm69NJLdeGFF2rkyJHy8/PTddddpw4dOigiIkL5+fmubaOiolz9mjx5surq6rRv3z63jzVr1ix17NhRQ4cO1ahRo/T+++832qZnz54KDw9X586d1a1bN91zzz3asWOHJKljx4668cYbXbMR3377rb7//nsFBwe73QegPWr8fwoA7VrPnj1VUVGhY8eONQoLP/zwg3r27Ola7tOnj+tns9ksHx8flZaWun2siy++2PVzp06dGixfcMEFqq6udi2//PLLSk9PV2lpqUwmk6qqqhqElqZ0795dXbp0cS37+vqesp81NTX685//rG3btunw4cOSpJ9//lkOh0MWi0U333yzHnjgAd13331at26dbrzxRnXs2NHteoH2iBkF4DwzaNAgdezYUZs2bWqwvrq6Wlu3btXw4cNd606cv5eOT9uXlJSod+/ezd6n3NxcvfDCC3r66ae1Y8cO5ebm6sILL5S7D7c9cuRIg9BRVFR0yn6+/PLL2rdvn/7617/q888/1xtvvCFJruNcffXV8vLyUm5urrKysjR+/PhmqA44txEUgPPMhRdeqOnTp2vRokXaunWrjh49qkOHDmnWrFnq06dPg3PyeXl52rRpk44dO6bXXntNHTt21MCBAyUdny04ePBgs/Tp559/lsVikdVq1bFjx/Tss8+qqqrqjNpIS0tTXV2dcnNz9fHHHysiIuKUx+nUqZO6d++uyspKPfvss422iY6O1oIFC2SxWBQUFHTWNQHtBUEBOA8lJibq/vvv19KlS3XNNddo4sSJstlsevXVVxtMtY8ePVrZ2dkaMmSI1q1bp7S0NHl5eUmSpkyZoueff15BQUF66aWX/qf+3HDDDRo5cqTCw8MVEhKiTp06yWazub3/xRdfrO7du2vEiBGaPXu25s+fr8svv7zRdrfffrtqa2t17bXXKjY2ViNGjGi0TVRUlL799lsuYgT+y+R0d24PwHklLS1N+/fv1xNPPNHaXWlSTk6OHnzwQW3durVZ2vvll180fPhwrVmzRv369WuWNoFzGTMKAHCSt956SwMGDCAkAP/Ftx4A4L9CQkLkdDob3N8BON9x6gEAABji1AMAADBEUADagPfee0//7//9P8PX77rrLq1Zs6ZZj7l8+XLNmTOnWds8F7TmY6d//cRN4FzANQqAh+Tm5uqJJ57Qt99+K4vFossuu0wPP/ywAgMDT7vviy++2Oz9mTp1arO3+eqrr+r1119XRUWFunTporFjxyopKemUt4tu7x566CH5+Pjo/vvvP6v9c3JydPvtt6tz586udfPmzdPNN9/cXF0E3HL+jV6gFVRVVWnq1KmaP3++brzxRh09elS5ubnt7vbAISEhmjBhguuGRjNnztTrr7+uO+6444zbOtUtps83vXv3bravfQJni1MPgAeceLhRZGSkLBaLLrjgAt1www268sorG2y3ZMkSDRkyRCEhIfr73//uWh8fH6/09HRJx09TTJo0SQsXLtQ111yjiIgI/fOf/zQ89sqVKzVixAgNGjRI4eHhrm3T0tI0e/ZsSdKCBQs0aNAg17+rrrpKaWlpkqSSkhLde++9uvbaaxUSEqJVq1YZHuvSSy9V9+7dJR2/LbLZbNb+/fvdeo9O1LV48WINHTpUaWlp+umnn5SUlKRrr71WwcHBWrZsmerr6yVJwcHB+vLLLyVJ69atk7+/v/7zn/9IktLT091+PPRHH32kqKgoBQUFadKkSa5HaUvHg89LL72kcePG6ZprrtF9993X4ImWL7zwgm644QbdcMMNSk9Pl7+/v/bv36933nlHmZmZeumll1yP2D7hq6++MmwPaIsICoAH9O/fXxaLRf/3f/+nv//9764HEp1s9+7d6t+/v7Zv36677rpLc+bMMXzWwe7du+Xn56ft27dr5syZmjFjhiorKxtt99133+mNN95QRkaGdu7cqZdeekmXXHJJo+3mzZunnTt3aufOnXrzzTfVvXt3jR49WvX19brnnnvk7++vrVu36rXXXtNrr72mbdu2GdaamZmpwYMH69prr9XXX3+tSZMmuf0+najrH//4h+655x4tXLhQP/30kzZv3qzXX39d69at07vvvitJGjJkiD777DNJx0/r+Pn5uZZ37NihoUOHnvZ4eXl5evjhh7VgwQLl5OQoNjZW06ZNU11dnWub999/Xy+++KK2bNmib775Ru+9954kaevWrXr11Vf1yiuv6IMPPnAdW5JiY2M1btw43Xnnndq5c6eWL19+2vZOpby8XNddd51CQkK0ePHiBs+zADyFoAB4QLdu3fTmm2/KZDJp7ty5Gj58uKZOnaoff/zRtY2vr68mTpzoeorhDz/80OD1k1mtVt1+++3y8vLS2LFj1b9/f3388ceNtrNYLKqrq9PevXt19OhR9e3bV5deeqlhP8vLyzV9+nTNnTtXV111lfbs2aPy8nLNmDFDHTt2lJ+fnyZOnKjs7GzDNsaNG6fPP/9cGzdu1KRJk+Tt7e32+9S7d2/Fx8erQ4cO8vLyUnZ2tv70pz+pW7du6tu3r+644w7XY6B/HRTuvvtu1yOjd+zYoSFDhpz2eH/9618VGxurgQMHut53Ly8vffHFF65t4uPj5ePjox49eig4OFhfffWVpOO/8CdMmKDf/e536ty5s2bMmOFWjUbt/dpll12mtWvX6pNPPtFrr72mvLw8PfbYY24dA2hOBAXAQy6//HI99thj2rp1qzIzM1VaWqrFixe7Xj/5EcwnLmAz+gvSx8dHJpPJtWz0WOXf/OY3evjhh5WWlqbrrrtO999/v0pKSk7Z5tGjRzVz5kxFRkbqpptukiR9//33Ki0tVVBQkOvf8uXLDQPMyfr166ff/e53stvtp932hJMfa11RUaGjR4/K19e3QZ0n+j906FD961//0g8//KD6+nrdeOON+vzzz3Xo0CH99NNPCggIOO3xCgsL9corrzSor7i4uMF72atXL9fPnTt3dn0mpaWlDfrr7rMpjNo71Xa//e1vZTab5efnpwcffFAbN2506xhAczq/rxQCWsnll1+uCRMm6J133jmr/UtKSuR0Ol1hoaioSCEhIafcdty4cRo3bpyqqqo0b948PfHEE3r88ccbbbdw4UJ17dpV9913n2udzWZT3759Gz2S2l3Hjh3TgQMH3N7+5PDTs2dPeXl5qbCwUL/97W8lHa/Tx8dH0vEQdMEFF+j1119XUFCQunXrposvvlh//etfdc0118hsPv3fQTabTVOnTtU999xzhpUdn/04OXQVFRUZ1tIcTCaT24/dBpoTMwqAB+zdu1cvv/yyiouLJR3/pZKVleV6ZPOZKi8v16pVq3T06FG9//772rt3r0aNGtVou++++07//Oc/VVdXp44dO6pTp06yWCyNtnv77be1Y8cOPfnkkw1+wQYGBqpbt25auXKlfvnlFzkcDv373//W7t27T9mv9PR0lZWVSZL+85//aOXKlRo+fLjr9fj4eNdFkqdjsVgUERGhp556SlVVVfr+++/1yiuvaPz48a5thg4dqtWrV7tOM/x6+XRiYmL09ttva9euXXI6naqurtbHH3/s1iOuIyIi9N5772nv3r2qqalpdNtn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KD093fVaRkaGxo4dq+joaOXl5bnWJycnn1UfAQDAcW4HBavVqoSEBL377rt6++23ZbValZSUpNGjR+uZZ57R999/f9o28vLy9MUXX8jX19e1LiUlRXFxcdq4caPi4uI0b968U+6bmZmpAwcOaNOmTXrnnXeUlpamQ4cOSZKWLVumjIwMzZkzRytWrJAk5eTkyGKxKCgoyN0SAQDAr5zVxYw//vijfvzxR/3888+69NJLVVJSoptvvlkrV6403Keurk4LFixQSkqKTCaTJKmsrEz5+fmKjIyUJEVGRio/P1/l5eWN9s/OzlZMTIzMZrOsVqtCQ0O1YcOG40WYzaqtrVV1dbW8vLxUV1en1NRUzZ49+2zKAwAA/9XB3Q2//fZbrV+/XpmZmerSpYuio6O1fv16+fj4SJKmTZum8ePHa8qUKafc/5lnntH48ePl5+fnWldUVCQfHx9ZLBZJksViUe/evVVUVCSr1dpg/6KiogYzETabTcXFxZKkpKQkTZ48WV27dpXdbtfKlSsVExOjHj16uFseAAA4BbeDwm233aabbrpJqampCgwMbPR63759dfvtt59y3507d2rPnj0t9hd+WFiYwsLCJEkFBQXavXu3EhMTZbfbVVZWpqCgICUkJJxRm97e3VqiqwCaUH7kF3l5uf2/JeC8ZbGYZe3ZxSPHcntEPvvssxoyZEij9bt373YFh1mzZp1y3x07dui7777T6NGjJUnFxcW68847lZycrJKSEjkcDlksFjkcDpWWlspmszVqw2azqbCw0HWsX88wnLB48WIlJydr/fr1slqtSklJUXx8vIKDgxvMZpxOWVmV6uudbm8PoBl0sOjo0WOt3QugzXM46vXDDz81S1tms6nJP47dvkbh7rvvPuX6u+6667T7TpkyRZ988ok+/PBDffjhh+rTp49eeukljR07VgEBAcrKypIkZWVlKSAgoNFpB0mKiIhQenq66uvrVV5ers2bNys8PLzBNmvXrlVgYKD69++vmpoa17UQJpNJ1dXV7pYKAAD+67RBob6+Xg6HQ06nU06nU/X19a5/BQUFrusLztb8+fO1evVqhYeHa/Xq1bLb7a7XEhMTtWfPHklSVFSU+vbtq7CwME2cOFHTp09vMENw+PBhpaenu66RGD9+vLZv367IyEj169dP/v7+/1M/AQA4H5mcTmeT8+tXXnml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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_turn_dist(opt_row_turns_5_3)\n",
"\n",
"make_pct_yaxis(ax);\n",
"ax.set_title(\"Optimal play\\nShip size 3, row length 5\");"
]
},
{
"cell_type": "markdown",
"id": "71ccd081",
"metadata": {},
"source": [
"Two of the games take four turns and one takes three turns. Notably, no games take five turns. This is because we know that the third cell is a guaranteed hit in this configuration.\n",
"\n",
"We can repeat this exercise for a row of length ten."
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "d7310cf4",
"metadata": {},
"outputs": [],
"source": [
"all_rows_10_3 = get_all_ship_rows(10, 3)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "1cf3f53d",
"metadata": {},
"outputs": [],
"source": [
"opt_row_games_10_3 = [\n",
" play(ship_row[np.newaxis, np.newaxis],\n",
" Single1DOptimalStrategy(10, 3))\n",
" for ship_row in all_rows_10_3\n",
"]\n",
"opt_row_turns_pmf_10_3 = Pmf.from_seq([game.turns for game in opt_row_games_10_3])"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "bfe8df60",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Uyf9+c9/lslk0hNPPKGhQ4dq8uTJ+uabb5xtAgICNGbMGOeqhcePH693/GL+/v564IEH5OXlpZEjR6pPnz764IMPGrSzWCyqq6vTgQMHdPbsWQUGBur66683rLOyslLTpk3TE088oZtuukl79uxRZWWl8zZJUFCQxowZo8LCQsNrjBo1Sjt37tS7776rcePGqVu3bi5/n3r06KGkpCS1a9dOXl5eKiws1G9/+1t16tRJgYGBevDBB53LPn8/KDz00EPOJaJ37Nih8PDwK77eX/7yF40dO1Y333yz8/vu5eWlzz77zNkmKSlJPXv2lJ+fnyIiIvTFF19IOv8L/5577tFPf/pTdejQQdOnT3epj0bXa4wLC1517tzZua9z5846c+ZMo68FNBZBAWgmffv21e9+9ztt2bJF69atU3l5ubKyspzHL15yuUOHDpJUbwXEi/Xs2VMmk8m5bbSM8o9+9CPNnj1bOTk5+vnPf67f/OY3Onbs2CWvefbsWc2YMUNxcXG66667JElff/21ysvLFRYW5vwvNzfXMMBcrHfv3vrpT3+qzMzMK7a94OJlrE+cOKGzZ88qICCgXj8v1H/LLbfon//8p44fPy673a4777xTO3fu1NGjR3X69GmFhIRc8fVKSkq0YsWKev0rKyur973s3r278+sOHTo4x6S8vLxeva6uRWF0vca4sIT2xQtlVVVVycfHp9HXAhrr6ntrMuAGffv21T333KM333zzB51/7NgxORwOZ1goLS1VZGTkJduOGjVKo0aNUlVVlebOnavFixfr6aefbtBu/vz58vHx0SOPPOLcZ7VaFRgY2GAJaledO3dOR44ccbn9xeGna9eu8vLyUklJiX7yk59IOt/Pnj17Sjofgq655hq9+uqrCgsLU6dOnXTttdfqL3/5iwYNGiSz+cp/91itVk2ePFlTpkxpZM/Oz35cHLpKS0sN+9LUunTpou7du2vfvn269dZbJUn79u1zfp+A5sSMAtAMDhw4oFdeeUVlZWWSzv9SKSgocC7R3FiVlZVauXKlzp49q3feeUcHDhzQHXfc0aDdl19+qY8//lh1dXXy9vZW+/btZbFYGrR74403tGPHDv3+97+v9ws2NDRUnTp10rJly/Tdd9/JZrPp3//+t3bv3n3JuvLy8lRRUSFJ+s9//qNly5Zp6NChzuNJSUmG7+L/PovF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T/Hx8dq1a5fzFsO0adPqzRCcOnVKeXl5WrFihSRp9OjRmj59utavX6+BAwcqODi4JboKAECbYnI4HMyvXwK3Htq4dhYtWrnD3VXge9KSwxkXD5OWHC6ds7m7DDQjj7n1AAAAWh+CAgAAMERQAAAAhggKAADAEEEBAAAYIigAAABDBAUAAGCIoAAAAAwRFAAAgCGCAgAAMORyUDhx4kRz1gEAADyQy0HhF7/4haZMmaL169errq6uOWsCAAAewuWg8P7772vo0KFavny5brvtNj3xxBMqKipqztoAAICbuRwU/P39lZycrL/+9a9644035O/vr7S0NA0fPlzPPfecvv766+asEwAAuMEPejPjN998o2+++UZnzpzR9ddfr2PHjunuu+/WsmXLmro+AADgRu1cbbh//36tXbtW69atU8eOHZWQkKC1a9eqZ8+ekqSpU6dq9OjRmjRpUrMVCwAAWpbLQeH+++/XXXfdpezsbIWGhjY4HhgYqAceeKBJiwMAAO7lclB4/vnnFR4e3mD/7t27ncFh5syZTVcZAABwO5ffo/DQQw9dcv/EiRObrBgAAOBZrjijYLfb5XA46v13wZEjR2SxWJq1QAAA4D5XDAo33XSTTCaT8+uLmc1mTZ48uXkqAwAAbnfFoLBp0yY5HA4lJSXptddec+43mUzy9/fXNddc06wFAgAA97liULjuuusknX8yIwAAuLpcNig88cQTmj9/viQpLS3NsN2iRYuatioAAOARLhsUAgMDnV9ff/31zV4MAADwLJcNChd/JHL69OnNXgwAAPAslw0KH3/8sUsXGTp0aJMUAwAAPMtlg8KcOXOueAGTyaRNmzY1WUEAAMBzXDYobN68uaXqAAAAHugHLTMNAACuDpedUbjzzjv1zjvvSJLuuOMO5xMav++DDz5o8sIAAID7XTYoXHiGgiQ9/fTTzV4MAADwLJcNCmFhYc6vb7nllmYvBgAAeBaX36NQV1en5557TtHR0erfv7+io6P17LPPqra29ornnjhxQikpKYqJidGoUaM0ffp0VVZWSpIOHjyosWPHKiYmRmPHjtWhQ4cueQ2bzabMzExFRUVpxIgRysvLcx7Lz8/XyJEjlZCQoOLiYuf+9PR0FRUVudpFAADwPS4HhSeffFLbtm3TnDlzlJ+frzlz5mjHjh168sknr3iuyWTSxIkT9e6772rdunUKCgrS4sWLJUkZGRkaP3683n33XY0fP15z58695DXWrVunI0eOaMOGDXrzzTeVk5Ojo0ePSpKWLFnirGnp0qWSpO3bt8tisdSbFQEAAI3jclDYtGmTli5dqjvuuEM/+clPdMcdd+iFF15w6RkKfn5+Gjx4sHO7f//+KikpUUVFhfbu3au4uDhJUlxcnPbu3eucbbhYYWGhEhMTZTab5e/vr6ioKK1fv/58J8xm1dbWqrq6Wl5eXqqrq1N2drZSU1Nd7R4AALiEK64eecG1116rmpoa+fr6OvfV1taqe/fujXpBu92u119/XZGRkSotLVXPnj1lsVgkSRaLRT169FBpaan8/f3rnVdaWqqAgADnttVqVVlZmaTzC1ZNmDBBPj4+yszM1LJly5SYmCg/P79G1QYAAOpz+RHO8fHxmjhxopKSktSzZ0+VlZVp1apVio+Pb9QLzp8/Xx07dtT999+vvXv3/rCqvyc6OlrR0dGSpEOHDmn37t1KSUlRZmamKioqFBYWpuTk5EZds1u3Tk1SGzxT5bffycvL5ZyMlmIyMS4exmIxy79rR3eXATdq9COcc3Nz622/+eabmjRpkksvtnDhQh0+fFi5ubkym82yWq06duyYbDabLBaLbDabysvLZbVaG5xrtVpVUlKi0NBQSQ1nGC7IyspSenq61q5dK39/f2VkZCgpKUkREREKCgpyqU5Jqqiokt3ucLk9Wpl2Fp09e87dVeD7HA7GxcPYbHYdP37a3WWgGZnNpsv+cdxij3B+5pln9Pnnn2vZsmXy9vaWJHXr1k0hISEqKChQfHy8CgoKFBIS0uC2gyTFxsYqLy9P0dHROnnypDZu3KhVq1bVa7NmzRqFhoaqT58+2rp1q/MBUSaTSdXV1U3WFwAArhYt8gjn/fv3Kzc3V+Xl5Ro3bpzi4+M1bdo0Sec/TfHaa68pJiZGr732mjIzM53npaSkaM+ePZLO3/oIDAxUdHS0xowZo2nTptWbITh16pTy8vKcsxujR4/Wtm3bFBcXp969eys4OLglugoAQJticjgcLs2vV1VVKScnRzt27NCJEyd08Wlt8RHO3Hpo49pZtGjlDndXge9JSw5nXDxMWnK4dM7m7jLQjK5066FRz1HYu3evpk6dqpMnT+rxxx+X1WrVr371q6aoEwAAeCCX31780UcfqbCwUF27dpXFYlFUVJT69eunyZMnExYAAGijXJ5RsNvt6ty5sySpY8eO+vbbb9W9e3cdPny42YoDAADu5fKMwo033qgdO3Zo6NChCgsLU2Zmpnx8fNS7d+9mLA8AALiTyzMKCxYs0HXXXSdJevzxx9W+fXt9++23WrRoUbMVBwAA3MvlGYWLP4ro7++vrKysZikIAAB4jkY9KzU/P19/+9vfVF5erh49emjkyJG67777nA82AgAAbYvLQWHRokXatGmTHnjgAV133XX6+uuv9corr+jgwYNKS0trzhoBAICbuBwUVq9erdWrV6tXr17OfREREbr77rsJCgAAtFEuv5nRx8dHPj4+DfZ16sQqiwAAtFWXnVH46quvnF8/8MADmj59uiZNmqRevXqptLRUL7/8Mg9bAgCgDbtsUBgxYoRMJlO9dR22b99er822bdt0//33N091AADArS4bFPbt29dSdQAAAA/UqI9HSlJJSYmOHTumXr16yWq1NkdNAADAQ7gcFMrLyzVr1ix99tln8vPz08mTJ3XzzTfrD3/4g3r27NmcNQIAADdp1DLTN954oz755BN9+OGH+uSTTxQSEqKMjIzmrA8AALiRyzMK//znP/Xcc8/Jy8tL0vkVJNPS0nT77bc3W3EAAMC9XJ5R6NKliw4cOFBv35dffilfX98mLwoAAHgGl2cUJk6cqF/96le67777FBAQoJKSEr311luaOXNmc9YHAADcyOWgMGbMGAUFBamgoED/+te/1KNHD/3+97/X0KFDm7M+AADgRi4FBZvNppiYGBUWFhIMAAC4irj0HgWLxSKLxaLa2trmrgcAAHgQl289JCcn65FHHtFDDz2kXr16yWQyOY8FBQU1S3EAAMC9XA4K8+fPlyR99NFH9fabTCZ98cUXTVsVAADwCFcMCjU1NXrxxRf1i1/8QjfddJMeeughtW/fviVqAwAAbnbF9yjMmzdP77//vn784x9rw4YNWrRoUUvUBQAAPMAVg8LWrVv18ssvKy0tTcuXL9f777/fEnUBAAAPcMWgUF1drR49ekiSrFarqqqqmr0oAADgGa74HgWbzaZt27bJ4XBIks6dO1dvWxLPVgAAoI26YlDo1q2bZs+e7dz28/Ort20ymbRp06bmqQ4AALjVFYPC5s2bW6IOAADggVxePRIAAFx9WiQoLFy4UJGRkQoODta///1v5/7I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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_turn_dist(opt_row_turns_pmf_10_3)\n",
"\n",
"make_pct_yaxis(ax);\n",
"ax.set_title(\"Optimal play\\nShip size 3, row length 10\");"
]
},
{
"cell_type": "markdown",
"id": "ad9c1836",
"metadata": {},
"source": [
"We see that no games take more than six turns with this configuration. Since the equivalence class of -1 modulo 3 contains three members (2, 5, and 8), we are guaranteed to get our first hit in at most three guesses, and once we have a first hit it will take at most three guesses to sink the ship (two hits and potentially one miss if the first hit was not on the rightmost cell of the ship)."
]
},
{
"cell_type": "markdown",
"id": "f9adfa7f",
"metadata": {},
"source": [
"#### Bayesian (Thompson sampling)\n",
"\n",
"The above thought exercise is interesting, but it involves several domain-specific insights (the optimal search grid, how to optimally sink a ship that has been located) that do not generalize immediately to two-dimensional grids that allow ships to be oriented in either rows or columns. (Note that if we restrict our ship in an $m \\times n$ grid to be oriented along a row, we're essentially playing a one-dimensional game on a row of length $m \\cdot n$.) In this section we will show how to reproduce the above results using a Bayesian approach to this game of simplified Battleship. This approach will generalize to a near-optimal strategy for standard Battleship with many fewer hard coded rules than the above optimal one-dimensional strategy requires to generalize.\n",
"\n",
"<center><img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Bayes%27_Theorem_MMB_01.jpg/1280px-Bayes%27_Theorem_MMB_01.jpg\" width=500></center>\n",
"\n",
"We begin by enumerating all possible boards for a given row/ship configuration (in this case 5/3)."
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "148757e5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAAEtCAYAAACFw1ChAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAInElEQVR4nO3cP2hV9x/G8U9UpAjV2II291YoHSzSpUPBxSkOLjG4CcGpagdxcVIsKGg7pAgqKDjoKK7FP4MdgoMOpYNCrYKlrQ73pko0IEqhoPc3iJ1S+/Az8dTD6zUl597h4Qv3vnPOkKHBYDAoAOCVFjU9AADeBoIJAAHBBICAYAJAQDABILDkVS92u903tQMA/hN6vd6c118ZzKqqXr8/72N4odvpVJUzXmjOeeG9PON+f+4vGl5fp/PiBsYZL6yX5zwXj2QBICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgMDQYDAY/NOL3W73TW4BgMb1er05r7vDBIDAkn97Q78/d2l5fZ3Oizv4Xr/f8JJ263Y6VeWcF5IzXngvz9h38sJ6+b08F3eYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgMDQYDAY/NOL3W73TW4BgMb1er05r7vDBIDAkn97Q78/d2l5fZ3Oizt4Z7ywXp5zr99veEl7dTudqnLGC8kZvxkvz3ku7jABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAgaHBYDD4pxe73e6b3AIAjev1enNef2UwAYAXPJIFgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAoDXB/P3332vr1q21adOm2rp1a929e7fpSa0zOTlZo6Oj9cknn9SdO3eantNKs7OztXPnztq0aVNt3ry5du/eXY8ePWp6Vuvs2rWrxsfHa8uWLTUxMVG3b99uelJrnThxojXfGa0J5sGDB2tiYqIuX75cExMTdeDAgaYntc7GjRvr7Nmz/in/AhoaGqodO3bU5cuX68KFC7VmzZo6cuRI07NaZ3Jyss6fP1/fffddffHFF7V///6mJ7XSzz//XDdu3KhOp9P0lHnRimA+fPiwbt26VWNjY1VVNTY2Vrdu3fKX+Tz7/PPPa2RkpOkZrTY8PFzr16//+/fPPvus+v1+g4va6d133/375ydPntTQ0FCDa9rpr7/+qkOHDtXBgwdbc75Lmh4wH6anp2v16tW1ePHiqqpavHhxrVq1qqanp+u9995reB38f54/f17nzp2r0dHRpqe00ldffVXXrl2rwWBQp0+fbnpO6xw/frzGx8drzZo1TU+ZN624w4Q2Onz4cC1btqy2bdvW9JRW+uabb+rKlSu1Z8+e+vbbb5ue0yrXr1+vn376qSYmJpqeMq9aEcyRkZG6f/9+PXv2rKqqnj17Vg8ePPD4kLfW5ORk3bt3r44dO1aLFrXiY/qftWXLlvrhhx9qdna26Smt8eOPP9Zvv/1WGzdurNHR0frjjz9q+/btdfXq1aanvZZWfBLff//9WrduXV28eLGqqi5evFjr1q3zOJa30tGjR+vmzZt18uTJWrp0adNzWufp06c1PT399+9TU1O1YsWKGh4ebm5Uy3z55Zd19erVmpqaqqmpqfrggw/qzJkztWHDhqanvZahwWAwaHrEfPj1119r37599fjx41q+fHlNTk7Wxx9/3PSsVvn666/r+++/r5mZmVq5cmUNDw/XpUuXmp7VKr/88kuNjY3VRx99VO+8805VVX344Yd18uTJhpe1x8zMTO3atav+/PPPWrRoUa1YsaL27t1bn376adPTWmt0dLROnTpVa9eubXrKa2lNMAFgIbXikSwALDTBBICAYAJAQDABICCYABAQTAAICCYABP4HILJBxrcuFuYAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(all_rows_5_3)\n",
"ax.set_yticklabels([]);"
]
},
{
"cell_type": "markdown",
"id": "c06ae9ad",
"metadata": {},
"source": [
"We consider this set of ships as a uniform prior distribution on the set of possible board layouts. With this perspective, when we take the average in each columns, we get the prior probability that each cell contains a ship."
]
},
{
"cell_type": "markdown",
"id": "0dccb125",
"metadata": {},
"source": [
"We already see that this Bayesian approach thhat we can conclude that the third cell must contain a ship without doing any modular arithmetic. \n",
"\n",
"For a configuration with a longer row (10/3), we see that the middle six cells have the higest prior probability of containing a ship. This makes sense as there are three configurations in which each of these cells contains a ship, but only one configuration in which the first cell contains a ship, and similarly for the other cells near the edges."
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "3fe59fc3",
"metadata": {},
"outputs": [],
"source": [
"all_rows_10_3 = get_all_ship_rows(10, 3)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "7db04efe",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdYAAAHLCAYAAAB1UrkfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAvX0lEQVR4nO3dfVjUdaL//9cwiCY14dQFDmKpXVvL7pFNpTqeastEMMW7imVjU/ewYUpoucclyVYCjQ5tu5biDXrKr5Wn0xcqBLzN1brSY5Zla0k3XiipcZfgQIqhDvP7w5/zjQEZat8TUs/HdXFdzmc+75n3aPny9f7cjMXtdrsFAACMCOjqCQAA8GNCsAIAYBDBCgCAQQQrAAAGEawAABhEsAIAYBDBCgDocrm5ubrjjjt03XXX6fPPP/dsP3TokBITExUXF6fExERVVFR06rlvc7lcysrKUkxMjEaNGqWCggLPc4WFhRozZowmTpyo/fv3e7ZnZGRoz5493+uzEKwAgC43cuRIrV27Vv369Wu1PTMzU0lJSdq8ebOSkpI0f/78Tj33bSUlJTp8+LC2bNmiV155RUuWLNHRo0clScuWLVNhYaHmzZun/Px8SdLu3btltVoVHR39vT4LwQoA6HLR0dFyOBytttXV1amsrEzx8fGSpPj4eJWVlam+vr7D57xt2LBBCQkJCggIkN1uV0xMjDZt2iRJCggIUHNzs5qamtSjRw+dPn1aixcv1pw5c773Zwn83iMBAOhAY2OjGhsb22y32Wyy2Ww+x1dVVSksLExWq1WSZLVaFRoaqqqqKrnd7gs+Z7fb27xOeHi457HD4VB1dbUkKT09XcnJyQoODlZWVpZWrlyphIQEhYSEfN+PTbACACRZLMZfcs3ixcrLy2uzPS0tTTNnzjT+ft9HbGysYmNjJUkVFRXat2+fUlJSlJWVpbq6OkVHR2vKlCnf6TUJVgCAX0ydOlWTJk1qs70zbVU61yxramrkcrlktVrlcrlUW1srh8Mht9t9wefae53KykpFRUVJattgz8vJyVFGRoaKi4tlt9uVmZmpyZMna8SIEerfv3+nPzfHWAEAksX8j81mU0RERJufzgbrFVdcocjISJWWlkqSSktLFRkZKbvd3uFz3kaPHq2CggK1tLSovr5eW7duVVxcXKt9ioqKFBUVpYEDB+rUqVOy/P8N3mKxqKmpqbO/i+fG8O02AABZzS8Fy9X5eFm4cKG2bNmiY8eOqU+fPgoJCdH69etVXl6uuXPnqrGxUTabTbm5uRo0aJAkdfhcSkqKZs2apcGDB8vlcik7O1s7d+70PJeYmOh574aGBqWmpmr16tUKCgqS0+lUWlqanE6nhg4dquzs7O/0sQlWAECXB+uPCUvBAAAYRLACAGAQZwUDAM6dcAQjCFYAAMFqEEvBAAAYRGMFANBYDaKxAgBgEI0VAEBjNYjGCgCAQQQrAAAGsRQMAGAp2CAaKwAABtFYAQA0VoNorAAAGERjBQDQWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBBCsAAAaxFAwAYCnYIBorAAAG0VgBADRWg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBDBCgCAQQQrAAAGcYwVAMAxVoNorAAAGERjBQDQWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBBCsAAAaxFAwAYCnYIBorAAAG0VgBADRWg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBDBCgCAQQQrAAAGcYwVAMAxVoNorAAAGERjBQDQWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBBCsAAAaxFAwAYCnYIBorAAAG0VgBADRWg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBCNFQBAYzWIxgoAgEEEKwAABhGsAAAYxDFWAADHWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBNFYAAI3VIBorAAAGEawAABjEUjAAgKVgg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBDBCgA411hN/3xH27dv18SJEzVhwgSNGzdOW7ZskSQdOnRIiYmJiouLU2JioioqKtod73K5lJWVpZiYGI0aNUoFBQWe5woLCzVmzBhNnDhR+/fv92zPyMjQnj17vvtkO8BSMACgy7ndbqWnp2vt2rW69tpr9emnn+ree+9VTEyMMjMzlZSUpAkTJmjdunWaP3++XnjhhTavUVJSosOHD2vLli1yOp2aOHGihg8froiICC1btkylpaXav3+/8vPztXjxYu3evVtWq1XR0dFGPwuNFQBwUQgICNDXX38tSfr6668VGhqq48ePq6ysTPHx8ZKk+Ph4lZWVqb6+vs34DRs2KCEhQQEBAbLb7YqJidGmTZs8r93c3Kympib16NFDp0+f1uLFizVnzhzjn4PGCgDwi8bGRjU2NrbZbrPZZLPZWm2zWCx65plnlJqaqt69e+vkyZPKz89XVVWVwsLCZLVaJUlWq1WhoaGqqqqS3W5v9RpVVVUKDw/3PHY4HKqurpYkpaenKzk5WcHBwcrKytLKlSuVkJCgkJAQw5+aYAUASH45K3jNmjXKy8trsz0tLU0zZ85ste3s2bPKz8/XsmXLNGzYML3//vuaPXu2nnrqKSNziY2NVWxsrCSpoqJC+/btU0pKirKyslRXV6fo6GhNmTLFyHsRrAAAvwTr1KlTNWnSpDbbvduqJH3yySeqra3VsGHDJEnDhg3TJZdcop49e6qmpkYul0tWq1Uul0u1tbVyOBxtXsPhcKiyslJRUVGS2jbY83JycpSRkaHi4mLZ7XZlZmZq8uTJGjFihPr37//PfmyOsQIA/MNmsykiIqLNT3vB2rdvX1VXV+vgwYOSpPLych07dkxXX321IiMjVVpaKkkqLS1VZGRkm2VgSRo9erQKCgrU0tKi+vp6bd26VXFxca32KSoqUlRUlAYOHKhTp07JYjn3LwqLxaKmpiYjn9vidrvdRl4JANB9/YsfKuvH3y1eiouLtWrVKk/YzZo1SzExMSovL9fcuXPV2Ngom82m3NxcDRo0SJKUkpKiWbNmafDgwXK5XMrOztbOnTs9zyUmJnpev6GhQampqVq9erWCgoLkdDqVlpYmp9OpoUOHKjs728jHJlgBABdFsP5YcIwVAMAtDQ3iGCsAAAYRrAAAGMRSMACApWCDaKwAABhEYwUA0FgNIlgBAASrQSwFAwBgEI0VAEBjNYjGCgCAQTRWAACN1SAaKwAABhGsAAAYxFIwAIClYINorAAAGERjBQDQWA2isQIAYBCNFQBAYzWIYAUAEKwGsRQMAIBBBCsAAAYRrAAAGMQxVgAAx1gNIlgBAASrQSwFAwBgEI0VAEBjNYjGCgCAQTRWAACN1SAaKwAABhGsAAAYxFIwAIClYINorAAAGERjBQDQWA2isQIAYBCNFQBAYzWIYAUAEKwGsRQMAIBBBCsAAAYRrAAAGMQxVgAAx1gNIlgBAASrQSwFAwBgEI0VAEBjNYjGCgCAQTRWAACN1cvIkSPldrs73Gfbtm3tbidYAQDwsnDhQs+vLRaLUlNTtXTpUs/jBx544IJjCVYAAI3Vy/Dhw1s9DgwMbLXNarVecCzHWAEA8OHSSy9VVVWVJKm2tla9e/e+4L40VgAAfBgxYoRSUlL061//Wm+//bZuvfXWC+5rcfs6OgsA+PGL8cNa8NYfT7ycPn1a+fn52r9/v6699lrNmDFDl1xySbv7EqwAAIK1HYcOHdLGjRtVW1ur0NBQjRkzRgMGDPA5jmOsAIBzJy+Z/unGtm7dqrvuuksHDhxQcHCwDhw4oEmTJunvf/+7z7EcYwUAdPsgNG3RokVavny5/vVf/9WzbdeuXXriiSc0cuTIDsfSWAEA8FJbW6vo6OhW22688UbV1tb6HEuwAgBYCvby85//XGvWrPE8drvdWr16tX7+85/7HMvJSwAAKc4PSbi5+8ZLeXm5pk+frubmZjkcDlVVValXr15avny5rrnmmg7HEqwAAIK1HWfPntXevXtVU1OjsLAwDRkyRIGBvk9N4uQlAEC3X7o17bPPPlNQUJBuuOEGSdLhw4d15MgRDRw40OdYjrECAODlscceU01NjSRp/fr1uvfee/Xv//7vWrlypc+xBCsAgJOXvBw8eFBDhw6VJK1du1ZPP/20CgsL9dJLL/kcy1IwAABezh9LPXnypMrLy3XDDTcoMDBQJ06c8D3W35MDAHQD3bxhmjZkyBA9/vjjam5u1i233KLAwEBVVlYqLCzM51iWggEA8LJgwQK53W4FBgZq7ty5kiSXy6XMzEyfY7ncBgAgjfVDZV3/44sXX18ZJ7EUDABAG06nU5s2bdKxY8dabV+xYoWmT58uSUpLS2t3LMEKAICX1NRUWSwW9evXr81zhw8f7nAsS8EAACneD0vBpd03Xm688Ubt3r1bFkvr35chQ4Zo7969HY7l5CUAALxERES0CVVJuvrqq32OpbECAKRxfmisJd0/Xr766itVVVWpX79+uuKKKzo1hmOsAACuY/Vy4sQJPfLII9q5c6eam5sVGBioW2+9VU899ZQuvfTSDseyFAwAgJenn35a4eHh2rt3ry677DK9//77Cg0N1ZNPPulzLI0VAEBj9bJ9+3atX7/ec5w1KChIGRkZGjlypM+xNFYAALw0NTUpODhYknT+VKSTJ0/KarX6HEuwAgDgpX///jp69Kikc8G6fv16TZ8+XZMmTfI5lqVgAABLwV7uv/9+VVdXq3///nI4HHrllVd0zz33KCEhwedYLrcBAEgT/ZCsRT/NeKGxAgBorF5ef/31Cz7nazmYYAUAwEthYaHn1263W9XV1aqpqVFUVBTBCgDohIugsTY3NysnJ0e7du1Sz549df3112vBggU6dOiQ5s6dK6fTqZCQEOXm5mrAgAFtxrtcLi1cuFBvv/22LBaLpk2b5jkmWlhYqOeff15BQUF64okn9Mtf/lKSlJGRobvvvlvR0dGtXmvt2rVtXn/t2rU+b8AvEawAAOmiCNa//OUv6tmzpzZv3iyLxeL5yrbMzEwlJSVpwoQJWrdunebPn68XXnihzfiSkhIdPnxYW7ZskdPp1MSJEzV8+HBFRERo2bJlKi0t1f79+5Wfn6/Fixdr9+7dslqtbUL1Qu69914NHz5cGRkZHe7H5TYAgC538uRJFRUV6aGHHvLclOHKK69UXV2dysrKFB8fL0mKj49XWVmZ6uvr27zGhg0blJCQoICAANntdsXExGjTpk2SpICAADU3N6upqUk9evTQ6dOntXjxYs2ZM6fTczx79qySkpLkcrk63I/GCgDwS2NtbGxUY2Njm+02m002m63VtiNHjigkJER5eXnavXu3goOD9dBDD6lXr14KCwvz3JjBarUqNDRUVVVVstvtrV6jqqpK4eHhnscOh0PV1dWSpPT0dCUnJys4OFhZWVlauXKlEhISFBIS0u7cL3Ty0lVXXeWZS0lJicaNG9dmH4IVAOAXa9asUV5eXpvtaWlpmjlzZqttZ8+e1ZEjR/SLX/xCjzzyiP7xj39o+vTpevbZZ43MJTY2VrGxsZKkiooK7du3TykpKcrKylJdXZ2io6M1ZcoUz/7fPnnp29xut+fkpaKiIoIVAPDDmTp1artn0Hq3VUkKDw9XYGCgZ8n3V7/6lfr06aNevXqppqZGLpdLVqtVLpdLtbW1cjgcbV7D4XCosrJSUVFRkto22PNycnKUkZGh4uJi2e12ZWZmavLkyRoxYoT69+8vqf2Tl7w999xz7W7nGCsAwC9sNpsiIiLa/LQXrHa7XTfddJN27twpSTp06JDq6uo0YMAARUZGqrS0VJJUWlqqyMjINsvAkjR69GgVFBSopaVF9fX12rp1q+Li4lrtU1RUpKioKA0cOFCnTp3yHM+1WCxqampqta/T6dS6deu0atUqrVu3Tg0NDZ363Nx5CQAgJfjhIGvBd4uXI0eO6NFHH5XT6VRgYKAefvhh3XbbbSovL9fcuXPV2Ngom82m3NxcDRo0SJKUkpKiWbNmafDgwXK5XMrOzvaEc0pKihITEz2v39DQoNTUVK1evVpBQUFyOp1KS0uT0+nU0KFDlZ2d7dn3gw8+0PTp03X11VerX79+qqysVEVFhVasWKGhQ4d2+DkIVgCA9Bs/BOv/7b7xctddd+kPf/iDxo4d69lWUlKiNWvWXPD463ksBQMA4OXIkSMaPXp0q21jx47VF1984XMswQoAOHe5jemfbuyqq67S5s2bW23buHFju3d88sZSMABASvRDEr7SfeNl7969euCBBzRo0CCFh4ersrJSBw8eVH5+voYMGdLhWIIVACD91g/B+j/dO14aGhq0fft21dTUKCwsTCNGjNDll1/ucxzBCgAgWA3iBhEAAHiZMmWKLtQ7X3zxxQ7HEqwAgG5/spFp48eP9/z6/Pexvv766+3ewtAbwQoAgJd77rmnzbYxY8boscce8zmWYAUA0Fg7YeDAgfrkk0987kewAgAI1k5wu90qKSmR2+323GO4PQQrAACdYLVaPd9+0xGCFQBAYzWIWxoCAGAQwQoAgEEsBQMAIGnkyJEXvCnEt23btq3D5wlWAADHWCUtXLjQ8+uPPvpIpaWl+t3vfqe+ffuqpqZGL774YqduEMG9ggEA0hQ/JOsL3Tdexo4dq+eff15hYWGebTU1NUpOTtb69es7HMsxVgAAvHz11Vfq2bNnq22XXHKJjh075nMsS8EAAJaCvYwcOVIPPvigpk2bpn79+unLL7/UihUrNHLkSJ9jWQoGAEhT/ZCsa7pvvDQ3N2v58uXasGGDamtrFRoaqrFjx2rGjBkKCgrqcCzBCgCQfu+HYP0/P8146XApuF+/fj/UPAAAPnz55ZddPYWfjHffffeCz914440djvV5jDVn/KjvPiM/eLT4DUnSl49XdvFMzun3eLgk6csHun4+/fIvnrlIzKcjF9NcpIt4PhfZ/+cXw9+D5/8OxA8jPT3d82u32636+nq1tLToyiuv1FtvvdXhWE5eAgBw8pKXN998s9Xj06dPKy8vT5dddpnPsVxuAwCAD0FBQZo5c6bWrFnjc18aKwCAxtoJbrdbN998s1wul6xW6wX3I1gBAASrl9OnT2vZsmXasGGDampqFBoaqvj4eC1YsKDDUJUIVgAA2vjLX/6ijz/+WI899pj69eunyspKLV26VCdOnNC8efM6HEuwAgBorF42btyo4uJi2e12SdI111yjf/mXf9H48eN9BisnLwEA4MViaf9fGhfa/m0EKwAAXu68806lpaVpx44dOnjwoHbs2KEZM2Zo9OjRPseyFAwAgJc5c+ZoxYoVyszM9NwreMKECZoxY4bPsQQrAIBjrF6CgoI0a9YszZo16zuPJVgBAASrl47uFfxt7d03mGAFAMBLenq6vvrqK1ksFtlsNjU2NsrtduvKK6/0nMDkdrvbvW8wwQoAoLF6uffee9XQ0KBZs2apV69eam5u1jPPPKOQkBA98MADHY7lrGAAALysXr1as2fPVq9evSRJPXv21B//+EetXr3a51iCFQBwrrGa/unGevfurX/84x+ttn344YcKDg72OZalYABAtw9C02bPnq2UlBTdfvvtcjgcqqys1FtvvaXs7GyfYwlWAAC8jBs3ToMHD9bGjRtVW1ur6667Tg8//LAGDBjgcyzBCgBAOwYMGNCpG0J44xgrAABetmzZoptvvlmjRo3yHGt977332r28xhvBCgDg5CUv//mf/6k//elPmjx5sv76179KkkJCQvTMM8/4HMtSMACg2wehaQ0NDZo4caLOnDmj5cuXS5J+9rOf6fDhwz7H0lgBAPByww03aN++ferRo4fOnDkjSfr8889ls9l8jqWxAgBorF4iIiI0ffp0xcfH68yZM8rJydGGDRv029/+1udYghUAAC+NjY265ZZb5HQ6NXr0aAUEBCgrK0sjR470OZZgBQDQWL089dRT33sswQoAgJcvv/yyU/v169evzTaCFQAALzExMXK73a2+Iu68b2/79NNP24wlWAEALAV7yc7O1rvvvqvU1FQ5HA5VV1dryZIluummm3TPPfd0OJZgBQDAy+LFi/XGG294vjZuwIABysnJUUxMjH7zm990OJbrWAEA3HnJi9vt1pEjR1pt++KLLzo1lsYKAICX5ORkTZ06VXfddZfna+Nee+01TZs2zedYghUA0O0bpmnJycmKjIzU+vXr9fnnnys0NFR/+9vfNHz4cJ9jLe5vn+rkpb3TiAEAXaOzl4B8L7P9kKyLLhgvP2odNla//iECAHCRysvLu+BzaWlpkqT8/Hw98MADbZ5nKRgAAC8X+habby/yHj16tN19OlwKBgD8RLAUbAyNFQDAyUteuKUhAOCfQ7C24n1Lw/ZwS0MAADpp//7933sswQoAoLF6CQj4/jcmJFgBAPAyZcoUXejc3hdffFGSlJKSolWrVrV5nmAFANBYvYwfP97nPmPHjm13O5fbAACkP/khWf/y44uX8vJyXXPNNR3u49fGeujQIc2dO1dOp1MhISHKzc3VgAED/PmWF5Sbm6vNmzfryy+/VElJia699toumcd5x48fV3p6ug4fPqygoCBdffXVys7Olt1u77I5paam6ujRowoICFDv3r315z//WZGRkV02H+nc3U+WLFnS5X9md9xxh4KCgtSzZ09J0pw5c3Trrbd22Xyam5uVk5OjXbt2qWfPnrr++uu1YMGCH3weR48e1YMPPuh5/PXXX+vEiRN69913f/C5nLd9+3Y9++yzcrvdamlp0cyZMxUbG9tl83nzzTf17LPP6uzZs7r88sv15JNPqn///l02H3TOmTNn9M4776iurq7VknBmZqYef/xxWSwWTZo0qd2xfm2sU6ZM0d13360JEyZo3bp1evXVV/XCCy/46+06tGfPHvXr10+/+93vtGLFii4PVqfTqc8++0w33XSTpHPB39DQoJycnC6b09dff63LLrtMkrR161YtXbpUr7/+epfNZ//+/Vq0aJHKy8uVn5/f5cF6Mfx3c97ChQsVEBCgjIwMWSwWHTt2TFdeeWVXT0tPPPGEXC6X5s+f3yXv73a7deONN2rt2rW69tpr9emnn+ree+/V+++//0+djPJ9NTQ0KDY2Vv/zP/+jgQMHat26dSouLtZzzz33g8/Fp3Q/NNanum9jnT59ug4cOKC+ffu22v7hhx/q+uuvl9vt1n//93+3O9ZvjbWurk5lZWVavXq1JCk+Pl4LFixQfX19l7Sy6OjoH/w9OxISEuIJVUm6/vrr9fLLL3fhjOQJVUk6ceJEh9dv+dvp06eVnZ2tp59+WlOnTu2yeVyMTp48qaKiIr311lueP6OLIVRPnz6tkpKSLg+NgIAAff3115LO/WMxNDS0S0JVOvf9nVdeeaUGDhwoSbrtttuUnp7eZX8PovP27t2rHTt2qEePHq22DxkyRGvXru1wrN+CtaqqSmFhYbJarZIkq9Wq0NBQVVVV8R+Ul5aWFr388su64447unoqmjdvnnbu3Cm3263/+q//6rJ5PPvssxo/fvxFtWQ2Z84cud1uDRs2TH/84x9l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\n",
"text/plain": [
"<Figure size 576x576 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(all_rows_10_3.mean(axis=0), cbar=True);"
]
},
{
"cell_type": "markdown",
"id": "3fa107ae",
"metadata": {},
"source": [
"Looking at these probabilities, a resonable strategy would seem to be to guess the next cell with the highest probability of containing a hit. In both the 5/3 and 10/3 cases, this would result in guessing the third cell next. (By convention when many cells have the same hit probability, we will choose the one wit smallest coordinates.)\n",
"\n",
"Let's focus on the 5/3 configuration for the moment and return to 10/3 after. Suppose the true 5/3 board is as follows."
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "7b6cb36d",
"metadata": {},
"outputs": [],
"source": [
"board_5_3 = np.zeros(5)\n",
"board_5_3[1:4] = 1"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "b4e6cb97",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(board_5_3);"
]
},
{
"cell_type": "markdown",
"id": "3bb0a0ef",
"metadata": {},
"source": [
"Guessing the third cell must result in a hit in the 5/3 configuration, so after one guess the following board has been revealed."
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "5c57a53d",
"metadata": {},
"outputs": [],
"source": [
"revealed_5_3 = np.ma.masked_all_like(board_5_3)\n",
"revealed_5_3[2] = board_5_3[2]"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "690b73c6",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed_5_3);"
]
},
{
"cell_type": "markdown",
"id": "e46d8fb4",
"metadata": {},
"source": [
"With this information, what should our next guess be? For the first guess we chose the cell with the highest prior probability of yielding a hit, so it seems intuitive that we would choose the cell with the highest _posterior_ probability of yielding a hit, given the observation from our first guess.\n",
"\n",
"We can get this posterior distribution by eliminating the boards that do not match the cells that have been revealed to us."
]
},
{
"cell_type": "code",
"execution_count": 59,
"id": "59ffcaab",
"metadata": {},
"outputs": [],
"source": [
"def is_compat(ships, revealed, board_axis=(-2, -1)):\n",
" return (ships == revealed).all(axis=board_axis)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "972842bf",
"metadata": {},
"outputs": [],
"source": [
"compat_5_3 = all_rows_5_3[\n",
" is_compat(all_rows_5_3, revealed_5_3, board_axis=-1)\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 61,
"id": "8639e583",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAAEtCAYAAACFw1ChAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAInElEQVR4nO3cP2hV9x/G8U9UpAjV2II291YoHSzSpUPBxSkOLjG4CcGpagdxcVIsKGg7pAgqKDjoKK7FP4MdgoMOpYNCrYKlrQ73pko0IEqhoPc3iJ1S+/Az8dTD6zUl597h4Qv3vnPOkKHBYDAoAOCVFjU9AADeBoIJAAHBBICAYAJAQDABILDkVS92u903tQMA/hN6vd6c118ZzKqqXr8/72N4odvpVJUzXmjOeeG9PON+f+4vGl5fp/PiBsYZL6yX5zwXj2QBICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgMDQYDAY/NOL3W73TW4BgMb1er05r7vDBIDAkn97Q78/d2l5fZ3Oizv4Xr/f8JJ263Y6VeWcF5IzXngvz9h38sJ6+b08F3eYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgMDQYDAY/NOL3W73TW4BgMb1er05r7vDBIDAkn97Q78/d2l5fZ3Oizt4Z7ywXp5zr99veEl7dTudqnLGC8kZvxkvz3ku7jABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAgaHBYDD4pxe73e6b3AIAjev1enNef2UwAYAXPJIFgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAoDXB/P3332vr1q21adOm2rp1a929e7fpSa0zOTlZo6Oj9cknn9SdO3eantNKs7OztXPnztq0aVNt3ry5du/eXY8ePWp6Vuvs2rWrxsfHa8uWLTUxMVG3b99uelJrnThxojXfGa0J5sGDB2tiYqIuX75cExMTdeDAgaYntc7GjRvr7Nmz/in/AhoaGqodO3bU5cuX68KFC7VmzZo6cuRI07NaZ3Jyss6fP1/fffddffHFF7V///6mJ7XSzz//XDdu3KhOp9P0lHnRimA+fPiwbt26VWNjY1VVNTY2Vrdu3fKX+Tz7/PPPa2RkpOkZrTY8PFzr16//+/fPPvus+v1+g4va6d133/375ydPntTQ0FCDa9rpr7/+qkOHDtXBgwdbc75Lmh4wH6anp2v16tW1ePHiqqpavHhxrVq1qqanp+u9995reB38f54/f17nzp2r0dHRpqe00ldffVXXrl2rwWBQp0+fbnpO6xw/frzGx8drzZo1TU+ZN624w4Q2Onz4cC1btqy2bdvW9JRW+uabb+rKlSu1Z8+e+vbbb5ue0yrXr1+vn376qSYmJpqeMq9aEcyRkZG6f/9+PXv2rKqqnj17Vg8ePPD4kLfW5ORk3bt3r44dO1aLFrXiY/qftWXLlvrhhx9qdna26Smt8eOPP9Zvv/1WGzdurNHR0frjjz9q+/btdfXq1aanvZZWfBLff//9WrduXV28eLGqqi5evFjr1q3zOJa30tGjR+vmzZt18uTJWrp0adNzWufp06c1PT399+9TU1O1YsWKGh4ebm5Uy3z55Zd19erVmpqaqqmpqfrggw/qzJkztWHDhqanvZahwWAwaHrEfPj1119r37599fjx41q+fHlNTk7Wxx9/3PSsVvn666/r+++/r5mZmVq5cmUNDw/XpUuXmp7VKr/88kuNjY3VRx99VO+8805VVX344Yd18uTJhpe1x8zMTO3atav+/PPPWrRoUa1YsaL27t1bn376adPTWmt0dLROnTpVa9eubXrKa2lNMAFgIbXikSwALDTBBICAYAJAQDABICCYABAQTAAICCYABP4HILJBxrcuFuYAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(compat_5_3)\n",
"ax.set_yticklabels([]);"
]
},
{
"cell_type": "markdown",
"id": "8d9174f0",
"metadata": {},
"source": [
"Since the third cell is guaranteed to be a hit in the 5/3 configuration, all ship layouts are compatible with the result of our first guess, and the posterior is the same as the prior _restricted to unknown cells_. With this restriction our posterior is as follows."
]
},
{
"cell_type": "code",
"execution_count": 62,
"id": "70daa515",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(\n",
" np.ma.masked_array(compat_5_3.mean(axis=0),\n",
" mask=~revealed_5_3.mask),\n",
" cbar=True\n",
");"
]
},
{
"cell_type": "markdown",
"id": "dec13e24",
"metadata": {},
"source": [
"We see that out of all the unknown cells, the second and third are tied for the highest posterior probability of being a hit. By our convention, we will choose the second cell as the next guess, which we know will reveal a hit."
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "bf10ca6a",
"metadata": {},
"outputs": [],
"source": [
"revealed_5_3[1] = board_5_3[1]"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "d72fe797",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed_5_3);"
]
},
{
"cell_type": "markdown",
"id": "cbf4a3e0",
"metadata": {},
"source": [
"With this observations we are able to eliminate one of the potential boards."
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "973117c0",
"metadata": {},
"outputs": [],
"source": [
"compat_5_3 = all_rows_5_3[\n",
" is_compat(all_rows_5_3, revealed_5_3, board_axis=-1)\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "8c0169f7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAADUCAYAAAARKRPEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHAUlEQVR4nO3dOWhV+R/G4W9UBhHUqOCSKIiFIjZTDNhYxcImip0QrNwKsbFSFEZwKTIIKhiw0FJsxaXQIlhoIRYKbqC4FUlUXGAYEQS9/0KcKuP/ZTSe8fA8VXJvipcf3PPJOUXS1el0OgUAfNWkpgcAwM9AMAEgIJgAEBBMAAgIJgAEBBMAAlO+9mZvb++P2gEA/wkjIyPjvv7VYFZVjYyOfvcxfNbb01NVzniiOeeJ9+WMR0fHv9Dw7Xp6Pt/AOOOJ9eWcx+ORLAAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASDQ1el0Ov/0Zm9v74/cAgCNGxkZGfd1d5gAEJjy/35gdHT80vLteno+38GPjI42vKTdent6qso5TyRnPPG+nLFr8sT6cl0ejztMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQEAwASAgmAAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEBBMAAgIJgAEBBMAAoIJAAHBBICAYAJAQDABICCYABAQTAAICCYABAQTAAKCCQABwQSAgGACQKCr0+l0/unN3t7eH7kFABo3MjIy7utfDSYA8JlHsgAQEEwACAgmAAQEEwACggkAAcEEgIBgAkBAMAEgIJgAEGhNMJ88eVIbNmyoNWvW1IYNG+rp06dNT2qdwcHB6uvrq2XLltWDBw+antNKb9++ra1bt9aaNWtq7dq1tWPHjnrz5k3Ts1pn+/bttW7dulq/fn0NDAzU/fv3m57UWsePH2/NNaM1wdy3b18NDAzUpUuXamBgoH7//femJ7XO6tWr6/Tp0/7G8ATq6uqqLVu21KVLl+r8+fO1aNGiOnz4cNOzWmdwcLDOnTtXZ8+erU2bNtWePXuantRKd+/erVu3blVPT0/TU76LVgTz9evXde/everv76+qqv7+/rp3757fzL+z3377rRYsWND0jFbr7u6ulStX/v39r7/+WqOjow0uaqfp06f//fVff/1VXV1dDa5ppw8fPtT+/ftr3759rTnfKU0P+B7GxsZq3rx5NXny5Kqqmjx5cs2dO7fGxsZq9uzZDa+Df+fTp0915syZ6uvra3pKK+3du7euXbtWnU6nTp482fSc1jl27FitW7euFi1a1PSU76YVd5jQRgcOHKhp06bVxo0bm57SSocOHaorV67Uzp07648//mh6TqvcvHmzbt++XQMDA01P+a5aEcwFCxbUixcv6uPHj1VV9fHjx3r58qXHh/y0BgcH69mzZ3X06NGaNKkVH9P/rPXr19f169fr7du3TU9pjRs3btTjx49r9erV1dfXV8+fP6/NmzfX1atXm572TVrxSZwzZ04tX768Lly4UFVVFy5cqOXLl3scy0/pyJEjdefOnRoaGqpffvml6Tmt8+7duxobG/v7++Hh4Zo5c2Z1d3c3N6pltm3bVlevXq3h4eEaHh6u+fPn16lTp2rVqlVNT/smrfkH0o8ePardu3fXn3/+WTNmzKjBwcFasmRJ07Na5eDBg3X58uV69epVzZo1q7q7u+vixYtNz2qVhw8fVn9/fy1evLimTp1aVVULFy6soaGhhpe1x6tXr2r79u31/v37mjRpUs2cObN27dpVK1asaHpaa/X19dWJEydq6dKlTU/5Jq0JJgBMpFY8kgWAiSaYABAQTAAICCYABAQTAAKCCQABwQSAgGACQOB/a9UrF9BvM14AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(compat_5_3)\n",
"ax.set_yticklabels([]);"
]
},
{
"cell_type": "markdown",
"id": "d30ed19f",
"metadata": {},
"source": [
"Combining these two compatible boards to form the posterior distribution, we get the following."
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "d245abc2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdYAAAHLCAYAAAB1UrkfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAru0lEQVR4nO3df1jV9cH/8dfhKJq0Ex27wIO41K7V2Cb3NKrba3U3BQEVFSvG4p66m4kpoavNkWS3dFBpOLeakoqunJVXX79wbwj4A3J2d6W32dzcLKnlpZIavxLEs8RAj+f7h9/OHecgB9ubCfl8XBfXBe/zeX/4HK66Xr7enx/H4vF4PAIAAEYEXesDAADgy4RgBQDAIIIVAACDCFYAAAwiWAEAMIhgBQDAIIIVAHDNFRQUaPz48brjjjv0wQcfeMePHz+u1NRUJSQkKDU1VTU1Nd167fPcbrecTqfi4uI0YcIEFRcXe18rKSnRpEmTlJycrMOHD3vHc3JydODAgS/0XghWAMA1Fxsbq82bN2vo0KEdxnNzc5WWlqbKykqlpaVpyZIl3Xrt88rLy3XixAlVVVVpy5YtWr16tU6dOiVJWrNmjUpKSrR48WIVFRVJkvbv3y+r1aqYmJgv9F4IVgDANRcTEyOHw9FhrKmpSdXV1UpKSpIkJSUlqbq6Ws3NzV2+5mv79u1KSUlRUFCQ7Ha74uLitHPnTklSUFCQ2tra1Nraqv79+6u9vV2rVq3SwoULv/B76feFZwIA0AWXyyWXy+U3brPZZLPZAs6vq6tTeHi4rFarJMlqtSosLEx1dXXyeDxXfM1ut/vtJyIiwvuzw+FQfX29JCk7O1vp6ekKCQmR0+nU+vXrlZKSotDQ0C/6tglWAIAki8X4LjetWqXCwkK/8aysLM2fP9/47/si4uPjFR8fL0mqqanRoUOHlJGRIafTqaamJsXExGjmzJlXtU+CFQDQI2bNmqXp06f7jXenrUqXm2VDQ4PcbresVqvcbrcaGxvlcDjk8Xiu+Fpn+6mtrVV0dLQk/wb7mfz8fOXk5KisrEx2u125ubmaMWOGxo0bp2HDhnX7fXOOFQAgWcx/2Ww2RUZG+n11N1gHDx6sqKgoVVRUSJIqKioUFRUlu93e5Wu+EhMTVVxcrEuXLqm5uVm7du1SQkJCh21KS0sVHR2tESNG6Pz587L8/wZvsVjU2tra3b/i5Tl8ug0AQFbzS8Fydz9eli1bpqqqKp0+fVo333yzQkNDtW3bNh09elSLFi2Sy+WSzWZTQUGBRo4cKUldvpaRkaEFCxZo1KhRcrvdysvL0969e72vpaamen/32bNnlZmZqY0bNyo4OFgtLS3KyspSS0uLxowZo7y8vKt62wQrAOCaB+uXCUvBAAAYRLACAGAQVwUDAC5fcAQjCFYAAMFqEEvBAAAYRGMFANBYDaKxAgBgEI0VAEBjNYjGCgCAQQQrAAAGsRQMAGAp2CAaKwAABtFYAQA0VoNorAAAGERjBQDQWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBBCsAAAaxFAwAYCnYIBorAAAG0VgBADRWg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBDBCgCAQQQrAAAGcY4VAMA5VoNorAAAGERjBQDQWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBBCsAAAaxFAwAYCnYIBorAAAG0VgBADRWg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBDBCgCAQQQrAAAGcY4VAMA5VoNorAAAGERjBQDQWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBBCsAAAaxFAwAYCnYIBorAAAG0VgBADRWg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBCNFQBAYzWIxgoAgEEEKwAABhGsAAAYxDlWAADnWA0iWAEABKtBLAUDAGAQjRUAQGM1iMYKAIBBNFYAAI3VIBorAAAGEawAABjEUjAAgKVgg2isAAAYRGMFANBYDSJYAQAEq0EsBQMAYBDBCgC43FhNf12l119/XcnJyZo2bZqmTJmiqqoqSdLx48eVmpqqhIQEpaamqqamptP5brdbTqdTcXFxmjBhgoqLi72vlZSUaNKkSUpOTtbhw4e94zk5OTpw4MDVH2wXWAoGAFxzHo9H2dnZ2rx5s26//Xa9//77evjhhxUXF6fc3FylpaVp2rRp2rp1q5YsWaKXXnrJbx/l5eU6ceKEqqqq1NLSouTkZI0dO1aRkZFas2aNKioqdPjwYRUVFWnVqlXav3+/rFarYmJijL4XGisAoFcICgrS3//+d0nS3//+d4WFhenMmTOqrq5WUlKSJCkpKUnV1dVqbm72m799+3alpKQoKChIdrtdcXFx2rlzp3ffbW1tam1tVf/+/dXe3q5Vq1Zp4cKFxt8HjRUA0CNcLpdcLpffuM1mk81m6zBmsVj03HPPKTMzU4MGDdK5c+dUVFSkuro6hYeHy2q1SpKsVqvCwsJUV1cnu93eYR91dXWKiIjw/uxwOFRfXy9Jys7OVnp6ukJCQuR0OrV+/XqlpKQoNDTU8LsmWAEAUo9cFbxp0yYVFhb6jWdlZWn+/Pkdxi5evKiioiKtWbNGd955p/70pz/p8ccf14oVK4wcS3x8vOLj4yVJNTU1OnTokDIyMuR0OtXU1KSYmBjNnDnTyO8iWAEAPRKss2bN0vTp0/3GfduqJL333ntqbGzUnXfeKUm68847dcMNN2jAgAFqaGiQ2+2W1WqV2+1WY2OjHA6H3z4cDodqa2sVHR0tyb/BfiY/P185OTkqKyuT3W5Xbm6uZsyYoXHjxmnYsGH/6NvmHCsAoGfYbDZFRkb6fXUWrEOGDFF9fb2OHTsmSTp69KhOnz6tW2+9VVFRUaqoqJAkVVRUKCoqym8ZWJISExNVXFysS5cuqbm5Wbt27VJCQkKHbUpLSxUdHa0RI0bo/Pnzslgu/4vCYrGotbXVyPu2eDwej5E9AQD6rm/1QGV99+ripaysTBs2bPCG3YIFCxQXF6ejR49q0aJFcrlcstlsKigo0MiRIyVJGRkZWrBggUaNGiW32628vDzt3bvX+1pqaqp3/2fPnlVmZqY2btyo4OBgtbS0KCsrSy0tLRozZozy8vKMvG2CFQDQK4L1y4JzrAAAHmloEOdYAQAwiGAFAMAgloIBACwFG0RjBQDAIBorAIDGahDBCgAgWA1iKRgAAINorAAAGqtBNFYAAAyisQIAaKwG0VgBADCIYAUAwCCWggEALAUbRGMFAMAgGisAgMZqEI0VAACDaKwAABqrQQQrAIBgNYilYAAADCJYAQAwiGAFAMAgzrECADjHahDBCgAgWA1iKRgAAINorAAAGqtBNFYAAAyisQIAaKwG0VgBADCIYAUAwCCWggEALAUbRGMFAMAgGisAgMZqEI0VAACDaKwAABqrQQQrAIBgNYilYAAADCJYAQAwiGAFAMAgzrECADjHahDBCgAgWA1iKRgAAINorAAAGqtBNFYAAAyisQIAaKw+YmNj5fF4utxm9+7dnY4TrAAA+Fi2bJn3e4vFoszMTD3//PPenx955JErziVYAQA0Vh9jx47t8HO/fv06jFmt1ivO5RwrAAAB3Hjjjaqrq5MkNTY2atCgQVfclsYKAEAA48aNU0ZGhv7t3/5Nb775pu67774rbmvxBDo7CwD48ovrgbXgXV+eeGlvb1dRUZEOHz6s22+/XfPmzdMNN9zQ6bYEKwCAYO3E8ePHtWPHDjU2NiosLEyTJk3S8OHDA87jHCsA4PLFS6a/+rBdu3bpgQce0JEjRxQSEqIjR45o+vTp+sMf/hBwLudYAQB9PghNe/bZZ7V27Vr967/+q3ds3759Wr58uWJjY7ucS2MFAMBHY2OjYmJiOozdfffdamxsDDiXYAUAsBTs4+tf/7o2bdrk/dnj8Wjjxo36+te/HnAuFy8BAKSEHkjCyr4bL0ePHtXcuXPV1tYmh8Ohuro6DRw4UGvXrtVtt93W5VyCFQBAsHbi4sWLOnjwoBoaGhQeHq7Ro0erX7/AlyZx8RIAoM8v3Zr2t7/9TcHBwbrrrrskSSdOnNDJkyc1YsSIgHM5xwoAgI+nnnpKDQ0NkqRt27bp4Ycf1n/8x39o/fr1AecSrAAALl7ycezYMY0ZM0aStHnzZq1cuVIlJSV65ZVXAs5lKRgAAB+fnUs9d+6cjh49qrvuukv9+vXTJ598EnhuTx8cAKAP6OMN07TRo0fr6aefVltbm+69917169dPtbW1Cg8PDziXpWAAAHwsXbpUHo9H/fr106JFiyRJbrdbubm5Aedyuw0AQJrcA5V125cvXgJ9ZJzEUjAAAH5aWlq0c+dOnT59usP4unXrNHfuXElSVlZWp3MJVgAAfGRmZspisWjo0KF+r504caLLuSwFAwCkpB5YCq7ou/Fy9913a//+/bJYOv5dRo8erYMHD3Y5l4uXAADwERkZ6ReqknTrrbcGnEtjBQBIU3qgsZb3/Xj5+OOPVVdXp6FDh2rw4MHdmsM5VgAA97H6+OSTT/TEE09o7969amtrU79+/XTfffdpxYoVuvHGG7ucy1IwAAA+Vq5cqYiICB08eFBf+cpX9Kc//UlhYWF65plnAs6lsQIAaKw+Xn/9dW3bts17njU4OFg5OTmKjY0NOJfGCgCAj9bWVoWEhEiSPrsU6dy5c7JarQHnEqwAAPgYNmyYTp06JelysG7btk1z587V9OnTA85lKRgAwFKwj9mzZ6u+vl7Dhg2Tw+HQli1b9NBDDyklJSXgXG63AQBIyT2QrKXXZ7zQWAEANFYfv//976/4WqDlYIIVAAAfJSUl3u89Ho/q6+vV0NCg6OhoghUA0A29oLG2tbUpPz9f+/bt04ABA/Ttb39bS5cu1fHjx7Vo0SK1tLQoNDRUBQUFGj58uN98t9utZcuW6c0335TFYtGcOXO850RLSkr04osvKjg4WMuXL9c3v/lNSVJOTo4efPBBxcTEdNjX5s2b/fa/efPmgA/glwhWAIDUK4L1F7/4hQYMGKDKykpZLBbvR7bl5uYqLS1N06ZN09atW7VkyRK99NJLfvPLy8t14sQJVVVVqaWlRcnJyRo7dqwiIyO1Zs0aVVRU6PDhwyoqKtKqVau0f/9+Wa1Wv1C9kocfflhjx45VTk5Ol9txuw0A4Jo7d+6cSktL9eMf/9j7UIZbbrlFTU1Nqq6uVlJSkiQpKSlJ1dXVam5u9tvH9u3blZKSoqCgINntdsXFxWnnzp2SpKCgILW1tam1tVX9+/dXe3u7Vq1apYULF3b7GC9evKi0tDS53e4ut6OxAgB6pLG6XC65XC6/cZvNJpvN1mHs5MmTCg0NVWFhofbv36+QkBD9+Mc/1sCBAxUeHu59MIPValVYWJjq6upkt9s77KOurk4RERHenx0Oh+rr6yVJ2dnZSk9PV0hIiJxOp9avX6+UlBSFhoZ2euxXunjpq1/9qvdYysvLNWXKFL9tCFYAQI/YtGmTCgsL/cazsrI0f/78DmMXL17UyZMn9Y1vfENPPPGE/vrXv2ru3Ln69a9/beRY4uPjFR8fL0mqqanRoUOHlJGRIafTqaamJsXExGjmzJne7T9/8dLneTwe78VLpaWlBCsA4J9n1qxZnV5B69tWJSkiIkL9+vXzLvn+y7/8i26++WYNHDhQDQ0NcrvdslqtcrvdamxslMPh8NuHw+FQbW2toqOjJfk32M/k5+crJydHZWVlstvtys3N1YwZMzRu3DgNGzZMUucXL/l64YUXOh3nHCsAoEfYbDZFRkb6fXUWrHa7Xffcc4/27t0rSTp+/Liampo0fPhwRUVFqaKiQpJUUVGhqKgov2VgSUpMTFRxcbEuXbqk5uZm7dq1SwkJCR22KS0tVXR0tEaMGKHz5897z+daLBa1trZ22LalpUVbt27Vhg0btHXrVp09e7Zb75snLwEApJQeOMlafHXxcvLkST355JNqaWlRv3799Nhjj+n+++/X0aNHtWjRIrlcLtlsNhUUFGjkyJGSpIyMDC1YsECjRo2S2+1WXl6eN5wzMjKUmprq3f/Zs2eVmZmpjRs3Kjg4WC0tLcrKylJLS4vGjBmjvLw877Z//vOfNXfuXN16660aOnSoamtrVVNTo3Xr1mnMmDFdvg+CFQAgfa8HgvX/9t14eeCBB/SjH/1IkydP9o6Vl5dr06ZNVzz/+hmWggEA8HHy5EklJiZ2GJs8ebI+/PDDgHMJVgDA5dttTH/1YV/96ldVWVnZYWzHjh2dPvHJF0vBAAAptQeScEvfjZeDBw/qkUce0ciRIxUREaHa2lodO3ZMRUVFGj16dJdzuwzWoUOHGj9YAMAX89FHH/Xczr/fA8H6f/pusEqXL3Z6/fXX1dDQoPDwcI0bN0433XRTwHkB72P9aEqtkQP8shlafvneqB79D72P+uwfZPxt/Hn/Nvx/1anP/r+qreW/HV8RERSdf7abbrpJycnJVz2PB0QAAOBj5syZutKC7ssvv9zlXIIVANDnLzYyberUqd7vP/s81t///vedPsLQF8EKAICPhx56yG9s0qRJeuqppwLOJVgBADTWbhgxYoTee++9gNsRrAAAgrUbPB6PysvL5fF4vM8Y7gzBCgBAN1itVu+n33SFYAUA0FgN4pGGAAAYRLACAGAQS8EAAEiKjY294kMhPm/37t1dvk6wAgA4xypp2bJl3u/feecdVVRU6N///d81ZMgQNTQ06OWXX+YBEQCAbiJYNXbsWO/3y5Yt04svvqjw8HDv2P3336/09HTNmTOny/1wjhUAAB8ff/yxBgwY0GHshhtu0OnTpwPOpbECAGisPmJjY/Xoo49qzpw5Gjp0qD766COtW7dOsbGxAecSrAAA+Hj66ae1du1aLV++XI2NjQoLC9PkyZM1b968gHMJVgAAjdXHgAED9Nhjj+mxxx676rkEKwAAPt5+++0rvnb33Xd3OZdgBQDAR3Z2tvd7j8ej5uZmXbp0SbfccoveeOONLucSrAAAloJ9/Pd//3eHn9vb21VYWKivfOUrAedyuw0AAAEEBwdr/vz52rRpU8BtaawAABprN3g8Hn3nO9+R2+2W1Wq94nYEKwCAYPXR3t6uNWvWaPv27WpoaFBYWJiSkpK0dOnSLkNVIlgBAPDzi1/8Qu+++66eeuopDR06VLW1tXr++ef1ySefaPHixV3OJVgBADRWHzt27FBZWZnsdrsk6bbbbtO3vvUtTZ06NWCwcvESAAA+LJbO/6VxpfHPI1gBAPAxceJEZWVlac+ePTp27Jj27NmjefPmKTExMeBcloIBAPCxcOFCrVu3Trm5ud5nBU+bNo1nBQMAuolzrB0EBwdrwYIFWrBgwVXPJVgBAASrj66eFfx5nT03mGAFAMBHdna2Pv74Y1ksFtlsNrlcLnk8Ht1yyy3eC5g8Hk+nzw0mWAEANFYfDz/8sM6ePasFCxZo4MCBamtr03PPPafQ0FA98sgjXc7lqmAAAHxs3LhRjz/+uAYOHCjp8uez/uQnP9HGjRsDziVYAQCXG6vprz5s0KBB+utf/9ph7C9/+YtCQkICzmUpGADQ54PQtMcff1wZGRn67ne/K4fDodraWr3xxhvKy8sLOJdgBQDAx5QpUzRq1Cjt2LFDjY2NuuOOO/TYY49p+PDhAecSrAAAdGL48OHdeiCEL86xAgDgo6qqSt/5znc0YcIE77nWP/7xj53eXuOLYAUAcPGSj5///Of62c9+phkzZuiXv/ylJCk0NFTPPfdcwLksBQMA+nwQmnb27FklJyfrwoULWrt2rSTpa1/7mk6cOBFwLo0VAAAfd911lw4dOqT+/fvrwoULkqQPPvhANpst4FwaKwCAxuojMjJSc+fOVVJSki5cuKD8/Hxt375d3//+9wPOJVgBAPDhcrl07733qqWlRYmJiQoKCpLT6VRsbGzAuQQrAIDG6mPFihVfeC7BCgCAj48++qhb2w0dOtRvjGAFAMBHXFycPB5Ph4+I+8znx95//32/uQQrAIClYB95eXl6++23lZmZKYfDofr6eq1evVr33HOPHnrooS7nEqwAAPhYtWqVXnvtNe/Hxg0fPlz5+fmKi4vT9773vS7nch8rAIAnL/nweDw6efJkh7EPP/ywW3NprAAA+EhPT9esWbP0wAMPeD827ne/+53mzJkTcC7BCgDo8w3TtPT0dEVFRWnbtm364IMPFBYWpl/96lcaO3ZswLkEKwCAYO3E2LFjuxWkvghWAAB8FBYWXvG1rKwsSVJRUZEeeeQRv9cJVgAAfFzpU2w+fz/rqVOnOt2GYAUAwEd3Hmm4dOnSTscJVgAA51h98EhDAMA/hmDtwPeRhp3hkYYAAHTT4cOHv/BcghUAQGP1ERT0xR9MSLACAOBj5syZHa4A/ryXX35ZkpSRkaENGzb4vU6wAgBorD6mTp0acJvJkyd3Ok6wAgDg40ofDXf06FHv98nJyZ1uQ7ACAODjwoULeuutt9TU1NRhSTg3N1dPP/20LBaLpk+f3ulcghUAwFKwj/nz5+vIkSMaMmRIh3G3263/+q//ksfjIVgBAOiugwcPas+ePerfv3+H8dGjR2vz5s1dziVYAQA0Vh9BQUF+oSqp0zG/uT1xQAAA9GX79u3rdPyFF14IOJdgBQBcbqymv/qYGTNmdDre0NCgDRs2KCkpSXPnzg24H4IVAECwSjp27JgqKyslSZ9++qnKy8s1e/ZsTZ48WX/729/0xBNP6M033wy4H4vnSo+WUOdP7QcAXBvd/cSVLySnB5LwmSvGS6/0P//zP3I6nbp06ZKam5sVERGh2bNnKz4+XjfccEO399NlsAIArhNP9kCw5vfNeNm3b5/Kysr02muv6Wtf+5qmTp2qiRMnKjQ0tFvzCVYAAMHaiU8//VSvvfaatm7dqgMHDujee+/VlClTlJCQ0OU8ghUAQLAGcPr0aVVUVKi0tFSlpaVdbkuwAgCkxT0QrMuvz3jhqmAAQK9RWFioO+64Qx988IEk6fjx40pNTVVCQoJSU1NVU1PT6Ty32y2n06m4uDhNmDBBxcXF3tdKSko0adIkJScnd/gA85ycHB04cMD4eyBYAQC94nabw4cP6y9/+YsiIiK8Y7m5uUpLS1NlZaXS0tK0ZMmSTueWl5frxIkTqqqq0pYtW7R69WqdOnVKkrRmzRqVlJRo8eLFKioqkiTt379fVqtVMTExV3+gARCsAIBrrr29XXl5ecrNzZXFcjmVm5qaVF1draSkJElSUlKSqqur1dzc7Dd/+/btSklJUVBQkOx2u+Li4rRz505Jlx9P2NbWptbWVvXv31/t7e1atWqVFi5c2CPvhWcFAwB65IEOLpdLLpfLb9xms8lms3UY+/Wvf62pU6dq2LBh3rG6ujqFh4fLarVKkqxWq8LCwlRXVye73d5hfl1dXYem63A4VF9fL0nKzs5Wenq6QkJC5HQ6tX79eqWkpHTr9plLly7pzJkzuvnmmxUU1L0uSrACAHrEpk2bVFhY6DeelZWl+fPne38+ePCg3nnnnR5rkPHx8YqPj5ck1dTU6NChQ8rIyJDT6VRTU5NiYmI0c+bMDnNcLpeWLVumHTt26OLFi+rXr58mTpyoJUuW6MYbb+zy9xGsAIAeaayzZs3q9DNLfdvqH//4Rx07dkyxsbGSpPr6ev3oRz9STk6OGhoa5Ha7ZbVa5Xa71djYKIfD4bdPh8Oh2tpaRUdHS/JvsJ/Jz89XTk6OysrKZLfblZubqxkzZmjcuHEd2vLSpUv16aefqrS0VEOHDlVtba1++ctfKi8vTytWrOjyffeJc6zdvSrselRQUKDx48d3uIoOl505c0YZGRlKSEjQlClTlJWV1em5metZZmampk6dquTkZKWlpem999671ofU6/hepYrus9lsioyM9PvyDdY5c+Zoz5492r17t3bv3q0hQ4bohRde0KRJkxQVFaWKigpJUkVFhaKiovyWgSUpMTFRxcXF3scR7tq1y+9BDqWlpYqOjtaIESN0/vx577lci8Wi1tbWDtvu2bNHP//5z3Xbbbdp4MCBGjlypFauXNmtZwX3iWDt7lVh16PY2Fht3ryZ5zp3wmKxaPbs2aqsrFR5ebmGDRumlStXXuvD6lUKCgpUVlam0tJSpaen68knn7zWh9SrdHaVKv65nn76ab3yyitKSEjQK6+8IqfT6X0tIyND77zzjiRp2rRpioyMVHx8vL73ve/p0Ucf7dBAz549q+LiYs2ZM0eSNHXqVL311ltKSkrS8OHDdccdd3T4vQMHDlRLS0uHsebm5m49M7jXPyCiqalJCQkJ3kuj3W637rnnHlVVVXX6r5br1fjx47Vu3Trdfvvt1/pQeq3Kykq9+uqr+u1vf3utD6VXKi0t1UsvvaTf/e531/pQeoX29nbNmDFDK1eu1KxZs778/3/l9sBasLNXx0uX1q5dq7KyMv3whz9URESEamtr9eKLLyo5OVnz5s3rcm6vP8d6NVeFAVdy6dIlvfrqqxo/fvy1PpReZ/Hixdq7d688Ho9+85vfXOvD6TU6u0oV14958+YpLCxMW7duVUNDg8LDwzVnzhw9+OCDAef2+mAFTFi6dKkGDRqkH/zgB9f6UHqd5cuXS7rcWFesWKENGzZc4yO69nr6KtVeqQ9+fmpPe/DBB/2CdN++fRo7dmyX83p9sDocjm5fFQZ0pqCgQB9++KHWrVvX7fvQrkfJyclasmSJ956969mVrlJ95plndO+9917jo+shBGsHb7/9dqfjc+fO1QsvvKDIyEgNGTKk0216fbAOHjzYe1XYtGnTurwqDPD17LPP6t1339X69esVHBx8rQ+nVzl37pxcLpf3H6m7d+/WTTfd1O3PnPwymzNnjvciF4lrGK5H2dnZnY5fuHBBCxcu1JkzZ/TDH/5Qjz/+uN82vf7iJUk6evSoFi1aJJfLJZvNpoKCAo0cOfJaH1avsGzZMlVVVen06dO6+eabFRoaqm3btl3rw+oVjhw54r3ib+DAgZKkyMhIPf/889f4yHqH06dPKzMzU+fPn1dQUJBuuukmPfHEE/rmN795rQ+t17kugjWvByrrkl4fL1dtzJgx+vOf/6wzZ85o4sSJeuutt/y26RPBCgDoYQRrt+Tk5OiZZ56RJN17773as2eP3zYEKwCAYDWo159jBQD8E3DxkjFcIgkAgEE0VgAAjdUgghUAAB+NjY3atGmTQkJClJ6e7n12cFBQkN+HCPhiKRgAcLmxmv7qw37605/qyJEjeuutt5Sfny/p8oNDrnR/6+fRWAEA8PHuu+9q//79+uSTT/TQQw9Jku6///5ufboawQoA6PMN07Tw8HC1trbKbrfL5XJJki5evKhLly4FnMtSMAAAPtLT07V48WK9//778ng8eu+99/Tkk09q9OjRAefygAgAgJTfA5X1yb4bL1FRUR1+ttlsuuuuu/Sf//mfCg8P73IuS8EAAJaCfRw+fNj7vcVikcXS/T8QwQoAgI9/5CMmCVYAAI3VIIIVAECwGsRVwQAAGERjBQDQWA0iWAEA8BEbG6vu3I26e/duvzGCFQBAY/WxbNmyDj83NTXppZdeUmJiot89rr54QAQAQPpFDyTrz75c8XL69Gmlp6errKysy+24eAkAgG4IDg5WXV1dwO1YCgYAsBTso7CwsMPP58+f1+uvv6777rsv4FyCFQAAHydOnOjw86BBgzRr1ixNnz494FzOsQIApF/2QGX96fUZLzRWAAB8vP3221d87e6775YkHThwQDExMX6v01gBANKveqCx/qTvxst3v/vdTsc9Ho/eeOMNSdLEiRO1Y8cOv20IVgCA9GwPBOvj12e8cLsNAADdlJ2dHXAbzrECAODjD3/4gzZs2KCPP/64w6MN6+rqdODAAUmdP85QIlgBAPCzbNkyZWZmKjIy0jtmsVg0d+5cLV++vMu5BCsAgAdE+Dh37pxSUlL8xoOCgjR27Ngu5xKsAACC1ce8efM6HX/00UcDzuWqYACA9OseSNYfX5/xQmMFANBYDeJ2GwAADKKxAgBorAbRWAEAMIhgBQDAIJaCAQAsBRtEYwUAwCAaKwCAxmoQwQoAIFgNYikYAACDaKwAABqrQTRWAAAMIlgBADCIYAUAwCDOsQIAOMdqEMEKACBYDWIpGAAAg2isAAAaq0E0VgAADKKxAgBorAbRWAEAMIhgBQDAIJaCAQAsBRtEYwUAwCAaKwCAxmoQwQoAIFgNYikYAACDaKwAABqrQTRWAAAMorECAGisBtFYAQAwiGAFAMAgloIBACwFG0RjBQDAIBorAIDGahCNFQAAg2isAAAaq0EEKwCAYDWIpWAAAAwiWAEAMIhgBQBcc2fOnFFGRoYSEhI0ZcoUZWVlqbm5WZJ0/PhxpaamKiEhQampqaqpqel0H263W06nU3FxcZowYYKKi4u9r5WUlGjSpElKTk7W4cOHveM5OTk6cOCA0fdCsAIALp9jNf11Nb/eYtHs2bNVWVmp8vJyDRs2TCtXrpQk5ebmKi0tTZWVlUpLS9OSJUs63Ud5eblOnDihqqoqbdmyRatXr9apU6ckSWvWrFFJSYkWL16soqIiSdL+/ftltVoVExNzdQcbAMEKALjmwRoaGqp77rnH+/O3v/1t1dbWqqmpSdXV1UpKSpIkJSUlqbq62ttmP2/79u1KSUlRUFCQ7Ha74uLitHPnTklSUFCQ2tra1Nraqv79+6u9vV2rVq3SwoULr+5Au4GrggEAPcLlcsnlcvmN22w22Wy2K867dOmSXn31VY0fP151dXUKDw+X1WqVJFmtVoWFhamurk52u73DvLq6OkVERHh/djgcqq+vlyRlZ2crPT1dISEhcjqdWr9+vVJSUhQaGmrgnXZEsAIAdMHd3/g+N23apMLCQr/xrKwszZ8//4rzli5dqkGDBukHP/iBqqurjRxLfHy84uPjJUk1NTU6dOiQMjIy5HQ61dTUpJiYGM2cOdPI7yJYAQA9YtasWZo+fbrfeFdttaCgQB9++KHWrVunoKAgORwONTQ0yO12y2q1yu12q7GxUQ6Hw2+uw+FQbW2toqOjJfk32M/k5+crJydHZWVlstvtys3N1YwZMzRu3DgNGzbsH3jHlxGsAIAeaayBlnx9Pfvss3r33Xe1fv16BQcHS5IGDx6sqKgoVVRUaNq0aaqoqFBUVJTfMrAkJSYmqri4WPHx8WppadGuXbu0efPmDtuUlpYqOjpaI0aM0JtvvimL5fLJYIvFotbW1n/g3f4vi8fj8RjZEwCgz2r9bYjxfQ764blub3vkyBElJSVp+PDhGjhwoCQpMjJSzz//vI4ePapFixbJ5XLJZrOpoKBAI0eOlCRlZGRowYIFGjVqlNxut/Ly8rR3717va6mpqd7fcfbsWWVmZmrjxo0KDg5WS0uLsrKy1NLSojFjxigvL8/I+yZYAQA6+5tQ4/u8aXaL8X32BSwFAwB6ZCn4esV9rAAAGERjBQDQWA2isQIAYBCNFQBAYzWIYAUA6MJFgtUUloIBADCIxgoAYCnYIBorAAAG0VgBADRWgwhWAADBahBLwQAAGERjBQBwu41BNFYAAAyisQIAOMdqEI0VAACDaKwAABqrQQQrAIBgNYilYAAADKKxAgC43cYgGisAAAbRWAEAnGM1iGAFABCsBrEUDACAQTRWAACN1SAaKwAABtFYAQA0VoMIVgAA97EaxFIwAAAG0VgBACwFG0RjBQDAIBorAIDGahCNFQAAg2isAAAaq0EEKwCA220MYikYAACDaKwAAJaCDaKxAgBgEI0VAEBjNYhgBQAQrAaxFAwAgEE0VgAAt9sYRGMFAMAgGisAgHOsBhGsAACC1SCWggEAMIjGCgCgsRpEYwUAwCAaKwCA220MorECAGAQjRUAwDlWgwhWAADBahBLwQAAGERjBQDQWA2isQIAYBCNFQBAYzWIYAUAcB+rQSwFAwBgEI0VAMBSsEE0VgAADKKxAgBorAYRrAAAgtUgloIBADCIxgoA4HYbg2isAAAYRGMFAHCO1SAaKwAABtFYAQA0VoMIVgAAwWoQS8EAABhEYwUAcLuNQTRWAAAMorECADjHahDBCgAgWA1iKRgAAINorAAAGqtBNFYAAAyisQIAuN3GIBorAEAX3P2Nf12t48ePKzU1VQkJCUpNTVVNTY3fNm63W06nU3FxcZowYYKKi4u9r5WUlGjSpElKTk7W4cOHveM5OTk6cODAF/q7fBEEKwCgV8jNzVVaWpoqKyuVlpamJUuW+G1TXl6uEydOqKqqSlu2bNHq1at16tQpSdKaNWtUUlKixYsXq6ioSJK0f/9+Wa1WxcTE/NPeB8EKALjmjbWpqUnV1dVKSkqSJCUlJam6ulrNzc0dttu+fbtSUlIUFBQku92uuLg47dy5U5IUFBSktrY2tba2qn///mpvb9eqVau0cOFCM3+kbuIcKwCgR7hcLrlcLr9xm80mm83WYayurk7h4eGyWq2SJKvVqrCwMNXV1clut3fYLiIiwvuzw+FQfX29JCk7O1vp6ekKCQmR0+nU+vXrlZKSotDQ0B54d1dGsAIA5PGY3+fq1ZtUWFjoN56VlaX58+cb/33x8fGKj4+XJNXU1OjQoUPKyMiQ0+lUU1OTYmJiNHPmTOO/1xfBCgDoEbNmzdL06dP9xn3bqnS5eTY0NMjtdstqtcrtdquxsVEOh8Nvu9raWkVHR0vyb7Cfyc/PV05OjsrKymS325Wbm6sZM2Zo3LhxGjZsmKF32DnOsQIAeoTNZlNkZKTfV2fBOnjwYEVFRamiokKSVFFRoaioqA7LwJKUmJio4uJiXbp0Sc3Nzdq1a5cSEhI6bFNaWqro6GiNGDFC58+fl8VikSRZLBa1trb20Lv9XxaPpycWAAAAuDpHjx7VokWL5HK5ZLPZVFBQoJEjRyojI0MLFizQqFGj5Ha7lZeXp71790qSMjIylJqa6t3H2bNnlZmZqY0bNyo4OFgtLS3KyspSS0uLxowZo7y8vB5/HwQrAAAGsRQMAIBBBCsAAAYRrAAAGESwAgBgEMEKAIBBBCsAAAYRrAAAGESwAgBg0P8Dpxpz4BKhvXIAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x576 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(\n",
" np.ma.masked_array(compat_5_3.mean(axis=0),\n",
" mask=~revealed_5_3.mask),\n",
" cbar=True\n",
")\n",
"ax.set_yticklabels([]);"
]
},
{
"cell_type": "markdown",
"id": "2366a7f0",
"metadata": {},
"source": [
"We see that it is impossible for the fourth cell to contain a hit, and there's a 50% chance that the first and fourth cells will be a hit. By our convention above, we guess the first cell, resulting in a miss."
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "72dfcfe5",
"metadata": {},
"outputs": [],
"source": [
"revealed_5_3[0] = board_5_3[0]"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "71c50a42",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed_5_3);"
]
},
{
"cell_type": "markdown",
"id": "b86d6c82",
"metadata": {},
"source": [
"Finally we see that there is only one board compatible with the information that has been revealed, so we guess the fourth cell to end the game."
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "573b6067",
"metadata": {},
"outputs": [],
"source": [
"compat_5_3 = all_rows_5_3[\n",
" is_compat(all_rows_5_3, revealed_5_3, board_axis=-1)\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "25583393",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(compat_5_3)\n",
"ax.set_yticklabels([]);"
]
},
{
"cell_type": "markdown",
"id": "9a80238e",
"metadata": {},
"source": [
"We now return to the 10/3 case. Suppose we are working with the following board."
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "f252a06c",
"metadata": {},
"outputs": [],
"source": [
"board_10_3 = np.zeros(10)\n",
"board_10_3[5:8] = 1"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "d64f6af8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(board_10_3);"
]
},
{
"cell_type": "markdown",
"id": "bf024164",
"metadata": {},
"source": [
"Recalling the prior distribution on hits in the 10/3 configuration, we see first guess the third cell, revealing a miss."
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "892b9e6b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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9pj69eunyspKLV26VCdOnNC8efM6HEuwAgBorF42btyo4uJi2e12SdI111yjf/mXf9H48eN9BisnLwEA4MViaf9fGhfa/m0EKwAAXu68806lpaVpx44dOnjwoHbs2KEZM2Zo9OjRPseyFAwAgJc5c+ZoxYoVyszM9NwreMKECZoxY4bPsQQrAIBjrF6CgoI0a9YszZo16zuPJVgBAASrl47uFfxt7d03mGAFAMBLenq6vvrqK1ksFtlsNjU2NsrtduvKK6/0nMDkdrvbvW8wwQoAoLF6uffee9XQ0KBZs2apV69eam5u1jPPPKOQkBA98MADHY7lrGAAALysXr1as2fPVq9evSRJPXv21B//+EetXr3a51iCFQBwrrGa/unGevfurX/84x+ttn344YcKDg72OZalYABAtw9C02bPnq2UlBTdfvvtcjgcqqys1FtvvaXs7GyfYwlWAAC8jBs3ToMHD9bGjRtVW1ur6667Tg8//LAGDBjgcyzBCgBAOwYMGNCpG0J44xgrAABetmzZoptvvlmjRo3yHGt977332r28xhvBCgDg5CUv//mf/6k//elPmjx5sv76179KkkJCQvTMM8/4HMtSMACg2wehaQ0NDZo4caLOnDmj5cuXS5J+9rOf6fDhwz7H0lgBAPByww03aN++ferRo4fOnDkjSfr8889ls9l8jqWxAgBorF4iIiI0ffp0xcfH68yZM8rJydGGDRv029/+1udYghUAAC+NjY265ZZb5HQ6NXr0aAUEBCgrK0sjR470OZZgBQDQWL089dRT33sswQoAgJcvv/yyU/v169evzTaCFQAALzExMXK73a2+Iu68b2/79NNP24wlWAEALAV7yc7O1rvvvqvU1FQ5HA5VV1dryZIluummm3TPPfd0OJZgBQDAy+LFi/XGG294vjZuwIABysnJUUxMjH7zm990OJbrWAEA3HnJi9vt1pEjR1pt++KLLzo1lsYKAICX5ORkTZ06VXfddZfna+Nee+01TZs2zedYghUA0O0bpmnJycmKjIzU+vXr9fnnnys0NFR/+9vfNHz4cJ9jLe5vn+rkpb3TiAEAXaOzl4B8L7P9kKyLLhgvP2odNla//iECAHCRysvLu+BzaWlpkqT8/Hw98MADbZ5nKRgAAC8X+habby/yHj16tN19OlwKBgD8RLAUbAyNFQDAyUteuKUhAOCfQ7C24n1Lw/ZwS0MAADpp//7933sswQoAoLF6CQj4/jcmJFgBAPAyZcoUXejc3hdffFGSlJKSolWrVrV5nmAFANBYvYwfP97nPmPHjm13O5fbAACkP/khWf/y44uX8vJyXXPNNR3u49fGeujQIc2dO1dOp1MhISHKzc3VgAED/PmWF5Sbm6vNmzfryy+/VElJia699toumcd5x48fV3p6ug4fPqygoCBdffXVys7Olt1u77I5paam6ujRowoICFDv3r315z//WZGRkV02H+nc3U+WLFnS5X9md9xxh4KCgtSzZ09J0pw5c3Trrbd22Xyam5uVk5OjXbt2qWfPnrr++uu1YMGCH3weR48e1YMPPuh5/PXXX+vEiRN69913f/C5nLd9+3Y9++yzcrvdamlp0cyZMxUbG9tl83nzzTf17LPP6uzZs7r88sv15JNPqn///l02H3TOmTNn9M4776iurq7VknBmZqYef/xxWSwWTZo0qd2xfm2sU6ZM0d13360JEyZo3bp1evXVV/XCCy/46+06tGfPHvXr10+/+93vtGLFii4PVqfTqc8++0w33XSTpHPB39DQoJycnC6b09dff63LLrtMkrR161YtXbpUr7/+epfNZ//+/Vq0aJHKy8uVn5/f5cF6Mfx3c97ChQsVEBCgjIwMWSwWHTt2TFdeeWVXT0tPPPGEXC6X5s+f3yXv73a7deONN2rt2rW69tpr9emnn+ree+/V+++//0+djPJ9NTQ0KDY2Vv/zP/+jgQMHat26dSouLtZzzz33g8/Fp3Q/NNanum9jnT59ug4cOKC+ffu22v7hhx/q+uuvl9vt1n//93+3O9ZvjbWurk5lZWVavXq1JCk+Pl4LFixQfX19l7Sy6OjoH/w9OxISEuIJVUm6/vrr9fLLL3fhjOQJVUk6ceJEh9dv+dvp06eVnZ2tp59+WlOnTu2yeVyMTp48qaKiIr311lueP6OLIVRPnz6tkpKSLg+NgIAAff3115LO/WMxNDS0S0JVOvf9nVdeeaUGDhwoSbrtttuUnp7eZX8PovP27t2rHTt2qEePHq22DxkyRGvXru1wrN+CtaqqSmFhYbJarZIkq9Wq0NBQVVVV8R+Ul5aWFr388su64447unoqmjdvnnbu3Cm3263/+q//6rJ5PPvssxo/fvxFtWQ2Z84cud1uDRs2TH/84x9l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\n",
"text/plain": [
"<Figure size 576x576 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(all_rows_10_3.mean(axis=0), cbar=True);"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "711e01b6",
"metadata": {},
"outputs": [],
"source": [
"revealed_10_3 = np.ma.masked_all_like(board_10_3)\n",
"revealed_10_3[2] = board_10_3[2]"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "1b9591f0",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed_10_3);"
]
},
{
"cell_type": "markdown",
"id": "620d1cb1",
"metadata": {},
"source": [
"Excluding boards that are incompatible with a miss in the third cell, we see that we have already ruled out a ship in the first two cells as well."
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "fe5436a6",
"metadata": {},
"outputs": [],
"source": [
"compat_10_3 = all_rows_10_3[\n",
" is_compat(all_rows_10_3, revealed_10_3, board_axis=-1)\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "28180c43",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAcwAAAEBCAYAAAD1rZXsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAMJklEQVR4nO3dS4jV9f/H8bfjMJahjiZeZiq1ILCgBCWhmzVFbSyk3yZENwktDDNDyrSIvGTTIpW0kmoZrjRRCypQF0qZYFCiRKiYnuM9RZ0upvP9LaTpvxhn3vH/db5z4PFYzbnIeSFnfPr5nhH7FUVRBADQo4ayBwBAPRBMAEgQTABIEEwASBBMAEgQTABIaOzpwdbW1lrtAIA+oVKpdHt/j8GMiKhWu/+FfVFLy9XA18vmetsb8ffmSrVa8pK81paWiKifzfW2N+LvzfX4Xq6XzfW2N6K+N3fHJVkASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABI6FcURXGtB1tbW2u5BQBKV6lUur3fCRMAEhp7e0K12n1p+6KWlqsn4nrZXG97I+p7c6VaLXlJTmtLS0TUz96I+t5cL+/lev7eq8fN3XHCBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSAhH5FURTXerC1tbWWWwCgdJVKpdv7nTABIKGxtydUq92Xti9qabl6Iq6XzfW2N8LmWvhrb6VaLXlJXmtLS0TY/G/6a2+9vI8j6u97L+Lvzd1xwgSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSABMEEgATBBICEfkVRFNd6sLW1tZZbAKB0lUql2/udMAEgobG3J1Sr3Ze2L2ppuXoirpfN9bY3wuZaqLe9EX9vrlSrJS/Ja21piYj62VxveyP+3lyP7+XuOGECQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAQr+iKIprPdja2lrLLQBQukql0u39TpgAkNDY2xOq1e5L2xe1tFw9EdfL5nrbG2FzLdTb3oj63lypVktektPa0hIR9bM3or43d8cJEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEgQTABIEEwASBBMAEvoVRVFc68HW1tZabgGA0lUqlW7v7zGYAMBVLskCQIJgAkCCYAJAgmACQIJgAkCCYAJAgmACQIJgAkCCYAJAQmOtX/DQoUOxYMGCOHfuXDQ3N0d7e3uMHTu21jPS2tvb44svvohKpRKbN2+O22+/vexJPTp79my89NJL8fPPP0dTU1OMGTMmFi9eHMOGDSt7Wo9mz54dR48ejYaGhhg4cGC89tprMX78+LJn9Wr16tXx7rvv1sV7o62tLZqammLAgAERETF//vx44IEHSl7Vsz/++CPefPPN+Prrr2PAgAExYcKEWLJkSdmzunX06NF47rnnum5fuHAhLl68GN9++22Jq3q3bdu2WLVqVRRFEZ2dnTFnzpx47LHHyp7Vo+3bt8eqVavi8uXLMWTIkFi+fHncfPPN//4LFzU2c+bMYuPGjUVRFMXGjRuLmTNn1nrCP7J79+6iWq0WDz/8cPHjjz+WPadXZ8+eLb755puu22+99VbxyiuvlLgo5/z5811ff/XVV8W0adNKXJOzd+/eYtasWcVDDz1UF++NenkP/19Lliwpli1bVnR2dhZFURSnTp0qeVHe0qVLizfeeKPsGT3q7OwsJk2a1PW+2L9/fzFhwoTiypUrJS+7tnPnzhX33HNPcfDgwaIornbkmWeeqclr1/SS7JkzZ2Lfvn0xderUiIiYOnVq7Nu3L3755ZdazvhHJk2aFKNHjy57Rlpzc3NMnjy56/aECROiWq2WuChn0KBBXV9fvHgx+vXrV+Ka3l26dCkWL14cr7/+ep/fWq86Ojpi48aNMXfu3K7f4+HDh5e8KufSpUuxefPm+M9//lP2lF41NDTEhQsXIuLqqXjEiBHR0NB3P607fPhwDB8+PMaNGxcREVOmTIkdO3bUpCM1vSR77NixGDlyZPTv3z8iIvr37x8jRoyIY8eO9flLhvWos7Mz1q1bF21tbWVPSVm0aFHs3LkziqKIjz76qOw5PVq1alU8+eSTtbkM9D80f/78KIoiJk6cGC+++GIMHjy47EnXdOTIkWhubo7Vq1fHrl274oYbboi5c+fGpEmTyp7Wq61bt8bIkSPjzjvvLHtKj/r16xcrV66M2bNnx8CBA6OjoyPWrl1b9qwejRs3Lk6fPh3ff/993HXXXbF58+aIiJp0pO/+NYL/tyVLlsTAgQNjxowZZU9JWbZsWWzfvj3mzZsXb7/9dtlzrum7776LH374IaZPn172lH/kk08+iU2bNsX69eujKIpYvHhx2ZN6dPny5Thy5EjccccdsWHDhpg/f37MmTMnLl68WPa0Xq1fv74uTpeXL1+OtWvXxnvvvRfbtm2L999/P+bNmxcdHR1lT7umQYMGxYoVK2L58uXx1FNPxZkzZ2Lw4MHR2Pjvn/9qGszRo0fHiRMn4sqVKxERceXKlTh58mRdXfKsF+3t7XH48OFYuXJln7680p1p06bFrl274uzZs2VP6dbu3bvj4MGD8cgjj0RbW1scP348Zs2aFTt27Ch7Wo/++j5ramqK6dOnx549e0pe1LOWlpZobGzs+gjn7rvvjqFDh8ahQ4dKXtazEydOxO7du+OJJ54oe0qv9u/fHydPnoyJEydGRMTEiRPj+uuvjwMHDpS8rGf33ntvrFu3LjZs2BAzZsyI33//vSZXe2r6J+mNN94Y48ePjy1btkRExJYtW2L8+PEux/6PrVixIvbu3Rtr1qyJpqamsuf0qqOjI44dO9Z1e+vWrTFkyJBobm4ub1QPnn322dixY0ds3bo1tm7dGqNGjYqPP/447r///rKnXdOvv/7a9TlVURTx+eef9/mfQh42bFhMnjw5du7cGRFXf8L+zJkzMWbMmJKX9ezTTz+NKVOmxNChQ8ue0qtRo0bF8ePH4+DBgxERceDAgTh9+nTccsstJS/r2alTpyLi6sdO77zzTjz99NMxcODAf/11a/4fSB84cCAWLFgQ58+fj8GDB0d7e3vceuuttZzwjyxdujS+/PLLOH36dAwdOjSam5vjs88+K3vWNf30008xderUGDt2bFx33XUREXHTTTfFmjVrSl52badPn47Zs2fHb7/9Fg0NDTFkyJB4+eWX+/znP39pa2uLDz74oE//s5IjR47EnDlz4sqVK9HZ2Rm33XZbvPrqqzFixIiyp/XoyJEjsXDhwjh37lw0NjbGCy+8EFOmTCl7Vo8ef/zxWLRoUTz44INlT0nZtGlTfPjhh10/WPX888/Ho48+WvKqni1atCj27NkTf/75Z9x3332xcOHCrn8u9W+qeTABoB7V14dbAFASwQSABMEEgATBBIAEwQSABMEEgATBBIAEwQSAhP8CXM2vXZLND+IAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(compat_10_3)\n",
"ax.set_yticklabels([]);"
]
},
{
"cell_type": "markdown",
"id": "ca6111da",
"metadata": {},
"source": [
"Unsurprisingly, the sixth through eight cells are tied for the highest probability of yielding a hit, so we guess the six cell, revealing a hit."
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "809f5e42",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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l156SVlZWZ7nUlJS9NFHH0mSJkyYoIiICMXGxuo3v/mN7r///lYNtKGhQQUFBZ4AHz9+vN555x3PPduvueaaVu/bq1cvOZ3OVtvq6+s7dc9gbhABAJAy/bAWnNV942XZsmUqLi7W73//e4WHh6uyslLPP/+8Jk6cqBkzZnQ4lqVgAAC8zJgxQ6GhoVq7dq1qamoUFhamadOm6c477/Q5lsYKAJAe9UNjffTHFy87d+7U8OHDO9yHxgoA6JZfTO5P7777brvbp0+frueee04RERHq27dvu/vQWAEAUpYfkjWz+8bLrbfe2u722tpahYaG6tixY/r973+v2bNnt9mHYAUASNl+CNb5P754GTp0qD744AMdO3ZMt99+u9555502+3C5DQAAnXTuS8779OmjwMD2j6bSWAEANFaDOHkJAMDJSwaxFAwAgEE0VgAAjdUgghUAAC+1tbVavXq1goODlZyc7Ll3cEBAgM8vFmApGABwtrGa/unG/u3f/k379+/XO++8o5ycHElnv94uPT3d51gaKwAAXj7++GPt2rVLx48f11133SVJuuWWWzR//nyfYwlWAEC3b5imhYWFqampSXa7XY2NjZKkM2fOqKWlxedYloIBAPCSnJysefPm6dNPP5Xb7dYnn3yihx9+WEOGDPE5lhtEAACkHD9U1oe7b7xERka2emyz2XTdddfpz3/+s8LCwjocy1IwAIClYC/79u3z/Npischi6fxvEMEKAICXgIDvf6SUYAUA0FgNIlgBAASrQZwVDACAQTRWAACN1SCCFQAALyNHjlRnrkbdunVrm20EKwCAxupl4cKFrR7X1dXphRde0OjRo9tc4+qNG0QAAKQn/ZCsf/pxxcvRo0eVnJys4uLiDvfj5CUAADohKChIVVVVPvdjKRgAwFKwl7y8vFaPT548qW3btunmm2/2OZZgBQDAy6FDh1o97t27t6ZOnapJkyb5HMsxVgCA9Bc/VNZ/+2nGC40VAAAv77777nmfu/766yVJu3fvVnR0dJvnaawAAOmvfmisf+y+8XLrrbe2u93tduutt96SJN1+++3asGFDm30IVgCA9LQfgnX2TzNeuNwGAIBOSk9P97kPx1gBAPDyt7/9TStXrtRXX33V6taGVVVV2r17t6T2b2coEawAALSxcOFCpaamKiIiwrPNYrFo+vTpeuyxxzocS7ACALhBhJcTJ04oISGhzfaAgAANHz68w7EEKwCAYPUyY8aMdrfff//9PsdyVjAAQHrWD8n6wE8zXmisAAAaq0FcbgMAgEE0VgAAjdUgGisAAAYRrAAAGMRSMACApWCDaKwAABhEYwUA0FgNIlgBAASrQSwFAwBgEI0VAEBjNYjGCgCAQQQrAAAGEawAABjEMVYAAMdYDSJYAQAEq0EsBQMAYBCNFQBAYzWIxgoAgEE0VgAAjdUgGisAAAYRrAAAGMRSMACApWCDaKwAABhEYwUA0FgNIlgBAASrQSwFAwBgEI0VAEBjNYjGCgCAQTRWAACN1SAaKwAABhGsAAAYxFIwAIClYINorAAAGERjBQDQWA2isQIAYBCNFQBAYzWIYAUAEKwGsRQMAIBBBCsAAAYRrACALnfs2DGlpKQoLi5O48aNU1pamurr6yVJBw8eVGJiouLi4pSYmKiKiop2X8PlcikrK0sxMTEaNWqUCgoKPM8VFhZqzJgxmjhxovbt2+fZnpGRod27dxv9LAQrAODsMVbTP9/l7S0W3Xvvvdq0aZNKSkrUv39/PfXUU5KkzMxMJSUladOmTUpKStL8+fPbfY2SkhIdOnRImzdv1iuvvKLFixfryJEjkqSlS5eqsLBQ8+bNU35+viRp165dslqtio6O/m6T9YFgBQB0ebCGhITohhtu8Dy+9tprVVlZqbq6OpWVlSk+Pl6SFB8fr7KyMk+b/bb169crISFBAQEBstvtiomJ0caNGyVJAQEBam5uVlNTk3r06KFTp05p0aJFmjNnznebaCdwVjAAwC8aGxvV2NjYZrvNZpPNZjvvuJaWFr388su67bbbVFVVpbCwMFmtVkmS1WpVaGioqqqqZLfbW42rqqpSeHi457HD4VB1dbUkKT09XcnJyQoODlZWVpZWrFihhIQEhYSEGPikrRGsAACddvUw/pqrV69WXl5em+1paWmaOXPmecctWLBAvXv31j333KOysjIjc4mNjVVsbKwkqaKiQnv37lVKSoqysrJUV1en6OhoTZkyxch7EawAAL+YOnWqJk2a1GZ7R201NzdXX3zxhZYvX66AgAA5HA7V1NTI5XLJarXK5XKptrZWDoejzViHw6HKykpFRUVJattgz8nJyVFGRoaKi4tlt9uVmZmpyZMna8SIEerfv/8/8InPIlgBAH5prL6WfL09/fTT+vjjj7VixQoFBQVJki677DJFRkaqtLRUEyZMUGlpqSIjI9ssA0vS6NGjVVBQoNjYWDmdTm3ZskVr1qxptU9RUZGioqI0cOBAvf3227JYzh4Mtlgsampq+gc+7f+xuN1ut5FXAgB0W03/GWz8NXv//kSn992/f7/i4+M1YMAA9erVS5IUERGhJUuWqLy8XHPnzlVjY6NsNptyc3M1aNAgSVJKSopmzZqlwYMHy+VyKTs7Wzt27PA8l5iY6HmPhoYGpaamatWqVQoKCpLT6VRaWpqcTqeGDh2q7OxsI5+bYAUAqOE/Qoy/5qX3Oo2/ZnfAUjAAwC9LwT9VXMcKAIBBNFYAAI3VIBorAAAG0VgBADRWgwhWAIBOnyFYTWEpGAAAg2isAACWgg2isQIAYBCNFQBAYzWIYAUAEKwGsRQMAIBBNFYAAJfbGERjBQDAIBorAIBjrAbRWAEAMIjGCgCgsRpEsAIACFaDWAoGAMAgGisAgMttDKKxAgBgEI0VAMAxVoMIVgAAwWoQS8EAABhEYwUA0FgNorECAGAQjRUAQGM1iGAFAHAdq0EsBQMAYBCNFQDAUrBBNFYAAAyisQIAaKwG0VgBADCIxgoAoLEaRLACALjcxiCWggEAMIjGCgBgKdggGisAAAbRWAEANFaDCFYAAMFqEEvBAAAYRGMFAHC5jUE0VgAADKKxAgA4xmoQwQoAIFgNYikYAACDaKwAABqrQTRWAAAMorECALjcxiAaKwAABtFYAQAcYzWIYAUAEKwGsRQMAIBBNFYAAI3VIBorAAAG0VgBADRWgwhWAADXsRrEUjAAAAbRWAEALAUbRGMFAMAgGisAgMZqEMEKACBYDWIpGAAAg2isAAAutzGIxgoAgEE0VgAAx1gNorECAGAQjRUAQGM1iGAFABCsBrEUDACAQTRWAACX2xhEYwUAwCAaKwCAY6wGEawAAILVIJaCAQAwiMYKAKCxGkRjBQDAIBorAIDLbQyisQIAdNrVw/jPd3Xw4EElJiYqLi5OiYmJqqioaLOPy+VSVlaWYmJiNGrUKBUUFHieKyws1JgxYzRx4kTt27fPsz0jI0O7d+/+Xr8v3wfBCgC4IGRmZiopKUmbNm1SUlKS5s+f32afkpISHTp0SJs3b9Yrr7yixYsX68iRI5KkpUuXqrCwUPPmzVN+fr4kadeuXbJarYqOjv7BPgfBCgDo8sZaV1ensrIyxcfHS5Li4+NVVlam+vr6VvutX79eCQkJCggIkN1uV0xMjDZu3ChJCggIUHNzs5qamtSjRw+dOnVKixYt0pw5c8z8JnUSx1gBAH7R2NioxsbGNtttNptsNlurbVVVVQoLC5PVapUkWa1WhYaGqqqqSna7vdV+4eHhnscOh0PV1dWSpPT0dCUnJys4OFhZWVlasWKFEhISFBIS4odPd34EKwBAbrf511y8eLXy8vLabE9LS9PMmTONv19sbKxiY2MlSRUVFdq7d69SUlKUlZWluro6RUdHa8qUKcbf1xvBCgDwi6lTp2rSpElttnu3Vels86ypqZHL5ZLVapXL5VJtba0cDkeb/SorKxUVFSWpbYM9JycnRxkZGSouLpbdbldmZqYmT56sESNGqH///oY+Yfs4xgoA8AubzaaIiIg2P+0F62WXXabIyEiVlpZKkkpLSxUZGdlqGViSRo8erYKCArW0tKi+vl5btmxRXFxcq32KiooUFRWlgQMH6uTJk7JYLJIki8WipqYmP33a/2Nxu/2xAAAAwHdTXl6uuXPnqrGxUTabTbm5uRo0aJBSUlI0a9YsDR48WC6XS9nZ2dqxY4ckKSUlRYmJiZ7XaGhoUGpqqlatWqWgoCA5nU6lpaXJ6XRq6NChys7O9vvnIFgBADCIpWAAAAwiWAEAMIhgBQDAIIIVAACDCFYAAAwiWAEAMIhgBQDAIIIVAACD/j8n6OsUVDL8tgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(compat_10_3.mean(axis=0), cbar=True);"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "9948ceb8",
"metadata": {},
"outputs": [],
"source": [
"revealed_10_3[5] = board_10_3[5]"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "aa174a53",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed_10_3);"
]
},
{
"cell_type": "markdown",
"id": "db93c5d3",
"metadata": {},
"source": [
"Hitting the rest of the ship will proceed similarly to the 5/3 case, so we stop playing here.\n",
"\n",
"This approach of calculating the posterior distribution by enumerating the possible grids and eliminating those that are incompatible with the observed hits and misses is a very simple type of [approximate Bayesian computation](https://en.wikipedia.org/wiki/Approximate_Bayesian_computation) (ABC). ABC is a fascinating and deep field of research in its own right, and we are really only scratching its surface here.\n",
"\n",
"Choosing to guess the cell with the [maximum a posteriori](https://en.wikipedia.org/wiki/Maximum_a_posteriori_estimation) (MAP) is a simplified (greedy) form of [Thompson sampling](https://en.wikipedia.org/wiki/Thompson_sampling), a Bayesian approach to playing games of incomplete information that chooses the next action according to the probability that it maximizes the expected reward. In the simple situation of a single ship (in both one and two dimensions) we can calculate the cell(s) that has the MAP probability chance of yielding a hit (the expected reward) exactly, so this strategy becomes greedy. (I have a soft spot for Thompsons sampling in general as we use it in a number of our machine-learning based products at [Kibo](https://kibocommerce.com/), where I work. For a discussion of the applications of Thompson sampling to e-commerce optimization, take a look at my [talks](https://austinrochford.com/talks.html).)"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "5c27b524",
"metadata": {},
"outputs": [],
"source": [
"def argmax_2d(x):\n",
" max_i = x.max(axis=1).argmax()\n",
" max_j = x[max_i].argmax()\n",
" \n",
" return max_i, max_j"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "a360f93d",
"metadata": {},
"outputs": [],
"source": [
"class SingleThompsonStrategy(Strategy):\n",
" def __init__(self, poss_ships):\n",
" self._poss_ships = poss_ships\n",
" \n",
" def compat_ships(self, revealed):\n",
" if revealed.mask.all():\n",
" return self._poss_ships\n",
" else:\n",
" is_compat_ = is_compat(self._poss_ships, revealed)\n",
"\n",
" return self._poss_ships[is_compat_]\n",
" \n",
" def next_guess(self, revealed):\n",
" post = np.ma.masked_array(\n",
" self.compat_ships(revealed).mean(axis=0),\n",
" mask=~revealed.mask\n",
" )\n",
" \n",
" return argmax_2d(post)"
]
},
{
"cell_type": "markdown",
"id": "669a632c",
"metadata": {},
"source": [
"We watch this strategy play the game we started above."
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "51870522",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 3/3 [00:00<00:00, 391.81it/s]\n"
]
}
],
"source": [
"ts = SingleThompsonStrategy(all_rows_10_3[:, np.newaxis, :])\n",
"game_10_3 = play(board_10_3[np.newaxis, np.newaxis, :], ts,\n",
" progress_bar=True)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "d2c5c586",
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"ani = animate_boards(game_10_3.turn_revealed)"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "e080072f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video width=\"576\" height=\"576\" controls autoplay loop>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAACuJtZGF0AAACrgYF//+q\n",
"3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSByMzAzME0gOGJkNmQyOCAtIEguMjY0L01Q\n",
"RUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMjAgLSBodHRwOi8vd3d3LnZpZGVvbGFu\n",
"Lm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0xIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5h\n",
"bHlzZT0weDM6MHgxMTMgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhl\n",
"ZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTEgY3FtPTAg\n",
"ZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02\n",
"IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50\n",
"ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi\n",
"X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w\n",
"PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj01IHNjZW5lY3V0PTQwIGludHJhX3Jl\n",
"ZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAu\n",
"NjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAE\n",
"kGWIhAAS//73rd+BTcBA7Wu6Vzi0y6uUND1R9pSmeLZIAAADAAADAAIRcKTdcx9EHWf4AAAhYALW\n",
"HqH8JyQ4gBKC1ImXhdEKAApKn8Z8m/xAD2TXBZ6JSrZPQJZbqHUXqu9KcDl/RE/0Z1dyxsifoduF\n",
"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\n",
"YXZmNTguNDUuMTAw\n",
"\">\n",
" Your browser does not support the video tag.\n",
"</video>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"HTML(ani.to_html5_video())"
]
},
{
"cell_type": "markdown",
"id": "c1ad8c5b",
"metadata": {},
"source": [
"As with our optimal row strategy, we can play every possible 10/3 game with the Thompson sampling strategy and compare the distributions of the number of turns."
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "c638eff3",
"metadata": {},
"outputs": [],
"source": [
"ts_row_games_10_3 = [\n",
" play(row[np.newaxis, np.newaxis],\n",
" SingleThompsonStrategy(all_rows_10_3[:, np.newaxis, :]))\n",
" for row in all_rows_10_3\n",
"]\n",
"ts_row_turns_pmf_10_3 = Pmf.from_seq([\n",
" game.turns for game in ts_row_games_10_3\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "010ae400",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAANQCAYAAAA/mfX7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABuSklEQVR4nO3de1zUZf7//+fMAJYo4piHISyt3Ygt8YSZW1kiAikLdCD9sEHliuUhbV1iJUscU1vMXQvNPFR+tk9u28ImKUtkam1mSVKbulht23rIAA8gKkKgM/P7w6/zi8V0IGB42+N+u3Vr3u+53te8Li7JZ9f1nhmTy+VyCQAAwMDM3i4AAADghyLQAAAAwyPQAAAAwyPQAAAAwyPQAAAAwyPQAAAAwyPQAN9j5syZuv/++8/b5vXXX9fPfvazVq8lJCREb7zxRqu/jtG1t59TUVGRQkJCVF5e7u1SgIsegQY/St9++62eeeYZRUVFKSwsTEOHDtVdd92ll19+uUn9jB49Wu+9914rVfn/e//99xUTE9Oqr5GVlaWYmBgNHDhQgwcP1rhx4/Tuu++26mteTEaNGqUlS5a0SF+HDh3Sb37zG40ZM0Y/+9nPvjdYHzp0SNOnT9egQYM0aNAg/frXv1ZFRUWL1AAYjY+3CwC8Yc6cOSoqKtKsWbMUEhKikydPavfu3SotLW1SP5dccokuueSSVqry/9e9e/dWf42f/OQnGj58uC6//HKdOnVKa9eu1eTJk/WXv/xF119/fbP7ra+vl5+fXwtWevGrr69XYGCg7r//fhUWFsrhcDRq43Q69dBDD8lkMmn16tVyuVyy2+2aMmWKXn31VZlMJi9UDngPKzT4Udq4caN+9atfKTIyUr1799a1116rO++8U1OnTm3U9rXXXtOIESM0aNAgTZo0SZWVle7n/nvL6ezxBx98oDFjxqhfv366++67VVJSct56iouLNW7cOA0cOFADBw5UXFyctmzZ4n7+u1spS5YsUUhISKN/Zs6c6W6/detWjRs3TmFhYbrllluUkZGho0ePnreGu+66S8OGDdMVV1yhq6++WmlpafL399fHH398/h/mf0lOTtZjjz2mZ555RjfffLOGDx8uSfr000/1y1/+UmFhYRoyZIh+85vfuFcTamtrdf311+uDDz5w93Pvvffq+uuvV21trSSprq5O/fr109///nePazl58qTmzZunW265Rf3791dCQoI2bNjgfv7AgQMKCQlRQUGBHnroIfXv318jR45UXl5eg36+/vprjR8/Xv369dNtt92mNWvWKDk5WbNmzXKPef/+/Vq6dKl7Pg4cOOC+/quvvtIvf/lL9e/fX6NHj24wt+cSHBysJ554QomJid8bZj/44AOVlJTo6aefVv/+/TVgwAAtXLhQ//jHP/TRRx95/DMCLhYEGvwode/eXVu2bFFVVdV52+3atUtFRUVasWKFXnjhBX3++efKyso67zVOp1NPP/20MjMzlZOTo27duunBBx90/8X83xwOhyZPnqz+/ftr7dq1Wrt2rR5++GFdeuml52w/fvx4vf/+++5/nn/+efn4+OiGG26QJH344YeaPHmyxowZo3Xr1um5557TgQMHNHXqVHn6TSenT59WXl6eampqFB4e7tE13/Xmm2+qsrJS//u//6s//vGPOnz4sMaPH69evXopJydHzz//vP71r3/p4YcfliRdeuml6t+/vz788ENJZ7YEP/30U3Xq1EnFxcWSpE8++UROp1ODBw/2qAaXy6WHHnpIX3zxhRYvXqz8/Hz9z//8j2bMmOF+nbN+//vfKy4uTuvWrdPtt9+uxx57THv37nX3M3XqVJ04cUJr1qzR888/r3fffVe7d+92X79kyRJdfvnlDebGZrO5n8/KytKDDz6oN954Q9dff71+/etf6/jx403+uX7XJ598ouDgYF111VXucz/96U/Vq1evJodQ4GLAlhN+lObNm6e0tDQNGzZMP/nJTzRgwADdeuutGjlyZIOlel9fX/3ud79zb5n8z//8zwXvs3G5XEpPT3cHjIULF+q2225Tfn6+EhMTG7Wvrq7WsWPHFBERoT59+kiS+9/n4u/vL39/f0lSWVmZZs+erfvuu0933nmnJGnZsmVKTk5WcnKy+5qsrCyNGDFCn3/+uUJDQ7+373feeUczZszQt99+q06dOmnp0qW67rrrzjvec+nRo4fmzJkjs/nM/zM988wz6tSpk5566in3z/Lpp59WfHy8tm/friFDhujGG290r758/PHH6tWrl26++WZ9+OGHuuWWW7Rt2zb169dPnTp18qiGjz76SJ9++qk++OADde7cWZI0duxYffrpp/q///s/DRs2zN323nvv1ejRoyVJjzzyiNasWaNt27apT58++uCDD/T5559rw4YNuvLKK92133rrre7rAwMDZbFY1LFjx3OuqEydOtW9UvXoo4/qjTfe0I4dO3TLLbc06ef6XYcPHz7na1122WU6fPhws/sFjIpAgx+lwYMH6+2339bOnTv16aefavv27Zo2bZqGDx+u559/3h1qrr766gb3f/To0UNHjhy5YP8DBgxwP+7SpYuuuuoq/fvf/z5n2y5duigxMVG/+tWvdOONN+qGG25QZGRkg//zPpeTJ0/qoYce0oABA5SWluY+v2vXLn366adas2ZNo2v27t173kAzdOhQ5eXl6dixYyosLNRvf/tbrV69usmh5rrrrnOHGUn697//rQEDBjT4WV577bXq3LmzvvzyS3egef7553XixAlt27ZNw4YN09ChQ7Vq1SpJ0rZt23TjjTd6XMOuXbt06tQpd5A469SpU+5g8t1azvLx8VG3bt3c8/zvf/9bXbt2bXBNYGCg+vbt63Et3/2Zd+/eXRaLpVVv3uX+GfwYEWjwo+Xj4+N+d8j48eP1xhtvKD09Xdu3b3evrvj6+ja4xmQyebxt810XumbevHlKSUnR1q1btXXrVj377LN64oknNG7cuHO2dzqd+s1vfiMfHx89/fTTDcKD0+lUamqq4uPjG1132WWXnbeOjh07uv/iDgsL0xdffKEXXnhBixcvvtAQG/i+7bJzOfuXb//+/eXn56eioiJt27ZN999/v4YOHarf/OY3Ki0t1T//+U898sgjHvfrdDrVuXNn5ebmNnruv+f1QvP8QwPCf/d/tr4fonv37g3uOTqroqLigvMMXIy4hwb4f66++mpJapH/c/7000/dj48fP649e/a4+/8+11xzjR544AG98MILuuuuu/SXv/zle9tmZWXp888/1/LlyxuFh+uvv17//ve/deWVVzb65+xWlaecTqfq6+ubdM25/OQnP9Gnn37aoK/PP/9cJ06c0E9/+lNJkp+fnwYNGqSNGzdq9+7duvHGG2W1WvWTn/xEzz33nMxmswYNGuTxa/br10/Hjx9XXV1do59DUFBQk2qvrKzUvn373OeOHTvmvsfmLF9f33O+G6m1DBo0SAcOHGhQx1dffaWysjKP7zMCLiYEGvwo3XvvvXr11Ve1a9cuffPNN/rwww9lt9sVEBCgoUOH/qC+TSaTnn76aW3fvl1ffPGF0tPTdemllyo2Nvac7fft26enn35axcXF+uabb/SPf/xDH3/88fcGoNdff11/+tOfNG/ePEln7qU4fPiwTpw4IUmaNm2aNm3apAULFuizzz7T/v379d577+mxxx7Tt99+e84+jxw5ouzsbO3YsUPffPONPv/8cy1atEgffvihEhISftDPQzrz866urlZGRob+9a9/qbi4WI8++qgGDx7c4KbjG2+8UevXr9dVV12lbt26uc/l5eVp4MCB6tChg8eveeONN+rnP/+5Hn74Yb399tv6+uuv9c9//lP/93//d96w+N9+/vOf69prr9Vvf/tb7dy5U59//rnS09NlsVgarNwEBwfrk08+UWlpqSorK3/wCsxnn32mzz77TFVVVaqpqXEff7eu6667To8++qh27typHTt26NFHH9WAAQPcK4zAjwlbTvhRGj58uNavX6/s7GxVV1erW7duCg8P11NPPSWr1fqD+jabzZoxY4Zmz56tr7/+WiEhIVqxYoU6dux4zvaXXnqp9u3bpxkzZqiyslKBgYG67bbb9Nvf/vac7T/66CPV19frV7/6VYPzd9xxh373u9/pxhtv1B//+EctXbpUSUlJcrlcstlsuvnmm+Xjc+5feV9fX3322Wf6y1/+oqqqKnXp0kXXXHONVq5c2eAelCVLlmjp0qX64osvmvQzueyyy/TSSy/p6aef1t133y0/Pz/deuuteuyxxxq0u/HGG/X73/++Qag8O56m3D8jnQmWzz//vJYuXaqnnnpKhw4dUpcuXXTttddqwoQJTepn6dKlmj17tn75y1/KarVq4sSJqqioaBCwHn74YWVmZiomJkZ1dXXatGlTk+r9b/8dJM8en/3Zm81mLV++XPPmzdN9990nk8mk4cOH64knnuAeGvwomVzNuSEAwDm9/vrrevzxxxu8pfdikp6eriNHjuill17ydileVV1drVtvvVWPPPJIg3eTAfAeVmgAeMTpdOrDDz9s8tdDXAw2bdokHx8fXXXVVaqsrNTSpUtlMpl0++23e7s0AP8PgQaAR8xm8wU/4fZi9e233+q5557TN998o0svvVTXXXed/vSnP/FuIqAdYcsJAAAYHu9yAgAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAdBulZaWauDAgXI4HC3e95IlS5SWltasa2fOnKnFixe3cEUA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MTFR+/fvP+c46+rqlJaWpqFDhyo8PFx33XWXjhw5Ikn661//qttvv10DBw7UyJEj9ec//9l9XVFRkYYPH65Vq1Zp2LBhuvnmm7Vx40b9/e9/V3R0tG644QYtX77c3X7JkiWaNm2aHnnkEQ0cOFB33HGHPv/883PW9N0tvwMHDigkJERr167VbbfdpqFDh+r55593t/3222/129/+VkOGDNHtt9+uVatWafjw4ReYXeDiRaAB0MDmzZs1ZswYFRcXKyIiQk8++aSkM0HnoYce0k033aQPPvhAjz/+uNLS0vSf//zHfe2bb76pRx55RNu2bZOfn5/Gjh2r6667Ttu2bVN0dLSeeuqpBq+1fv16vfjii3r77be1Z88eLVu2TJK0evVq9ezZUx9++KG2bt2qGTNmyGQyeVTD3/72N02dOlXbt2/XFVdcocWLF59znGvXrlV1dbXeffddFRUVyW6365JLLpEkdevWTStWrNAnn3yip556Sk899ZRKSkrc1x45ckR1dXV67733NG3aND3++ONat26d/vrXv2rNmjV67rnn9PXXX7vbb9q0STExMfroo48UGxuryZMn69SpUx7Nx8cff6zCwkL98Y9/1HPPPaevvvpKkrR06VJ988032rhxo1avXq1169Z51B9wsSLQAGhg8ODBuvXWW2WxWBQfH+9eTdixY4dqamo0ceJE+fn5adiwYRoxYoT+9re/ua8dNWqUrr/+enXo0EGjRo1Shw4dlJCQIIvFotGjR+uzzz5r8Fq//OUvZbPZFBgYqEmTJrn78vHx0eHDh1VaWipfX1+Fh4fLZDJ5XENYWJh8fHwUFxfX6DXP8vHxUVVVlfbt2yeLxaLrr79enTp1kiTddtttuuKKK2QymXTDDTfopptuUnFxcYNrJ02aJF9fX40ePVpHjx5VSkqKOnXqpJ/+9Kf66U9/qi+++MLd/rrrrlNMTIx8fX31wAMPqL6+Xjt27PBoPqZOnapLLrlE1157ra699lr3fLz55pt68MEH1aVLF/Xq1UspKSke9QdcrAg0ABq47LLL3I8vueQS1dXV6fTp0zp06JB69eols/n//89GUFCQDh486D7u1q1bg2v/u6+ampoGr2Wz2Rr0dejQIUnSr371K1155ZUaP368Ro4cqZUrV0qSRzVc6DXPio+P180336wZM2bo5ptv1sKFC92rJn//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1HjF5qwFCxYoIyND69atk9VqVWZmppKTkzVixAj17t27SfVVVFTL6XQ1b3DfI8DXqVP1jhbtE23EJebOqJg742LuDMtx2qmjh0+0aJ9ms+m8iw1ee9t2t27dFBoaqvz8fElSfn6+QkNDG203SVJMTIxycnLkdDpVWVmpjRs3Kjo6ukGbvLw8hYWFqW/fvqqtrZXJZJIkmUwm1dTUtP6AAACA17RJoJk3b56GDx+u8vJyPfDAAxozZowkac6cOXrllVcUHR2tV155RXa73X1Namqqdu3aJUmKj49XcHCwoqKidM8992jKlCkNVlyOHTumnJwcTZw4UZIUFxenbdu2KTY2Vn369FFISEhbDBMAAHiJyeVytey+ykWidbac6lX++h9atE+0jaC7fq3Svy72dhloBubOuJg74+p15wwdP+XXon222y0nAACAlkKgAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhkegAQAAhtcuAk1ERIRiYmIUHx+v+Ph4bdmypVEbh8Mhu92uyMhIjRo1Sjk5Oe7ncnNzNXr0aCUkJKikpMR9PiMjQ8XFxW0yBgAA4D0+3i7grOzsbF1zzTXf+/z69eu1f/9+bdiwQVVVVUpISNCwYcMUHBysZcuWKT8/XyUlJVqxYoWys7NVVFQki8Wi8PDwNhwFAADwhnaxQuOJgoICJSYmymw2y2q1KjIyUoWFhZIks9msuro61dTUyNfXV/X19crOzlZaWpqXqwYAAG2h3azQpKWlyeVyafDgwZoxY4YCAgIaPF9WVqagoCD3sc1mU3l5uSQpPT1d48ePl7+/v+x2u1auXKnExEQFBga25RAAAICXtItAs2bNGtlsNtXX12v+/PmaO3euFi1a5PH1UVFRioqKkiTt3btXO3fuVGpqqux2uyoqKhQeHq6UlJQm1dStW6cmtffE6eqj8vWztHi/aAMmMXdGxdwZF3Nn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JpfLpcGDB2vGjBkKCAho8LyR5+9CY5OMOXdff/21AgMDtXTpUhUVFcnf31/Tp09XeHh4g3ZGnDtPxya14dy50CrmzJnjmjRpksvhcDR67tChQ676+nqXy+Vyvf/++64bb7zRVVlZ2dYl/iBr1651TZgwodH52NhY144dO9zHK1eudD355JNtWVqL+L7xGXHuPvnkE1dycrLL6XS6XC6Xa8SIEa4vvviiUTujzp2n4zPi3J1VWlrqcrlcrrq6Otfs2bNdv/nNbxq1Mer8eTI2o87drl27XNdcc41r3bp1LpfL5fr0009dN954o+vEiRMN2hlx7jwdW1vOHVtOrSArK0v79u3TM888I7O58Y+4e/fu8vX1lSTddNNNstls+vLLL9u6zB8kISFBRUVFOnr0aIPznn4renv3feMz4txt375d//nPfzRy5EhFRESovLxcv/rVr/T+++83aGfUufN0fEacu7NsNpskyc/PT0lJSfrkk0/O2caI8+fJ2Iw6d0FBQfLx8VFsbKwkqX///uratav27NnToJ0R587TsbXl3BFoWtjixYv1z3/+U88995z8/PzO2ebgwYPux5999pm++eYb9e3bt61KbJaTJ0+qrKzMfbx582Z16dJFgYGBDdp58q3o7ZGn4zPi3E2cOFHvv/++Nm/erM2bN6tXr1568cUXdfPNNzdoZ9S583R8Rpw7SaqpqdGJEyckSS6XSwUFBY3efScZc/48HZtR585qtWro0KHuL1Xes2ePKioqdOWVVzZoZ8S583RsbTl33EPTgr788kstX75cffr00bhx4yRJwcHBeu655xp8c/gf/vAHlZSUyGw2y9fXVwsXLlT37t29XP351dbWavr06aqtrZXZbFaXLl20fPlymUymBmOLj4/Xjh07FBUVJUmaMmXKBe9raA88HZ8R5+58Loa5O5+LYe4qKir08MMPy+FwyOl06uqrr3a/7dXo8+fp2Iw6d5Jkt9v12GOPKSsrSz4+Plq4cKECAgIMP3eSZ2Nry7nj27YBAIDhseUEAAAMj0ADAAAMj0ADAAAMj0ADAAAMj0ADAAAMj0ADAAAMj8+hAdCuffd7X2pra+Xn5yeLxSLpzOdgxMXFeas0AO0In0MDwDAiIiI0b948/fznP2/SdS6XSy6X65xfRQLg4sBvNwBDWrJkidLS0tzHBw4cUEhIiE6fPi1JSk5O1uLFizVu3Dj1799fX3/9tUJCQvTqq68qKipKQ4YMkd1u19n/p9u3b5/uvfdeDR48WEOHDtUjjzzijWEBaCa2nABctN544w2tWrVKffv2dQeXd999V7m5uaqurtadd96pESNGaPjw4Xr22Wd100036eWXX9apU6e0a9cuL1cPoClYoQFw0brjjjv005/+VD4+Pu5v/E1NTVVAQICCgoI0dOhQff7555IkHx8flZaW6tChQ+rQoYPCw8O9WTqAJiLQALho2Wy2Rue++8V4l156qU6ePClJevTRR+VyuXT33XdrzJgxys3NbbM6AfxwbDkBMKRLL71U3377rfv4yJEjjdqYTCaP++vevbvmzZsnSSouLtYDDzygIUOG6Morr/zhxQJodazQADCk0NBQbd++XaWlpTpx4oRWrFjxg/p78803VV5eLknq0qWLTCYT74oCDIQVGgCGdNNNN2n06NGKi4tT165dlZqaqs2bNze7v127dmnBggWqrq5Wt27dNGvWLPXu3bsFKwbQmvgcGgAAYHispwIAAMMj0AAAAMMj0AAAAMMj0AAAAMMj0AAAAMMj0AAAAMMj0AAAAMMj0AAAAMMj0AAAAMP7/wC6kKPi2z1nQgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x864 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, (opt_ax, ts_ax) = plt.subplots(nrows=2, sharex=True, sharey=True,\n",
" figsize=(FIG_WIDTH, 2 * FIG_HEIGHT))\n",
"\n",
"plot_turn_dist(opt_row_turns_pmf_10_3, color='C0', ax=opt_ax);\n",
"\n",
"make_pct_yaxis(opt_ax);\n",
"opt_ax.set_title(\"Optimal play\");\n",
"\n",
"plot_turn_dist(ts_row_turns_pmf_10_3, color='C1', ax=ts_ax);\n",
"\n",
"make_pct_yaxis(ts_ax);\n",
"ts_ax.set_title(\"Thompson sampling\");\n",
"\n",
"fig.suptitle(\"Ship size 3, row length 10\");\n",
"fig.tight_layout();"
]
},
{
"cell_type": "markdown",
"id": "bcf64c90",
"metadata": {},
"source": [
"It turns out that for a single row with a single ship, the Thompson sampling strategy is optimal!\n",
"\n",
"<center>\n",
"<figure>\n",
" <img src=\"https://sinmantyx.files.wordpress.com/2015/05/m6xj1.jpg\">\n",
" <caption>Image credit <a href=\"https://sinmantyx.wordpress.com/2015/05/29/bayes-theorem-205-hypothesis-fever-and-falsification/\">SINMANTYX</a></caption>\n",
"</figure>\n",
"</center>\n",
"\n",
"It is extremely cool to me that we can reproduce the optimal strategy without too much domain-specific thought, but just by enumerating all possible boards and sequentially eliminating the ones that are no longer compatible with the observed (revealed) data! This result is particularly exciting because, as we will see, the generalization of the row-optimal strategy to a two-dimensional grid is not straightforward (even for just one ship), but the Thompson sampling approach generalizes much more readily."
]
},
{
"cell_type": "markdown",
"id": "337babfb",
"metadata": {},
"source": [
"### Square, one ship\n",
"\n",
"We now turn to the case of a square grid with one ship on it to see how these strategies generalize to something closer to standard Battleship.\n",
"\n",
"#### Random guessing\n",
"\n",
"Once again the number of turns it takes to sink the ship follows a negative hypergeometric distribution. For the 5/5/3 configuration, this distribution is shown below."
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "25990751",
"metadata": {},
"outputs": [],
"source": [
"random_5_5_3_pmf = get_random_guess_dist(5**2, 3)"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "8f00a9b2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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f8LDw0lMTAQgMTGR8PBwHZK1Eb3PbeuNN97gwIEDLFq0CA8PD0DvcVuq7fvd1O9xF6vVarXZq4tdSU9P57e//S1msxmLxUL37t35wx/+QGBgoNHRHMa8efPYuHEjubm5tG3bFl9fXz777DOOHz/O888/z7lz5/Dx8WHBggV069bN6LjNXm3f7yVLluh9biNHjx5l7NixhIaG0qJFCwBCQkJYtGiR3uM2UNf3+/nnn2/S97iKgoiIiNRJpx5ERESkTioKIiIiUicVBREREamTioKIiIjUSUVBRERE6qSiICIiInXSvR5EpNEMGDCg5r/Ly8vx8PComf8fHx/P+PHjjYomIldJcxRExCaGDx/OvHnzuPnmm6/o86xWK1artWZUrYgYS38TRcTm3n77bWbPnl3z8enTpwkLC6O6uhqAadOm8cYbbzBlyhT69etHeno6YWFhfPTRR0RFRXHDDTcQHx/PT7/XnDp1igcffJBBgwYxePBgnn76aSN2S8Qp6NSDiNiF1atX87e//Y2uXbvWFILNmzezYsUKSkpKmDhxIsOGDWPo0KG89dZb3HLLLbz//vtUVVWxf/9+g9OLOC4dURARu3DPPffQo0cP3NzccHd3ByA2NhYfHx+Cg4MZPHgwhw4dAsDNzY2MjAxycnLw9PQkMjLSyOgiDk1FQUTsQm23JA4ICKj575YtW1JaWgrAs88+i9VqZdKkSdx9992sWLGiyXKKOBudehARm2vZsiXnz5+v+Tg3N/eSbVxcXBr8egEBAcybNw+AXbt28fDDD3PDDTfQpUuXaw8rIhfREQURsbnw8HB27txJRkYGxcXFLF269Jpe7/PPPycrKwuANm3a4OLiolUSIjaiIwoiYnO33HILY8aMYfz48bRt25bY2Fi++uqrq369/fv3M3/+fEpKSvD39+eFF16gU6dOjZhYRH6iOQoiIiJSJx2rExERkTqpKIiIiEidVBRERESkTioKIiIiUicVBREREamTioKIiIjUSUVBRERE6qSiICIiInVSURAREZE6/X/LaL35WKlWAwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_turn_dist(random_5_5_3_pmf, kind='line', mean=True)\n",
"\n",
"make_pct_yaxis(ax);\n",
"ax.set_title(r\"5/5/3\");"
]
},
{
"cell_type": "markdown",
"id": "3d1735a1",
"metadata": {},
"source": [
"There are not really any surprises here; the geometry of the board and the ability to have ships orient along rows or columns doesn't affect the random guessing strategy at all."
]
},
{
"cell_type": "markdown",
"id": "d38e8d60",
"metadata": {},
"source": [
"#### Near optimal\n",
"\n",
"We now construct a near optimal strategy for one ship on a two-dimensional grid based on trying to reduce the problem to search on a one-dimensional row/column as quickly as possible. We call this strategy \"near optimal\" because we will see that it takes slightly more turns, on average, than a Thompson sampling strategy to sink the ship.\n",
"\n",
"It is tempting to treat an $m \\times n$ two-dimensional grid as a $m \\cdot n$ one-dimensional grid and use the search grid from the above strategy, but this grid will only minimize the turns-to-first-hit when $m$ and $n$ are [relatively prime](https://en.wikipedia.org/wiki/Coprime_integers). To illustrate this fact, we show the results of wrapping the search grid for the 100/2 configuration to the 10/10/2 configuration below."
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "8b12e4d7",
"metadata": {},
"outputs": [],
"source": [
"bad_search_j_1d = get_search_cells_1d(100, 2)\n",
"bad_search_i, bad_search_j = np.divmod(bad_search_j_1d, 10)\n",
"bad_search_grid = np.zeros((10, 10))\n",
"bad_search_grid[bad_search_i, bad_search_j] = 1"
]
},
{
"cell_type": "code",
"execution_count": 92,
"id": "b30c89d5",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHkCAYAAACHXd7BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAevElEQVR4nO3de3CU5f338c+GNUKoOSCSZFd+nByjVDEgBxUEjCDaBkR0LKLBKbToiMGCFBC0QUABhwpRUKkWK9bSThUtKB7QyDiJFqggFolODeddCAQJkABCkvv5gyd55MdmOfR778Hn/frHZO811zfXoG+ue9ngcRzHEQAA+K8kRHsAAAB+DAgqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKvAjsXTpUmVlZenWW281/bo7d+5UVlaWsrKyGn3Os88+q6ysLE2aNMl0bSCeEFSgETk5OcrKytJll12mzp07KycnRw899JA2bNhgvlZWVpaWLl0q6f+FMS8vz3yd05k0aZKysrL07LPPntW/d9VVV2n48OHq2bPnWa3zxBNPnMuYQEzyRnsAINb17dtXaWlpWrdund577z19+OGHmjNnjm655ZZojxYzevfurd69e0d7DCCqOKECp3HHHXdo5syZeuedd/Tzn/9cNTU1mjp1qo4cOSLpxC3RMWPGqFevXurWrZvy8vJOOsXm5eUpKytLv//973X33Xfrqquu0tChQxUIBE5Za+nSpXrkkUckSWvWrFFWVpZycnJCzlVeXq4RI0YoOztbw4YN086dO095ztdff62RI0eqR48euuaaa3T//fdr8+bNIb/epEmT9Oabb0qS5s+fH/IW7vLly3XDDTeoW7duevLJJxse/9+3fHfu3KmRI0eqW7du6tSpkwYMGKBnnnmm0T0GfgwIKnCGvF6vRo8eLUmqrKzUunXrdPjwYd177716//331bZtW11zzTVas2aN7r33Xm3fvv2kf/+ll15SRkaG0tLStH79es2bN6/h2jfffKMhQ4bokksuabhtmp6eruHDh2vIkCEh5xk/frxKSkqUmZmpiy++WC+++OJJ1/fs2aO8vDwVFxcrOztbHTt21Mcff6zhw4frwIEDp3y9nj17qkOHDpIav4X79NNPq0uXLqqqqtIrr7yizz77LORs8+bNU3Fxsa688koNHjxYmZmZJ/0mw+v1nvRP4MeA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BggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGziqo1dXV+uqrr1RVVeXWPAAAxKWwQf3d736n7777TpL0+eefq3///powYYL69++v4uLiiAwIAEA88Ia7+MUXX6hFixaSpMLCQr3wwgvq1KmTtmzZoocffli9evWKyJAAAMS6sCfU77//vuHj6upqderUSZLUrl07HT9+3N3JAACII2GDeu2112rWrFk6cuSIevTooRUrVkiSSkpKlJqaGon5AACIC2GDOnnyZNXU1Kh3795auXKlxo0bpyuuuEKLFi3Sk08+GakZAQCIeWFfQ01MTNSjjz6qcePGafv27aqtrZXP51NaWlqk5gMAIC6EDWq9pKQkXXbZZW7PAgBA3OIHOwAAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGDA4ziOE6nF/H5/pJYCAMAVgUAg5OOcUAEAMOCN9ILBYOiyxxKf78RJOhAMRnmSM+P3+SSxt25gb93D3rqHvXVP/d6GwgkVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAA2GD2qNHD82YMUOlpaWRmgcAgLgUNqjNmzdXQkKCRowYodtuu01//vOfdeDAgUjNBgBA3Agb1JSUFE2ePFmffPKJ7rvvPn3yySfq27evxo4dq5KSkkjNCABAzDuj11DPO+883XzzzfrDH/6g999/X1lZWZo+fbrbswEAEDfCBtVxnFMea9Wqle6//3699957rg0FAEC8CRvUBQsWRGoOAADiWtig+v3+SM0BAEBc432oAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGPA4juNEajH+flUAQLwLBAIhH+eECgCAAW+kFwwGQ5c9lvh8J07SgWAwypOcGb/PJ4m9dQN76x721j3srXvq9zYUTqgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAY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y5bpjTfekOM4mjZtWrRHalRNTY127Nihjh07aunSpRo/frzy8/NVVVUV7dHCeuONN2L+dFpTU6OFCxfqueee08cff6znn39eY8eOVXV1dbRHO8UFF1yguXPnaubMmRoyZIj27dun5ORkeb3unx/jNqiZmZkqLy9XbW2tJKm2tlZ79uyJm9uq8WD27Nnatm2b5s2bF5O3dkIZPHiwVq9erf3790d7lFOsXbtWmzdv1o033qicnBzt3r1bI0eOVHFxcbRHa1T9f0+JiYkaNmyY1q1bF+WJGufz+eT1ehteBrrqqquUlpamLVu2RHmyxpWXl2vt2rUaOHBgtEcJq7S0VHv27NHVV18tSbr66qvVrFkzlZWVRXmy0K677jotWbJES5cu1T333KOjR49G5K5QfPxfMoQLL7xQl19+ud5++21J0ttvv63LL7+c271G5s6dq40bN2rBggVKTEyM9jiNqq6u1q5duxo+LyoqUkpKilJTU6M3VCNGjRql4uJiFRUVqaioSBkZGfrjH/+oXr16RXu0kA4fPtzwmpnjOFqxYkVM/+npFi1aqEePHiopKZF04l0A+/btU5s2baI8WePefPNN9enTR2lpadEeJayMjAzt3r1bmzdvliSVlZWpoqJC//M//xPlyULbu3evpBMvWT399NMaOnSokpKSXF/X4ziO4/oqLikrK9OkSZN08OBBJScna/bs2Wrfvn20xwppxowZ+uCDD1RRUaG0tDSlpqbqnXfeifZYIf3nP/9Rbm6u2rZtq6ZNm0qSLr74Yi1YsCDKk52qoqJCDzzwgI4cOaKEhASlpKRo4sSJMf16VL2cnBy98MILMfu2mR07dig/P1+1tbWqq6tThw4d9Oijj6pVq1bRHq1RO3bs0OTJk1VZWSmv16vf/OY36tOnT7THatSAAQM0ZcoU9e7dO9qjnNayZcv04osvNvyBrzFjxqhfv35Rniq0KVOmaN26dTp+/Lh69uypyZMnN7z1y01xHVQAAGJF3N7yBQAglhBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADPwfOnKqcQ1en08AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(bad_search_grid)\n",
"ax.set_title(r\"Don't do this!\", fontweight='bold');"
]
},
{
"cell_type": "markdown",
"id": "940f1296",
"metadata": {},
"source": [
"Clearly this search strategy can fail to locate a column-oriented ship in an even-numbered column even after fifty guesses!\n",
"\n",
"Instead, the optimal grid to search for the initial hit (at least for a square grid) is to cycle through the equivalence classes modulo the ship size in each row, as shown below for both the 10/10/2 and the 5/5/3 configurations."
]
},
{
"cell_type": "code",
"execution_count": 93,
"id": "e5b9a018",
"metadata": {},
"outputs": [],
"source": [
"def get_search_cells_2d(grid_shape, ship_size):\n",
" i, j = np.indices(grid_shape)\n",
" in_grid = (i - 1) % ship_size == j % ship_size\n",
" \n",
" return i[in_grid], j[in_grid]"
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "11ced72a",
"metadata": {},
"outputs": [],
"source": [
"search_i, search_j = get_search_cells_2d((10, 10), 2)\n",
"search_grid = np.zeros((10, 10))\n",
"search_grid[search_i, search_j] = 1"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "a277bd32",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHmCAYAAADKlX/KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAg60lEQVR4nO3deXRTdf7/8VfaUqEgFGRNrLIoCoNQFsWFtciiFgQcHUTRGXQAFZBNwAKCgAgOCoigouLRI3LmHLfD5ghYlUVlUUCR6mhhABPaUqAsRSht7++P/uiRb9NYmHeShnk+zuGc9OYm981H4Jl701SX4ziOAADAfyUq3AMAAHAxIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqPifkpSUpC+//LLU+++44w5t2rTJ9JjBeM7/RX+0juPHj9ecOXNCOBFwrphwDwBY27p1q2bPnq2ff/5Z0dHRatiwoVJSUtS8efM/fOzKlSvN5wnGc44ZM0Zff/21Tp48qVq1aunhhx/W3XffXabHDhgwQNu3b1dMTNFf/9q1a+uTTz75r2cK1vOeFYx1BCwRVFxUTpw4oSFDhmjKlCm67bbbdObMGW3dulWxsbHhHs3U4MGDNWPGDMXGxio9PV0PPPCAmjRpombNmpXp8U899dQfBthxHKWlpalp06bnbP/xxx919dVXKzo6+oKe93zl5+cXRxooz7jki4vKnj17JEnJycmKjo5WxYoV1a5dO1177bXF+6Slpalnz55q3bq1RowYodOnTxff9/tLwklJSXr11Vd1++236/rrr9eTTz55zr6/t2jRIrVv314tW7ZU9+7d9dVXX5V4zlWrVqlly5bFv5o1a6YBAwZIkjIzMzVs2DDdeOONSkpK0ttvvx3w93n11VcXv0hwuVxyuVzat2/fBaxY6X799VcNHDhQ69atK962detWPfjgg0pPT/+vn/+HH35Q79691bJlSw0fPlwjRowovmSblJSkRYsWqWfPnkpMTFR+fn6Jy/W7du1Snz591LJlyxL/HYFwIKi4qDRo0EDR0dEaN26cvvjiCx09erTEPh9//LFef/11ffrpp/rpp5/0wQcflPp8y5cv1xtvvKE1a9Zoz549WrhwYYl9du/erSVLlui9997Ttm3b9MYbb8jj8ZTY7/bbb9e2bdu0bds2rV+/XgkJCbrjjjtUWFioRx55RNdcc43WrVunt956S2+99ZbWr18f8Pc6ZcoUtWjRQrfddptq1aqljh07lmGFijz//PNq27at+vXrV+r7kgkJCZo/f76eeOIJff311/ruu+80dOhQ/eMf/1Djxo0v+HklKS8vT0OHDlWfPn20efNmJScna+3atefss3LlSi1atEhbt24tcYaal5enxx57THfeeac2b96sHj16aPXq1WX+/QPBQFBxUalSpYreffdduVwuTZo0STfddJOGDBmi7Ozs4n0GDBigOnXqKD4+Xp07d1ZaWlqpz3ffffepXr16io+P1yOPPOL3fbzo6Gjl5eUpPT1dZ86c0eWXX64rrrii1OcsLCzU6NGjdcMNN6hfv376/vvvdfjwYQ0dOlSxsbFKSEjQPffco1WrVgX8vU6ZMkXffvutlixZoq5du5b5svaYMWO0du1arV+/Xn/5y180ZMiQUs9ur7/+es2ePVuPP/64Bg8erGnTpqlDhw7/9fPu2LFD+fn5euCBB1ShQgV169ZN11133Tn7DBgwQPXq1VPFihX9Pv7MmTN68MEHVaFCBfXo0aPE44FQI6i46DRq1EgzZ87UunXrtHz5cmVlZWnGjBnF99eqVav4dqVKlXTy5MlSn6tevXrFt91ut7Kyskrsc+WVVyolJUXz58/XzTffrJEjRyozM7PU55wzZ45yc3M1ceJESZLX61VWVpbatGlT/OuVV14550VAaaKjo9WmTRtlZGRo6dKlf7i/JLVo0UJVqlRRbGys+vTpo1atWumLL74odX+3263o6Gg5juP3zPtCnjcrK0t16tSRy+Uq3vb7tfb39R893u12l7o/EAoEFRe1Ro0aqW/fvvr5558v6PEHDhwovu3z+VS7dm2/+/Xs2VNLly7VZ599JpfLpdmzZ/vdb+XKlVq5cqVefPFFVahQQVJROC6//HJt3bq1+Ne2bdv02muvlXnOgoKCC34P1eVyqbT/LfK+ffv0t7/9TWPGjNHTTz+tQYMGlXktAz1vrVq1lJmZec79v1/rs48vjb/H+3y+Ms0FBAtBxUUlPT1dixcvVkZGhqSif6RXrFihFi1aXNDzvfvuu8rIyFBOTk7xNyj9X7t379ZXX32lvLw8xcbG6pJLLvH7HbC7du3StGnTtGDBAtWoUaN4e/PmzVWlShUtWrRIp06dUkFBgf7973/ru+++8zvToUOHtHLlSuXm5qqgoEDr16/XypUrdeONN0oq+jzm+PHj/T722LFjWr9+vU6fPq38/HwtW7ZMW7duVbt27Ursm5mZqb/+9a8aMmSI+vbtq+7du2vs2LEaOHCg9u/ff8HPK0mJiYmKjo7WO++8o/z8fK1du1bff/+9331Le3xMTIzefvtt5efna/Xq1ef1eCAY+F50XFSqVKmiHTt26M0339Tx48d16aWXqnPnzho7duwFPV9ycrIGDhyorKwsdenSRY888kiJffLy8vT8888rPT1dFSpUUMuWLTV16tQS+3366ac6duyY+vfvX7ytdevWev311/Xyyy9r1qxZ6tKli/Ly8tSgQQONGDHC70wul0tLly7V5MmTVVhYKI/Ho5SUFN16662Sil5E3HHHHX4fm5+fr7lz52r37t3Fn9FdsGCBGjZsWGLf6tWra9y4cerevXvxtl69eikuLu6cFwTn+7ySFBsbq/nz52vixIl64YUX1L59e3Xq1KnM7wOfffykSZM0d+5cdezYUV27di3TY4FgcTmlXZMB/sclJSVp+vTpuvnmm8M9Spnl5eXpzjvv1LJly4ovKUeKu+++W/369dNdd90V7lGAC8IlX+AiEhsbq48//jgiYrp582YdPHhQ+fn5+vDDD/XTTz+pffv24R4LuGBc8gUQFnv27NGIESN08uRJJSQk6MUXXyz1m76ASMAlXwAADHDJFwAAAyG95BvoQ+EAAEQCr9frd3vI30P1+fwPUp643UXh90bIB8U9//8nxLC29ljb4GFtg4e1DR5PgJ/IxSVfAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADMSUZacjR44oIyNDklS3bl1Vr149qEMBABBpAgZ13759mjRpknbt2qXatWtLkrKystS0aVM9/fTTql+/fihmBACg3AsY1LFjx6p///568803FRVVdHW4sLBQy5cv17hx4/TPf/4zJEMCAFDeBXwPNScnR7169SqOqSRFRUXpzjvv1NGjR4M+HAAAkSJgUOPj47VixQo5jlO8zXEcLVu2TFWrVg36cAAARIqAl3xnzpypyZMna+rUqapTp44kKTMzU9dee61mzpwZkgEBAIgEAYNav359vfXWWzp8+LAOHDggSapXr55q1KgRkuEAAIgUZfrYTI0aNYgoAAAB8IMdAAAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMOByHMcJ1cE8Hk+oDgUAQFB4vV6/2zlDBQDAQEyoD+j1+UJ9yPPmcbslST6f/1ch5Y3bXXTmz9raY22Dh7UNHtY2eM6urT+coQIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYOCCg9qzZ0/LOQAAiGgxge785ZdfSr3vyJEj5sMAABCpAgY1OTlZHo9HjuOUuC8nJydYMwEAEHECBtXj8ejdd99VnTp1StzXsWPHoA0FAECkCfgeardu3eT1ev3e17Vr16AMBABAJAp4hjpu3LhS75s4caL5MAAARCo+NgMAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABl+M4TqgO5vF4QnUoAACCwuv1+t3OGSoAAAZiQn1An89/2csTt7voTNrr84V5krLxuN2SWNtgYG2Dh7UNHtY2eM6urT+coQIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYCBgUI8cOaIJEyZo4MCBWrJkyTn3DRs2LKiDAQAQSQIGdfLkyapWrZr69euntWvXaujQocrPz5ck7d+/PyQDAgAQCQIGde/evRo7dqy6deumxYsXq1atWho8eLBOnz4dqvkAAIgIAYOal5dXfNvlcmny5Mlq3LixBg0aRFQBAPidgEFNSEjQli1bztk2btw4JSYm6j//+U8w5wIAIKLEBLrzueeek8vlKrF95MiR6tmzZ9CGAgAg0gQManx8fKn3XXXVVdazAAAQsfgcKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAZcjuM4oTqYx+MJ1aEAAAgKr9frdztnqAAAGIgJ9QG9Pl+oD3nePG63JMnn8/8qpLxxu4vO/Flbe6xt8LC2wcPaBs/ZtfWHM1QAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADJx3UI8ePRqMOQAAiGgBg/rjjz+qb9+++vOf/6z09HQNGjRIHTp0UMeOHZWWlhaqGQEAKPcCBnX69Ol67LHHdP/99+vhhx9WcnKyduzYocmTJ2vWrFmhmhEAgHIvYFBzc3PVpUsX9e7dW5LUq1cvSVJSUpJycnKCPRsAABEjYFAdxym+fcstt5xzX2FhYXAmAgAgAgUMqsfj0YkTJyQVXf49KyMjQ5UqVQruZAAARJCYQHcuWLDA7/aqVatq4cKFQRkIAIBIFDCopYmLi1NcXJz1LAAARCx+sAMAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGXI7jOKE6mMfjCdWhAAAICq/X63c7Z6gAABiICfUBfT7/ZS9P3O6iM2mvzxfmScrG43ZLYm2DgbUNHtY2eFjb4Dm7tv5whgoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAICB8w7ql19+GYw5AACIaDGB7vzll19KbHvyySe1ePFiOY6jq666KmiDAQAQSQIGNTk5WW63+5xt2dnZ+vvf/y6Xy6VPP/00qMMBABApAgZ16NCh2rFjh6ZMmSKPxyNJSkpKUmpqakiGAwAgUgR8D3Xo0KEaOXKkRo8eraVLl0qSXC5XSAYDACCS/OE3JTVt2lRvv/22vF6vHnzwQZ05cyYUcwEAEFECXvI9KzY2VmPGjNH27du1efPmYM8EAEDEKVNQz0pMTFRiYmKQRgEAIHLxgx0AADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAw4HIcxwnVwTweT6gOBQBAUHi9Xr/bOUMFAMBATKgP6PX5Qn3I8+ZxuyVJPp//VyHljdtddObP2tpjbYOHtQ0e1jZ4zq6tP5yhAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYCBgUDdu3Fh8+/jx43riiSd06623atiwYcrOzg76cAAARIqAQZ09e3bx7Tlz5qhy5cpauHChGjZsqOnTpwd9OAAAIkVMoDsdxym+/c033+i9995ThQoV1LhxY/Xs2TPowwEAECkCBjUvL0/p6elyHEcul0sVKlQovi8qirdfAQA4K2BQT506pUGDBhWfqWZmZqpOnTo6ceIEQQUA4HcCBjU1NdXv9ujoaL344otBGQgAgEh0QaeZlSpVUkJCgvUsAABELK7bAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYMDlOI4TqoN5PJ5QHQoAgKDwer1+t3OGCgCAgZhQH9Dn81/28sTtLjqT9vp8YZ6kbDxutyTWNhhY2+BhbYOHtQ2es2vrD2eoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGDivoObm5uqHH37QiRMngjUPAAARKWBQn3rqKR0+fFiS9M0336hr164aO3asunbtqg0bNoRkQAAAIkFMoDu3b9+uGjVqSJLmzZunV155Rc2bN9eePXs0evRotWvXLiRDAgBQ3gU8Qz19+nTx7dzcXDVv3lyS1KBBA505cya4kwEAEEECBvWmm27SzJkz9dtvv6lt27ZatWqVJGnjxo2Kj48PxXwAAESEgEFNSUlRfn6+OnTooDVr1mjUqFFq1qyZFi9erBkzZoRqRgAAyr2A76HGxsZq4sSJGjVqlPbt26eCggK53W5Vr149VPMBABARAgb1rLi4OF177bXBngUAgIjFD3YAAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAgMtxHCdUB/N4PKE6FAAAQeH1ev1u5wwVAAADMaE+oNfnC/Uhz5vH7ZYk+Xz+X4WUN2530Zk/a2uPtQ0e1jZ4WNvgObu2/nCGCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgIGAQW3btq2mT5+utLS0UM0DAEBEChjUypUrKyoqSgMHDlSfPn30zjvv6OjRo6GaDQCAiBEwqNWqVVNKSorWrVunwYMHa926derUqZNGjhypjRs3hmpGAADKvTK9h1qhQgX16NFDixYt0ieffKJrrrlG06ZNC/ZsAABEjIBBdRynxLbatWtryJAh+te//hW0oQAAiDQBg7pgwYJQzQEAQEQLGFSPxxOqOQAAiGh8DhUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADLsdxnFAdjP+/KgAg0nm9Xr/bOUMFAMBATKgP6PP5L3t54nYXnUl7fb4wT1I2HrdbEmsbDKxt8LC2wcPaBs/ZtfWHM1QAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMnFdQf/vtN+3cuVPHjh0L1jwAAESkgEFds2aNWrVqpR49emjHjh26/fbbNXbsWHXt2lWpqamhmhEAgHIvJtCdL730kpYuXapjx45p0KBBevnll9WqVSulp6dr9OjRSkpKCtWcAACUawGD6nK5dM0110iSKleurFatWkmSGjVqFPzJAACIIAEv+bpcLqWnp2vbtm06efKktm/fLknas2ePCgoKQjEfAAARIeAZ6vDhw3XvvfcqKipKc+bM0bx583Tw4EFlZGRoypQpIRoRAIDyL2BQO3furM2bNxd/fcMNNygtLU1169ZVzZo1gz4cAACRImBQ/6/o6Gg1a9YsWLMAABCx+MEOAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGHA5juOE6mAejydUhwIAICi8Xq/f7ZyhAgBgICbUB/T6fKE+5HnzuN2SJJ/P/6uQ8sbtLjrzZ23tsbbBw9oGD2sbPGfX1h/OUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwEFOWnXJycnTgwAHFxMQoISFBFStWDPZcAABElIBB9Xq9mjx5sjZs2CCXy6WqVavq1KlTuvfeezVq1CjFxsaGak4AAMq1gJd8x48fr169emnTpk1KSUnRfffdp9TUVB0/flzPPvtsqGYEAKDcCxjUo0ePqlevXqpWrZoGDBigdevW6bLLLtO0adO0cePGUM0IAEC5FzCoMTEx2rdvnyRp586dxZd4o6KiFBNTprdfAQD4nxCwisOHD9c999yjWrVq6eDBg5ozZ44kKTs7W61atQrJgAAARIKAQe3UqZNWr16tvXv3qkGDBqpSpYokqWbNmpo+fXpIBgQAIBL84XXbqlWr6rrrrgvFLAAARCx+sAMAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGXI7jOKE6mMfjCdWhAAAICq/X63d7SIMKAMDFiku+AAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYiAn3AP+NPXv2aPz48crJyVF8fLxmzZql+vXrh3ssv2bNmqVPPvlEXq9Xy5cvV+PGjcM9UqmOHDmisWPHat++fYqNjdWVV16pqVOnqkaNGuEeza9HH31Uv/76q6KiohQXF6dJkyapSZMm4R4roJdeeknz588v938WkpKSFBsbq0suuUSSNGbMGLVv3z7MU5Xu9OnTmjFjhr766itdcsklSkxM1LRp08I9Vgm//vqrHnvsseKvjx8/rhMnTmjz5s1hnCqwzz77TPPmzZPjOCosLNSwYcPUrVu3cI/l1+eff6558+YpPz9f1apV07PPPquEhITgH9iJYAMGDHA++ugjx3Ec56OPPnIGDBgQ5olKt2XLFsfn8zmdO3d2fvrpp3CPE9CRI0ecr7/+uvjrmTNnOk8++WQYJwrs2LFjxbfXrFnj9O7dO4zT/LGdO3c6Dz30kNOpU6dy/2chEv68/t60adOcZ555xiksLHQcx3EOHjwY5onKZvr06c7TTz8d7jFKVVhY6LRp06b4z0JaWpqTmJjoFBQUhHmyknJycpwbbrjB2b17t+M4RW0YOHBgSI4dsZd8Dx06pF27dik5OVmSlJycrF27dunw4cNhnsy/Nm3aqF69euEeo0zi4+PVtm3b4q8TExPl8/nCOFFgl156afHtEydOyOVyhXGawPLy8jR16lRNnjy5XM8ZiXJzc/XRRx/p8ccfL17bmjVrhnmqP5aXl6fly5frrrvuCvcoAUVFRen48eOSis6oa9euraio8peQvXv3qmbNmmrQoIEkqWPHjtqwYUNI2hCxl3wPHDigOnXqKDo6WpIUHR2t2rVr68CBA+X20mQkKiws1NKlS5WUlBTuUQKaMGGCNm7cKMdx9Prrr4d7nFLNmzdPvXr1Cs3lJyNjxoyR4zhq3bq1Ro0apapVq4Z7JL/279+v+Ph4vfTSS9q0aZMqV66sxx9/XG3atAn3aAGlpqaqTp06+tOf/hTuUUrlcrk0d+5cPfroo4qLi1Nubq5effXVcI/lV4MGDZSdna3vvvtOzZs31/LlyyUpJG0ofy8vUK5MmzZNcXFxuv/++8M9SkDPPPOMPv/8c40cOVLPPfdcuMfxa9u2bfr+++/Vv3//cI9SZkuWLNGyZcv0/vvvy3EcTZ06NdwjlSo/P1/79+9X06ZN9cEHH2jMmDEaNmyYTpw4Ee7RAnr//ffL/dlpfn6+Xn31VS1cuFCfffaZXn75ZY0cOVK5ubnhHq2ESy+9VHPmzNGzzz6rvn376tChQ6patapiYoJ//hixQa1Xr54yMzNVUFAgSSooKFBWVlbEXFaNBLNmzdLevXs1d+7ccnlpx5/evXtr06ZNOnLkSLhHKWHLli3avXu3unTpoqSkJGVkZOihhx7Shg0bwj1aqc7+fYqNjVX//v317bffhnmi0rndbsXExBS/DdSiRQtVr15de/bsCfNkpcvMzNSWLVvUs2fPcI8SUFpamrKystS6dWtJUuvWrVWpUiWlp6eHeTL/br75Zi1dulQffPCB7r//fp06dSokV4Ui419JPy677DI1adJEK1askCStWLFCTZo04XKvkTlz5mjnzp1asGCBYmNjwz1OqXJzc3XgwIHir1NTU1WtWjXFx8eHb6hSDBo0SBs2bFBqaqpSU1NVt25dvfHGG2rXrl24R/Pr5MmTxe+ZOY6jVatWlevvnq5Ro4batm2rjRs3Sir6FMChQ4d05ZVXhnmy0n344Yfq2LGjqlevHu5RAqpbt64yMjK0e/duSVJ6erqys7N1xRVXhHky/w4ePCip6C2rF154Qf369VNcXFzQj+tyHMcJ+lGCJD09XePHj9exY8dUtWpVzZo1Sw0bNgz3WH5Nnz5dq1evVnZ2tqpXr674+HitXLky3GP59fPPPys5OVn169dXxYoVJUmXX365FixYEObJSsrOztajjz6q3377TVFRUapWrZrGjRtXrt+POispKUmvvPJKuf3YzP79+zVs2DAVFBSosLBQjRo10sSJE1W7du1wj1aq/fv3KyUlRTk5OYqJidGIESPUsWPHcI9Vqu7du2vChAnq0KFDuEf5Q8uWLdNrr71W/A1fw4cP16233hrmqfybMGGCvv32W505c0a33HKLUlJSij/6FUwRHVQAAMqLiL3kCwBAeUJQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMPD/AKeB05S1wFRNAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(search_grid)\n",
"ax.set_title(r\"Ship size 3, $5 \\times 5$ grid\");"
]
},
{
"cell_type": "code",
"execution_count": 96,
"id": "7afa9e51",
"metadata": {},
"outputs": [],
"source": [
"search_i, search_j = get_search_cells_2d((5, 5), 3)\n",
"search_grid = np.zeros((5, 5))\n",
"search_grid[search_i, search_j] = 1"
]
},
{
"cell_type": "code",
"execution_count": 97,
"id": "8dc3a95c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHmCAYAAADKlX/KAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAYLElEQVR4nO3deZDWBf3A8c/DwqYM6koDyK6U95UppKaZSi4pHguiZTIkWqSIigUjgeIBHjlimKZhRh6jEzLNNNVw6GhIKeaBTIgmeAEe7XKEgiaWy8Lz+4MfOxLLivjZXXd7vWaYWb7nZ78uz/t5vs/uWigWi8UAAD6Vdi09AAC0BYIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQeV/SmVlZTz55JNbXX/qqafGM888k3rOpjjm/6KPu46XXXZZ3HLLLc04EWyufUsPANnmzZsXEydOjFdffTVKSkpir732irFjx8YhhxzysfvOnDkzfZ6mOOaoUaPi6aefjg8++CC6dOkS5513Xpx55pnbtO/gwYPjueeei/btN/7z79q1azz88MOfeqamOu4mTXEdIZOg0qa8//77MWzYsBg/fnycfPLJsW7dupg3b16Ulpa29GipLrjggrjhhhuitLQ0Fi9eHOecc04ceOCBcfDBB2/T/ldfffXHBrhYLMaiRYvioIMO2mz5Sy+9FPvuu2+UlJRs13E/qbq6uvpIw2eZW760KUuXLo2IiKqqqigpKYkddtghjjnmmDjggAPqt1m0aFH069cvDjvssBgxYkR8+OGH9es+eku4srIyfvWrX8Upp5wSRxxxRFx++eWbbftRkydPjmOPPTZ69eoVffv2jaeeemqLYz744IPRq1ev+j8HH3xwDB48OCIiVqxYEZdcckkcddRRUVlZGffff3+jn+e+++5b/yShUChEoVCIN998czuu2Nb94x//iCFDhsTjjz9ev2zevHlx7rnnxuLFiz/18V988cUYMGBA9OrVK374wx/GiBEj6m/ZVlZWxuTJk6Nfv37Rs2fPqKur2+J2/cKFC+P000+PXr16bfHfEVqCoNKm7LnnnlFSUhJjxoyJxx57LN59990ttnnooYfirrvuikcffTRefvnl+P3vf7/V402fPj3uvvvu+NOf/hRLly6NO+64Y4ttlixZElOmTInf/e53MX/+/Lj77rujoqJii+1OOeWUmD9/fsyfPz/mzJkTPXr0iFNPPTU2bNgQF154Yey///7x+OOPx3333Rf33XdfzJkzp9HPdfz48XHooYfGySefHF26dInevXtvwxXa6Oabb44jjzwyBg4cuNX3JXv06BG33357/PjHP46nn346nn/++Rg+fHj89Kc/jf3222+7jxsRUVtbG8OHD4/TTz895s6dG1VVVTFr1qzNtpk5c2ZMnjw55s2bt8Ur1Nra2rj44ovjtNNOi7lz58ZJJ50UjzzyyDZ//tAUBJU2pVOnTvHAAw9EoVCIq666Kr72ta/FsGHDYtWqVfXbDB48OLp16xZlZWVx/PHHx6JFi7Z6vO9+97vRvXv3KCsriwsvvLDB9/FKSkqitrY2Fi9eHOvWrYvdd989vvCFL2z1mBs2bIhLL700vvrVr8bAgQPjhRdeiHfeeSeGDx8epaWl0aNHj/jOd74TDz74YKOf6/jx4+Nvf/tbTJkyJU444YRtvq09atSomDVrVsyZMyfOOuusGDZs2FZf3R5xxBExceLE+NGPfhQXXHBBXHfddXHcccd96uMuWLAg6urq4pxzzokOHTrEiSeeGF/+8pc322bw4MHRvXv32GGHHRrcf926dXHuuedGhw4d4qSTTtpif2hugkqbs/fee8eNN94Yjz/+eEyfPj1WrlwZN9xwQ/36Ll261H+84447xgcffLDVY3Xv3r3+4/Ly8li5cuUW23zxi1+MsWPHxu233x5HH310jBw5MlasWLHVY95yyy2xdu3auPLKKyMiorq6OlauXBmHH354/Z8777xzsycBW1NSUhKHH354LF++PKZOnfqx20dEHHroodGpU6coLS2N008/Pb7yla/EY489ttXty8vLo6SkJIrFYoOvvLfnuCtXroxu3bpFoVCoX/bRa93Q3z9u//Ly8q1uD81BUGnT9t577zjjjDPi1Vdf3a79ly1bVv9xTU1NdO3atcHt+vXrF1OnTo0///nPUSgUYuLEiQ1uN3PmzJg5c2bcdttt0aFDh4jYGI7dd9895s2bV/9n/vz58etf/3qb51y/fv12v4daKBRia/9b5DfffDO+//3vx6hRo+Kaa66JoUOHbvO1bOy4Xbp0iRUrVmy2/qPXetP+W9PQ/jU1Nds0FzQVQaVNWbx4cdxzzz2xfPnyiNj4ID1jxow49NBDt+t4DzzwQCxfvjzWrFlT/w1K/23JkiXx1FNPRW1tbZSWlsbnPve5Br8DduHChXHdddfFpEmTonPnzvXLDznkkOjUqVNMnjw5/vOf/8T69evjlVdeieeff77Bmd5+++2YOXNmrF27NtavXx9z5syJmTNnxlFHHRURG38e87LLLmtw3/feey/mzJkTH374YdTV1cW0adNi3rx5ccwxx2yx7YoVK+J73/teDBs2LM4444zo27dvjB49OoYMGRJvvfXWdh83IqJnz55RUlISv/nNb6Kuri5mzZoVL7zwQoPbbm3/9u3bx/333x91dXXxyCOPfKL9oSn4XnTalE6dOsWCBQvi3nvvjX/961+x0047xfHHHx+jR4/eruNVVVXFkCFDYuXKldGnT5+48MILt9imtrY2br755li8eHF06NAhevXqFddee+0W2z366KPx3nvvxaBBg+qXHXbYYXHXXXfFL3/5y5gwYUL06dMnamtrY88994wRI0Y0OFOhUIipU6fGuHHjYsOGDVFRURFjx46Nb37zmxGx8UnEqaee2uC+dXV1ceutt8aSJUvqf0Z30qRJsddee22x7a677hpjxoyJvn371i/r379/dOzYcbMnBJ/0uBERpaWlcfvtt8eVV14ZP/vZz+LYY4+Nb3zjG9v8PvCm/a+66qq49dZbo3fv3nHCCSds077QVArFrd2Tgf9xlZWVcf3118fRRx/d0qNss9ra2jjttNNi2rRp9beUW4szzzwzBg4cGN/61rdaehTYLm75QhtSWloaDz30UKuI6dy5c+Of//xn1NXVxR/+8Id4+eWX49hjj23psWC7ueULtIilS5fGiBEj4oMPPogePXrEbbfdttVv+oLWwC1fAEjgli8AJGjWW76N/VA4ALQG1dXVDS5v9vdQa2oaHoTtV16+8YmKa5tv07Wt9ksD0lX8/2828nWbz2NC09l0bRvili8AJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQAStN+WjVavXh3Lly+PiIjddtstdt111yYdCgBam0aD+uabb8ZVV10VCxcujK5du0ZExMqVK+Oggw6Ka665JvbYY4/mmBEAPvMaDero0aNj0KBBce+990a7dhvvDm/YsCGmT58eY8aMid/+9rfNMiQAfNY1+h7qmjVron///vUxjYho165dnHbaafHuu+82+XAA0Fo0GtSysrKYMWNGFIvF+mXFYjGmTZsWO++8c5MPBwCtRaO3fG+88cYYN25cXHvttdGtW7eIiFixYkUccMABceONNzbLgADQGjQa1D322CPuu+++eOedd2LZsmUREdG9e/fo3LlzswwHAK3FNv3YTOfOnUUUABrhFzsAQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIUisVisblOVlFR0VynAoAmUV1d3eByr1ABIEH75j5hdU1Nc5+yzasoL4+IiJqahp81sf3KyzfeVXFt8226th4T8nlMaDqbvm4b4hUqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIsN1B7devX+YcANCqtW9s5WuvvbbVdatXr04fBgBaq0aDWlVVFRUVFVEsFrdYt2bNmqaaCQBanUaDWlFREQ888EB069Zti3W9e/dusqEAoLVp9D3UE088Maqrqxtcd8IJJzTJQADQGjX6CnXMmDFbXXfllVemDwMArZUfmwGABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJCgUi8Vic52soqKiuU4FAE2iurq6weVeoQJAgvbNfcKamobLzvYrL9/4yr+6pqaFJ2l7KsrLI8LXbVPY9HXr2ubzmNB0Nj0mNMQrVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABI0GhQV69eHVdccUUMGTIkpkyZstm6Sy65pEkHA4DWpNGgjhs3LnbZZZcYOHBgzJo1K4YPHx51dXUREfHWW281y4AA0Bo0GtQ33ngjRo8eHSeeeGLcc8890aVLl7jgggviww8/bK75AKBVaDSotbW19R8XCoUYN25c7LfffjF06FBRBYCPaDSoPXr0iGeffXazZWPGjImePXvG66+/3pRzAUCr0r6xlTfddFMUCoUtlo8cOTL69evXZEMBQGvTaFDLysq2um6fffbJngUAWi0/hwoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASFAoFovF5jpZRUVFc50KAJpEdXV1g8u9QgWABO2b+4Q1NQ2Xne1XXr7xlb9rm2/Tta2uqWnhSdqeivLyiPB12xQ8JjSdTde2IV6hAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIMEnDuq7777bFHMAQKvWaFBfeumlOOOMM+Lb3/52LF68OIYOHRrHHXdc9O7dOxYtWtRcMwLAZ16jQb3++uvj4osvjrPPPjvOO++8qKqqigULFsS4ceNiwoQJzTUjAHzmNRrUtWvXRp8+fWLAgAEREdG/f/+IiKisrIw1a9Y09WwA0Go0GtRisVj/8de//vXN1m3YsKFpJgKAVqjRoFZUVMT7778fERtv/26yfPny2HHHHZt2MgBoRdo3tnLSpEkNLt95553jjjvuaJKBAKA1ajSoW9OxY8fo2LFj9iwA0Gr5xQ4AkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASFYrFYbK6TVVRUNNepAKBJVFdXN7jcK1QASNC+uU9YXVPT3Kds8yrKyyMioqam4WdNbL/y8o13VVzbfJuurceEfB4Tms6mr9uGeIUKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABJ84qE8++WRTzAEArVr7xla+9tprWyy7/PLL45577olisRj77LNPkw0GAK1Jo0GtqqqK8vLyzZatWrUqzj///CgUCvHoo4826XAA0Fo0GtThw4fHggULYvz48VFRUREREZWVlTF79uxmGQ4AWotG30MdPnx4jBw5Mi699NKYOnVqREQUCoVmGQwAWpOP/aakgw46KO6///6orq6Oc889N9atW9cccwFAq9LoLd9NSktLY9SoUfHcc8/F3Llzm3omAGh1timom/Ts2TN69uzZRKMAQOvlFzsAQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIUisVisblOVlFR0VynAoAmUV1d3eDyZg0qALRVbvkCQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEgvpfli5dGmeddVb07ds3zjrrrHj99ddbeqQ2Y8KECVFZWRn7779/vPLKKy09TpuxevXqOP/886Nv377Rr1+/GD58eLzzzjstPVabcdFFF0X//v1jwIABMWjQoFi0aFFLj9Tm/OIXv2gTjwuC+l/GjRsXgwYNiocffjgGDRoUV199dUuP1Gb06dMnpkyZ4n+SkKxQKMR5550XDz/8cEyfPj169OgREydObOmx2owJEybEtGnT4o9//GMMGTIkxo4d29IjtSkvvvhiPPfcc1FeXt7So3xqgvoRb7/9dixcuDCqqqoiIqKqqioWLlzo2X6Sww8/PLp3797SY7Q5ZWVlceSRR9b/vWfPnlFTU9OCE7UtO+20U/3H77//fhQKhRacpm2pra2Na6+9NsaNG9cmrmv7lh7gs2TZsmXRrVu3KCkpiYiIkpKS6Nq1ayxbtiw6d+7cwtPBx9uwYUNMnTo1KisrW3qUNuWKK66Iv/71r1EsFuOuu+5q6XHajJ///OfRv3//6NGjR0uPksIrVGhDrrvuuujYsWOcffbZLT1Km/KTn/wk/vKXv8TIkSPjpptuaulx2oT58+fHCy+8EIMGDWrpUdII6kd07949VqxYEevXr4+IiPXr18fKlSvdpqRVmDBhQrzxxhtx6623Rrt2/mk3hQEDBsQzzzwTq1evbulRWr1nn302lixZEn369InKyspYvnx5/OAHP4gnnniipUfbbv7VfcTnP//5OPDAA2PGjBkRETFjxow48MAD3e7lM++WW26Jv//97zFp0qQoLS1t6XHajLVr18ayZcvq/z579uzYZZddoqysrOWGaiOGDh0aTzzxRMyePTtmz54du+22W9x9991xzDHHtPRo261QLBaLLT3EZ8nixYvjsssui/feey923nnnmDBhQuy1114tPVabcP3118cjjzwSq1atil133TXKyspi5syZLT1Wq/fqq69GVVVV7LHHHrHDDjtERMTuu+8ekyZNauHJWr9Vq1bFRRddFP/+97+jXbt2scsuu8SYMWPiS1/6UkuP1uZUVlbGnXfeGfvtt19Lj7LdBBUAErjlCwAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAgv8DO+yHLcrD9E4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(search_grid)\n",
"ax.set_title(r\"Ship size 3, $5 \\times 5$ grid\");"
]
},
{
"cell_type": "markdown",
"id": "c5ab020f",
"metadata": {},
"source": [
"We can tell that these search grids are optimal because each cell highlighted in red is one cell less than the ship shize away from any other hightlighted cell.\n",
"\n",
"Once a hit has been found by searching these cells, we have to determine if the ship is oriented along the row or column passing through that cell. For hits near a boundary (in cells less than a ship's length away from either the top/bottom or left/right edge) we only have to test one cell to decide which way the ship is oriented. For hits at the interior we have to, in general, test two adjacent cells (either left and right or above and below) to determine the orientation of the ship.\n",
"\n",
"The following plot highlights the cells that only require one test guess to determine the row/column orientation following a hit for the 10/10/3 configuration."
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "66967a5c",
"metadata": {},
"outputs": [],
"source": [
"near_edge = np.zeros((10, 10))\n",
"i, j = np.indices((10, 10))\n",
"near_edge[(i < 2) | (7 < i) | (j < 2) | (7 < j)] = 1"
]
},
{
"cell_type": "code",
"execution_count": 99,
"id": "ccdc4c30",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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22s7duzomkUAUEI1g1qpVGLz5s0RsfPx7/tWrVoV++67b9cuA4ASaan14ty5czu93qdPn7jjjju6ZBAAlFHNoO5Or169olevXtlbAKC0/GIHAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASNBVFUdTrsEqlUq+jAKBLVKvVTq+7QwWABC31PrDa3l7vI/dYpa0tIsqxNWLX3vb2zr9r6k7a2nY+pSjD1ohy7S3T1ohy7S3T1ohde8vwHlbW99vOuEMFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJ9jiof/jDH7piBwCUWkutF1966aUPXLvmmmvinnvuiaIo4tBDD+2yYQBQJjWDOmbMmGhra/u3a2vXro2vfe1r0dTUFL///e+7dBwAlEXNoF522WXxwgsvxA033BCVSiUiIkaNGhULFiyoyzgAKIuan6FedtllMXHixLjyyitj3rx5ERHR1NRUl2EAUCb/8T9KOuqoo+JnP/tZVKvV+MpXvhLvvfdePXYBQKnUfOT7vp49e8ZVV10Vzz//fDz99NNdvQkASudDBfV9w4cPj+HDh3fRFAAoL7/YAQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABE1FURT1OqxSqdTrKADoEtVqtdPr7lABIEFLvQ+strfX+8g9Vmlri4hybI3Ytbe9vfPvmrqTtradTynKsDWiXHvLtDWiXHvLtDVi194yvIeV9f22M+5QASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAgppBXbRoUcfXmzZtim9+85tx+umnx4QJE2Lt2rVdPg4AyqJmUL/zne90fD179uzo3bt33HHHHXHwwQfHzJkzu3wcAJRFS60Xi6Lo+PqZZ56JX/3qV7HXXnvFYYcdFmPHju3ycQBQFjWDunXr1li2bFkURRFNTU2x1157dbzW3OzjVwB4X82gvvPOOzF+/PiOO9XVq1fHoEGDYvPmzYIKAP+iZlAX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H/3oR42es1tz5syJcePG1efxU5KrrroqiqKIY489NiZNmhR9+vRp9KROrVixIlpbW+P222+Pp556Knr37h1XXHFFHHfccY2eVtOCBQti0KBB8bGPfazRU3arqakpbrvttrjkkkuiV69esWXLlrj77rsbPatTw4YNi7Vr18af//znOOaYY2L+/PkREXVpQ/f79oJuZcaMGdGrV684//zzGz2lpptuuimeeOKJmDhxYnz7299u9JxOPffcc/GXv/wlzjvvvEZP+dDuvffeePDBB+O+++6Loihi+vTpjZ60W9u2bYsVK1bEUUcdFffff39cddVVMWHChNi8eXOjp9V03333dfu7023btsXdd98dd9xxRzz++ONx5513xsSJE2PLli2NnvYB++23X8yePTtuueWWOPvss+ONN96IPn36REtL198/ljaoBx54YKxevTq2b98eERHbt2+P119/vTSPVctg1qxZ8corr8Rtt93WLR/tdOass86Kp556KtatW9foKR+wePHiePnll+O0006LUaNGxapVq+Kiiy6KhQsXNnrabr3/v6eePXvGeeedF88++2yDF+1eW1tbtLS0dHwM9IlPfCL69esXy5cvb/Cy3Vu9enUsXrw4xo4d2+gpNS1dujRef/31OPbYYyMi4thjj4199903li1b1uBlnfvUpz4V8+bNi/vvvz/OP//8eOedd+ryVKgc75Kd2H///ePII4+Mhx56KCIiHnrooTjyyCM97k0ye/bsWLJkScydOzd69uzZ6Dm7tWXLlli5cmXHnxcsWBB9+/aN1tbWxo3ajfHjx8fChQtjwYIFsWDBghg8eHD8+Mc/jpNOOqnR0zr11ltvdXxmVhRFPPzww936v57u379/nHDCCbFo0aKI2PlTAG+88UYcdNBBDV62e7/+9a9j5MiR0a9fv0ZPqWnw4MGxatWqePnllyMiYtmyZbF27dr4r//6rwYv69yaNWsiYudHVt/97nfjnHPOiV69enX5uU1FURRdfkoXWbZsWVx99dWxcePG6NOnT8yaNSsOPvjgRs/q1MyZM+PRRx+NtWvXRr9+/aK1tTV+85vfNHpWp/7xj3/EmDFjYujQobHPPvtERMRHP/rRmDt3boOXfdDatWvjkksuibfffjuam5ujb9++MWXKlG79edT7Ro0aFXfddVe3/bGZFStWxIQJE2L79u2xY8eOOOSQQ+K6666LgQMHNnrabq1YsSKmTp0a69evj5aWlvjGN74RI0eObPSs3frMZz4T1157bZx88smNnvIfPfjgg/HDH/6w4z/4uvzyy+P0009v8KrOXXvttfHss8/Ge++9FyeeeGJMnTq140e/ulKpgwoA3UVpH/kCQHciqACQQFABIIGgAkACQQWABIIKAAkEFQAS/D9kk7Jh0y4tYAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(near_edge);"
]
},
{
"cell_type": "markdown",
"id": "3dc239fe",
"metadata": {},
"source": [
"The strategy outlined here is implemented below."
]
},
{
"cell_type": "code",
"execution_count": 100,
"id": "d19a01c4",
"metadata": {},
"outputs": [],
"source": [
"class SingleGridStrategy(Strategy):\n",
" def __init__(self, ship_size):\n",
" self._ship_size = ship_size\n",
"\n",
" def next_guess(self, revealed):\n",
" if revealed.mask.all() or revealed.sum() == 0:\n",
" next_unmasked = (revealed.mask\n",
" [search_i, search_j]\n",
" .argmax())\n",
"\n",
" return search_i[next_unmasked], search_j[next_unmasked]\n",
" else:\n",
" grid_length, _ = revealed.shape\n",
" hit_i, hit_j = argmax_2d(revealed)\n",
" ship_size = self._ship_size\n",
" \n",
" if revealed.sum() == 1: \n",
" if hit_i < ship_size - 1 or grid_length - ship_size < hit_i:\n",
" next_i = hit_i + (1 if hit_i < ship_size - 1 else -1)\n",
" \n",
" if revealed.mask[next_i, hit_j]:\n",
" return next_i, hit_j\n",
" else:\n",
" is_row = revealed[next_i, hit_j] == 0\n",
" elif hit_j < ship_size - 1 or grid_length - ship_size < hit_j:\n",
" next_j = hit_j + (1 if hit_j < ship_size - 1 else -1)\n",
" \n",
" if revealed.mask[hit_i, next_j]:\n",
" return hit_i, next_j\n",
" else:\n",
" is_row = revealed[hit_i, next_j] == 1\n",
" elif revealed.mask[hit_i, hit_j - 1]:\n",
" return hit_i, hit_j - 1\n",
" elif revealed.mask[hit_i, hit_j + 1]:\n",
" return hit_i, hit_j + 1\n",
" else:\n",
" is_row = False\n",
" else: \n",
" is_row = revealed[hit_i].sum() > 1\n",
" \n",
" if is_row:\n",
" return hit_i, next_guess_1d_with_hit(revealed[hit_i])\n",
" else:\n",
" return next_guess_1d_with_hit(revealed[:, hit_j]), hit_j"
]
},
{
"cell_type": "markdown",
"id": "67421354",
"metadata": {},
"source": [
"This strategy involves quite a bit of branching logic and more than a few magic numbers. While I do not doubt that this implementation can be simplified, avoiding complex branching logic is one of the motivations for a simulation-based Bayesian approach to Battleship.\n",
"\n",
"To understand the distribution of turns required by this strategy to sink the ship, we define a function that generates all square grids of a given shape with a single ship of a given size."
]
},
{
"cell_type": "code",
"execution_count": 101,
"id": "01e27b90",
"metadata": {},
"outputs": [],
"source": [
"def get_all_ships(grid_length, ship_size):\n",
" rows = get_all_ship_rows(grid_length, ship_size)\n",
" n_rows, _ = rows.shape\n",
" \n",
" i = np.arange(grid_length)\n",
"\n",
" boards = np.zeros((\n",
" n_rows, grid_length,\n",
" grid_length, grid_length,\n",
" ))\n",
" boards[:, i, i, :] = rows[:, np.newaxis]\n",
" long_boards = boards.reshape((-1, grid_length, grid_length))\n",
" \n",
" return np.concatenate((\n",
" long_boards,\n",
" long_boards.transpose(0, 2, 1)\n",
" ))"
]
},
{
"cell_type": "markdown",
"id": "497ffe4e",
"metadata": {},
"source": [
"We generate all possible boards for the 5/5/3 configuration and visualize a few of them."
]
},
{
"cell_type": "code",
"execution_count": 102,
"id": "e7e94cc5",
"metadata": {},
"outputs": [],
"source": [
"all_ships_5_5_3 = get_all_ships(5, 3)"
]
},
{
"cell_type": "code",
"execution_count": 103,
"id": "128eb200",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiUAAAI1CAYAAAAJu4pwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgMklEQVR4nO3df4zU9Z348dcCUsGISKvATlGshJ+nt3ha03CKBX/cGUBqe1ePwHFRwTvEP9DK1qJZ9ayy1PP8hWmsYrWtVpP2TNXkWpWYnlWRxmrsQb1iT/R2AUtZJHBVUD7fPwh73S8ywMrMvNh5PBISdj47+359Zum7z/nM7NpQFEURAAA11qvWAwAARIgSACAJUQIApCBKAIAURAkAkIIoAQBSECXQg82aNSsWLVpU6zG6+PGPfxxjx46t9RhAQqIEDqKvf/3rMWrUqD3+PPXUU7UerUe76667PvZxX7t27R6f+6Mf/Si+9KUvfaL7Pf7443HhhRfGaaedFieffHL89V//dSxbtiz82if4ZPrUegDoaU499dS4/fbbu9w2YMCAiq65ffv26Nu3b0XXOFDVnqlUKsWjjz7a5bZBgwbt8XlPP/10nH322Z/ofp/+9Kdj3rx5ccIJJ0Tfvn3jl7/8Zdxwww3Ru3fvmD179sE4HahLrpTAQXbYYYfFMccc0+XPpz71qYiI+N3vfhdz586N8ePHx/jx4+Mf//Efuzwr/7iXNtavXx+jRo2KFStWRETEihUrYtSoUfHcc8/F3/3d38VJJ50Ujz322F7n2blzZ9x6661x+umnxymnnBKLFi2K999/v/P4jh074tZbb40zzjgj/uzP/izOP//8eOKJJ7p8jQcffDAuuOCCGD9+fEyYMCEWLFgQ7777bufxvc1UFEXcfvvt8YUvfCHGjx8fCxYsiC1btuxxfldccUWcfvrpcfLJJ8fkyZPjvvvuO8BHPaJ37957PO69e/fu8jnbtm2LF154Ic4555xPdL8zzjgjzj777DjxxBNj2LBh8aUvfSkmTJgQL7/88gHPDfwfV0qgSt5///245JJL4rjjjovvfe97ERHR2toal156aTz11FMHfFVh8eLFcfXVV8fIkSPjsMMO2+vn/fSnP43zzz8/Hn744Vi7dm0sWrQo+vXrF9dee21ERNx2223x4x//OK6//voYPXp0/PSnP42rr746PvOZz8QXvvCFzq/T3Nwcw4YNi40bN0Zra2tceeWV8f3vf7/sTA899FB897vfjZaWlmhqaopnnnkm7r777i73uf766+P999+P7373u3HkkUfG//zP/8TGjRsP6LGI2BU3Z555ZkREjBw5MubNmxennHJKl8/5+c9/HkOGDImRI0d+4vvtVhRFvP766/HKK6/EP/3TPx3w3MCfKICDprm5uRgzZkzR1NTU+Wfy5MlFURTFY489Vpx88snFH/7wh87P//3vf1+cdNJJxb/9278VRVEUP/rRj4oxY8Z0+Zrr1q0rRo4cWbz00ktFURTFSy+9VIwcObLzPuXMnDmz+OIXv1h8+OGHnbf98Ic/LMaNG1ds27at+N///d9i3Lhxxfe///0u95s3b14xa9asvX7d//zP/yxGjhxZrF+/vuxMZ5xxRnHbbbd1ue2KK67oco5Tp04t7rzzzn2eSznPPfdc8dRTTxWrV68uVq5cWVx55ZXF6NGji+eff77L51155ZVFa2vrJ75fURTFli1biqampmLcuHHF6NGji7vuuusTnQNQFK6UwEF28sknR2tra+fHu18KWLNmTZx44old3q/wmc98Jk444YT47W9/26119sdJJ53U5eWIU045JXbs2BFvv/12ROx6+ea0007rcp/TTjst7r333s6PV6xYEffee2+sWbMmtmzZ0vmGzra2thg8ePDHzrR169bYsGFDjB8/vsvXPuWUU+KZZ57p/Hj27NnR0tISP//5z+Pzn/98nHXWWXvMsy8TJ07s8vGpp54aGzZsiPvvvz8mTJgQEbve4/Lcc891eWmou/eLiDjiiCPi8ccfjz/+8Y/xq1/9Km677bYYPHhw/M3f/M0BzQ78H1ECB9nhhx8exx9//Mcea2ho2OO2oig6b+/Va8+3ee3YseNjv1b//v27NV/xMT8h8nFz7b6tvb095s6dGxdccEHMmzcvjj766NiwYUP8wz/8wx6z/elMu9f5uK/9p7785S/HGWecEf/xH/8RK1asiDlz5sTZZ58dt9566wGf259qamqKp59+uvPjF198Mfr16xdNTU0H5X69evXq/D6PHj06tmzZErfffrsogU/AG12hSkaMGBFr1qyJTZs2dd62cePGeOutt2LEiBERseunPj766KMu76lYtWrVJ1r39ddfj48++qjz41dffTUOO+ywOO644+L444+P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\n",
"text/plain": [
"<Figure size 576x576 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True,\n",
" figsize=(FIG_WIDTH, FIG_WIDTH))\n",
"\n",
"plt_boards = rng.choice(all_ships_5_5_3, size=axes.size, replace=False)\n",
"\n",
"for (board, ax) in zip(plt_boards, axes.flat):\n",
" plot_board(board, ax=ax);\n",
"\n",
"fig.suptitle(\"Four boards, 5/5/3\");\n",
"fig.tight_layout();"
]
},
{
"cell_type": "markdown",
"id": "dcd3da2d",
"metadata": {},
"source": [
"We now play all 5/5/3 games using this strategy."
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "6356e0ee",
"metadata": {},
"outputs": [],
"source": [
"grid_games_5_5_3 = [\n",
" play(ship[np.newaxis], SingleGridStrategy(3))\n",
" for ship in all_ships_5_5_3\n",
"]\n",
"grid_turns_pmf_5_5_3 = Pmf.from_seq([\n",
" game.turns for game in grid_games_5_5_3\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "f4dcdd2c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_turn_dist(grid_turns_pmf_5_5_3,\n",
" color='C1', label=\"Near optimal\",\n",
" mean=True, mean_kwargs={'c': 'C1'});\n",
"plot_turn_dist(random_5_5_3_pmf,\n",
" kind='line', c='C0',\n",
" mean=True, mean_kwargs={'c': 'C0'},\n",
" label=\"Random\",\n",
" ax=ax)\n",
"\n",
"make_pct_yaxis(ax);\n",
"\n",
"ax.legend();"
]
},
{
"cell_type": "markdown",
"id": "0998095f",
"metadata": {},
"source": [
"We see that this near optimal strategy is an significant improvement over random guessing (which is expected). Intuitively, it seems odd that the distribution is bimodal. In fact, we will see after implementing Thompson sampling in the two-dimensional case, that this strategy is definitely not optimal."
]
},
{
"cell_type": "markdown",
"id": "a80b8d0d",
"metadata": {},
"source": [
"#### Bayesian (Thompson sampling)\n",
" \n",
"The generalization of one-dimensional Thompson sampling to a two-dimensional grid is much simpler than the above generalization of the one-dimensional optimal strategy. The implementation of Thompson sampling for a single ship in two dimensions is shown below."
]
},
{
"cell_type": "code",
"execution_count": 106,
"id": "a2da0000",
"metadata": {},
"outputs": [],
"source": [
"class SingleThompsonStrategy(Strategy):\n",
" def __init__(self, poss_ships):\n",
" self._poss_ships = poss_ships\n",
" \n",
" def compat_ships(self, revealed):\n",
" if revealed.mask.all():\n",
" return self._poss_ships\n",
" else:\n",
" is_compat_ = is_compat(self._poss_ships, revealed)\n",
"\n",
" return self._poss_ships[is_compat_]\n",
" \n",
" def next_guess(self, revealed):\n",
" post = np.ma.masked_array(\n",
" self.compat_ships(revealed).mean(axis=0),\n",
" mask=~revealed.mask\n",
" )\n",
" \n",
" return argmax_2d(post)"
]
},
{
"cell_type": "markdown",
"id": "10dd78a4",
"metadata": {},
"source": [
"We now play all 5/5/3 games with this strategy to understand its turn distribution."
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "d4286979",
"metadata": {},
"outputs": [],
"source": [
"ts_games_5_5_3 = [\n",
" play(ship[np.newaxis], SingleThompsonStrategy(all_ships_5_5_3))\n",
" for ship in all_ships_5_5_3\n",
"]\n",
"ts_turns_pmf_5_5_3 = Pmf.from_seq([\n",
" game.turns for game in ts_games_5_5_3\n",
"])"
]
},
{
"cell_type": "markdown",
"id": "da9690f4",
"metadata": {},
"source": [
"As alluded to above, we see that the turn distribution for Thompson sampling is concentrated to the left of the turn distribution for our near optimal strategy."
]
},
{
"cell_type": "code",
"execution_count": 108,
"id": "40659fbe",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_turn_dist(grid_turns_pmf_5_5_3,\n",
" color='C1', label=\"Near optimal\",\n",
" mean=True, mean_kwargs={'c': 'C1'});\n",
"plot_turn_dist(random_5_5_3_pmf,\n",
" kind='line', c='C0',\n",
" mean=True, mean_kwargs={'c': 'C0'},\n",
" label=\"Random\",\n",
" ax=ax)\n",
"plot_turn_dist(ts_turns_pmf_5_5_3,\n",
" color='C2', label=\"Thompson sampling\",\n",
" mean=True, mean_kwargs={'c': 'C2'},\n",
" ax=ax);\n",
"\n",
"make_pct_yaxis(ax);\n",
"\n",
"ax.legend(loc='upper right');"
]
},
{
"cell_type": "markdown",
"id": "806333d8",
"metadata": {},
"source": [
"Note that while the turn distribution for Thompson sampling is concentrated further to the left, the expected numbers of turns for Thompson sampling and our near optimal strategy, indicated by the dashed vertical lines, are quite close.\n",
"\n",
"No doubt we could improve the logic of our near optimal strategy to match (or perhaps even beat) Thompson sampling, but the generalization of Thompson sampling to the two-dimensional grid is so much more elegant that it seems hardly worthwhile."
]
},
{
"cell_type": "markdown",
"id": "94dd2e43",
"metadata": {},
"source": [
"### Standard battleship\n",
"\n",
"Now that we understand these approaches to simplified versions of Battleship, we are ready to tackle the Thompson sampling approach to standard Battleship.\n",
"\n",
"#### Random\n",
"\n",
"From above we recall the turn distribution for random guessing at standard Battleship."
]
},
{
"cell_type": "code",
"execution_count": 109,
"id": "3404bf01",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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3bsHT09PfP311wgICMCIESMQGxuL+t81d+7cwbx58zB8+HCMHDkSr732mj5ui6hbYNcDERmEvXv34pNPPoGHh4cmITh58iQSEhJQXl6OGTNmYMKECXjyySfx0UcfYfTo0fjiiy9QU1ODpKQkPUdP1HWxRYGIDMLTTz+N/v37w8TEBFKpFAAQGRmJXr16wcXFBSNHjsS1a9cAACYmJsjKykJeXh7MzMwgk8n0GTpRl8ZEgYgMQlPb4jo4OGge9+jRAxUVFQCAv/71rxAEAbNmzcK0adOQkJCgsziJuht2PRBRp+vRoweqqqo0zwsKChqVqd+hsDUcHBywdu1aAMCFCxcwf/58jBgxAv369et4sETUAFsUiKjTeXl54fz588jKykJZWRm2b9/eofq+//575OTkAACsra0hEok4S4Kok7BFgYg63ejRozF16lQEBwfD1tYWkZGROH78eLvrS0pKwvr161FeXg57e3usXr0abm5uWoyYiOpxHQUiIiJqFtvqiIiIqFlMFIiIiKhZTBSIiIioWUwUiIiIqFlMFIiIiKhZTBSIiIioWUwUiIiIqFlMFIiIiKhZTBSIiIioWf8fbxzSCJeZYo4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"execution_count": 109,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"std_turn_ax.figure"
]
},
{
"cell_type": "markdown",
"id": "188e6f86",
"metadata": {},
"source": [
"#### Optimistic expected values\n",
"\n",
"Generalizing the optimal one-dimensional strategy to two dimensions was sufficiently difficult that we do not attempt to define even a near optimal strategy for standard Battleship. Configurations where several ships are adjacent, such as the one shown below, will certainly lead to complex and bug-prone branching logic."
]
},
{
"cell_type": "code",
"execution_count": 110,
"id": "e8f7a22b",
"metadata": {},
"outputs": [],
"source": [
"ships = np.zeros((n_ships, GRID_LENGTH, GRID_LENGTH))\n",
"ships[0, 0, :5] = 1\n",
"ships[1, 1, :4] = 1\n",
"ships[2, 2, :3] = 1\n",
"ships[3, 3, :3] = 1\n",
"ships[4, 4, :2] = 1"
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "3a857675",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Vnnc8rqfMWOGKSwsNEVFRWbFihUmMzPTfPPNN+bUqVNm8uTJZvr06cYYY9atW2duvvlmb/zu3btNamqqKS4uNoWFhebGG280//znP01JSYnZtWuXSU1NNXv27DHGnHvvJCUlmW3btpmysjJz5syZejt/sOPkyZMmNTXVzJw502zatMmcOHHCu23RokXm3nvv9X7943vu2LFjTUZGhvnvf/9rCgsLzZQpU7z7l+87e/Zsc+bMGbN582bTvn17M2nSJPPdd9+Zw4cPm7S0NLNlyxZjjDH79+83H3zwgSkuLjZHjx41Y8aMMfPnz/fm7tmzpxkyZIhxu93eOcOP77u+7tHVzUkQ/CrWgtvtNgMGDDALFy40x44dM2+++aY5ffq0OXnypJk6daqZNGmSN27s2LFm+fLllY714znvRx99ZFJTU82uXbtMcXGxmTt3rhkzZkyl/ffv31/luC70Hvnqq69Mhw4dzAcffGA8Ho9ZunSpyczMNMXFxcYYY9avX28OHz5sysrKzLp160yHDh1MQUGBMabquU6wCruVshMnTqhZs2aKjo6ucnv79u3VsWNHRUdHq1WrVsrKytLWrVsr7TNhwgQ1bdpUjRo1kiRFRkZq2rRpio2N9b5WbufOnTp27Jj3IxBXXnmlbrnllkpPYDt27KjMzExFRkaeF4/wM3nyZCUnJ6tTp0768MMPdeedd0qSOnfurDZt2igyMlLXXnutBg4cqE8//dTvPMuXL1dWVpY6dOigqKgoDRs2TDExMdqxY4eioqLk8Xi0b98+lZSUqFWrVvr5z3/uje3UqZO6d++uqKgoDR069IKrX+3atVO/fv0UExOj8ePHy+Px6LPPPvN73AheLVq00Pfff68VK1bo/vvvV9OmTRUfH6+JEydq3bp1kqTo6Gj973//k9vtVkxMjJKTkxUREXHB406dOlWNGzdWo0aN9MYbb+j222/XlVdeqSZNmuiee+7R+vXrVVpaqszMTB04cED79++XJL322mvq37+/YmNjtWnTJjkcDo0YMULR0dFq166d+vbtW+n3g3v37q1OnTopMjJScXFx9XaeYEd8fLxefvllRUREaPbs2UpPT1d2dra+++67GsUPHTpUrVu3VuPGjXX33XfrzTffrPQx18mTJysuLk4ZGRlq3LixBg0apObNmyshIUHJycn6/PPPJUlXXXWVunbtqtjYWF1++eUaP378efOQcePGqWXLlj7nDL7u0TWZkyD4lc8jxowZo5SUFGVnZ6tZs2bq27evLrnkEsXHx2vSpEnn1VVVKs5533jjDY0YMULt2rVTbGys7rnnHu3YsUPffvttjcbl6z2yfv16de/eXV27dlVMTIzuvPNOnTlzRtu3b5ck9e/fXwkJCYqMjNSAAQN01VVXBcXvetZW1Z1JCGvatKmOHz+u0tLSKhuzr7/+WgsWLNCuXbtUVFSksrIytWvXrtI+LVu2rPR1s2bNfP6AdrlcOnLkSKUl1bKyskpf/+xnPwvkW0KIeeqpp9SlSxeVlZXp3Xff1bhx47Ru3Tq53W7l5uZq7969KikpkcfjUb9+/fzO43a7tWbNGv3973/3vlZSUqIjR44oNTVV999/v/Ly8vTll18qIyNDOTk5SkhIkCRdccUV3phGjRqpuLjY53uqYn1HRkYqISFBR44c8XvcCF4FBQUqKytTUVGRhg8f7n3dGOP9IyB33nmnnnzySd1xxx2SpKysLE2YMOGCx61YY0eOHJHD4fB+7XA4VFpaqqNHjyohIUH9+vXT66+/rilTpmjt2rVatGiRpHP36vz8/PPu1UOGDPF+/eN7P0LP1VdfrQULFkg699GoGTNm6KGHHtIvfvGLamMr1kdiYqJKSkp0/Phx72vNmzf3/jsuLu68r0+fPi1JOnr0qObPn69t27apsLBQxhhddtllPnNVxdc9uiZzEgS/8nlERUVFRXr44Ye1efNmff/995KkwsJClZWVKSoqyuexKtbakSNHKs2JmzRpoqZNm6qgoECtWrWqdly+3iNHjhxRYmKid1tkZKRatmzp/WjkmjVrtGzZMrlcLknS6dOnK723QkXYNWVOp1NxcXHasGFDlRPaP/zhD2rbtq0ee+wxxcfH64UXXjjvLyn++KnthZ7itmzZUq1atdLbb7/tc5/qngIjPEVFRalPnz6aM2eO/v3vfys3N1djx47Vs88+q7i4OP3xj3/03pSqqqHq6qply5bKzs7WpEmTqtw+ePBgDR48WKdOndKcOXOUm5urRx99tNbfR/ln1iXp7NmzKigoUIsWLWp9HAS3/Px8FRQUKDMzU88884zWrVvnbfIrio+PV05OjnJycrR3717deuutuv7665Wenu7z2BVrvUWLFt4f3NK5hw/R0dHeCfCwYcM0c+ZMderUSZdccomcTqekc++HlJQULVu2rK6+ZQS5q6++WsOHD9err76qtm3ben/vUVKVq2cV/1LuoUOHFBMTo2bNmtXoL+hW9NhjjykiIkKvv/66mjVrpg0bNlT6nTPJ/3lDTeYkCE3PP/+8vv76ay1fvlw//elPtXv3bt10000yxlww7kL319OnT+vEiRNV3sur4us90qJFC+3Zs8e7zRijQ4cOKSEhQS6XSw888IBeeOEFOZ1O7+pvVeMLdmH38cVLL71U06ZN09y5c7VhwwYVFRWppKRE7733nh555BEVFhaqSZMmatKkifbt26dXXnkloHw33HCD4uPjtXTpUp05c0ZlZWXas2dPSC67om4ZY7Rhwwb98MMPuvrqq1VYWKif/OQniouLU35+vtauXevd9/LLL1dkZKQOHjzofa158+YqKCio9IdqKho5cqT+8Y9/6LPPPpMxRqdPn9amTZt06tQpffXVV/r444/l8XgUGxuruLi4Cz5Ju5D//Oc/evvtt1VaWqoXX3xRsbGx6tChg1/HQvA5deqUNm7cqHvuuUdDhgzRtddeq5EjR+qhhx7S0aNHJZ1bQdu8ebOkc3985sCBAzLGKD4+XlFRUYqMPPej6oorrqhU41UZNGiQXnzxRR08eFCFhYVauHCh+vfv713FdTqdioyM1IIFCyqtgvXo0UP79+/XmjVrVFJSopKSEuXn51f6ZXOEtn379un555/3Pkg6dOiQ1q5dqw4dOui6667T1q1b5Xa7dfLkSf3lL385L/7111/Xl19+qaKiIv35z39W3759/bpvFhYWqnHjxrrssstUUFCgZ599NuDvrRxzkvBVWFiouLg4XXbZZTpx4oSefPLJSttrcn8dPHiwVq1apd27d8vj8ejxxx/XDTfcUKNVMsn3e6R///5677339PHHH6ukpETPP/+8YmNj5XQ6VVRUpIiICF1++eWSpJUrV2rv3r3eY1Y31wkmYdeUSdL48eOVk5Ojp59+Wunp6erRo4deeuklZWZmatasWVq7dq2SkpI0e/ZsDRgwIKBcUVFRWrx4sb744gv17t1baWlpeuCBB3Tq1Kk6+m4Qasr/ulxSUpKeeOIJLViwQL/61a/04IMPatGiRXI6nXrqqafUv39/b8wll1yi7OxsjR49WsnJydqxY4fS0tJ0zTXXKCMjo8r/v+b666/XvHnzNHfu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\n",
"text/plain": [
"<Figure size 900x180 with 5 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(ncols=n_ships, sharex=True, sharey=True,\n",
" figsize=(n_ships * 2.5, 2.5))\n",
"\n",
"for (ship, name, ax) in zip(ships, SHIP_NAMES, axes):\n",
" plot_board(ship, ax=ax);\n",
" \n",
" ax.set_xticklabels([]);\n",
" ax.set_yticklabels([]);\n",
" ax.set_title(name);\n",
" \n",
"fig.tight_layout();"
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "361dbdce",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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APgXdYPa0dFR83qvXr3ie9/7XrcMAoAy+m/dZu65554xbNiw7C0AUFqe2wJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkKClKIqiUYdVKpVGHQUA3aJarda87g4VABK0NfrAzs7aZe9J2tt33kmXYWtEufaWaWtEufaWaWtEufaWaWtEufaWaWvEe3trcYcKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASfKigbt26Nf7617/Gli1bumsPAJRS3aB+61vfildeeSUiIp544okYO3ZsTJ06NcaOHRuLFy9uyEAAKIO2ei8+/fTTMXDgwIiImD9/ftx2221x5JFHxsqVK+Pyyy+P448/viEjAaCnq3uH+tZbb3V9vHXr1jjyyCMjImLEiBHxzjvvdO8yACiRukH95Cc/GTfeeGO88cYbMWrUqLj//vsjImLJkiXRv3//RuwDgFKoG9Tp06fHtm3b4oQTToiHHnooLrvssjjiiCPijjvuiOuvv75RGwGgx6v7Hmrv3r3jqquuissuuyxWr14d27dvj/b29hgwYECj9gFAKdQN6rv69OkThx56aHdvAYDS8osdACCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABI0FIURdGowyqVSqOOAoBuUa1Wa153hwoACdoafWBnZ+2y9yTt7TvvpMuwNaJce8u0NaJce8u0NaJce8u0NaJce8u0NeK9vbW4QwWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAnqBnXUqFExZ86cWL58eaP2AEAp1Q3qXnvtFa2trXHeeefF5z//+fj5z38er776aqO2AUBp1A1qv379Yvr06fHoo4/GBRdcEI8++miceOKJMXny5FiyZEmjNgJAj/eB3kPdbbfd4rTTTosf/OAH8cADD8QhhxwSs2fP7u5tAFAadYNaFMX7rg0ePDi+/vWvx29/+9tuGwUAZVM3qAsWLGjUDgAotbpBrVQqjdoBAKXm51ABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEjQUhRF0ajD/P9VASi7arVa87o7VABI0NboAzs7a5e9J2lv33knXYatEeXaW6atEeXaW6atEeXaW6atEeXaW6atEe/trcUdKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASPChgvrGG2/EsmXL4rXXXuuuPQBQSnWD+tBDD8VRRx0Vp512WjzzzDPx2c9+NqZOnRpjx46Njo6ORm0EgB6vrd6LN998cyxcuDBee+21mDhxYtx6661x1FFHxYoVK+Lyyy+PMWPGNGonAPRodYPa0tIShxxySERE7LXXXnHUUUdFRMSBBx7Y/csAoETqPvJtaWmJFStWxFNPPRWvv/56PP300xERsXLlyti+fXsj9gFAKdS9Q73kkkvirLPOitbW1pg3b17Mnz8/XnrppVi3bl1cc801DZoIAD1f3aCedNJJ8fjjj3d9fuyxx8by5ctj6NChMWjQoG4fBwBlUTeo/79evXrFEUcc0V1bAKC0/GIHAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQAStBRFUTTqsEql0qijAKBbVKvVmtfdoQJAgrZGH9jZWbvsPUl7+8476TJsjSjX3jJtjSjX3jJtjSjX3jJtjSjX3jJtjXhvby3uUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEgQdsH+Yc2bdoUa9eujba2thg2bFjsscce3b0LAEqlblCr1WrMnDkzFi9eHC0tLdG3b994880346yzzorLLrssevfu3aidANCj1X3ke8UVV8SECRPisccei+nTp8eXv/zl6OjoiM2bN8cNN9zQqI0A0OPVDeqrr74aEyZMiH79+sW5554bjz76aOyzzz4xe/bsWLJkSaM2AkCPVzeobW1tsXr16oiIWLZsWdcj3tbW1mhr+0BvvwLA/wl1q3jJJZfEl770pdh3333jpZdeinnz5kVExIYNG+Koo45qyEAAKIO6QT3xxBPjwQcfjFWrVsWIESPiIx/5SEREDBo0KObMmdOQgQBQBv/xuW3fvn3j4x//eCO2AEBp+cUOAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkaCmKomjUYZVKpVFHAUC3qFarNa83NKgA8L+VR74AkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASBBW7MH/E+sXLkyrrjiiti0aVP0798/5s6dG8OHD2/2rJrmzp0bDzzwQFSr1Vi0aFEcfPDBzZ60Sxs3boypU6fG6tWro3fv3rH//vvHrFmzYuDAgc2eVtOFF14YL7zwQrS2tkafPn3i6quvjsMOO6zZs+q6+eab4/vf/36P/1oYM2ZM9O7dO3bfffeIiJgyZUp8+tOfbvKqXXvrrbfi+uuvjz/+8Y+x++67x8iRI2P27NnNnvU+L7zwQlx00UVdn2/evDm2bNkSjz/+eBNX1ffwww/H/PnzoyiK2LFjR0yaNClOPfXUZs+q6ZFHHon58+fHtm3bol+/fnHDDTfEsGHDuv/gosTOPffc4p577imKoijuueee4txzz23yol1bunRp0dnZWZx00knF3//+92bPqWvjxo3Fn/70p67Pb7zxxuLKK69s4qL6Xnvtta6PH3rooeL0009v4pr/bNmyZcX5559fnHjiiT3+a6EMX6//avbs2cV1111X7NixoyiKonjppZeavOiDmTNnTnHttdc2e8Yu7dixozjmmGO6vhaWL19ejBw5sti+fXuTl73fpk2bimOPPbZ4/vnni6LY2YbzzjuvIWeX9pHvyy+/HM8++2yMGzcuIiLGjRsXzz77bLzyyitNXlbbMcccE/vtt1+zZ3wg/fv3j1GjRnV9PnLkyOjs7Gziovr23nvvro+3bNkSLS0tTVxT39tvvx2zZs2KmTNn9uidZbR169a455574tJLL+36dzto0KAmr/rP3n777Vi0aFF84QtfaPaUulpbW2Pz5s0RsfOOevDgwdHa2vMSsmrVqhg0aFCMGDEiIiJGjx4dixcvbkgbSvvId+3atTFkyJDo1atXRET06tUrBg8eHGvXru2xjybLaMeOHbFw4cIYM2ZMs6fUNWPGjFiyZEkURRE/+tGPmj1nl+bPnx8TJkxozOOnJFOmTImiKOLoo4+Oyy67LPr27dvsSTWtWbMm+vfvHzfffHM89thjsddee8Wll14axxxzTLOn1dXR0RFDhgyJj33sY82eskstLS1x0003xYUXXhh9+vSJrVu3xu23397sWTWNGDEiNmzYEH/+85/jyCOPjEWLFkVENKQNPe/bC3qU2bNnR58+feKcc85p9pS6rrvuunjkkUdi8uTJ8e1vf7vZc2p66qmn4i9/+UucffbZzZ7ygd15551x7733xl133RVFUcSsWbOaPWmXtm3bFmvWrInDDz887r777pgyZUpMmjQptmzZ0uxpdd111109/u5027Ztcfvtt8ctt9wSDz/8cNx6660xefLk2Lp1a7Onvc/ee+8d8+bNixtuuCHOOOOMePnll6Nv377R1tb994+lDep+++0X69evj+3bt0dExPbt2+PFF18szWPVMpg7d26sWrUqbrrpph75aKeW008/PR577LHYuHFjs6e8z9KlS+P555+Pk08+OcaMGRPr1q2L888/PxYvXtzsabv07p+n3r17x9lnnx1PPvlkkxftWnt7e7S1tXW9DfSJT3wiBgwYECtXrmzysl1bv359LF26NMaPH9/sKXUtX748XnzxxTj66KMjIuLoo4+OPffcM1asWNHkZbV96lOfioULF8bdd98d55xzTrz55psNeSpUjv9K1rDPPvvEYYcdFvfdd19ERNx3331x2GGHedybZN68ebFs2bJYsGBB9O7du9lzdmnr1q2xdu3ars87OjqiX79+0b9//+aN2oWJEyfG4sWLo6OjIzo6OmLo0KHx4x//OI4//vhmT6vp9ddf73rPrCiKuP/++3v0354eOHBgjBo1KpYsWRIRO38K4OWXX47999+/yct27de//nWMHj06BgwY0OwpdQ0dOjTWrVsXzz//fERErFixIjZs2BD/9V//1eRltb300ksRsfMtq+9+97tx5plnRp8+fbr93JaiKIpuP6WbrFixIq644op47bXXom/fvjF37tw44IADmj2rpjlz5sSDDz4YGzZsiAEDBkT//v3jN7/5TbNn1fSPf/wjxo0bF8OHD4899tgjIiI++tGPxoIFC5q87P02bNgQF154YbzxxhvR2toa/fr1i2nTpvXo96PeNWbMmLjtttt67I/NrFmzJiZNmhTbt2+PHTt2xIEHHhhXXXVVDB48uNnTdmnNmjUxffr02LRpU7S1tcU3vvGNGD16dLNn7dJnPvOZmDFjRpxwwgnNnvIf3XvvvfHDH/6w6y98XXLJJXHKKac0eVVtM2bMiCeffDLeeeedOO6442L69OldP/rVnUodVADoKUr7yBcAehJBBYAEggoACQQVABIIKgAkEFQASCCoAJDg/wFkk7JhwqGG3QAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(to_board(ships));"
]
},
{
"cell_type": "markdown",
"id": "39c699da",
"metadata": {},
"source": [
"In spite of these challenges, we will want to at least be able to benchmark the average number of turns Thompson sampling requires against other approaches. Fortunately we can propose several scenarios for which the expected number of turns is straightforward to calculate.\n",
"\n",
"### Extremely optimistic\n",
"\n",
"We can make two assumptions to get a reasonable floor on the expected number of turns.\n",
"\n",
"1. The first five hits we get are each from a different ship.\n",
"2. As soon as we hit a ship, we know the complete location of that ship.\n",
"\n",
"Together with a search strategy for the first five hits, we can calculate the expected value in this unrealistic but instructive scenario. Weakening these assumptions also leads to more realistic expected values to which we can compare the performance of Thompson sampling.\n",
"\n",
"A fairly efficient search strategy for the first five hits in standard Battle ship is to search a mod-two grid (since the smallest ship has size two)."
]
},
{
"cell_type": "code",
"execution_count": 113,
"id": "6e31f4c8",
"metadata": {},
"outputs": [],
"source": [
"search_i, search_j = get_search_cells_2d((10, 10), 2)\n",
"search_grid = np.zeros((10, 10))\n",
"search_grid[search_i, search_j] = 1"
]
},
{
"cell_type": "code",
"execution_count": 114,
"id": "4de49811",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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u3fvliS1bNlSjRo1islwAAAkimq9baZRo0ZEFACACPjBDgAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABjwOOdcrBbz+/2xWgoAgKgIBAJhH+eECgCAAW+sFwwEg7Fe8nvz+3ySpGAw/HchNY3Pd+Lkz97aY2+jh72NHvY2ek7ubTicUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMPCDg9q/f3/LOQAASGjeSBe3bt1a5bWioiLzYQAASFQRg9qvXz/5/X455067VlxcHK2ZAABIOBGD6vf79cILL6h58+anXevRo0fUhgIAINFEfA316quvViAQCHutd+/eURkIAIBEFPGEOmXKlCqvzZgxw3wYAAASFW+bAQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwABBBQDAAEEFAMAAQQUAwIDHOeditZjf74/VUgAAREUgEAj7OCdUAAAMeGO9YDAYvuw1ic934iQdCAbjPEn1+H0+SextNLC30cPeRg97Gz0n9zYcTqgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABggqAAAGCCoAAAYIKgAABiIGNSioiJNnz5dw4cP1/PPP3/KtTFjxkR1MAAAEknEoObk5KhBgwbKzs7WO++8o9GjR6uiokKStGvXrpgMCABAIogY1B07dmjy5Mm6+uqrtXTpUjVt2lS33Xabjh07Fqv5AABICBGDWlZWFvrY4/EoJydHbdu21YgRI4gqAADfEjGo55xzjjZs2HDKY1OmTFGHDh30n//8J5pzAQCQULyRLt5///3yeDynPT5+/Hj1798/akMBAJBoIgY1LS2tymtt2rSxngUAgITF+1ABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAwQFABADBAUAEAMEBQAQAw4HHOuVgt5vf7Y7UUAABREQgEwj7OCRUAAAPeWC8YCAZjveT35vf5JEnBYPjvQmoan+/EyZ+9tcfeRg97Gz3sbfSc3NtwOKECAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYOB7B/XAgQPRmAMAgIQWMahffvmlBg0apMGDBys/P18jRoxQ9+7d1aNHD+Xl5cVqRgAAaryIQZ07d65uv/12DR06VLfeeqv69eunzZs3KycnRwsWLIjVjAAA1HgRg1pSUqJevXpp4MCBkqSsrCxJUmZmpoqLi6M9GwAACSNiUJ1zoY+vuOKKU64dP348OhMBAJCAIgbV7/fr8OHDkk7c/j2poKBAderUie5kAAAkEG+ki4sXLw77eP369bVkyZKoDAQAQCKKGNSqpKamKjU11XoWAAASFj/YAQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMEFQAAAwQVAAADBBUAAAMe55yL1WJ+vz9WSwEAEBWBQCDs45xQAQAw4I31gsFg+LLXJD7fiZN0IBiM8yTV4/f5JLG30cDeRg97Gz3sbfSc3NtwOKECAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBg4HsH9f3334/GHAAAJDRvpItbt2497bG77rpLS5culXNObdq0idpgAAAkkohB7devn3w+3ymPFRYW6re//a08Ho/+/ve/R3U4AAASRcSgjh49Wps3b9asWbPk9/slSZmZmcrNzY3JcAAAJIqIr6GOHj1a48eP18SJE7Vs2TJJksfjiclgAAAkkjP+oaQLL7xQzz33nAKBgH7961+rvLw8FnMBAJBQIt7yPSklJUWTJk3Spk2b9OGHH0Z7JgAAEk61gnpShw4d1KFDhyiNAgBA4uIHOwAAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGCAoAIAYICgAgBggKACAGDA45xzsVrM7/fH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vHr1ajdw4MA4TnNmn3/+ubvllltcz549a/zvhUT4/fptc+bMcffee687fvy4c865vXv3xnmi6pk7d66755574j1GlY4fP+46d+4c+r2Ql5fnOnTo4CorK+M82emKi4tdly5d3LZt25xzJ9owfPjwmKydsLd89+3bpy+++EL9+vWTJPXr109ffPGF9u/fH+fJwuvcubNatmwZ7zGqJS0tTRkZGaHPO3TooGAwGMeJIjv77LNDHx8+fFgejyeO00RWVlam2bNnKycnp0bPmYhKSkq0fPlyjRs3LrS3TZo0ifNUZ1ZWVqaVK1fqhhtuiPcoESUlJenQoUOSTpyomzVrpqSkmpeQHTt2qEmTJmrVqpUkqUePHlq7dm1M2pCwt3x3796t5s2bKzk5WZKUnJysZs2aaffu3TX21mQiOn78uJYtW6bMzMx4jxLR9OnTtW7dOjnn9Ic//CHe41Rp0aJFysrKis3tJyOTJk2Sc06dOnXShAkTVL9+/XiPFNauXbuUlpamxx57TOvXr1fdunU1btw4de7cOd6jRZSbm6vmzZvroosuivcoVfJ4PHr44Yc1atQopaamqqSkRE8++WS8xwqrVatWKiws1KeffqpLLrlEK1eulKSYtKHmfXuBGmXOnDlKTU3V0KFD4z1KRPfee6/WrFmj8ePH6/7774/3OGFt3LhRn332mW6++eZ4j1Jtzz//vFasWKFXXnlFzjnNnj073iNVqaKiQrt27dKFF16oV199VZMmTdKYMWN0+PDheI8W0SuvvFLjT6cVFRV68skntWTJEr377rt6/PHHNX78eJWUlMR7tNOcffbZWrhwoe677z4NGjRI+/btU/369eX1Rv/8mLBBbdmypfbs2aPKykpJUmVlpb755puEua2aCBYsWKAdO3bo4YcfrpG3dsIZOHCg1q9fr6KioniPcpoNGzZo27Zt6tWrlzIzM1VQUKBbbrlFa9eujfdoVTr571NKSopuvvlmffLJJ3GeqGo+n09erzf0MtCll16qhg0bavv27XGerGp79uzRhg0b1L9//3iPElFeXp6++eYbderUSZLUqVMn1alTR/n5+XGeLLyuXbtq2bJlevXVVzV06FAdPXo0JneFEuO/kmE0btxYF1xwgVatWiVJWrVqlS644AJu9xpZuHChPv/8cy1evFgpKSnxHqdKJSUl2r17d+jz3NxcNWjQQGlpafEbqgojRozQ2rVrlZubq9zcXLVo0ULPPPOMunXrFu/Rwjpy5EjoNTPnnN54440a/aenGzVqpIyMDK1bt07SiXcB7Nu3T+eee26cJ6vaa6+9ph49eqhhw4bxHiWiFi1aqKCgQNu2bZMk5efnq7CwUP/zP/8T58nC27t3r6QTL1k99NBDys7OVmpqatTX9TjnXNRXiZL8/HxNnTpVBw8eVP369bVgwQKdf/758R4rrLlz5+rtt99WYWGhGjZsqLS0NL3++uvxHiusr776Sv369dN5552n2rVrS5J+8pOfaPHixXGe7HSFhYUaNWqUSktLlZSUpAYNGmjKlCk1+vWokzIzM/XEE0/U2LfN7Nq1S2PGjFFlZaWOHz+u1q1ba8aMGWrWrFm8R6vSrl27NG3aNBUXF8vr9eqOO+5Qjx494j1Wla655hpNnz5d3bt3j/coZ7RixQo9/fTToT/wNXbsWF111VVxniq86dOn65NPPlF5ebmuuOIKTZs2LfTWr2hK6KACAFBTJOwtXwAAahKCCgCAAYIKAIABggoAgAGCCgCAAYIKAIABggoAgIH/B4x5GiXnlwrRAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_board(search_grid)\n",
"ax.set_title(r\"Standard Battleship\");"
]
},
{
"cell_type": "markdown",
"id": "231c725d",
"metadata": {},
"source": [
"The distribution of the number of turns it takes to get five hits in these fifty cells is given below."
]
},
{
"cell_type": "code",
"execution_count": 115,
"id": "25a4801e",
"metadata": {},
"outputs": [],
"source": [
"extreme_hit_pmf = get_random_guess_dist(search_grid.sum(),\n",
" np.ceil(SHIP_SIZES / 2).sum(),\n",
" n_hit=SHIP_SIZES.size)"
]
},
{
"cell_type": "code",
"execution_count": 116,
"id": "9d008b88",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGaCAYAAACSWkBBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAA9SUlEQVR4nO3de1yUdd7/8ffMcFBJRTwBQuZWa4eNosZ17WQSAqEC7kbbrzutXKFSO65RpK2NlvdmtW2Ylprrfbt6d+9CG+IhFxUrc5O0tTTass1jclDBEwxymJnfH+bcEuqMyszgzOv5ePh4MNf1nev6XIzMfOb7/V6fr8HhcDgEAAACltHXAQAAAN8iGQAAIMCRDAAAEOBIBgAACHAkAwAABDiSAQAAAhzJAOBj8fHx2rNnzzk9d9SoUcrPz5ckFRUVacyYMW0ZmtP27duVkZGh+Ph4LVy4UL/73e80a9Ysj5zrVGbOnKmJEyeedv+wYcNUWlrqtXgAfxPk6wCAQJGQkKADBw7IZDI5t61cuVKbN29uk+OnpaUpLS2tTY71Y2+//bZ+/vOfq7Cw0CPHP1/Lly/3dQjABY1kAPCit956SzfeeKOvwzhr5eXlGjZsmK/DAOAhDBMAPta/f3/t2rVLkvTMM8/IYrEoOztb8fHxyszM1O7du51t169fr5SUFN1www2aOnWqTi4g+re//U3/7//9vxbHfeedd5SUlKQBAwbIYrE429tsNv3+97/XwIEDlZCQoEWLFql///5qbm5uFd/o0aNVWlqqqVOnKj4+Xjt27NAzzzyj1157TZJ0xx13aO3atc72zc3NGjhwoMrKyiRJn3/+ue6++26ZzWalpaWdsTt/7ty5uuWWWxQfH6/k5GR98sknzn1NTU3KyclRfHy8hg0bpq1btzr3JSQk6B//+Iek40MKjz76qB5//HHFx8dr5MiR+vrrr906x8mOHj2qnJwc/eIXv9CQIUM0e/Zs2e32Fr/rl156SQMGDFBCQoI+/PDDM15XYmKi4uPjlZqaqlWrVp22LeALJANAO7N8+XJNmDBBGzdu1MUXX+z80K2pqdEjjzyixx9/XBs2bNDFF1+sf/7zn2c81gcffKCCggItWbJE77//vtatWydJ+utf/6qPPvpIS5Ys0XvvvafVq1ef9hgLFy6U2WzW7373O23evFn9+vVrsX/YsGFatmyZ8/HHH3+sbt266eqrr1ZVVZUefPBBPfzww/r000/19NNP69FHH1VNTU2r82zfvl2LFy9WQUGBNm/erPnz56tPnz7O/SUlJRo2bJg2bdqkhIQETZs27bQxr1mzRikpKfr00081fPhwjRs3Tk1NTS7PcbJp06bp6NGjWr16tf785z9ryZIlevfdd537t2zZon79+mnDhg0aO3asJk2apNNVd4+NjdXixYv12WefacKECXrqqae0b9++08YPeBvJAOBF48ePl9lsltls1rhx407ZZujQoYqLi1NQUJDS0tL0r3/9S5L00Ucf6bLLLlNKSoqCg4N13333qUePHmc8X1ZWlrp06aLo6GgNHDjQ+Q35/fff1+jRoxUZGamuXbsqOzv7nK9pxIgRKikpUX19vSRp6dKlGj58uCRpyZIluvXWWzV48GAZjUbddNNN+tnPfnbKb9Emk0mNjY367rvv1NTUpJiYGF188cXO/TfccIMGDx4sk8mk9PT0Ft/2f+zqq692/p4eeOABNTY26osvvnB5jhNsNptWrFih3/72t7rooosUExOjBx54QEVFRc420dHRuuuuu2QymTRy5Ejt379fBw4cOGU8d9xxh3r37i2j0ajU1FT17dtXW7Zsce8XDHgBcwYAL5o1a5bLOQMnf8B36NBBVqtVkrRv3z5FRkY69xkMBkVFRZ3xWD179nT+3LFjR9XV1TmPdfJzTz7u2erbt68uvfRSrV27VkOGDFFJSYlzomF5eblWrlx5ymGEUx3n2Wef1cyZM/Xvf/9bN998s5555hn17t1bUuvfS0NDg5qbmxUU1Ppt7OTrMRqN6t27t/bt2yez2XzGc5xw8OBBNTU1KTo62rktOjpaVVVVzscnx9OxY0dJcr5WP1ZYWKgFCxZo7969znYHDx48ZVvAF+gZAC4QPXv2VGVlpfOxw+FQRUVFmxzr5J/PxfDhw7Vs2TKtWbNGl112mfr27StJioqKUnp6ujZt2uT89/nnn5+2J2LEiBF65513tHbtWhkMBr3yyivnFM/J12O321VVVaVevXq5fY5u3bopODhY5eXlzm0VFRWtkgZ37N27V5MnT9Zzzz2n0tJSbdq0SZdffvk5XBXgOSQDwAVi8ODB+vbbb1VcXKzm5mYtXLjwtN3Srtxxxx1auHChqqqqdOTIEc2bN++8YktNTdX69ev1zjvvOIcIpOO3O65du1br1q2TzWZTQ0ODSktLT5l8bN++XZ988okaGxsVEhKi0NDQFrdhno2ysjLn7+m///u/FRISomuvvdbtc5hMJqWkpOi1115TbW2t9u7dqwULFpzTrZv19fUyGAyKiIiQJL377rv69ttvz+m6AE8hGQAuEBEREXr99df16quvauDAgdq1a5euv/76czrWXXfdpZtuuklpaWnKyMjQ4MGDFRQUdM4fvr169dJ1112nzZs3KzU11bk9KipKs2fP1pw5czRo0CANHjxY8+fPd87KP1ljY6Pz2m6++WbV1NToiSeeOKd4br/9dq1YsUIDBgzQkiVLNHPmTAUHB5/VOZ577jl17NhRiYmJuueeezR8+HD96le/OutYLrvsMo0ZM0Z33323brzxRm3btu2cXzfAUwyO001/BRAwPvzwQz3//PMtxvYvVDNnztSuXbvOeYgBCET0DAAB6NixY/rwww/V3NysqqoqzZo1S4mJib4OC4CPkAwAAcjhcCgvL08DBgxQRkaGLr30Uj322GO+DguAjzBMAABAgKNnAACAAEcyAABAgCMZAAAgwJEMAAAQ4EgGAJzWsGHDTrvk8MnLGJ/Oq6++qv/6r//yQGRnjq29PveEk5dcPvlnV+68806qF8IjSAYANy1atEi//OUv9bOf/UzPPPNMi32HDh3S+PHjdd1112nIkCFaunTpBX9e6fhyyqdaVMgdNTU1Kiws1N13390msfz4Q/N8YnP3uaf6oD6f856vMWPGKC8vzyfnhn8jGQDc1KtXL40bN+6UJWmnTp2q4OBgrV+/Xi+//LKef/75U36Dczgc+uqrr1pt//rrr2Wz2Tx23rPV3Nx83sf429/+psGDB6tDhw7nfSwcd/vtt6u0tFT79u3zdSjwMyQDgJuSkpKUmJio8PDwFtutVquKi4v12GOPKSwsTGazWQkJCVqyZEmrY3z//fcaM2aMPvroI+e2TZs26b777tN3333nsfOeUFZWpoyMDMXHx+vRRx/V448/7uzqT0hI0Ny5czVixAhdd911am5ubvHN+KuvvtLIkSMVHx+vxx9/XA0NDWf8fX300UcaMGBAi23fffedRo0aJbPZrGHDhmnNmjXOfQkJCZozZ45SU1M1YMAA5ebmOs/x1FNPqby8XA899JDi4+M1b968Vt/aExIS9Pbbbzvjf/bZZ3XgwAGNHTtW8fHxuv/++3X48GFn25OfO3fuXN1yyy2Kj49XcnKyPvnkk1Oe88fPraio0IQJE/SLX/xCAwcO1NSpU53HS0xMVHx8vFJTU7Vq1aoz/q5OePvtt/XII4+02DZt2jS9+OKLkqTQ0FBdffXVWr9+vVvHA9xFMgCcp507d8poNKpfv37ObVdccYX+/e9/t2obGxurmTNn6qmnntKGDRu0ZcsWTZgwQS+//LJ++tOfeuy80vGFgCZMmKCRI0fq008/1fDhw7V69eoWbZYvX665c+dq06ZNCgoKavHc8ePHKz09XZ9++qlSUlJUXFx8xvi2bdvWIrampiY99NBDuummm/SPf/xDkydP1sSJE7V9+3Znm6VLl2r+/PlatWqVduzYodmzZ0uSXn75ZUVHR+utt97S5s2blZWVdcpzFhcXa8GCBfr73/+utWvXKisrS08++aRKS0tlt9v15z//udVztm/frsWLF6ugoECbN2/W/Pnz1adPH5fntNlsevDBBxUdHa2SkhJ99NFHzkWaYmNjtXjxYn322WeaMGGCnnrqKbe+zaelpWndunU6cuSIpOM9NCtWrFB6erqzzaWXXqqvv/7a5bGAs0EyAJwnq9Wqzp07t9jWuXNn1dXVnbL9gAED9Morr+ixxx7Tgw8+qGnTpunWW2/1+Hm/+OILNTc3a/To0QoODlZSUpKuueaaFm1GjRqlqKioVl37X3zxhZqamnTfffcpODhYKSkprZ77Y0ePHlVYWFiLY1itVmVnZyskJESDBg3SkCFDtHz5cmeb//iP/1BUVJTCw8P18MMPt9jnjnvvvVc9evRQ7969ZTabFRcXp6uuukohISEaOnToKYdoTCaTGhsb9d1336mpqUkxMTG6+OKLXZ5ry5Yt2rdvn3JyctSpUyeFhobKbDZLOr5EdO/evWU0GpWamqq+fftqy5YtLo/Zq1cvmc1mrVy5UpK0bt06devWTT/72c+cbcLCwpzJAtBWSAaA89SpUyfV1ta22FZbW9vig/DHoqOjZTKZ5HA41KdPH6+cd9++ferdu7cMBoNzW1RUVIs2P358pudGR0efMb4uXbq0SEz27dunyMhIGY3/97YTHR2tqqqqU54/Ojr6rMfGe/To4fw5NDS0xeMOHTrIarW2ek7fvn317LPPaubMmbrxxhv1xBNPtIjpdCoqKhQdHd2iB+WEwsJCpaeny2w2y2w269tvv9XBgwfduoaRI0eqqKhIklRUVNSiV0CS6urq1KVLF7eOBbiLZAA4T5dccolsNpt27tzp3Pb111/rsssuO2X73bt364EHHtDEiRNlsViUnZ19TpP+zva8PXv2VFVVlU5ejqSioqJFm5M/7F09t7y8/Izx9e/fv0VsvXr1UmVlpex2e4vz9+7d+5TxlJeXq1evXmc8R1sZMWKE3nnnHa1du1YGg8Gt5Y+joqJUUVHRarLl3r17NXnyZD333HMqLS3Vpk2bdPnll7sdS2Jior755htt27ZNH3zwgUaMGNFi/3fffacrrrjC7eMB7iAZANzU3NyshoYG2e122Ww2NTQ0qLm5WZ06ddLQoUOVl5cnq9Wqzz77TGvWrGn1jU6SqqqqdP/99+uhhx7SL3/5SyUnJysnJ0djxozRnj17PHZeSbruuutkMpm0aNEiNTc3a/Xq1dq6datb137dddcpKChICxcuVHNzs4qLi10+d/Dgwdq4caPzcVxcnDp27Ki3335bTU1NKi0tVUlJiXOcXZL+53/+R5WVlTp06JBzMuEJPXr0OO3v6Hxs375dn3zyiRobGxUSEqLQ0FCZTCaX54yLi1PPnj316quvymq1qqGhQZ999pnq6+tlMBgUEREhSXr33XfPKtkLDQ1VcnKyfvvb3+qaa65p0QPT2NiosrIy3XjjjedxxUBrJAOAm958803FxcVp7ty5KioqUlxcnN58801J0pQpU3Ts2DHdeOON+u1vf6vnn3/+lN8Gu3Xrpqefflr33HOPc1taWpqmTJni/PDwxHklKSQkRDNnzlRBQYEGDBigoqIi3XbbbQoJCXF57See+95772nAgAFasWKFhg4desbnpKen68MPP9SxY8ecx3jzzTf10Ucf6Re/+IUsFotmzJihSy+91Pmc4cOHa8yYMUpMTFRsbKwefvhh577s7Gy9+eabMpvNmj9/vsuY3dXY2KhXX31VAwcO1M0336yamho98cQTLs9pMpn01ltvadeuXRoyZIhuvfVWvf/++7rssss0ZswY3X333brxxhu1bds2XX/99WcVU0ZGhrZt29YqsVuzZo1+/vOft+hNAdoCSxgDASwzM1N33333KWsYtIU//OEPioiI0P333++ybUJCgl544QW+9er4EMkdd9yh9evX66KLLnJuz8zM1IsvvnjWd54A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AQDAr3gtGQAAAO0TFQgBAAhwJAMAAAQ4kgEAAAIcyQAAAAGOZKANvPTSS0pISFD//v21bds253Z3FmdC2zp48KCysrKUnJysESNGaMKECaqpqZHE6+EL48aNU1pamjIyMnTPPffoX//6lyReC1954403WrxP8Tr4RkJCglJSUpSenq709HStW7dOko9fDwfO28aNGx3l5eWOIUOGOL755hvn9lGjRjkKCwsdDofDUVhY6Bg1apSvQgwYBw8edGzYsMH5+Pe//70jNzfX4XDwevjCkSNHnD+vWrXKkZGR4XA4eC184csvv3T85je/cdx2223O9yleB9/48WfFCb58PegZaANms7lVNcUTizMNHz5c0vHFmb766ivnt1R4Rnh4uAYOHOh8fN1116m8vJzXw0c6d+7s/Lm2tlYGg4HXwgcaGxs1depUTZkyxVmojdehffH163HBrE1woamoqFDv3r1lMpkkSSaTSb169VJFRUWryovwDLvdrnfeeUcJCQm8Hj40adIkrV+/Xg6HQ2+//TavhQ+8/vrrSktLU2xsrHMbr4NvTZw4UQ6HQzfccIOefPJJn78e9AzAb02bNk2dOnXSvffe6+tQAtqLL76oDz74QE888YRmzJjh63ACzubNm7V161bdc889vg4FP1i8eLGKior07rvvyuFwtIvquSQDHuLu4kzwjJdeekm7du3SH//4RxmNRl6PdiAjI0OlpaWKjIzktfCijRs3avv27br99tuVkJCgyspK/eY3v9Hu3bt5HXzkxO84JCRE99xzj/75z3/6/D2KZMBD3F2cCW3vtdde05dffqlZs2YpJCREEq+HL9TV1amiosL5uKSkRF27duW18LLs7Gx9/PHHKikpUUlJiSIjIzV//nylpqbyOviA1WrV0aNHJUkOh0MrVqzQlVde6fO/C9YmaAMvvPCCiouLdeDAAXXr1k3h4eFavnz5aRdngud8++23Gj58uC655BJ16NBBkhQTE6NZs2bxenjZgQMHNG7cONXX18toNKpr1656+umndfXVV/Na+FBCQoLeeust/fSnP+V18IE9e/bokUcekc1mk91u16WXXqrJkyerV69ePn09SAYAAAhwDBMAABDgSAYAAAhwJAMAAAQ4kgEAAAIcyQAAAAGOZAAAgADH2gQAzkp8fLzz5/r6eoWEhDjrqVssFqWlpfkqNADniDoDAM5ZQkKCXnjhBd14441n9TyHwyGHwyGjkc5JoD3gLxFAm5g5c6YmTpzofPz999+rf//+am5uliSNGjVKr732mu6++25de+212rNnj/r376933nlHSUlJGjBggCwWi058P9m1a5fuvfde3XDDDRo4cKAef/xxX1wWEBAYJgDgNUuWLNG8efPUr18/54f+Bx98oIKCAtXW1uqXv/ylhgwZoltvvVWvv/66brrpJi1cuFBNTU3aunWrj6MH/Bc9AwC8ZuTIkbr88ssVFBSk4OBgSVJWVpa6dOmi6OhoDRw4UF9//bUkKSgoSOXl5dq3b59CQ0NlNpt9GTrg10gGAHjNqZZj7dmzp/Pnjh07qq6uTpL01FNPyeFw6M4779SwYcNUUFDgtTiBQMMwAYA20bFjRx07dsz5+MCBA63aGAwGt4/Xs2dPvfDCC5KkTZs26YEHHtCAAQPUt2/f8w8WQAv0DABoE1deeaU2btyo8vJyHT16VHPmzDmv473//vuqrKyUJHXt2lUGg4G7DwAPoWcAQJu46aablJqaqrS0NHXr1k1ZWVkqKSk55+Nt3bpV06dPV21trbp3765JkyYpNja2DSMGcAJ1BgAACHD0uQEAEOBIBgAACHAkAwAABDiSAQAAAhzJAAAAAY5kAACAAEcyAABAgCMZAAAgwJEMAAAQ4P4/qTGZhW8jXFcAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = plot_turn_dist(extreme_hit_pmf, mean=True)\n",
"\n",
"make_pct_yaxis(ax);\n",
"ax.set_title(\"Finding five ships on a\\n\"\n",
" r\"$10 \\times 10$ grid (optimistically)\");"
]
},
{
"cell_type": "markdown",
"id": "74a3a20e",
"metadata": {},
"source": [
"Under the second assumption, it will take us 12 more guesses to sink all the ships, so the expected number of turns to solve the game (optimistically) is"
]
},
{
"cell_type": "code",
"execution_count": 117,
"id": "93a1b72c",
"metadata": {},
"outputs": [],
"source": [
"extreme_ev = extreme_hit_pmf.mean() + (SHIP_SIZES - 1).sum()"
]
},
{
"cell_type": "code",
"execution_count": 118,
"id": "171f7e9e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"40.18181818181814"
]
},
"execution_count": 118,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"extreme_ev"
]
},
{
"cell_type": "markdown",
"id": "89a47628",
"metadata": {},
"source": [
"Under the slightly more conservative (but still optimistic) assumption that it takes on average one and a half misses to determine the location and orientation of a ship, the expected value becomes"
]
},
{
"cell_type": "code",
"execution_count": 119,
"id": "6e665700",
"metadata": {},
"outputs": [],
"source": [
"optim_ev = extreme_hit_pmf.mean() + 1.5 * SHIP_SIZES.size + (SHIP_SIZES - 2).sum()"
]
},
{
"cell_type": "code",
"execution_count": 120,
"id": "8feefa1e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"42.68181818181814"
]
},
"execution_count": 120,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"optim_ev"
]
},
{
"cell_type": "markdown",
"id": "2d0e0b7f",
"metadata": {},
"source": [
"We will use these two figures to benchmark the performance of Thompson sampling for standard Battleship in the next section."
]
},
{
"cell_type": "markdown",
"id": "981fcfd5",
"metadata": {},
"source": [
"#### Bayesian (Thompson sampling)\n",
"\n",
"Generalizing the Thompson sampling strategy from one ship on a two-dimensional grid to standard Battleship is slighly more conceptually involved than generalize from one- to two-dimensional grids with one ship, but not too much more.\n",
"\n",
"The generalization also requires some computational optimizations, as we can no longer expect to enumerate and store all possible configurations of the board on reasonably sized hardware. To illustrate this and facilitate our eventual solution to this issue, we generate all possible configurations of each ship."
]
},
{
"cell_type": "code",
"execution_count": 121,
"id": "fb5c2cf3",
"metadata": {},
"outputs": [],
"source": [
"all_ships = [get_all_ships(GRID_LENGTH, ship_size) for ship_size in SHIP_SIZES]"
]
},
{
"cell_type": "markdown",
"id": "51907c9a",
"metadata": {},
"source": [
"Even though we can enumerate the possibilities for each ship easily,"
]
},
{
"cell_type": "code",
"execution_count": 122,
"id": "a6635008",
"metadata": {},
"outputs": [],
"source": [
"n_ship_grids = np.array([len(ships) for ships in all_ships])"
]
},
{
"cell_type": "code",
"execution_count": 123,
"id": "79f2e159",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([120, 140, 160, 160, 180])"
]
},
"execution_count": 123,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_ship_grids"
]
},
{
"cell_type": "markdown",
"id": "ef3d9948",
"metadata": {},
"source": [
"there are more than $10^{10}$ possible combinations in the cartesian product of these configurations"
]
},
{
"cell_type": "code",
"execution_count": 124,
"id": "3a88dd1b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"10.88882175214102"
]
},
"execution_count": 124,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.log10(n_ship_grids).sum()"
]
},
{
"cell_type": "markdown",
"id": "a02487aa",
"metadata": {},
"source": [
"Now, not all elements of the Cartesian product produce valid boards (the ships may overlap). An example of such an element is given below."
]
},
{
"cell_type": "code",
"execution_count": 125,
"id": "e90044f8",
"metadata": {},
"outputs": [],
"source": [
"ships = np.zeros((n_ships, GRID_LENGTH, GRID_LENGTH))\n",
"ships[0, 0, :5] = 1\n",
"ships[1, 0, :4] = 1\n",
"ships[2, 0, :3] = 1\n",
"ships[3, 0, :3] = 1\n",
"ships[4, 0, :2] = 1"
]
},
{
"cell_type": "code",
"execution_count": 126,
"id": "e92109cb",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA2UAAACwCAYAAACPbcZSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAbnElEQVR4nO3deXSU1RnH8V92hGhBLCkZrKfFggoKE5KQQJAtZV8ExQAHVLRCOCy2yBKtYA9QpRrEEhUKKNpWrVARlVAXPKCAitADBioWRFmcgVBZFELIJOH2D07mJJIhIZPkMjPfz19k3vd57533febmPu99M4QZY4wAAAAAAFaE2+4AAAAAAIQyijIAAAAAsIiiDAAAAAAsoigDAAAAAIsoygAAAADAIooyAAAAALCIoqwObNu2Tb1797bdDeACWVlZWrBggV/HyMnJ0dSpU31u79+/v7Zs2eJXGwAQSEaPHq2VK1daa59xF5eD1q1b68CBA5Vus/0ZCQQhW5S9/fbbGjp0qJxOp9LS0vSb3/xG27Ztq5VjJyYm6t13362VYyG09OjRQ7fccoucTqeSkpI0duxYHT58uMq4b7/9Vq1bt1ZJSYn3tVWrVmnEiBF12d1K5ebmqmPHjvXeLi4f5fM4MTFRw4cP16uvvqpz5875fdyPP/64lnoJXGjbtm0aPny4OnTooOTkZA0fPlx5eXm2u1Ulxl2UKT/+durUSQ899JAKCgqqjAvUosnWXKcuhGRRtnz5cj322GPKzMzU5s2btX79eo0cOVIffPDBJR2n/AT4Yq/5e0yElsWLF2v79u3atGmTmjZtqjlz5tjuEnDJyvJ4/fr1uv/++7V06VL9/ve/r9M263P8LC0trbe2UD9Onz6tzMxMjRo1Sp999pk++ugjTZw4UdHR0ba75hNzBlSmbPx94403tHPnTi1atMjvY5JrdS/kirJTp05p4cKFmjVrlnr16qWGDRsqKipKPXr00IwZM5SXl6eMjAwlJiYqLS1Ns2fPlsfj8ca3bt1aL7/8snr16qVevXppy5YtuvXWW7VkyRJ17txZDz30kPe1Mvn5+Zo0aZJSUlLUo0cP/fWvf/Vuy8nJ0eTJkzV16lQlJCTojTfeqNfzgctXTEyM+vTpo3379kmSNmzYoNtuu00JCQnq2rWrcnJyvPuOGjVKkpSUlCSn06nt27fr0Ucf1Y4dO7yrFZVZv369Bg8e7F3N+PLLL73blixZoi5dusjpdKp379765JNPvNuKi4s1ffp0OZ1O9e/fXzt37vRuK7+aUZbfv/3tb+V0OjVkyJAKbSD4XXnllerZs6eefvppvfHGG9qzZ488Ho/+9Kc/qVu3burUqZNmzZqls2fPSpKOHz+ucePGKTExUcnJyRo5cqTOnTunadOmye12KzMzU06nU0uXLvWuEK9cuVLdunXT3XffrXPnzum5555T9+7dlZqaqunTp+vUqVOSpLFjx+pvf/tbhf4NHDhQ69atkyTt27dPY8aMUXJysnr37q21a9d698vKytKjjz6q+++/X+3bt+dRsSD0zTffSJIGDBigiIgINWjQQGlpabrhhhsueGy7sqcTDh48qDvuuEMdOnTQ+PHjdfLkyQr7vv766+ratauSkpL06quvKi8vTwMHDlRiYqJmz55d4Th33XWXOnbsqI4dO+rBBx/UDz/84N3eo0cPLVmyRAMHDlT79u1VUlJywbj7wAMP+ByjLzYnQXCJi4tTly5dtHfvXn3//fcaN26cUlJSlJSUpHHjxunIkSOSpAULFmjbtm2aPXu2nE6nNx9/POeVpBUrVujXv/61kpOTlZmZqfz8/Gr3x9dnRJI++OAD9e/fX4mJiRo9erR37iOdn4+kp6fL6XSqX79+ev/99yWdH7OrM9cJGCbEfPjhh+bGG280xcXFlW7fuXOn2b59uykuLjaHDh0yffr0McuXL/dub9WqlbnnnnvMiRMnTGFhofn000/NjTfeaJ544glTVFTkfa1Lly7GGGNKS0vNkCFDTE5OjikqKjIHDx40PXr0MB999JExxpiFCxeam266ybz//vumtLTUFBYW1vk5wOWre/fuZvPmzcYYY86cOWOmT59upk2bZowx5tNPPzVffvmlKS0tNbt37zapqanm/fffN8YYc+jQIdOqVasKef3666+b4cOHVzj+jBkzzFNPPWWMMWbXrl0mJSXF7Nixw5SUlJhVq1aZ7t27m6KiIrNv3z5z6623miNHjniPf+DAAWPM+Zxt27at2bBhgykpKTHZ2dlm2LBhlb6Hsvz+17/+ZTwej1m2bJnp3r278Xg8dXH6cJkonwPlde3a1bz88stm7ty5Zty4cebEiRPm1KlTZty4cSY7O9sYY0x2draZOXOm8Xg8xuPxmK1bt5pz585V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\n",
"text/plain": [
"<Figure size 900x180 with 5 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(ncols=n_ships, sharex=True, sharey=True,\n",
" figsize=(n_ships * 2.5, 2.5))\n",
"\n",
"for (ship, name, ax) in zip(ships, SHIP_NAMES, axes):\n",
" plot_board(ship, ax=ax);\n",
" \n",
" ax.set_xticklabels([]);\n",
" ax.set_yticklabels([]);\n",
" ax.set_title(name);\n",
" \n",
"fig.tight_layout();"
]
},
{
"cell_type": "code",
"execution_count": 127,
"id": "68760ec3",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAccAAAHLCAYAAAC9PlPJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAmRklEQVR4nO3deXRU9f3/8dckJJGAkxAwCck3simbiBitFESgQcFWFlHwh2DlCIKtJiKL7BJEBAL8jGDArdgiIq1FUEFOQY1owRaQRUWhakShExIMEAbCEpLc3x98yY9MwmSCd2ZuLs/HOTnN3JnPve/WHl95v+8yDsMwDAEAgHIhwS4AAACrIRwBAPBAOAIA4IFwBADAA+EIAIAHwhEAAA91gl0AAABmS0lJUXh4uCIiIiRJ48aN02233ebzesIRAGBLCxcuVMuWLS9pLWNVAAA8OHhCDgCgNnC73XK73ZW2O51OOZ3OCttSUlJUv359GYahm266SWPGjKn0GW8IRwCAuRwOv+z2hYULlZWVVWl7amqq0tLSKmw7ePCgGjdurOLiYj377LMqKirS/PnzfT4W4QgAMJefwtF97JjPneOF/vOf/+iPf/yjsrOzfT4WF+QAAMzln2ysNgTPO3nypEpLS3XllVfKMAytW7dObdq0qdGxCEcAgLn8FI6+Onz4sNLS0lRaWqqysjK1aNFC6enpNdoHY1UAgLlC/ZSOpYGLK27lAADAA+EIAIAHzjkCAMwV5HOOZiAcAQDmskE4MlYFAMADnSMAwFx0jgAA2A+dIwDAXHSOAADYD+EIAIAHxqoAAHMxVgUAwH7oHAEA5qJzBADAfugcAQDmskHnSDgCAMxlg3BkrAoAgAc6RwCAuegcAQCwH8IRAAAPjFUBAOZirAoAgP3QOQIAzEXnCACA/dA5AgDMZYPOkXAEAJjLBuHIWBUAAA+EIwAAHghHAAA8cM4RAGAuzjkCAGA/dI4AAHPZoHMkHAEA5rJBODJWBQDAQ0A7x8TExEAeDgDghcvl8s+ObdA5Bnys6srNDfQhK0lMSJBkjVqkC+qJskg9x/63nmEWqee1/61nXvDrSXzyXC25uX76l0oNJSSc+4OTeiqzUi2SdetB1RirAgDggQtyAADmssFYlc4RAAAPdI4AAHPROQIAYD90jgAAc9mgcyQcAQDmskE4MlYFAMAD4QgAgAfCEQAAD5xzBACYi3OOAADYD50jAMBcNugcfQrHo0ePKi8vT5IUHx+vBg0a+LUoAEAtZvdw3L9/v5566il98803io2NlSQdOnRIbdu21dNPP62mTZsGokYAAALKaziOHz9egwcP1p///GeFhJw7PVlWVqY1a9ZowoQJ+tvf/haQIgEAtYgNOkevF+QUFhaqb9++5cEoSSEhIerXr5+OHTvm9+IAAAgGr+EYHR2ttWvXyjCM8m2GYei9996T0+n0e3EAAASD17HqnDlzlJ6erhkzZiguLk6SlJ+fr9atW2vOnDkBKRAAUMvYYKzqNRybNm2qpUuX6siRIzp48KAkqXHjxoqJiQlIcQAABINPt3LExMQQiAAA39igc+QJOQAAeOAJOQAAc9mgcyQcAQDmskE4MlYFAMADnSMAwFx0jgAA2A/hCACAB8IRAAAPnHMEAJjLBuccCUcAgLlsEI6MVQEA8EDnCAAwlw06R4dx4Zc1+lliYmKgDgUAqIbL5fLPjq/xUzp+H7C4onMEAJjMBp1jwMMxN9dPf6nUQELCuQ7WCrVI1FMdK9VjpVok6vHGSrVI1q0HVeOCHAAAPDBWBQCYywZjVTpHAAA80DkCAMxlg86RcAQAmMsG4chYFQAAD4QjAMBcDj/9XIKsrCy1atVK3377bY3WEY4AAFv6+uuvtWvXLiUkJNR4LeEIALCd4uJizZgxQ+np6XI4at52ckEOAKBWcLvdcrvdlbY7nU45nc4K2xYsWKC+ffsqKSnpko5FOAIAzOWnq1WXLl2qrKysSttTU1OVlpZW/nrnzp366quvNG7cuEs+FuEIADCXn8Jx6NCh6t+/f6Xtnl3jtm3b9MMPP6hHjx6SpLy8PA0fPlyzZ89Wly5dfDoW4QgAqBWqGp9WZeTIkRo5cmT565SUFL300ktq2bKlz8ciHAEA5rLBQwAIRwCArWVnZ9d4zSXfytGnT59LXQoAsDMLPQTgUnntHL///vuLvnf06FHTiwEAwAq8hmPv3r2VmJgowzAqvVdYWOivmgAACCqv4ZiYmKg333xTcXFxld7r1q2b34oCANRiNrggx+s5x549e8rlclX53h133OGXggAACDavneOECRMu+t7UqVNNLwYAYAM26By5lQMAYC4bhCPfygEAgAc6RwCAuegcAQCwHzpHAIC56BwBALAfwhEAAA+MVQEA5mKsCgCA/dA5AgDMRecIAID9OIyqvo/KTxITEwN1KABANS72xRK/2K/81DpuC1hcMVYFAJjMBmPVgIdjbq6f/lKpgYSEcx2sFWqRqKc6VqrHSrVI1OONlWqRrFsPqsY5RwAAPBCOAAB44JwjAMBcnHMEAMCDDcKRsSoAAB7oHAEA5qJzBADAfugcAQDmonMEAMB+CEcAADwwVgUAmIuxKgAA9kPnCAAwF50jAAD24zUcjx49qilTpmjYsGFavnx5hffS0tL8WhgAoJZy+OkngLyGY3p6uqKiojRo0CB9+OGHSk1NVUlJiSTpwIEDASkQAFDL2D0cf/rpJ40fP149e/bUa6+9pquuukqPPPKIzpw5E6j6AAAIOK/hWFxcXP67w+FQenq6WrZsqZEjRxKQAADb8hqOSUlJ2rZtW4VtEyZMUIcOHfTjjz/6sy4AAILG660cc+fOlcNRedA7evRo9enTx29FAQBqMRvcyuE1HKOjoy/63jXXXGN2LQAAO7BBOHKfIwAAHnhCDgDAXHSOAADYD50jAMBcdI4AANgPnSMAwFx0jgAA2A/hCACAB8aqAABzMVYFAMB+6BwBAOayQedIOAIAzGWDcHQYhmEE6mCJiYmBOhQAoBoul8s/O+7pp3TcELC4onMEAJjMBp1jwMMxN9dPf6nUQELCuQ7WCrVI1FMdK9VjpVok6vHGSrVI1q0HVeNqVQAAPDBWBQCYywZjVTpHAAA80DkCAMxF5wgAgP3QOQIAzEXnCACA/dA5AgDMRecIAID9EI4AAHhgrAoAMBdjVQAA7IfOEQBgrsuxczx27Jg/6gAA2IXDTz8B5DUc9+7dq3vuuUcDBgxQTk6ORo4cqa5du6pbt27as2dPoGoEACCgvIbjzJkz9dhjj+mBBx7Qww8/rN69e+uLL75Qenq6MjIyAlUjAKA2sXvnWFRUpB49eujuu++WJPXt21eSlJKSosLCQn/XBgBAUHgNR8Mwyn+/9dZbK7xXVlbmn4oAAAgyr+GYmJioEydOSDo3Yj0vLy9PdevW9W9lAIDayQZjVa+3cixatKjK7U6nU4sXL/ZLQQAABNsl3ecYGRmpyMhIs2sBANjB5XifIwAAdscTcgAA5rJA53jDDTeotLRUkuRwOBQdHa2wsLAKn8nOzr7oesIRAGAuC4RjZmZm+YWjO3bs0Lvvvqunn35au3fv1pIlSxQaGup1PeEIALCdlJSU8t/z8/NVp04drVixQlu2bNGwYcM0dOhQr+sJRwCAufzUObrdbrnd7krbnU6nnE5npe1TpkzRJ598ouPHjys0NFQ9e/bUrFmzVL9+/WqPRTgCAGqFpUuXKisrq9L21NRUpaWlVdiWl5enkJAQnTp1Sr/61a9UUlKiJ554wudjEY4AgFph6NCh6t+/f6XtVXWNvXr10hVXXKGHHnpIcXFxmj59upYuXVrhNsSBAwde9FiEIwCgVrjY+NRTUVGR2rZtq7CwMG3dulVHjx6Vw+HQRx99VP4ZwzAIRwBAAAX5atVTp06ptLRUJ06cUEhIiBo0aKA5c+bouuuu83kfhCMAwFxBDsdGjRrprbfekiQdOXJEp06dkiS5XC5J554bXh3CEQBgO//85z/11FNPKT8/v8J2wzC0d+/eatcTjgAAc1ngIQDTp0/XI488or59+17St0g5jAu/tNHPfGllAQCBcX7MaLr/46d0/JvvcXXLLbfo3//+t0JCLu0R4jx4HABgLgt8n+O9996rVatWXfJ/hYCPVXNz/fSXSg0kJJzrYK1Qi0Q91bFSPVaqRaIeb6xUi2Tdeuxq9+7dWrZsmZYsWaJGjRpVeG/ZsmXVruecIwDAdvr166d+/fpd8nrCEQBgLgtckDNgwIBftJ5wBADYzurVqy/6XlWPoPNEOAIAzGWBznHlypUVXhcUFMjlcun6668nHAEAQWCBcFy+fHmlbe+884727Nnj03pu5QAAXBb69evn8+0ddI4AAHNZoHPcv39/hdenT5/WunXrFB0d7dN6whEAYDu9evWSYRhyOP5/UsfHx+u5557zaT3hCACwHc9zi0eOHNGiRYv0448/6sYbb6x2PeccAQC2FxMTo4kTJ2rBggU+fZ7OEQBgLgucc6zK1q1bdfbsWZ8+SzgCAMxlgXDs3r27LvzSqdOnT+vs2bOaNm2aT+sJRwCA7XheeBMZGakmTZr4/N2ONQ7Hzz77TJ07d67pMgDA5cICnWNycvIvWu81HL///vtK2yZNmqTXXntNhmHommuu+UUHBwDAHyZNmuTT52bPnl3ldq/h2Lt3byUkJFTYVlBQoBEjRsjhcOijjz7ysUwAwGXDAp1jRESE1q5dq27duik+Pl55eXnauHGjevfurZiYmGrXew3H1NRUffHFF5o+fboSE899MWZKSoqys7PNqR4AAD/Yv3+/XnnllQrj1e3bt2vRokV6+umnq13v9T7H1NRUjR49WmPHjtWKFSskqcLTBgAAsKKdO3eqXbt2Fba1b99eu3bt8ml9tQ8BaNu2rV5//XW5XC4NHTrU53tEAACXKYeffmqgXbt2mj9/voqKiiRJJ0+e1Ny5c3Xdddf5tN6nq1XDw8M1btw47dq1S1u3bq1ZhQAABNicOXM0btw43XLLLXI6nXK73brhhhs0f/58n9bX6FaODh06qEOHDpdSJwDgcmGBs2+JiYlasWKF8vPzlZ+fr7i4OMXFxfm8nmerAgDMZYGxqiQVFRXp888/19atW7V9+3adOnXK57WEIwDAdn788Uf16dNHq1at0vPPP68333xTv/3tb5WTk+PTesIRAGAuC3SOs2fP1qhRo7RkyRJFRkbqjTfe0BNPPKFnn33Wp/WEIwDAdr788kvdddddFbb169dPX3/9tU/rCUcAgO0YhlH+rRzn/3Pv3r0+PR1HIhwBADbUunVr7d27V5JUWlqqadOm6aGHHtLjjz/u03q+sgoAYC4L3MoxceJEhYeHS5LuvvtuNWzYUMuXL1eLFi18Wk84AgDMZYFwbN26dfnvvn7B8YUIRwCA7Xj7yqqLfU3VhTjnCAAwlwVu5YiPjy//iYuLk2EY+vDDDxUREeHTejpHAIDtjBo1qtK2Xbt2afHixT6tdxjnr3ENgPPfCQkACD6Xy+WfHf/BTycdX/rlcXXjjTdq586d1X6OzhEAYC4LXJBTleLiYi1evFhlZWUKCfF+VjHg4Zib66e/VGogIeFcB2uFWiTqqY6V6rFSLRL1eGOlWiTr1nM5CQ8PV6dOnXz6LBfkAADggXAEAMAD5xwBAOay0DnHvLw8HTp0SLGxsYqPj/d5HeEIADCXBcIxPz9fY8eO1c6dOxUVFaVjx47pxhtv1HPPPafY2Nhq1zNWBQDYTnp6ulq3bq1t27bps88+0+eff65WrVopPT3dp/V0jgAAc1mgc9y5c6cWLlxY/vDxunXrauLEierSpYtP6+kcAQC2ExUVpR9++KHCtpycHEVHR/u0ns4RAGAuC3SODz/8sIYPH64BAwaocePGys3N1d///neNGTPGp/WEIwDAdu677z4lJSXpvffe0+7duxUbG6vMzEz9+te/9mk94QgAsKVOnTpVeiLOypUrNWDAgGrXEo4AAHNZYKy6evXqKrfPmDFDYWFhSkxM1M0333zR9YQjAMB2Vq5cWeX20tJSvfXWW3K5XOrUqdNFv/iYcAQAmMsCnePy5cur3J6cnKzly5frzJkzuu222y66nls5AACXjWHDhkmSIiIi1LRp04t+zms4bt68ufz348eP68knn9Ttt9+utLQ0FRQUmFMpAMBeHH76MUFqamr572+99dZFP+c1HOfPn1/+e2ZmpurVq6fFixerefPmmjlzpgllAgBsx8Lh6Cuv5xwNwyj/ffv27Vq5cqXCwsLUsmVL9enTx+/FAQAQDF7Dsbi4WDk5OTIMQw6HQ2FhYeXvhYRwuhIAYE9ew/H06dMaOXJkeQeZn5+vuLg4nThxgnAEAFjWvHnzdP311+vOO+/U4cOHNXfuXJWUlGjUqFG6+uqrq13vNRyzs7Or3B4aGqqFCxdeWsUAAHuzwK0ca9as0YMPPihJev755xUREaHmzZtrypQpWrZsWbXrL+k+x7p16yopKelSlgIA7M4C4XjixAnFxcVJkjZu3KiVK1cqLi5Or776qk/reQgAAMB2GjVqpO+++05ut1vR0dGKi4tTcXFxhWtnvCEcAQDmskDnOGLECA0cOFBlZWVKT0+XJO3evbvSg8gvhnAEANjOwIED1blzZ5WVlZWfBkxOTlZycrJP6wlHAIC5LNA5SlJiYuIlryUcAQC206ZNmwoPsvHkcDhkGIb27t1b5fuEIwDAdjZs2FDhdUFBgV5++WV1795dt956a7XrCUcAgLksMFb1vN0wKSlJ8+fP17333qtBgwZVu57H3AAALgvHjx9XYWGhT5+lcwQAmMsCneOkSZMqvD516pS2bNmiu+66y6f1hCMAwHbi4+MrvI6MjNSAAQPUpUsXn9YTjgAAc1mgcxw1atQvWk84AgDMZYFwXL169UXf69+/v6RzDye/2HcTOwxvN4KY7JfckAkAMJfL5fLPjif5KR1n+x5XQ4YMqXK7YRh68803JUnDhw/XkiVLqvwc4QgAlym/heNkP4XjrIDFVeDHqrm5fvqHUQMJCedC2gq1SNRTHSvVY6VaJOrxxkq1SNatB1XjnCMAwBaqe2TceRd7ZNyFCEcAgLmCdEHOhY+M++STT/TRRx9p+PDhaty4sfLy8vTKK6/o9ttv92lfPCEHAGALSUlJSkpKUv369TVv3jwdOHBAGRkZyszMVJs2bZSVlaWlS5f6tC/CEQBgLoeffnw9vMOhsLAwLVu2TGvWrCl/rmpRUZGKiop82gfhCACwlejoaN13330aNmyYVqxYobCwMO3YsUNDhw4tv8exOpxzBACYy0/nHN1ut9xud6XtTqdTTqezwrYnn3xSzZo10/vvv69du3YpPj5eI0aM0IABA3w6FuEIAKgVli5dqqysrErbU1NTlZaWVmGbw+HQwIED9c033ygyMlJZWVkKCfF9WEo4AgDM5afO8WJjUc+uUZLmzZunnJwcFRcXa+bMmZo0aZJKSko0atQoXX311dUei3AEANQKVY1PL2bFihW69tpr9Ze//EWzZs1SRESEmjdvrilTpmjZsmXVrueCHACArXz33XcqKipSYWGhBg0apFWrVsnlcumRRx7Rnj17fNoHnSMAwFxB/laOa6+9Vk2aNFFWVpbcbremT5+uJUuWqLi4WGFhYT7tg3AEANjOiBEjNHDgQJWVlSk9PV2StHv3bnXq1Mmn9YQjAMBcFvg+x4EDB6pz584qKytTUlKSJCk5OVnJyck+ra9ROBYVFenHH39UkyZNVL9+/ZpXCwCwPwuEo/TLvibR6wU506ZN05EjRyRJ27dv1x133KHx48frjjvu0KZNmy75oAAAWJnXznHXrl2KiYmRJC1YsEAvvfSS2rdvr3379mns2LHq0qVLQIoEANQiFukcfwmvneOZM2fKfy8qKlL79u0lSc2aNdPZs2f9WxkAAEHiNRw7deqkOXPm6NSpU+rYsaPWrVsnSdq8ebOio6MDUR8AAAHnNRwnT56skpISde3aVR988IHGjBmjdu3a6bXXXtOsWbMCVSMAoDYJ8ldWmcHrOcfw8HBNnTpVY8aM0f79+1VaWqqEhAQ1aNAgUPUBABBwPt3KERkZqdatW/u7FgCAHdj9ghwAAC5HPCEHAGAuOkcAAOyHzhEAYC46RwAA7IdwBADAA2NVAIC5GKsCAGA/dI4AAHPZoHMkHAEA5rJBODJWBQDAA50jAMBcNugcHYZhGIE6WGJiYqAOBQCohsvl8s+O5/opHccHLK7oHAEAJrNB5xjwcMzN9dNfKjWQkHCug7VCLRL1VMdK9VipFol6vLFSLZJ160HVuCAHAAAPjFUBAOaywViVzhEAAA90jgAAc9E5AgBgP3SOAABz2aBzJBwBAOayQTgyVgUAwAPhCACAB8IRAAAPnHMEAJjLBuccCUcAgLlsEI6MVQEA8EDnCAAwl907x44dO2rmzJnas2dPoOoBACDovIZjvXr1FBISomHDhql///564403dOzYsUDVBgCojRx++gkgr+EYFRWlyZMn69NPP9UjjzyiTz/9VN27d9fo0aO1efPmQNUIAEBA+XRBTlhYmO6880698sorWr9+vVq1aqVnnnnG37UBABAUXsPRMIxK22JjY/WHP/xB//jHP/xWFACgFrP7WHXRokWBqgMAAMvweitHYmJioOoAANiFDW7l4D5HAIC5bBCOPCEHAAAPdI4AAHPROQIAYD+EIwAAHghHAAA8cM4RAGAuG5xzJBwBAOayQTgyVgUAwAOdIwDAXHSOAADYj8Oo6qs3/IRntQKAdbhcLv/s+FU/tY4jAhZXdI4AAHgK+DnH3Fw//aVSAwkJ5zpYK9QiUU91rFSPlWqRqMcbK9UiWbceVI0LcgAA5uKCHAAA7IfOEQBgLht0joQjAMBcNghHxqoAAHigcwQAmIvOEQAA+6FzBACYi84RAAD7IRwBAPDAWBUAYC7GqgAA2A+dIwDAXHSOAADYT43C8dSpU9q9e7fcbre/6gEA1HYOP/0EkNdw/OCDD5ScnKw777xTX3zxhX73u99p/PjxuuOOO5SdnR2oGgEAtYkNwtHrOcesrCytWLFCbrdbI0eO1Isvvqjk5GTl5ORo7NixSklJCVSdAAAEjNdwdDgcatWqlSSpXr16Sk5OliS1aNHC/5UBABAkXseqDodDOTk52rlzp06ePKldu3ZJkvbt26fS0tJA1AcAQI1lZGQoJSVFrVq10rffflvj9V47x8cff1z333+/QkJClJmZqQULFujnn39WXl6epk+ffqk1AwDszAK3cvTo0UMPPvighgwZcknrvYbjb37zG23durX89S233KI9e/YoPj5ejRo1uqQDAgBszgLhePPNN/+i9TV6CEBoaKjatWv3iw4IAMClcLvdVd5K6HQ65XQ6TT0WT8gBAJjqbGmYX/a7dOlSZWVlVdqempqqtLQ0U49FOAIAaoWhQ4eqf//+lbab3TVKhCMAwGT+6hz9MT69GJ6tCgCwnZkzZ6pr167Ky8vTQw89pLvuuqtG6+kcAQCmOlvin86xJqZOnaqpU6de8nrCEQBgKn+NVQOJsSoAAB7oHAEApqJzBADAhugcAQCmskPnSDgCAExlhatVfymHYRhGoA6WmJgYqEMBAKrhcrn8st+czGv8st8Wo7/3y36rQucIADAVY9VLkJvrn79UaiIh4VwHa4VaJOqpjpXqsVItEvV4Y6VaJOvWg6rROQIATEXnCACABzuEI/c5AgDggc4RAGAqO9zKQecIAIAHOkcAgKk45wgAgA3ROQIATGWHzpFwBACYyg7hyFgVAAAPdI4AAFNxKwcAADZE5wgAMJUdzjn6FI6FhYU6ePCg6tSpo6SkJF1xxRX+rgsAUEvZPhxdLpfS09O1adMmORwOOZ1OnT59Wvfff7/GjBmj8PDwQNUJAEDAeD3nOHHiRPXt21dbtmzR5MmTNWTIEGVnZ+v48eOaPXt2oGoEANQiZ0vD/PITSF7D8dixY+rbt6+ioqL0+9//Xp9++qkaNmyoZ555Rps3bw5UjQAABJTXsWqdOnW0f/9+XX311dq9e3f5GDUkJER16nAtDwCgMtufc3z88cd133336aqrrtLPP/+szMxMSVJBQYGSk5MDUiAAoHaxw32OXsOxe/fu2rBhg3766Sc1a9ZM9evXlyQ1atRIM2fODEiBAAAEWrWzUafTqeuvvz4QtQAAbMAOY1WekAMAgAeuqgEAmIrOEQAAG6JzBACYyg6dI+EIADCVHW7lYKwKAIAHOkcAgKnsMFalcwQAwAOdIwDAVHboHAlHAICp7BCOjFUBAPBA5wgAMJUdbuVwGIZhBOpgiYmJgToUAKAaLpfLL/sdd9f/9ct+578/1i/7rUpAO0d//YMAAFiHHc45MlYFAJjKDuHIBTkAAHigcwQAmIrOEQAAG6JzBACYyg63ctA5AgDggc4RAGAqO5xzJBwBAKayQzgyVgUAwEOt6hz37duniRMnqrCwUNHR0crIyFDTpk2DUktGRobWr18vl8ulNWvWqGXLlkGpQ5KOHj2q8ePHa//+/QoPD1eTJk00Y8YMxcTEBK2mRx99VP/9738VEhKiyMhIPfXUU2rTpk3Q6pGkrKwsvfDCC0H/55WSkqLw8HBFRERIksaNG6fbbrstaPWcOXNGs2bN0r/+9S9FRESoQ4cOeuaZZ4JSy3//+1899thj5a+PHz+uEydOaOvWrUGpR5I+/vhjLViwQIZhqKysTGlpaerZs2dQatm4caMWLFigkpISRUVFafbs2UpKSgpKLd7YoXOsVeGYnp6uwYMHq1+/fnr33Xc1bdo0vf7660GppUePHnrwwQc1ZMiQoBz/Qg6HQw8//LA6duwo6Vxwz58/X7NmzQpaTRkZGbryyislSR9++KEmT56s1atXB62er7/+Wrt27VJCQkLQarjQwoULgxrQF5o3b54iIiK0fv16ORwOFRQUBK2W//mf/9G7775b/vrZZ59VaWlp0OoxDEPjx4/X8uXL1bJlS+3du1f333+/br/9doWEBHbwduzYMU2YMEF//etf1axZM7377ruaPn26lixZEtA6Lhe1Zqx6+PBhffPNN+rdu7ckqXfv3vrmm2905MiRoNRz8803q3HjxkE5tqfo6OjyYJSkDh06KDc3N4gVqTwYJenEiRNyOBxBq6W4uFgzZsxQenp6UOuwoqKiIr3zzjsaNWpU+f82jRo1CnJV5xQXF2vNmjW69957g1pHSEiIjh8/LulcJxsbGxvwYJSkn376SY0aNVKzZs0kSd26ddOmTZuC9u9Ab86WhvnlJ5BqTed48OBBxcXFKTQ0VJIUGhqq2NhYHTx4MKjjQ6spKyvTihUrlJKSEuxSNGXKFG3evFmGYehPf/pT0OpYsGCB+vbta6nx07hx42QYhm666SaNGTNGTqczKHUcOHBA0dHRysrK0pYtW1SvXj2NGjVKN998c1DquVB2drbi4uJ03XXXBa0Gh8Oh559/Xo8++qgiIyNVVFSkl19+OSi1NGvWTAUFBfryyy/Vvn17rVmzRpIs+e9A7nOE5TzzzDOKjIzUAw88EOxS9Oyzz2rjxo0aPXq05s6dG5Qadu7cqa+++kqDBw8OyvGrsnz5cr333nt6++23ZRiGZsyYEbRaSkpKdODAAbVt21arVq3SuHHjlJaWphMnTgStpvPefvvtoHeNJSUlevnll7V48WJ9/PHHevHFFzV69GgVFRUFvJYrr7xSmZmZmj17tu655x4dPnxYTqdTderUmh6nVqk14di4cWPl5+eXn38oLS3VoUOHLDPatIKMjAz99NNPev7554My9rmYu+++W1u2bNHRo0cDfuxt27bphx9+UI8ePZSSkqK8vDwNHz5cmzZtCngt553//2x4eLgGDx6sHTt2BK2WhIQE1alTp/x0xQ033KAGDRpo3759QatJkvLz87Vt2zb16dMnqHXs2bNHhw4d0k033SRJuummm1S3bl3l5OQEpZ7OnTtrxYoVWrVqlR544AGdPn3aUhOR8+wwVrXOv0Gr0bBhQ7Vp00Zr166VJK1du1Zt2rSx3DghWDIzM7V7924tWrRI4eHhQa2lqKhIBw8eLH+dnZ2tqKgoRUdHB7yWkSNHatOmTcrOzlZ2drbi4+O1ZMkSdenSJeC1SNLJkyfLz18ZhqF169YF9SremJgYdezYUZs3b5Z07orww4cPq0mTJkGrSZJWr16tbt26qUGDBkGtIz4+Xnl5efrhhx8kSTk5OSooKNDVV18dlHp+/vlnSedOnzz33HMaNGiQIiMjg1KL3TkMwzCCXYSvcnJyNHHiRLndbjmdTmVkZKh58+ZBqWXmzJnasGGDCgoK1KBBA0VHR+v9998PSi3fffedevfuraZNm+qKK66QdO6qv0WLFgWlnoKCAj366KM6deqUQkJCFBUVpQkTJgT13NF5KSkpeumll4J2peiBAweUlpam0tJSlZWVqUWLFpo6dapiY2ODUs/5miZPnqzCwkLVqVNHTzzxhLp16xa0eiSpV69emjJlirp27RrUOiTpvffe06uvvlp+wdLjjz+u22+/PSi1TJkyRTt27NDZs2d16623avLkyeW3BFnJba39M5n5597A/VFbq8IRAGB9v752i1/2++/vOlb/IZPUmrEqAACBwmVOAABTcSsHAAA2ROcIADCVHZ6tSucIAIAHOkcAgKns0DkSjgAAU9khHBmrAgDggc4RAGAqbuUAAMCG6BwBAKaywzlHwhEAYCo7hCNjVQAAPNA5AgBMRecIAIAN0TkCAExlh1s5CEcAgKmsMFbdt2+fJk6cqMLCQkVHRysjI0NNmzb1eT1jVQCA7aSnp2vw4MFav369Bg8erGnTptVovcMwDMNPtQEALkMOh3/262taHT58WL169dKWLVsUGhqq0tJSdezYURs2bFBMTIxP+2CsCgCoFdxut9xud6XtTqdTTqez/PXBgwcVFxen0NBQSVJoaKhiY2N18OBBwhEAEBz+mke+8MJSZWVlVdqempqqtLQ0U49FOAIAaoWhQ4eqf//+lbZf2DVKUuPGjZWfn6/S0tLyseqhQ4fUuHFjn49FOAIAagXP8enFNGzYUG3atNHatWvVr18/rV27Vm3atPF5pCpxQQ4AwIZycnI0ceJEud1uOZ1OZWRkqHnz5j6vJxwBAPDAfY4AAHggHAEA8EA4AgDggXAEAMAD4QgAgAfCEQAAD4QjAAAeCEcAADz8P0XftwYA5XgeAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 576x576 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(to_board(ships), vmax=5.,\n",
" cbar=True,\n",
" cbar_kwargs={\n",
" 'format': '%d',\n",
" 'label': \"Number of ships\"\n",
" });"
]
},
{
"cell_type": "markdown",
"id": "ea0de6f0",
"metadata": {},
"source": [
"The following function tests to see if an array of ship grids constitutes a valid board (has no overlap)."
]
},
{
"cell_type": "code",
"execution_count": 128,
"id": "633bb049",
"metadata": {},
"outputs": [],
"source": [
"def has_no_overlap(ships, ship_axis=0, board_axis=(-2, -1)):\n",
" return (to_board(ships, ship_axis=ship_axis)\n",
" .max(axis=board_axis) \\\n",
" == 1)"
]
},
{
"cell_type": "code",
"execution_count": 129,
"id": "800f83ec",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 129,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"has_no_overlap(ships)"
]
},
{
"cell_type": "markdown",
"id": "61f0eb6d",
"metadata": {},
"source": [
"Even eliminating sets of ships that do overlap, there are still too many possible boards to enumerate. To address this challenge we will switch from Thompson _enumeration_, which is a more proper description of what we've been doing so far to Thompson _sampling_. Instead of enumerating all boards compatible with the currently revealed information and choosing the unknown cell with the highest posterior probability of yielding a hit, we will draw a sample from the posterior distribution of compatible boards, calculate the cell most likely to yield a hit based on this sample to use as the next guess.\n",
"\n",
"This sampling approach means we only need to be able to simulate random games of Battleship and check if they are compatible with the currently revealed information in order to generalize Thompson sampling to standard Battleship. Simulating random games of Battleship is not particularly hard, but simulating games compatible with boards that have many spots revealed can take a prohibitively long time if done naively by sampling from each ship's possible configurations and then testing to see if the product of the samples is compatible. (I have tried this and had it take over an hour to generate a compatible sample with approximately 30 cells revealed.)\n",
"\n",
"Fortunately we can address this issue by intelligently propagating hits and misses from the aggregate board to each ship's grid and restricting to a subset of each ship's position that is more likely to produce a compatible board when combined with all the other ship samples.\n",
"\n",
"Before walking through this process, we introduce the machinery necessary to sample random (compatible) boards."
]
},
{
"cell_type": "code",
"execution_count": 130,
"id": "e95f43ca",
"metadata": {},
"outputs": [],
"source": [
"def _sample_compat_ships_block(poss_ships, revealed,\n",
" rng=None, block_size=10_000):\n",
" if rng is None:\n",
" rng = np.random.default_rng()\n",
"\n",
" samples = np.stack([\n",
" rng.choice(ships, size=block_size, shuffle=False)\n",
" for ships in poss_ships\n",
" ],\n",
" axis=1\n",
" )\n",
" \n",
" has_no_overlap_ = has_no_overlap(samples, ship_axis=1)\n",
" valid_samples = samples[has_no_overlap_]\n",
" \n",
" if revealed.mask.all():\n",
" return valid_samples\n",
" else:\n",
" is_compat_ = is_compat(to_board(valid_samples, ship_axis=1), revealed)\n",
" \n",
" return valid_samples[is_compat_]\n",
" \n",
"def sample_compat_ships_block(poss_ships, revealed,\n",
" rng=None, block_size=10_000):\n",
" block = []\n",
" \n",
" while len(block) == 0:\n",
" block = _sample_compat_ships_block(\n",
" poss_ships, revealed,\n",
" rng=rng, block_size=block_size\n",
" )\n",
" \n",
" return block\n",
"\n",
"\n",
"def generate_compat_ships(poss_ships, revealed,\n",
" rng=None, block_size=10_000):\n",
" while True:\n",
" yield from sample_compat_ships_block(\n",
" poss_ships, revealed,\n",
" rng=rng, block_size=block_size\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 131,
"id": "3970dde6",
"metadata": {},
"outputs": [],
"source": [
"def take(n, gen, progress_bar=False):\n",
" n_range = trange(n) if progress_bar else range(n)\n",
" \n",
" return [x for _, x in zip(n_range, gen)]"
]
},
{
"cell_type": "code",
"execution_count": 132,
"id": "b3040514",
"metadata": {},
"outputs": [],
"source": [
"def sample_compat_ships(poss_ships, revealed, n,\n",
" rng=None, block_size=10_000,\n",
" progress_bar=False):\n",
" compat_gen = generate_compat_ships(poss_ships, revealed,\n",
" rng=rng)\n",
" \n",
" return np.array(take(n, compat_gen,\n",
" progress_bar=progress_bar))\n",
"\n",
"def sample_ships(poss_ships, n,\n",
" rng=None, block_size=10_000,\n",
" progress_bar=False):\n",
" empty = np.ma.masked_all_like(all_ships[0][0])\n",
" \n",
" return sample_compat_ships(poss_ships, empty, n,\n",
" rng=rng, block_size=block_size,\n",
" progress_bar=progress_bar)"
]
},
{
"cell_type": "markdown",
"id": "96789058",
"metadata": {},
"source": [
"We plot four randomly sampled boards below."
]
},
{
"cell_type": "code",
"execution_count": 133,
"id": "7e458082",
"metadata": {},
"outputs": [],
"source": [
"ships = sample_ships(all_ships, 4, rng=rng)"
]
},
{
"cell_type": "code",
"execution_count": 134,
"id": "f4b55d9f",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiUAAAI1CAYAAAAJu4pwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAzYklEQVR4nO3deXQUZb7/8U8HiBDGJCAQ7BZlu2HHEB2QH8imoDIBRB0POiCKGjkIjGELJjBBiLKMV0QBl0FUrsvoHZcDLqNodJCMghsgAl6JbHYDEiAsYQ2p3x/e9CVCyoTpqjzT9X6dwzlJd/J8v09V98OnqzrVPsuyLAEAAFSzmOpuAAAAQCKUAAAAQxBKAACAEQglAADACIQSAABgBEIJAAAwAqEEOM2wYcOUnZ1d3W2U8/rrr6tt27bV3YajnJ5jnz59tHDhQsfGP1dOzLsyc508ebJuv/32iNYFIoFQgmo1efJktWrV6ox/b7/9dnW35lm7du1Sq1attGrVqupuxTWrVq0q9/hr3769rrrqKj3yyCMqKSmp0li33367Jk+eXO4207Zpdna25s2bV91tAGeoWd0NAJdffrkeffTRcrfFx8c7WvPEiROKjY11tEZVmdjTv5NIbL833nhDDRs21IkTJ7Ru3TplZ2frvPPO07333huhLs1w/vnnV3cLwFlxpATVrlatWmrYsGG5f+edd54k6YcfflB6ero6deqkTp06aeTIkdq2bVv4d892+PuXr0rLXgV//PHHuuWWW9ShQwe9+uqrFfZTWlqqhx9+WF26dFFqaqqys7N17Nix8P0nT57Uww8/rCuvvFLt27dX//79tWzZsnJjPP/88xo0aJA6deqkbt26KSMjQz/99FP4/op6sixLjz76qLp27apOnTopIyNDBw8ePGN+Y8aMUZcuXdSxY0ddddVVWrRoUZW2+RdffKEhQ4aEt+vAgQP1ySefSJJ69uwpSbrtttvUqlUr9enTR5K0Y8cOjR49Wt27d9ell16qAQMG6M033yw3btnprwULFqhbt27q3LmzJk+erCNHjoR/pjJzrGytrKwsPfroo+revbt69OghSdq0aZOGDBmiDh066JprrtE777xT6e1Sv359NWzYUIFAQNddd526deum9evXV7qvyZMn69NPP9Ubb7wRPuqyatWqCrfp2axfv14jRoxQp06ddMUVV2j0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S/o5nAFuIZTAWAMGDFD9+vWVkZGhb7/9VuvXr1dGRoaSkpLUv39/ST+f/qhbt67+8z//U1u3btWKFSu0YMGCf6luUVGRHnjgARUUFOjjjz/WvHnzdPPNNysuLk516tTRsGHD9Nhjj+ndd9/V1q1b9eSTT+rDDz/UyJEjJUmXXHKJfD6fFi9erB07duiDDz6odE8jRozQkiVL9Oabb2rr1q1avHixPv3003I/M336dP3jH//Q9u3b9f333+v999/XhRdeqLp161aqxrZt2/TnP/9ZX3zxhYLBoL7++mt9+eWX4f986tWrp7i4OK1cuVJ79uzRgQMHJEnNmjXThx9+qHXr1mnz5s2aOnVqub8oqqzKzPFca6Wlpalu3bqaOHGiNm3apDVr1igrK0u1a9euVG/79u3Tnj17tGvXLn366aeaP3++mjdvHj61VZm+LrroIn377bfavn279u3bp5MnT1a4TX9p5MiRKigo0IQJE7Ru3Trt2LFDn332mXJzc7Vjxw5J//r+r4jP59OkSZP0P//zP/r88881ffp09erVi1M3cBWhBMaqXbu2nnnmGcXGxmro0KEaNmyY4uLitGjRovBf3iQmJuqRRx7RmjVrNHDgQC1cuFATJ078l+pec801qlu3rm699VZlZGSoR48e5cbMyMjQ73//ez300ENKS0vT0qVL9ec//zn8lzetW7fW1KlT9corr+h3v/udnnnmGWVlZVWq9m233aZhw4Zp5syZuv7667VmzZozrpFhWVa49tChQ3X06FH95S9/CZ+2ePzxx9WqVasKa9SpU0fbtm3TuHHjdM0112jMmDHq1KmT/vSnP0n6+ZRYTk6O3n33XfXq1UuDBw+WJN1///0KBAK67bbbdPvttyspKUnXXHNN5TdsFeZ4rrXq1Kmjp59+WkVFRbrppps0YcIE3X777brgggsq1dvgwYPVvXt39e7dW5mZmWrXrp0WLVqkmjVrVrqvESNGqF69eho0aJC6du2qr776qsJt+kstWrTQX//6Vx05ckR33nmnfve732nq1Kk6fvx4+P0ev7b/z1XHjh112WWXacSIEbrzzjvVsmVLzZw5818aE6gqn8WJRiCqTJo0SYWFhVq8eHF1t4J/E5MnT9auXbv03HPPVXcr8Dje6ApEkdLSUn366adasmRJdbcCAFVGKAGiSExMTPjKrADw74bT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\n",
"text/plain": [
"<Figure size 576x576 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True,\n",
" figsize=(FIG_WIDTH, FIG_WIDTH))\n",
"\n",
"for (ships_, ax) in zip(ships, axes.flat):\n",
" plot_board(to_board(ships_), ax=ax);\n",
"\n",
"fig.suptitle(\"Four boards, standard Battleship\");\n",
"fig.tight_layout();"
]
},
{
"cell_type": "markdown",
"id": "a5c958e3",
"metadata": {},
"source": [
"To illustrate how long it can take to sample compatible boards from the full Cartesian product, we randomly mask one third of the cells in the first board above and attempt to sample a compatible board."
]
},
{
"cell_type": "code",
"execution_count": 135,
"id": "726a5d2a",
"metadata": {},
"outputs": [],
"source": [
"masked_i, masked_j = rng.choice(\n",
" np.indices((GRID_LENGTH, GRID_LENGTH)).reshape(2, -1),\n",
" size=GRID_LENGTH**2 // 3, axis=1,\n",
" replace=False, shuffle=False\n",
")\n",
"mask = np.full((GRID_LENGTH, GRID_LENGTH), False)\n",
"mask[masked_i, masked_j] = True\n",
"\n",
"revealed = np.ma.masked_array(to_board(ships[0]), mask=mask)"
]
},
{
"cell_type": "code",
"execution_count": 136,
"id": "ea6fcf12",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdQAAAHUCAYAAACDJ9lsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAY8ElEQVR4nO3de5DVBf3/8feuKyokNxFwT3zFy3jLjEFHpjRRFHMaILOmUdNpRgsbFQ0lUNRQwQtNE1LipYtNTcY0k+aIOam1Og5UyngrkppEUjwLCApy8YLA5/cHs2v93D3a9/vec/bz/T4ef+1+jjOf15w58Dyfz2HXpqIoigAA/keaGz0AAP43EFQASCCoAJBAUAEggaACQIKWep6sUqnU83QAkK5arXZ5vK5BjYhob+96SG/S2ror/GXYGlGuvWXaGvHe3u7+APUmHW9Yy/bclmFvmV4HEe+9Fsqwt0xbI2pfGLrlCwAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAErR8mP9ow4YNsWbNmoiIGD58eAwaNKhHRwFA2dQM6ssvvxzXXHNNPP/88zF06NCIiHj11VfjiCOOiOuuuy5GjhxZj40A0OvVDOr06dPj7LPPjp/85CfR3Lzr7vDOnTtj0aJFMWPGjPjlL39Zl5EA0NvV/Ax148aNMWnSpM6YRkQ0NzfH5z73uXjjjTd6fBwAlEXNoA4cODAeeOCBKIqi81hRFHH//fdH//79e3wcAJRFzVu+N998c8yaNSuuv/76GDZsWERErF27Ng477LC4+eab6zIQAMqgZlBHjhwZP/3pT+P111+P1atXR0TEfvvtF4MHD67LOAAoiw/1YzODBw8WUQCowS92AIAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEgQVNRFEW9TlapVOp1KgDoEdVqtcvjrlABIEFLvU/Y3t512XuT1tZdV9Jl2BpRrr0dW7t7h9fbdNxVKcPeMm2NeG+v122+Mj63Zdga8d7errhCBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABL8t4M6ceLEzB0AUGottR584YUXun1sw4YN6WMAoKxqBnXChAlRqVSiKIr3PbZx48ae2gQApVMzqJVKJX7xi1/EsGHD3vfY2LFje2wUAJRNzc9QTz311KhWq10+Nn78+B4ZBABlVPMKdcaMGd0+dvXVV6ePAYCy8mMzAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkaCqKoqjXySqVSr1OBQA9olqtdnncFSoAJGip9wnb27sue2/S2rrrSroMWyPKtbdMWyPKtbdja3fvnnubjjtWZdjbsbUMr4OIcr0WyvrcdsUVKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJCgZlA3bNgQV111VZx33nlx9913/9tjU6ZM6dFhAFAmNYM6a9asGDBgQJx55pnxu9/9Li6++OLYvn17RESsWrWqLgMBoAxqBvWll16K6dOnx6mnnhp33XVX7LvvvnHBBRfEO++8U699AFAKNYO6bdu2zq+bmppi1qxZccghh8TkyZNFFQD+Rc2gjhgxIpYuXfpvx2bMmBGjRo2Kf/7znz25CwBKpaXWg9/+9rejqanpfcenTp0aEydO7LFRAFA2NYM6cODAbh87+OCDs7cAQGn5OVQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABI0FUVR1OtklUqlXqcCgB5RrVa7PO4KFQAStNT7hO3tXZe9N2lt3XUlXYatEeXa27G1u3d4vU3HXZVqe3uDl3ywSmtrRJTwuS3B3jJtjSjX3jJtjah9p9UVKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAk+I+D+sYbb/TEDgAotZpB/dvf/hZnnHFGfPGLX4wVK1bE5MmT44QTToixY8fG8uXL67URAHq9mkGdM2dOXHTRRXHOOefEV7/61ZgwYUI899xzMWvWrJg7d269NgJAr1czqFu3bo2TTz45Tj/99IiImDRpUkREjBs3LjZu3NjT2wCgNGoGtSiKzq+PO+64f3ts586dPbMIAEqoZlArlUps2bIlInbd/u2wZs2a2GuvvXp2GQCUSEutBxcsWNDl8f79+8dtt93WI4MAoIxqBrU7ffv2jb59+2ZvAYDS8osdACCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABI0FQURVGvk1UqlXqdCgB6RLVa7fK4K1QASNBS7xO2t3dd9t6ktXXXlXQZtkaUa2/H1u7e4fU2HXdVyrC3Y2sZXgcR5XzdlmFrRLn+nJX1ddsVV6gAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASDBfxzUP/zhDz2xAwBKraXWgy+88ML7jl155ZVx1113RVEUcfDBB/fYMAAok5pBnTBhQrS2tv7bsfXr18fXvva1aGpqit///vc9Og4AyqJmUC+++OJ47rnn4tprr41KpRIREePGjYu2tra6jAOAsqj5GerFF18cU6dOjcsvvzwWLlwYERFNTU11GQYAZfKB/yjpiCOOiJ/97GdRrVbjK1/5Srz77rv12AUApVLzlm+HPn36xLRp0+LZZ5+NJ598sqc3AUDpfKigdhg1alSMGjWqh6YAQHn5xQ4AkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACRoKoqiqNfJKpVKvU4FAD2iWq12edwVKgAkaKn3Cdvbuy57b9LauutKugxbI8q1t0xbI97b29070t6k4w5Q6Z7b9vYGL/lgldbWiCjH1ohy7e3YWrbXbVdcoQJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgAQ1g7pkyZLOrzdv3hzf/OY345RTTokpU6bE+vXre3wcAJRFzaB+5zvf6fx63rx50a9fv7jtttviwAMPjDlz5vT4OAAoi5ZaDxZF0fn1U089Fb/61a9i9913j0MOOSQmTpzY4+MAoCxqBnXbtm2xYsWKKIoimpqaYvfdd+98rLnZx68A0KFmUN9+++2YPHly55Xq2rVrY9iwYbFlyxZBBYB/UTOobW1tXR7fbbfd4nvf+16PDAKAMvpvXWbutddeMWLEiOwtAFBa7tsCQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJCgqSiKol4nq1Qq9ToVAPSIarXa5XFXqACQoKXeJ2xv77rsvUlr664r6TJsjSjX3jJtjXhvb7W9vcFLPliltTUiun/33Nt03LEqw96OraV73ZbouS3D1ojad1pdoQJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgAT/UVC3bt0af/3rX2PLli09tQcASqlmUL/1rW/F66+/HhERTz31VIwfPz6mT58e48ePj8WLF9dlIACUQUutB5999tkYPHhwRETMnz8/7rjjjjjqqKNi5cqVcfnll8fxxx9fl5EA0NvVvEJ95513Or/eunVrHHXUURERccABB8S7777bs8sAoERqBvWTn/xk3HzzzfHWW2/FmDFj4sEHH4yIiCVLlsTAgQPrsQ8ASqFmUGfOnBnbt2+PE044IR555JG47LLL4sgjj4y77rorbrzxxnptBIBer+ZnqH369Imrr746Lrvssnj55Zdjx44d0draGoMGDarXPgAohZpB7dC3b9847LDDenoLAJSWX+wAAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkCCpqIoinqdrFKp1OtUANAjqtVql8ddoQJAgpZ6n7C9veuy9yatrbuupMuwNaJce8u0NeK9vd29I+1NOu4AeW7zdTy3ZdgaUa7XQufroL29wUs+nEpra7ePuUIFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJagZ1zJgxMWfOnFi+fHm99gBAKdUMar9+/aK5uTnOO++8+PznPx8///nP44033qjXNgAojZpBHTBgQMycOTMef/zxuOCCC+Lxxx+PE088MaZOnRpLliyp10YA6PU+1Geou+++e5x22mnxgx/8IB566KE49NBDY/bs2T29DQBKo2ZQi6J437GhQ4fG17/+9fjtb3/bY6MAoGxqBnXBggX12gEApVYzqJVKpV47AKDU/BwqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJmoqiKOp1Mv9/VQDKrlqtdnncFSoAJGip9wmr7e31PuV/rNLaGhHl2BpRrr2dW7t5h9fbdNxVaW/v/XtbW3dtLdtzW4a9ZdoaUdLXbQn+/op47++wrrhCBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACf6joL711luxbNmy2LRpU0/tAYBSqhnURx55JEaPHh2nnXZaPPfcc/HZz342pk+fHuPHj4+2trZ6bQSAXq+l1oO33nprLFy4MDZt2hSTJ0+O22+/PUaPHh0rVqyIyy+/PMaNG1evnQDQq9UMalNTUxx66KEREdGvX78YPXp0REQcdNBBPb8MAEqk5i3fpqamWLFiRTzzzDPx5ptvxrPPPhsREStXrowdO3bUYx8AlELNK9RLLrkkzjrrrGhubo558+bF/PnzY926dbFmzZq49tpr6zQRAHq/mkE96aST4sknn+z8/thjj43ly5fH8OHDY8iQIT0+DgDKomZQ/3+77bZbHHnkkT21BQBKyy92AIAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEgQVNRFEW9TlapVOp1KgDoEdVqtcvjrlABIEFLvU/Y3t512XuT1tZdV9Jl2BpRrr1l2hrx3t7u3pH2Jh13gKrt7Q1e8uFUWlsjohx7O7aW7XVbhr1l2hrx3t6uuEIFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgAQtH+Y/2rhxY6xevTpaWlpixIgRseeee/b0LgAolZpBrVarMWvWrFi8eHE0NTVF//794+23346zzjorLrvssujTp0+9dgJAr1bzlu8VV1wRkyZNiieeeCJmzpwZX/7yl6OtrS02b94cN910U702AkCvVzOob7zxRkyaNCkGDBgQ5557bjz++OOxzz77xOzZs2PJkiX12ggAvV7NoLa0tMTLL78cERHLli3rvMXb3NwcLS0f6uNXAPg/oWYVL7nkkvjSl74U++67b6xbty7mzZsXERHr16+P0aNH12UgAJRBzaCeeOKJ8fDDD8dLL70UBxxwQHzkIx+JiIghQ4bEnDlz6jIQAMrgA+/b9u/fPz7+8Y/XYwsAlJZf7AAACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQIKmoiiKep2sUqnU61QA0COq1WqXx+saVAD438otXwBIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkKCl0QP+J1auXBlXXHFFbNy4MQYOHBhz586NkSNHNnpWl+bOnRsPPfRQVKvVWLRoURxyyCGNntStDRs2xPTp0+Pll1+OPn36xP777x/XX399DB48uNHTunThhRfGK6+8Es3NzdG3b9+45ppr4vDDD2/0rJpuvfXW+P73v9/rXwvjxo2LPn36xB577BEREdOmTYtPf/rTDV7VvXfeeSduvPHG+OMf/xh77LFHjBo1KmbPnt3oWe/zyiuvxEUXXdT5/ebNm2PLli3x5JNPNnBVbY8++mjMnz8/iqKInTt3xpQpU+LUU09t9KwuPfbYYzF//vzYvn17DBgwIG666aYYMWJEz5+4KLFzzz23uO+++4qiKIr77ruvOPfccxu8qHtLly4t2tvbi5NOOqn4+9//3ug5NW3YsKH405/+1Pn9zTffXFx55ZUNXFTbpk2bOr9+5JFHitNPP72Baz7YsmXLivPPP7848cQTe/1roQyv1381e/bs4oYbbih27txZFEVRrFu3rsGLPpw5c+YU1113XaNndGvnzp3FMccc0/laWL58eTFq1Khix44dDV72fhs3biyOPfbY4sUXXyyKYlcbzjvvvLqcu7S3fF977bV4/vnnY8KECRERMWHChHj++efj9ddfb/Cyrh1zzDGx3377NXrGhzJw4MAYM2ZM5/ejRo2K9vb2Bi6qbe+99+78esuWLdHU1NTANbVt27Ytrr/++pg1a1av3llGW7dujfvuuy8uvfTSzud2yJAhDV71wbZt2xaLFi2KL3zhC42eUlNzc3Ns3rw5InZdUQ8dOjSam3tfQl566aUYMmRIHHDAARERMXbs2Fi8eHFd2lDaW76rV6+OYcOGxW677RYREbvttlsMHTo0Vq9e3WtvTZbRzp07Y+HChTFu3LhGT6npqquuiiVLlkRRFPGjH/2o0XO6NX/+/Jg0aVJ9bj8lmTZtWhRFEUcffXRcdtll0b9//0ZP6tKqVati4MCBceutt8YTTzwR/fr1i0svvTSOOeaYRk+rqa2tLYYNGxYf+9jHGj2lW01NTXHLLbfEhRdeGH379o2tW7fGnXfe2ehZXTrggANi/fr18ec//zmOOuqoWLRoUUREXdrQ+95e0KvMnj07+vbtG+ecc06jp9R0ww03xGOPPRZTp06Nb3/7242e06Vnnnkm/vKXv8TZZ5/d6Ckf2t133x33339/3HPPPVEURVx//fWNntSt7du3x6pVq+KII46Ie++9N6ZNmxZTpkyJLVu2NHpaTffcc0+vvzrdvn173HnnnXHbbbfFo48+GrfffntMnTo1tm7d2uhp77P33nvHvHnz4qabboozzjgjXnvttejfv3+0tPT89WNpg7rffvvF2rVrY8eOHRERsWPHjnj11VdLc1u1DObOnRsvvfRS3HLLLb3y1k5XTj/99HjiiSdiw4YNjZ7yPkuXLo0XX3wxTj755Bg3blysWbMmzj///Fi8eHGjp3Wr489Tnz594uyzz46nn366wYu619raGi0tLZ0fA33iE5+IQYMGxcqVKxu8rHtr166NpUuXxsSJExs9pably5fHq6++GkcffXRERBx99NGx1157xYoVKxq8rGuf+tSnYuHChXHvvffGOeecE2+//XZd7gqV42/JLuyzzz5x+OGHxwMPPBAREQ888EAcfvjhbvcmmTdvXixbtiwWLFgQffr0afScbm3dujVWr17d+X1bW1sMGDAgBg4c2LhR3Zg8eXIsXrw42traoq2tLYYPHx4//vGP4/jjj2/0tC69+eabnZ+ZFUURDz74YK/+19ODBw+OMWPGxJIlSyJi108BvPbaa7H//vs3eFn3fv3rX8fYsWNj0KBBjZ5S0/Dhw2PNmjXx4osvRkTEihUrYv369fFf//VfDV7WtXXr1kXEro+svvvd78aZZ54Zffv27fHzNhVFUfT4WXrIihUr4oorrohNmzZF//79Y+7cuXHggQc2elaX5syZEw8//HCsX78+Bg0aFAMHDozf/OY3jZ7VpX/84x8xYcKEGDlyZOy5554REfHRj340FixY0OBl77d+/fq48MIL46233orm5uYYMGBAzJgxo1d/HtVh3Lhxcccdd/TaH5tZtWpVTJkyJXbs2BE7d+6Mgw46KK6++uoYOnRoo6d1a9WqVTFz5szYuHFjtLS0xDe+8Y0YO3Zso2d16zOf+UxcddVVccIJJzR6yge6//7744c//GHnP/i65JJL4pRTTmnwqq5dddVV8fTTT8e7774bxx13XMycObPzR796UqmDCgC9RWlv+QJAbyKoAJBAUAEggaACQAJBBYAEggoACQQVABL8PznDsmGPySr6AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed);"
]
},
{
"cell_type": "code",
"execution_count": 137,
"id": "d0595ead",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"You gave up trying to sample a compatible boardafter 59.4 seconds\n"
]
}
],
"source": [
"start = datetime.datetime.now()\n",
"\n",
"try:\n",
" sample_compat_ships(all_ships, revealed, 1, rng=rng)\n",
"except KeyboardInterrupt:\n",
" end = datetime.datetime.now()\n",
" \n",
" print(\"You gave up trying to sample a compatible board\"\n",
" f\"after {(end - start).total_seconds():.1f} seconds\")"
]
},
{
"cell_type": "markdown",
"id": "bc5d3929",
"metadata": {},
"source": [
"In order to implement the strategy for sampling compatible boards outlined above, we need to think about how to propagate hit/miss information about the combined board to each ship. For a miss, this propagation is easy, as all ships must have been missed. Propagating the information from a hit is much trickier, since in general we don't know which ship was hit. We do however, know which ship was hit when our opponent announces that we sank one of their ships, because they have to tell us which one.\n",
"\n",
"To implement Thompson sampling for standard Battleship then, we track not just what has been revealed, but what we can conclude has been revealed per ship. We use this per-ship revealed information to reduce our possibilities the compatible ship grids _before_ sampling, then sample from the Cartesian product of these reduced sets, which produces compatible samples in at most seconds, even when many cells have been revealed.\n",
"\n",
"Of course there are many situations where we can infer which ship has been hit. Consider the following board."
]
},
{
"cell_type": "code",
"execution_count": 138,
"id": "a0f569ae",
"metadata": {},
"outputs": [],
"source": [
"revealed = np.ma.masked_all((10, 10))\n",
"revealed[0, :2] = 0\n",
"revealed[1, 2] = 0\n",
"revealed[2, :2] = 0"
]
},
{
"cell_type": "code",
"execution_count": 139,
"id": "831dc682",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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CCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIEFDURRFrW7W0tJSq1sBQFW0tbV1eN0JFQASNNX6hp2VvSvZd5Iuw9aIcu0t09aIcu0t09aIcu0t09aIcu0t09aIyk9anVABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkCC/yioO3fujD//+c+xY8eOau0BgFKqGNRvfvOb8cYbb0RExLPPPhujR4+OKVOmxOjRo2Px4sU1GQgAZdBU6cUXXngh+vbtGxER8+fPj7vvvjtOOOGEWLlyZVxzzTVx6qmn1mQkAHR1FU+o77zzTvvHO3fujBNOOCEiIoYOHRrvvvtudZcBQIlUDOonPvGJmDNnTrz11lsxYsSIeOSRRyIiYsmSJdHc3FyLfQBQChWDOm3atNi9e3ecdtpp8fjjj8ekSZPi+OOPj3vvvTduueWWWm0EgC6v4nuo3bt3j+uvvz4mTZoUq1evjj179sSgQYOiT58+tdoHAKVQMaj79OjRI4455phqbwGA0vKDHQAggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASNBQFEVRq5u1tLTU6lYAUBVtbW0dXndCBYAETbW+YWdl70r2naTLsDWiXHvLtDWiXHvLtDWiXHvLtDWiXHvLtDWi8pNWJ1QASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJBAUAEggaACQAJBBYAEggoACQQVABIIKgAkEFQASCCoAJCgYlBHjBgRs2fPjuXLl9dqDwCUUsWg9uzZMxobG+OSSy6Jz33uc/HTn/40tm7dWqttAFAaFYPau3fvmDZtWjz11FNx2WWXxVNPPRWnn356TJw4MZYsWVKrjQDQ5X2g91D322+/OOecc+J73/tePProo3H00UfHrFmzqr0NAEqjYlCLonjftf79+8fXvva1+PWvf121UQBQNhWDumDBglrtAIBSqxjUlpaWWu0AgFLzfagAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACRoKIqiqNXN/P9VASi7tra2Dq87oQJAgqZa37Czsncl+07SZdgaUa69ZdoaUa69ZdoaUa69ZdoaUa69ZdoaUflJqxMqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABI8B8F9a233oply5bFtm3bqrUHAEqpYlAff/zxGD58eJxzzjnx4osvxmc+85mYMmVKjB49OlpbW2u1EQC6vKZKL95xxx2xcOHC2LZtW4wfPz7uuuuuGD58eKxYsSKuueaaGDVqVK12AkCXVjGoDQ0NcfTRR0dERM+ePWP48OEREXHEEUdUfxkAlEjFR74NDQ2xYsWKeP755+PNN9+MF154ISIiVq5cGXv27KnFPgAohYon1KuuuiouuOCCaGxsjHnz5sX8+fNj48aNsX79+rjxxhtrNBEAur6KQT3jjDPimWeeaf/85JNPjuXLl8fAgQOjX79+VR8HAGVRMaj/Xbdu3eL444+v1hYAKC0/2AEAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgAQNRVEUtbpZS0tLrW4FAFXR1tbW4XUnVABI0FTrG3ZW9q5k30m6DFsjyrW3TFsjyrW3TFsjyrW3TFsjyrW3TFsjKj9pdUIFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgASCCgAJBBUAEggqACQQVABIIKgAkEBQASCBoAJAAkEFgARNH+QXbdmyJdatWxdNTU0xePDgOOCAA6q9CwBKpWJQ29raYsaMGbF48eJoaGiIXr16xdtvvx0XXHBBTJo0Kbp3716rnQDQpVV85HvttdfGuHHj4umnn45p06bFl770pWhtbY3t27fHrbfeWquNANDlVQzq1q1bY9y4cdG7d++4+OKL46mnnoqDDz44Zs2aFUuWLKnVRgDo8ioGtampKVavXh0REcuWLWt/xNvY2BhNTR/o7VcA+H+hYhWvuuqq+OIXvxiHHHJIbNy4MebNmxcREZs2bYrhw4fXZCAAlEHFoJ5++unx2GOPxapVq2Lo0KHxoQ99KCIi+vXrF7Nnz67JQAAog3/73LZXr17xsY99rBZbAKC0/GAHAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASNBRFUdTqZi0tLbW6FQBURVtbW4fXaxpUAPi/yiNfAEggqACQQFABIIGgAkACQQWABIIKAAkEFQASCCoAJBBUAEggqACQoKneA/43Vq5cGddee21s2bIlmpubY+7cuTFkyJB6z+rQ3Llz49FHH422trZYtGhRHHXUUfWe1KnNmzfHlClTYvXq1dG9e/c47LDDYubMmdG3b996T+vQ5ZdfHq+++mo0NjZGjx494oYbbohjjz223rMquuOOO+K73/1ul/9aGDVqVHTv3j3233//iIiYPHlyfOpTn6rzqs698847ccstt8Tvf//72H///WPYsGExa9ases96n1dffTWuuOKK9s+3b98eO3bsiGeeeaaOqyp74oknYv78+VEURezduzcmTJgQZ599dr1ndejJJ5+M+fPnx+7du6N3795x6623xuDBg6t/46LELr744uLBBx8siqIoHnzwweLiiy+u86LOLV26tFi7dm1xxhlnFH/961/rPaeizZs3F3/4wx/aP58zZ05x3XXX1XFRZdu2bWv/+PHHHy/OPffcOq7595YtW1Zceumlxemnn97lvxbK8PX6z2bNmlXcfPPNxd69e4uiKIqNGzfWedEHM3v27OKmm26q94xO7d27tzjppJPavxaWL19eDBs2rNizZ0+dl73fli1bipNPPrl45ZVXiqJ4rw2XXHJJTe5d2ke+r7/+erz00ksxZsyYiIgYM2ZMvPTSS/HGG2/UeVnHTjrppDj00EPrPeMDaW5ujhEjRrR/PmzYsFi7dm0dF1V20EEHtX+8Y8eOaGhoqOOaynbt2hUzZ86MGTNmdOmdZbRz58548MEH4+qrr27/ve3Xr1+dV/17u3btikWLFsXnP//5ek+pqLGxMbZv3x4R752o+/fvH42NXS8hq1atin79+sXQoUMjImLkyJGxePHimrShtI98161bFwMGDIhu3bpFRES3bt2if//+sW7dui77aLKM9u7dGwsXLoxRo0bVe0pF06dPjyVLlkRRFPGDH/yg3nM6NX/+/Bg3blxtHj8lmTx5chRFESeeeGJMmjQpevXqVe9JHVqzZk00NzfHHXfcEU8//XT07Nkzrr766jjppJPqPa2i1tbWGDBgQHz0ox+t95RONTQ0xO233x6XX3559OjRI3bu3Bn33HNPvWd1aOjQobFp06b44x//GCeccEIsWrQoIqImbeh6f7ygS5k1a1b06NEjLrroonpPqejmm2+OJ598MiZOnBi33XZbved06Pnnn48//elPceGFF9Z7ygd23333xUMPPRT3339/FEURM2fOrPekTu3evTvWrFkTxx13XDzwwAMxefLkmDBhQuzYsaPe0yq6//77u/zpdPfu3XHPPffEnXfeGU888UTcddddMXHixNi5c2e9p73PQQcdFPPmzYtbb701zjvvvHj99dejV69e0dRU/fNjaYN66KGHxoYNG2LPnj0REbFnz5547bXXSvNYtQzmzp0bq1atittvv71LPtrpyLnnnhtPP/10bN68ud5T3mfp0qXxyiuvxJlnnhmjRo2K9evXx6WXXhqLFy+u97RO7fv3qXv37nHhhRfGc889V+dFnRs0aFA0NTW1vw308Y9/PPr06RMrV66s87LObdiwIZYuXRpjx46t95SKli9fHq+99lqceOKJERFx4oknxoEHHhgrVqyo87KOffKTn4yFCxfGAw88EBdddFG8/fbbNXkqVI7/Snbg4IMPjmOPPTYefvjhiIh4+OGH49hjj/W4N8m8efNi2bJlsWDBgujevXu953Rq586dsW7duvbPW1tbo3fv3tHc3Fy/UZ0YP358LF68OFpbW6O1tTUGDhwYP/zhD+PUU0+t97QOvfnmm+3vmRVFEY888kiX/tvTffv2jREjRsSSJUsi4r3vAnj99dfjsMMOq/Oyzv3yl7+MkSNHRp8+feo9paKBAwfG+vXr45VXXomIiBUrVsSmTZviIx/5SJ2XdWzjxo0R8d5bVt/+9rfj/PPPjx49elT9vg1FURRVv0uVrFixIq699trYtm1b9OrVK+bOnRuHH354vWd1aPbs2fHYY4/Fpk2bok+fPtHc3By/+tWv6j2rQ3/7299izJgxMWTIkDjggAMiIuLDH/5wLFiwoM7L3m/Tpk1x+eWXx1tvvRWNjY3Ru3fvmDp1apd+P2qfUaNGxd13391lv21mzZo1MWHChNizZ0/s3bs3jjjiiLj++uujf//+9Z7WqTVr1sS0adNiy5Yt0dTUFF//+tdj5MiR9Z7VqU9/+tMxffr0OO200+o95d966KGH4vvf/377X/i66qqr4qyzzqrzqo5Nnz49nnvuuXj33XfjlFNOiWnTprV/61c1lTqoANBVlPaRLwB0JYIKAAkEFQASCCoAJBBUAEggqACQQFABIMF/AelMsmGPv5iUAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_board(revealed);"
]
},
{
"cell_type": "markdown",
"id": "f183d000",
"metadata": {},
"source": [
"If guessing (1, 0) results in a hit, we can obviously conclude that the patrol boat was hit. We do not account for situations such as this when propagating hit information from the combined board to individual ships to avoid cumbersome and error-prone conditional logic in our strategy. (In fact, Thompson sampling accounts for this automatically without a special rule, as there will be only one possible position for the patrol boat compatible with this revealed information.)\n",
"\n",
"We implement Thompson sampling for standard Battleship as described above."
]
},
{
"cell_type": "code",
"execution_count": 140,
"id": "35337dde",
"metadata": {},
"outputs": [],
"source": [
"class ThompsonStrategy(Strategy):\n",
" def __init__(self, all_ships, rng=None, block_size=10_000):\n",
" self._ship_strats = [\n",
" SingleThompsonStrategy(ships) for ships in all_ships\n",
" ]\n",
" \n",
" n_ship = len(all_ships)\n",
" grid_shape = all_ships[0][0].shape\n",
" self._ships_revealed = np.ma.masked_all((n_ship,) + grid_shape)\n",
"\n",
" self._rng = rng if rng is not None else np.random.default_rng()\n",
" self._block_size = block_size\n",
" \n",
" def next_guess(self, revealed, n=None):\n",
" post = np.ma.masked_array(\n",
" self.sample_post(revealed, n=n),\n",
" mask=~revealed.mask\n",
" )\n",
" \n",
" return argmax_2d(post)\n",
" \n",
" def sample_post(self, revealed, n=None):\n",
" all_compat_ships = [\n",
" ship_strat.compat_ships(ship_revealed)\n",
" for (ship_strat, ship_revealed)\n",
" in zip(self._ship_strats, self._ships_revealed)\n",
" ]\n",
" \n",
" if n is None:\n",
" compat_samples = sample_compat_ships_block(\n",
" all_compat_ships, revealed,\n",
" rng=self._rng, block_size=self._block_size\n",
" )\n",
" else:\n",
" compat_samples = sample_compat_ships(\n",
" all_compat_ships, revealed, n=n,\n",
" rng=self._rng, block_size=self._block_size\n",
" )\n",
" \n",
" return to_board(compat_samples, ship_axis=1).mean(axis=0)\n",
"\n",
" def reveal(self, i, j, hit_or_miss, sunk):\n",
" if hit_or_miss == 0 or sunk is not None:\n",
" self._ships_revealed[:, i, j] = 0\n",
" \n",
" if sunk is not None:\n",
" self._ships_revealed[sunk, i, j] = 1"
]
},
{
"cell_type": "markdown",
"id": "bf3161e0",
"metadata": {},
"source": [
"We use this strategy to play a game and visualize the results."
]
},
{
"cell_type": "code",
"execution_count": 141,
"id": "38e5e3bd",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 17/17 [00:02<00:00, 7.06it/s]\n"
]
}
],
"source": [
"strat = ThompsonStrategy(all_ships, rng=rng)\n",
"game = play(ships[0], strat,\n",
" progress_bar=True)"
]
},
{
"cell_type": "code",
"execution_count": 142,
"id": "5ed02ea9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"46"
]
},
"execution_count": 142,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"game.turns"
]
},
{
"cell_type": "code",
"execution_count": 143,
"id": "2a987a6c",
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"ani = animate_boards(game.turn_revealed)"
]
},
{
"cell_type": "code",
"execution_count": 144,
"id": "e7579234",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video width=\"576\" height=\"576\" controls autoplay loop>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQAARKBtZGF0AAACrgYF//+q\n",
"3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSByMzAzME0gOGJkNmQyOCAtIEguMjY0L01Q\n",
"RUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMjAgLSBodHRwOi8vd3d3LnZpZGVvbGFu\n",
"Lm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0xIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5h\n",
"bHlzZT0weDM6MHgxMTMgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhl\n",
"ZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTEgY3FtPTAg\n",
"ZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02\n",
"IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50\n",
"ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi\n",
"X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w\n",
"PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj01IHNjZW5lY3V0PTQwIGludHJhX3Jl\n",
"ZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAu\n",
"NjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAS\n",
"9mWIhAAT//73sY+BTcgADZc6inof4RWx9JBRerHZoGTqAAADAAADAABOFqne+b9ctAjWAAAHoACZ\n",
"Byc9/EUe/4AG2qc6+aThpBBRCwKukp7fa/Etl/WEUZs41IlOPXfYIL4Aa8xPnr8xL5GnERvmdsxs\n",
"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\n",
"dmY1OC40NS4xMDA=\n",
"\">\n",
" Your browser does not support the video tag.\n",
"</video>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 144,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"HTML(ani.to_html5_video())"
]
},
{
"cell_type": "markdown",
"id": "90b3d859",
"metadata": {},
"source": [
"With a bit of extra bookeeping, we can also watch the posterior distribution used for Thompson sampling evolve after each turn."
]
},
{
"cell_type": "code",
"execution_count": 145,
"id": "093574c9",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 17/17 [00:09<00:00, 1.83it/s]\n"
]
}
],
"source": [
"game = Battleship(ships[0])\n",
"strat = ThompsonStrategy(all_ships, rng=rng)\n",
"\n",
"posts = []\n",
"\n",
"with tqdm(total=SHIP_SIZES.sum()) as pbar:\n",
" while not game.is_solved:\n",
" post = strat.sample_post(game.revealed, n=1_000)\n",
" i, j = argmax_2d(np.ma.masked_array(\n",
" post, mask=~game.revealed.mask\n",
" ))\n",
"\n",
" hit_or_miss, sunk = game.guess(i, j)\n",
" strat.reveal(i, j, hit_or_miss, sunk)\n",
" \n",
" posts.append(post)\n",
" \n",
" if hit_or_miss == 1:\n",
" pbar.update()"
]
},
{
"cell_type": "code",
"execution_count": 146,
"id": "607a849d",
"metadata": {},
"outputs": [],
"source": [
"%%capture\n",
"ani = animate_boards(posts, cbar=True)"
]
},
{
"cell_type": "code",
"execution_count": 147,
"id": "628ecfbb",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video width=\"576\" height=\"576\" controls autoplay loop>\n",
" <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAIGZ0eXBNNFYgAAACAE00ViBpc29taXNvMmF2YzEAAAAIZnJlZQACem5tZGF0AAACrgYF//+q\n",
"3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2MSByMzAzME0gOGJkNmQyOCAtIEguMjY0L01Q\n",
"RUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMjAgLSBodHRwOi8vd3d3LnZpZGVvbGFu\n",
"Lm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0xIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5h\n",
"bHlzZT0weDM6MHgxMTMgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhl\n",
"ZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTEgY3FtPTAg\n",
"ZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02\n",
"IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50\n",
"ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBi\n",
"X3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29w\n",
"PTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj01IHNjZW5lY3V0PTQwIGludHJhX3Jl\n",
"ZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAu\n",
"NjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAu\n",
"zWWIhAAR//73iB8yy2n5OtdyEeetLq0fUO5GcV6kvf4gAAADAAADAA4SCLMzbu2wEQuAAAICADQi\n",
"VPOG7AQEEYBOTYrpcvzn2E2TFVCXvS6LV0auZBNFwwCPZB/8CagiT+Vpp230TwtlgZosQIqj+rwe\n",
"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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment