{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Riddler Battle Royale\n", "\n", "\n", "\n", "> [538's *The Riddler* Asks](http://fivethirtyeight.com/features/the-battle-for-riddler-nation-round-2/): *In a distant, war-torn land, there are 10 castles. There are two warlords: you and your archenemy, with whom you’re competing to collect the most victory points. Each castle has its own strategic value for a would-be conqueror. Specifically, the castles are worth 1, 2, 3, …, 9, and 10 victory points. You and your enemy each have 100 soldiers to distribute, any way you like, to fight at any of the 10 castles. Whoever sends more soldiers to a given castle conquers that castle and wins its victory points. If you each send the same number of troops, you split the points. You don’t know what distribution of forces your enemy has chosen until the battles begin. Whoever wins the most points wins the war. Submit a plan distributing your 100 soldiers among the 10 castles.*\n", "\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Load some useful modules\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import csv\n", "import random\n", "from collections import Counter\n", "from statistics import mean" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's play with this and see if we can find a good solution. Some implementation choices:\n", "* A `Plan` will be a tuple of 10 soldier counts (one for each castle).\n", "* `castles` will hold the indexes of the castles. Note that index 0 is castle 1 (worth 1 point) and index 9 is castle 10 (worth 10 points).\n", "* `half` is half the total number of points; if you get more than this you win.\n", "* `plans` will hold a set of plans that were submitted in the previous contest.\n", "* `play(A, B)` gives the single game reward for Plan A against Plan B: 1 if A wins, 0 if A loses, and 1/2 for a tie.\n", "* `reward(a, b, payoff)` returns payoff, payoff/2, or 0, depending on whether `a` is bigger than `b`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "Plan = tuple \n", "castles = range(10)\n", "half = 55/2 \n", "plans = {Plan(map(int, row[:10])) \n", " for row in csv.reader(open('battle_royale.csv'))}\n", "\n", "def play(A, B): \n", " \"Play Plan A against Plan B and return a reward (0, 1/2, or 1).\"\n", " A_points = sum(reward(A[c], B[c], c + 1) for c in castles)\n", " return reward(A_points, half) \n", "\n", "def reward(a, b, payoff=1): return (payoff if a > b else payoff / 2 if a == b else 0) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some tests:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "assert reward(6, 5, 9) == 9 # 6 soldiers defeat 5, winning all 9 of the castle's points\n", "assert reward(6, 6, 8) == 4 # A tie on an 8-point castle is worth 4 points\n", "assert reward(6, 7, 7) == 0 # No points for a loss\n", "assert reward(30, 25) == 1 # 30 victory points beats 25\n", "\n", "assert len(plans) == 1202\n", "\n", "assert play((26, 5, 5, 5, 6, 7, 26, 0, 0, 0),\n", " (25, 0, 0, 0, 0, 0, 0, 25, 25, 25)) == 1 # A wins game\n", "\n", "assert play((26, 5, 5, 5, 6, 7, 26, 0, 0, 0),\n", " (0, 25, 0, 0, 0, 0, 0, 25, 25, 25)) == 0 # B wins game\n", "\n", "assert play((25, 5, 5, 5, 6, 7, 26, 0, 0, 0),\n", " (25, 0, 0, 0, 0, 0, 0, 25, 25, 25)) == 1/2 # Tie game" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's run a tournament, playing each plan against every other, and returning a list of `[(plan, mean_game_points),...]`. I will also define `show` to pretty-print these results and display a histogram:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def tournament(plans):\n", " \"Play each plan against each other; return a sorted list of [(plan: mean_points)]\"\n", " rankdict = {A: mean_points(A, plans) for A in plans}\n", " return Counter(rankdict).most_common()\n", "\n", "def mean_points(A, opponents): \n", " \"Mean points for A playing against all opponents (but not against itself).\"\n", " return mean(play(A, B) for B in opponents if B is not A)\n", "\n", "def show(rankings, n=10): \n", " \"Pretty-print the n best plans, and display a histogram of all plans.\"\n", " print('Top', n, 'of', len(rankings), 'plans:')\n", " for (plan, points) in rankings[:n]:\n", " print(pplan(plan), pct(points))\n", " plt.hist([s for (p, s) in rankings], bins=20)\n", " \n", "def pct(x): return '{:6.1%}'.format(x)\n", "def pplan(plan): return '(' + ', '.join('{:2}'.format(c) for c in plan) + ')'" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[((0, 25, 0, 0, 0, 0, 0, 25, 25, 25), 1),\n", " ((26, 5, 5, 5, 6, 7, 26, 0, 0, 0), 0.5),\n", " ((25, 0, 0, 0, 0, 0, 0, 25, 25, 25), 0)]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This is what the result of a tournament looks like:\n", "tournament({(26, 5, 5, 5, 6, 7, 26, 0, 0, 0),\n", " (25, 0, 0, 0, 0, 0, 0, 25, 25, 25),\n", " (0, 25, 0, 0, 0, 0, 0, 25, 25, 25)})" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Top 10 of 1202 plans:\n", "( 0, 3, 4, 7, 16, 24, 4, 34, 4, 4) 85.6%\n", "( 5, 7, 9, 11, 15, 21, 25, 2, 2, 3) 84.1%\n", "( 3, 5, 8, 10, 13, 1, 26, 30, 2, 2) 83.3%\n", "( 2, 2, 6, 12, 2, 18, 24, 30, 2, 2) 83.3%\n", "( 2, 8, 2, 2, 10, 18, 26, 26, 3, 3) 83.2%\n", "( 3, 6, 7, 9, 11, 2, 27, 31, 2, 2) 83.2%\n", "( 1, 1, 1, 5, 11, 16, 28, 29, 3, 5) 82.8%\n", "( 1, 3, 1, 1, 17, 20, 21, 30, 3, 3) 82.6%\n", "( 3, 6, 10, 12, 16, 21, 26, 2, 2, 2) 82.4%\n", "( 6, 6, 6, 11, 20, 21, 21, 3, 3, 3) 82.2%\n" ] }, { "data": { "image/png": "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\n4m8ATnvjYfE5sOcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# A tournament with all 1202 plans:\n", "rankings = tournament(plans)\n", "show(rankings)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It looks like there are a few really bad plans in there. Let's just keep the top 1000 plans (out of 1202), and re-run the rankings:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Top 10 of 1000 plans:\n", "( 0, 3, 4, 7, 16, 24, 4, 34, 4, 4) 87.4%\n", "( 5, 5, 5, 5, 5, 5, 27, 30, 6, 7) 84.8%\n", "( 5, 5, 5, 5, 5, 5, 30, 30, 5, 5) 84.2%\n", "( 3, 3, 5, 5, 7, 7, 30, 30, 5, 5) 84.1%\n", "( 1, 2, 3, 4, 6, 16, 25, 33, 4, 6) 82.5%\n", "( 2, 2, 2, 5, 5, 26, 26, 26, 3, 3) 82.4%\n", "( 1, 1, 1, 5, 11, 16, 28, 29, 3, 5) 82.0%\n", "( 0, 1, 3, 3, 11, 18, 25, 33, 3, 3) 82.0%\n", "( 5, 7, 9, 11, 15, 21, 25, 2, 2, 3) 81.7%\n", "( 0, 0, 5, 5, 25, 3, 25, 3, 31, 3) 81.5%\n" ] }, { "data": { "image/png": "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\nJDXCwJekRvw/BVQV7pgMVw8AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plans = {A for (A, _) in rankings[:1000]}\n", "rankings = tournament(plans)\n", "show(rankings)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The top 10 plans are still winning over 80%, and the top plan remains `(0, 3, 4, 7, 16, 24, 4, 34, 4, 4)`. This is an interesting plan: it places most of the soldiers on castles 4+5+6+8, which totals only 23 points, so it needs to pick up 5 more points from the other castles (that have mostly 4 soldiers attacking each one). Is this a good strategy? Where should we optiomally allocate soldiers? \n", "\n", "To gain some insight, I'll create a plot with 10 curves, one for each castle. Each curve maps the number of soldiers sent to the castle (on the x-axis) to the expected points won (against the 1000 plans) on the y-axis:\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plotter(plans, X=range(41)):\n", " X = list(X)\n", " def mean_reward(c, s): return mean(reward(s, p[c], c+1) for p in plans)\n", " for c in range(10):\n", " plt.plot(X, [mean_reward(c, s) for s in X], '.-')\n", " plt.xlabel('Number of soldiers (on each of the ten castles)')\n", " plt.ylabel('Expected points won')\n", " plt.grid()\n", " \n", "plotter(plans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, this says that for castle 10 (the orange line at top), there is a big gain in expected return as we increase from 0 to 4 soldiers, and after that the gains are relatively less steep. This plot is interesting, but I can't see how to directly read off a best plan from it.\n", "\n", "## Hillclimbing\n", "\n", "Instead I'll see if I can improve the existing plans, using a simple *hillclimbing* strategy: Take a Plan A, and change it by randomly moving some soldiers from one castle to another. If that yields more `mean_points`, then keep the updated plan, otherwise discard it. Repeat." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def hillclimb(A, plans=plans, steps=1000):\n", " \"Try to improve Plan A, repeat `steps` times; return new plan and total.\"\n", " m = mean_points(A, plans)\n", " for _ in range(steps):\n", " B = mutate(A)\n", " m, A = max((m, A), \n", " (mean_points(B, plans), B))\n", " return A, m\n", "\n", "def mutate(plan):\n", " \"Return a new plan that is a slight mutation.\"\n", " plan = list(plan) # So we can modify it.\n", " i, j = random.sample(castles, 2)\n", " plan[i], plan[j] = random_split(plan[i] + plan[j])\n", " return Plan(plan)\n", "\n", "def random_split(n):\n", " \"Split the integer n into two integers that sum to n.\"\n", " r = random.randint(0, n)\n", " return r, n - r" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how well this works. Remember, the best plan so far had a score of `87.4%`. Can we improve on that?" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0, 3, 4, 15, 7, 21, 3, 31, 3, 13), 0.916)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hillclimb((0, 3, 4, 7, 16, 24, 4, 34, 4, 4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We got an improvement. Let's see what happens if we start with other plans:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0, 5, 5, 12, 7, 22, 3, 31, 3, 12), 0.912)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hillclimb((10, 10, 10, 10, 10, 10, 10, 10, 10, 10))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((1, 3, 4, 14, 7, 21, 3, 31, 4, 12), 0.9105)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hillclimb((0, 1, 2, 3, 4, 18, 18, 18, 18, 18))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0, 5, 5, 15, 7, 21, 3, 31, 6, 7), 0.9065)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hillclimb((2, 3, 5, 5, 5, 20, 20, 20, 10, 10))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0, 2, 6, 7, 18, 1, 26, 2, 32, 6), 0.8855)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hillclimb((0, 0, 5, 5, 25, 3, 25, 3, 31, 3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What if we hillclimb 20 times longer?" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((0, 5, 6, 14, 9, 21, 3, 31, 3, 8), 0.9065)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hillclimb((0, 3, 4, 7, 16, 24, 4, 34, 4, 4), steps=20000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Opponent modeling\n", "\n", "To have a chance of winning the second round of this contest, we have to predict what the other entries will be like. Nobody knows for sure, but I can hypothesize that the entries will be slightly better than the first round, and try to approximate that by hillclimbing from each of the first-round plans for a small number of steps:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def hillclimbers(plans, steps=100):\n", " \"Return a sorted list of [(improved_plan, mean_points), ...]\"\n", " pairs = {hillclimb(plan, plans, steps) for plan in plans}\n", " return sorted(pairs, key=lambda pair: pair[1], reverse=True)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[((29, 19, 2, 10, 6, 5, 3, 1, 25, 0), 1),\n", " ((11, 9, 18, 3, 1, 11, 0, 27, 0, 0), 1),\n", " ((0, 25, 0, 0, 0, 0, 0, 25, 25, 25), 1)]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For example:\n", "hillclimbers({(26, 5, 5, 5, 6, 7, 26, 0, 0, 0),\n", " (25, 0, 0, 0, 0, 0, 0, 25, 25, 25),\n", " (0, 25, 0, 0, 0, 0, 0, 25, 25, 25)})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I will define `plans2` (and `rankings2`) to be my estimate of the entries for round 2:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 6min 11s, sys: 3.21 s, total: 6min 14s\n", "Wall time: 6min 17s\n", "Top 10 of 1000 plans:\n", "( 1, 4, 5, 15, 6, 21, 3, 31, 3, 11) 90.8%\n", "( 0, 3, 5, 14, 7, 21, 3, 30, 4, 13) 90.6%\n", "( 0, 4, 6, 15, 9, 21, 4, 31, 5, 5) 90.2%\n", "( 2, 4, 3, 13, 5, 22, 3, 32, 4, 12) 90.1%\n", "( 0, 3, 5, 15, 8, 21, 4, 32, 6, 6) 90.0%\n", "( 0, 3, 5, 15, 6, 24, 3, 31, 5, 8) 90.0%\n", "( 0, 3, 6, 13, 6, 21, 5, 30, 4, 12) 90.0%\n", "( 3, 4, 5, 15, 7, 21, 2, 31, 6, 6) 89.9%\n", "( 2, 3, 3, 13, 6, 21, 3, 30, 5, 14) 89.8%\n", "( 0, 2, 2, 12, 2, 23, 4, 31, 3, 21) 89.8%\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%time rankings2 = hillclimbers(plans)\n", "plans2 = {A for (A, _) in rankings2}\n", "show(rankings2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Even though we only took 100 steps, the `plans2` plans are greatly improved: Almost all of them defeat 75% or more of the first-round `plans`. The top 10 plans are all very similar, targeting castles 4+6+8+10 (for 28 points), but reserving 20 or soldiers to spread among the other castles. Let's look more carefully at every 40th plan, plus the last one:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "( 1, 4, 5, 15, 6, 21, 3, 31, 3, 11) 90.8%\n", "( 0, 6, 3, 13, 3, 22, 2, 32, 4, 15) 88.9%\n", "( 1, 3, 6, 13, 9, 22, 1, 30, 4, 11) 88.3%\n", "( 2, 2, 1, 13, 3, 21, 2, 32, 3, 21) 87.9%\n", "( 0, 2, 5, 5, 15, 2, 28, 31, 5, 7) 87.6%\n", "( 2, 2, 4, 14, 9, 1, 27, 30, 6, 5) 87.3%\n", "( 3, 2, 3, 12, 3, 28, 3, 32, 6, 8) 87.0%\n", "( 1, 3, 2, 5, 18, 3, 26, 3, 33, 6) 86.7%\n", "( 0, 4, 4, 6, 15, 3, 29, 30, 5, 4) 86.5%\n", "( 5, 5, 4, 5, 13, 22, 2, 29, 3, 12) 86.2%\n", "( 5, 6, 5, 6, 16, 24, 26, 1, 5, 6) 85.9%\n", "( 0, 2, 5, 15, 8, 3, 20, 36, 6, 5) 85.7%\n", "( 5, 1, 6, 12, 2, 24, 5, 32, 4, 9) 85.4%\n", "( 2, 5, 8, 16, 11, 3, 2, 36, 5, 12) 85.1%\n", "( 2, 7, 3, 15, 14, 2, 3, 31, 9, 12) 84.8%\n", "( 6, 5, 8, 6, 7, 22, 30, 3, 7, 6) 84.6%\n", "( 5, 3, 3, 5, 3, 21, 26, 26, 3, 5) 84.4%\n", "( 0, 2, 4, 13, 2, 22, 17, 33, 2, 5) 84.0%\n", "( 0, 7, 12, 6, 8, 21, 2, 29, 12, 3) 83.5%\n", "( 5, 5, 4, 13, 18, 2, 26, 2, 6, 19) 83.0%\n", "( 5, 6, 3, 15, 17, 24, 4, 2, 5, 19) 82.5%\n", "( 5, 6, 5, 9, 6, 22, 34, 1, 7, 5) 81.8%\n", "( 4, 3, 7, 17, 17, 22, 3, 3, 5, 19) 81.0%\n", "( 0, 1, 2, 11, 12, 13, 28, 27, 2, 4) 80.4%\n", "( 5, 6, 13, 16, 15, 26, 2, 4, 7, 6) 78.9%\n", "( 0, 0, 1, 13, 0, 1, 24, 21, 36, 4) 70.3%\n" ] } ], "source": [ "for (p, m) in rankings2[::40] + [rankings2[-1]]:\n", " print(pplan(p), pct(m))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see a wider variety in plans as we go farther down the rankings. Now for the plot:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plotter(plans2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that many castles (e.g. 9 (green), 8 (blue), 7 (black), 6 (yellowish)) have two plateaus. Castle 7 (black) has a plateau at 3.5 points for 6 to 20 soldiers (suggesting that 6 soldiers is a good investment and 20 soldiers a bad investment), and then another plateau at 7 points for everything above 30 soldiers.\n", "\n", "Now that we have an estimate of the opponents, we can use `hillclimbers` to try to find a plan that does well against all the others:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 5min 40s, sys: 1 s, total: 5min 41s\n", "Wall time: 5min 42s\n", "Top 10 of 1000 plans:\n", "( 3, 8, 10, 18, 21, 3, 5, 6, 10, 16) 99.9%\n", "( 1, 9, 10, 17, 21, 6, 4, 6, 9, 17) 99.9%\n", "( 1, 8, 10, 18, 21, 4, 4, 6, 11, 17) 99.9%\n", "( 0, 10, 10, 17, 20, 4, 5, 6, 7, 21) 99.9%\n", "( 2, 11, 1, 16, 18, 7, 6, 6, 8, 25) 99.8%\n", "( 1, 8, 11, 19, 20, 4, 6, 5, 7, 19) 99.8%\n", "( 0, 1, 11, 15, 18, 7, 6, 5, 13, 24) 99.8%\n", "( 2, 10, 1, 17, 18, 9, 5, 6, 8, 24) 99.8%\n", "( 1, 9, 10, 17, 19, 4, 6, 6, 9, 19) 99.8%\n", "( 0, 2, 11, 18, 21, 4, 6, 8, 8, 22) 99.8%\n" ] }, { "data": { "image/png": "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\nPqzoGSj/xk4AAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%time rankings3 = hillclimbers(plans2)\n", "show(rankings3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can try even harder to improve the champ:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((3, 9, 10, 17, 21, 3, 5, 6, 7, 19), 1)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "champ, _ = rankings3[0]\n", "hillclimb(champ, plans2, 10000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are some champion plans from previous runs of this notebook:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "champs = {\n", " (0, 1, 3, 16, 20, 3, 4, 5, 32, 16),\n", " (0, 1, 9, 16, 15, 24, 5, 5, 8, 17),\n", " (0, 1, 9, 16, 16, 24, 5, 5, 7, 17),\n", " (0, 2, 9, 16, 15, 24, 5, 5, 8, 16),\n", " (0, 2, 9, 16, 15, 25, 5, 4, 7, 17),\n", " (0, 3, 4, 7, 16, 24, 4, 34, 4, 4),\n", " (0, 3, 5, 6, 20, 4, 4, 33, 8, 17),\n", " (0, 4, 5, 7, 20, 4, 4, 33, 7, 16),\n", " (0, 4, 6, 7, 19, 4, 4, 31, 8, 17),\n", " (0, 4, 12, 18, 21, 7, 6, 4, 8, 20),\n", " (0, 4, 12, 19, 25, 4, 5, 6, 8, 17),\n", " (0, 5, 6, 7, 18, 4, 5, 32, 7, 16),\n", " (0, 5, 7, 3, 18, 4, 4, 34, 8, 17),\n", " (1, 2, 9, 16, 15, 24, 5, 4, 7, 17),\n", " (1, 2, 9, 16, 15, 24, 5, 4, 8, 16),\n", " (1, 2, 11, 16, 15, 24, 5, 4, 7, 15),\n", " (1, 3, 14, 18, 24, 4, 5, 6, 8, 17),\n", " (1, 6, 3, 16, 16, 24, 5, 5, 7, 17),\n", " (2, 3, 7, 16, 16, 25, 5, 5, 8, 13),\n", " (2, 3, 8, 16, 12, 25, 5, 4, 8, 17),\n", " (2, 3, 8, 16, 15, 24, 5, 4, 7, 16),\n", " (2, 3, 8, 16, 15, 25, 4, 5, 8, 14),\n", " (2, 3, 8, 16, 16, 24, 5, 5, 8, 13),\n", " (2, 3, 9, 15, 12, 25, 4, 5, 8, 17),\n", " (2, 3, 9, 16, 12, 24, 5, 5, 8, 16),\n", " (2, 4, 12, 18, 24, 4, 6, 5, 8, 17),\n", " (3, 3, 7, 16, 16, 24, 5, 5, 8, 13),\n", " (3, 3, 8, 16, 12, 25, 4, 4, 8, 17),\n", " (3, 3, 8, 16, 15, 25, 5, 4, 7, 14),\n", " (3, 4, 12, 18, 23, 4, 6, 5, 8, 17),\n", " (3, 4, 15, 18, 23, 4, 5, 6, 8, 14),\n", " (3, 5, 7, 16, 5, 4, 5, 34, 7, 14),\n", " (3, 6, 13, 17, 23, 4, 6, 5, 8, 15),\n", " (4, 3, 12, 18, 23, 4, 5, 6, 8, 17),\n", " (4, 5, 3, 15, 11, 23, 5, 5, 10, 19),\n", " (4, 6, 3, 16, 14, 25, 5, 5, 8, 14),\n", " (4, 6, 3, 16, 16, 24, 5, 5, 7, 14),\n", " (4, 6, 3, 16, 16, 24, 5, 5, 8, 13),\n", " (5, 3, 12, 17, 23, 4, 5, 6, 8, 17),\n", " (5, 5, 3, 16, 12, 25, 4, 5, 8, 17),\n", " (5, 6, 3, 16, 16, 24, 5, 5, 7, 13),\n", " (5, 6, 7, 3, 21, 4, 27, 5, 8, 14),\n", " (5, 6, 8, 3, 18, 4, 27, 5, 8, 16),\n", " (5, 6, 8, 3, 20, 4, 27, 5, 8, 14),\n", " (5, 6, 8, 3, 21, 4, 27, 5, 8, 13)}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can evaluate each of them against the original `plans`, against the improved `plans2`, against their fellow champs, and against all of those put together:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Plan plans plans2 champs all\n", "( 0, 5, 7, 3, 18, 4, 4, 34, 8, 17) 85.5% 96.0% 68.5% 90.2%\n", "( 0, 4, 6, 7, 19, 4, 4, 31, 8, 17) 84.7% 95.0% 63.0% 89.2%\n", "( 0, 1, 3, 16, 20, 3, 4, 5, 32, 16) 85.6% 95.2% 31.5% 89.0%\n", "( 0, 3, 5, 6, 20, 4, 4, 33, 8, 17) 84.1% 95.2% 60.9% 89.0%\n", "( 0, 5, 6, 7, 18, 4, 5, 32, 7, 16) 84.3% 96.3% 28.3% 88.9%\n", "( 3, 5, 7, 16, 5, 4, 5, 34, 7, 14) 85.2% 95.7% 18.5% 88.8%\n", "( 5, 6, 8, 3, 18, 4, 27, 5, 8, 16) 81.8% 96.4% 64.1% 88.6%\n", "( 0, 4, 5, 7, 20, 4, 4, 33, 7, 16) 84.7% 95.0% 18.5% 88.2%\n", "( 5, 6, 8, 3, 20, 4, 27, 5, 8, 14) 82.0% 96.2% 48.9% 88.2%\n", "( 0, 1, 9, 16, 15, 24, 5, 5, 8, 17) 78.2% 98.6% 72.8% 88.0%\n", "( 5, 6, 7, 3, 21, 4, 27, 5, 8, 14) 81.8% 96.0% 51.1% 88.0%\n", "( 0, 1, 9, 16, 16, 24, 5, 5, 7, 17) 79.1% 98.5% 46.7% 87.8%\n", "( 5, 6, 8, 3, 21, 4, 27, 5, 8, 13) 82.0% 95.2% 45.7% 87.6%\n", "( 2, 3, 9, 15, 12, 25, 4, 5, 8, 17) 78.5% 97.9% 58.7% 87.5%\n", "( 4, 5, 3, 15, 11, 23, 5, 5, 10, 19) 76.8% 97.8% 97.8% 87.5%\n", "( 2, 3, 8, 16, 12, 25, 5, 4, 8, 17) 78.2% 98.1% 57.6% 87.5%\n", "( 2, 3, 8, 16, 15, 25, 4, 5, 8, 14) 79.7% 97.9% 31.5% 87.5%\n", "( 0, 2, 9, 16, 15, 24, 5, 5, 8, 16) 78.5% 98.2% 50.0% 87.4%\n", "( 2, 3, 7, 16, 16, 25, 5, 5, 8, 13) 79.3% 97.5% 44.6% 87.4%\n", "( 4, 6, 3, 16, 14, 25, 5, 5, 8, 14) 79.0% 97.4% 48.9% 87.3%\n", "( 5, 5, 3, 16, 12, 25, 4, 5, 8, 17) 78.1% 97.8% 60.9% 87.3%\n", "( 4, 6, 3, 16, 16, 24, 5, 5, 7, 14) 80.3% 97.2% 21.7% 87.3%\n", "( 2, 3, 8, 16, 15, 24, 5, 4, 7, 16) 80.2% 97.8% 10.9% 87.2%\n", "( 1, 2, 9, 16, 15, 24, 5, 4, 7, 17) 79.8% 97.8% 19.6% 87.2%\n", "( 0, 2, 9, 16, 15, 25, 5, 4, 7, 17) 79.1% 97.9% 31.5% 87.2%\n", "( 2, 3, 8, 16, 16, 24, 5, 5, 8, 13) 79.5% 97.5% 29.3% 87.2%\n", "( 2, 3, 9, 16, 12, 24, 5, 5, 8, 16) 78.0% 98.2% 45.7% 87.1%\n", "( 3, 3, 8, 16, 15, 25, 5, 4, 7, 14) 80.3% 97.6% 6.5% 87.1%\n", "( 1, 2, 9, 16, 15, 24, 5, 4, 8, 16) 79.2% 97.6% 27.2% 87.0%\n", "( 3, 3, 7, 16, 16, 24, 5, 5, 8, 13) 79.8% 97.1% 26.1% 87.0%\n", "( 4, 6, 3, 16, 16, 24, 5, 5, 8, 13) 80.0% 96.7% 28.3% 87.0%\n", "( 3, 3, 8, 16, 12, 25, 4, 4, 8, 17) 78.8% 97.8% 28.3% 87.0%\n", "( 5, 6, 3, 16, 16, 24, 5, 5, 7, 13) 80.9% 96.5% 8.7% 86.9%\n", "( 1, 2, 11, 16, 15, 24, 5, 4, 7, 15) 79.9% 97.2% 6.5% 86.7%\n", "( 1, 6, 3, 16, 16, 24, 5, 5, 7, 17) 75.2% 97.9% 41.3% 85.5%\n", "( 5, 3, 12, 17, 23, 4, 5, 6, 8, 17) 64.3% 99.5% 84.8% 82.0%\n", "( 4, 3, 12, 18, 23, 4, 5, 6, 8, 17) 64.0% 99.5% 88.0% 81.9%\n", "( 3, 4, 12, 18, 23, 4, 6, 5, 8, 17) 63.2% 99.5% 88.0% 81.5%\n", "( 2, 4, 12, 18, 24, 4, 6, 5, 8, 17) 63.0% 99.5% 91.3% 81.5%\n", "( 3, 4, 15, 18, 23, 4, 5, 6, 8, 14) 63.4% 99.5% 76.1% 81.3%\n", "( 3, 6, 13, 17, 23, 4, 6, 5, 8, 15) 63.2% 99.4% 78.3% 81.2%\n", "( 1, 3, 14, 18, 24, 4, 5, 6, 8, 17) 62.4% 99.5% 93.5% 81.2%\n", "( 0, 4, 12, 19, 25, 4, 5, 6, 8, 17) 62.1% 99.5% 95.7% 81.1%\n", "( 1, 9, 11, 17, 21, 6, 5, 4, 10, 16) 62.1% 100.0% 76.1% 80.9%\n", "( 0, 4, 12, 18, 21, 7, 6, 4, 8, 20) 61.4% 99.6% 100.0% 80.9%\n", "( 1, 7, 13, 17, 23, 6, 6, 5, 8, 14) 62.4% 99.5% 78.3% 80.9%\n", "( 0, 3, 4, 7, 16, 24, 4, 34, 4, 4) 87.4% 37.6% 0.0% 61.1%\n" ] } ], "source": [ "def μ(plan, plans): return pct(mean_points(plan,plans))\n", "all = plans | plans2 | champs\n", "\n", "print('Plan plans plans2 champs all')\n", "for p in sorted(champs, key=lambda p: -mean_points(p, all)):\n", " print(pplan(p), μ(p, plans), μ(p, plans2), μ(p, champs), μ(p, all))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Which plan is best? In the end, we don't know, because we don't know the pool we will be competing against." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.3" } }, "nbformat": 4, "nbformat_minor": 2 }