Skip to content

Instantly share code, notes, and snippets.

@ecmendenhall
Last active December 15, 2015 08:19
Show Gist options
  • Save ecmendenhall/5229689 to your computer and use it in GitHub Desktop.
Save ecmendenhall/5229689 to your computer and use it in GitHub Desktop.
The n-taps problem: how many beers should you try before switching to your favorite so far?
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "N-Taps problem"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The N-taps Problem\n",
"This week, I was introduced to Hopleaf, a craft beer bar in Chicago with 60 rotating taps. One of my favorite bars in Tucson, 1702, was similar. But every time I visit, I face a dilemma: I usually only visit twice a month, and drink $3\\pm1$ beers each time. As a reformed economist, I insist on optimizing every decision I make, and with each beer I order, I face a trade-off between tasting a new beer of uncertain quality or choosing my favorite so far. If I want to maximize expected utility for each month's visits, what is my best strategy?\n",
"\n",
"Richard Feynman posed [this problem](http://www.feynmanlectures.info/exercises/Feynmans_restaurant_problem.html) in the context of finding the best dish at a new restaurant. Here's a more formal description of what I'll call the \"n-taps\" problem:\n",
"\n",
">Assume a bar has $N$ beers on tap, that can be rated from worst $(1)$ to best $(N)$, according to your personal preference. When you try a new beer, you learn only whether it is the best one you've tried so far. Each time you order a beer, you choose either a new beer or the best beer you've tried so far. Given $N$ taps and $T \\leq N$ beers you plan to drink before the taps rotate, how many new beers $B$ should you try before switching to the best for all your remaining orders, in order to maximize the expected rating of each beer you drink?\n",
"\n",
"I am not so sure, but I am also not as smart as Richard Feynman. So, let's simulate it."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This simulation will use the usual Python suspects for statistics, plots, and data analysis: [Pandas](http://pandas.pydata.org/), [NumPy](http://www.numpy.org/), [Matplotlib](http://matplotlib.org/), and [SciPy](http://www.scipy.org/)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from scipy.stats import ttest_ind\n",
"from pandas import Series, DataFrame\n",
"from collections import defaultdict"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 91
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It seems reasonable to assume that beer quality is distributed normally, such that the top n-quantile is no more than twice the mean. (Is the best beer you can think of more than twice as good as an average one?) This model fits my own experience pretty well: if the average beer has positive utility, I can expect the 60 taps at Hopleaf to contain one or two really good beers, and one or two stinkers with negative utility (at least according to my own preferences).\n",
"\n",
"Let's start with a couple helper functions for building our simulated beer sample. First, one to generate a NumPy array of n normally distributed random samples with a given mean and standard deviation (sigma):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def normal_samples(mean, sigma, n):\n",
" return sigma * np.random.randn(n) + mean"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And one to split a given sample into [quantile](https://en.wikipedia.org/wiki/Quantile) bins:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def quantile_bins(series, qtiles=100):\n",
" step = 1.0 / qtiles\n",
" q = pd.qcut(series, np.arange(0, 1 + step, step))\n",
" return q"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Creating a set of n simulated taps such that they meet our assumptions above is just a matter of picking the right standard deviation. I'll assume an average beer has utility 10, just because it's a nice round number. For this value, a sigma of 4.3 approximates the assumptions we want, so that the best beer will be no more than twice as good as the average. I'm sure this is an easy calculation, but it was even easier to just fiddle with sigma until I found an assumption that worked.\n",
"\n",
"This function returns an n-element Pandas series (like a NumPy array with some extra data-crunching methods) drawn from the simulated beer quality distribution:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def new_taps(n):\n",
" return Series(normal_samples(10, 4.3, n))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def diminishing_utility(n, utility):\n",
" total_utility = 0\n",
" for i in xrange(n):\n",
" total_utility += utility * (0.95 ** i)\n",
" return total_utility"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 65
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have a way to simulate taps, we need a way to simulate beer-picking strategies. Here's a generic class to represent a strategy. It's mostly a data container, except for the `make_strategy` method. This uses a closure to return a utility function based on the parameters passed into the object\u2014number of beers to drink total, and number to taste before switching to the best:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class Strategy(object):\n",
"\n",
" def __init__(self, drink=1, taste=1, name=None):\n",
"\n",
" if taste > drink:\n",
" err = \"\"\"Drink must be <= taste.\n",
" You can't taste more beers than you drink!\"\"\"\n",
" raise Exception(err)\n",
"\n",
" def make_strategy(self, taste, total):\n",
"\n",
" def strategy(taps):\n",
" beers = np.random.choice(taps, taste, replace=False)\n",
" best = beers.max()\n",
" return sum(beers) + diminishing_utility(total - taste, best)\n",
"\n",
" return strategy\n",
"\n",
" self.taste = taste\n",
" self.drink = drink\n",
" self.total_utility = make_strategy(self, self.taste, self.drink)\n",
" if name:\n",
" self.name = name\n",
" else:\n",
" self.name = \"d\" + str(self.drink) + \"t\" + str(self.taste)\n",
"\n",
" def __repr__(self):\n",
" return self.__class__.__name__ + \": drink \" + str(self.drink) + \", taste \" + str(self.taste)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Feynman's strategy shares most of the same methods (so we'll subclass `Strategy`), but the \"beers to taste\" parameter is a function of total beers tried, and shouldn't be settable. And since Feynman's answer (taste $\\sqrt{2(drink + 1)} - 1$) doesn't always return an integer, let's pass in a rounding function (and round down by default):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class FeynmanStrategy(Strategy):\n",
"\n",
" def __init__(self, drink=1, roundfunc=np.floor, name=None):\n",
"\n",
" def make_strategy(self, taste, total):\n",
"\n",
" def strategy(taps):\n",
" beers = np.random.choice(taps, taste, replace=False)\n",
" best = beers.max()\n",
" return sum(beers) + diminishing_utility(total - taste, best)\n",
"\n",
" return strategy\n",
"\n",
" self.taste = int(roundfunc(np.sqrt(2 * (drink + 1)) - 1))\n",
" self.drink = drink\n",
" self.total_utility = make_strategy(self, self.taste, self.drink)\n",
" if name:\n",
" self.name = name\n",
" else:\n",
" self.name = \"d\" + str(self.drink) + \"t\" + str(self.taste)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Two classes and a few functions are almost all we need to start simulating. Here's a function that builds up a Pandas `DataFrame` using a list of strategies, the number of taps in the problem, and a `trials` parameter that sets the number of times to repeat the simulation:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def utility_frame(trials, n_taps, strategies):\n",
" utilities = defaultdict(lambda: np.zeros(trials))\n",
" for i in xrange(trials):\n",
" taps = new_taps(n_taps)\n",
" for strategy in strategies:\n",
" utilities[strategy][i] = strategy.total_utility(taps)\n",
" return DataFrame(utilities)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And here's a way to generate all the possible strategies up to n beers\u2014Feynman strategies that round up and down, and regular \"taste n\" strategies up to the limit:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def all_strategies(n):\n",
" f1 = FeynmanStrategy(n, name=\"feynman_floor\")\n",
" f2 = FeynmanStrategy(n, roundfunc=np.ceil, name=\"feynman_ceil\")\n",
" strategies = [Strategy(n, t) for t in xrange(1, n + 1) \n",
" if Strategy(n, t).taste not in [f1.taste, f2.taste]] + [f1, f2]\n",
" return strategies"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's get simulating. Six beers seems like a reasonable monthly limit, so we'll generate all possible strategies for six or fewer beers."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"strategies = all_strategies(6)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"strategies.sort(key=lambda i: i.taste)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"strategies[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 12,
"text": [
"[Strategy: drink 6, taste 1,\n",
" FeynmanStrategy: drink 6, taste 2,\n",
" FeynmanStrategy: drink 6, taste 3,\n",
" Strategy: drink 6, taste 4,\n",
" Strategy: drink 6, taste 5,\n",
" Strategy: drink 6, taste 6]"
]
}
],
"prompt_number": 12
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, let's generate 100000 sets of 60 taps\u2014like visiting Hopleaf a hundred thousand times. For each set, `utility_frame` also calculates the total utility of each strategy. (This runs reasonably fast for me, but if your machine hangs, you might want to knock off an order of magnitude. I hereby promise the [central limit theorem](https://en.wikipedia.org/wiki/Central_limit_theorem) will still work)."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"us = utility_frame(100000, 60, strategies)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By default, the data table orders strategies alphabetically. Instead, let's sort the columns by number of beers to taste:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"us = us.reindex_axis(sorted(us.columns, key=lambda i: i.taste), axis=1)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And now we can take a look at the first ten rows of the simulated trials:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"us.ix[:10,:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Strategy: drink 6, taste 1</th>\n",
" <th>FeynmanStrategy: drink 6, taste 2</th>\n",
" <th>FeynmanStrategy: drink 6, taste 3</th>\n",
" <th>Strategy: drink 6, taste 4</th>\n",
" <th>Strategy: drink 6, taste 5</th>\n",
" <th>Strategy: drink 6, taste 6</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0 </th>\n",
" <td> 41.124598</td>\n",
" <td> 41.626136</td>\n",
" <td> 45.725952</td>\n",
" <td> 74.027674</td>\n",
" <td> 57.539622</td>\n",
" <td> 43.844883</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1 </th>\n",
" <td> 59.011999</td>\n",
" <td> 59.551950</td>\n",
" <td> 65.648214</td>\n",
" <td> 63.936452</td>\n",
" <td> 57.097529</td>\n",
" <td> 52.661719</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2 </th>\n",
" <td> 25.478626</td>\n",
" <td> 75.814135</td>\n",
" <td> 56.830649</td>\n",
" <td> 68.378966</td>\n",
" <td> 45.658063</td>\n",
" <td> 58.017803</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3 </th>\n",
" <td> 85.992978</td>\n",
" <td> 61.731191</td>\n",
" <td> 66.742727</td>\n",
" <td> 57.013327</td>\n",
" <td> 73.179390</td>\n",
" <td> 39.453565</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4 </th>\n",
" <td> 31.131271</td>\n",
" <td> 39.809711</td>\n",
" <td> 76.701013</td>\n",
" <td> 85.176043</td>\n",
" <td> 62.924234</td>\n",
" <td> 55.272559</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5 </th>\n",
" <td> 42.048012</td>\n",
" <td> 95.454926</td>\n",
" <td> 57.959186</td>\n",
" <td> 75.707770</td>\n",
" <td> 48.185709</td>\n",
" <td> 65.343162</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6 </th>\n",
" <td> 53.725488</td>\n",
" <td> 83.222529</td>\n",
" <td> 86.241436</td>\n",
" <td> 69.603865</td>\n",
" <td> 65.653811</td>\n",
" <td> 59.205119</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7 </th>\n",
" <td> -4.760675</td>\n",
" <td> 41.135795</td>\n",
" <td> 68.381428</td>\n",
" <td> 79.098018</td>\n",
" <td> 70.794334</td>\n",
" <td> 74.161030</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8 </th>\n",
" <td> 94.154980</td>\n",
" <td> 43.023032</td>\n",
" <td> 70.030914</td>\n",
" <td> 76.856671</td>\n",
" <td> 62.975182</td>\n",
" <td> 68.346395</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9 </th>\n",
" <td> 62.171957</td>\n",
" <td> 46.242683</td>\n",
" <td> 94.088839</td>\n",
" <td> 67.359106</td>\n",
" <td> 75.328718</td>\n",
" <td> 76.419966</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td> 53.673610</td>\n",
" <td> 60.001262</td>\n",
" <td> 73.807438</td>\n",
" <td> 65.300583</td>\n",
" <td> 83.958839</td>\n",
" <td> 80.462430</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"output_type": "pyout",
"prompt_number": 15,
"text": [
" Strategy: drink 6, taste 1 FeynmanStrategy: drink 6, taste 2 \\\n",
"0 41.124598 41.626136 \n",
"1 59.011999 59.551950 \n",
"2 25.478626 75.814135 \n",
"3 85.992978 61.731191 \n",
"4 31.131271 39.809711 \n",
"5 42.048012 95.454926 \n",
"6 53.725488 83.222529 \n",
"7 -4.760675 41.135795 \n",
"8 94.154980 43.023032 \n",
"9 62.171957 46.242683 \n",
"10 53.673610 60.001262 \n",
"\n",
" FeynmanStrategy: drink 6, taste 3 Strategy: drink 6, taste 4 \\\n",
"0 45.725952 74.027674 \n",
"1 65.648214 63.936452 \n",
"2 56.830649 68.378966 \n",
"3 66.742727 57.013327 \n",
"4 76.701013 85.176043 \n",
"5 57.959186 75.707770 \n",
"6 86.241436 69.603865 \n",
"7 68.381428 79.098018 \n",
"8 70.030914 76.856671 \n",
"9 94.088839 67.359106 \n",
"10 73.807438 65.300583 \n",
"\n",
" Strategy: drink 6, taste 5 Strategy: drink 6, taste 6 \n",
"0 57.539622 43.844883 \n",
"1 57.097529 52.661719 \n",
"2 45.658063 58.017803 \n",
"3 73.179390 39.453565 \n",
"4 62.924234 55.272559 \n",
"5 48.185709 65.343162 \n",
"6 65.653811 59.205119 \n",
"7 70.794334 74.161030 \n",
"8 62.975182 68.346395 \n",
"9 75.328718 76.419966 \n",
"10 83.958839 80.462430 "
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You might already see a pattern, but we can confirm it by checking out the mean utility of each strategy over our 100,000 trials:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"us.mean()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 16,
"text": [
"Strategy: drink 6, taste 1 50.989950\n",
"FeynmanStrategy: drink 6, taste 2 63.194260\n",
"FeynmanStrategy: drink 6, taste 3 66.899613\n",
"Strategy: drink 6, taste 4 67.449760\n",
"Strategy: drink 6, taste 5 65.003542\n",
"Strategy: drink 6, taste 6 60.029217"
]
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Turns out, Feynman's answer is pretty good! With a six-beer limit, these strategies beat out the others, but not by much. To find out if they're significantly different from the neighbors (like drink 6, taste 4), we'll have to use a t-test. First, let's get the indices of the best Feynman and non-Feynman strategies:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m = us.mean()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"max_strategy = m.idxmax()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"max_strategy_index = m.argmax()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"max_feynman_index = strategies.index([s for s in strategies if s.name.find('feynman') != -1][-1])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ttest_ind(us.ix[:,max_feynman_index], us.ix[:,max_strategy_index])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 21,
"text": [
"(array(-2.6958279984866786), 0.0070272651253899341)"
]
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's significant, at least this time. (The p-value is on the right).\n",
"\n",
"Now we can make a pretty graph. Since you're presumably reading this in iPython, you can go back above and redo the simulation with different parameters. In fact, before we start, let's run another, this time with twice the total beer limit:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"strategies = all_strategies(12)\n",
"strategies.sort(key=lambda i: i.taste)\n",
"\n",
"us = utility_frame(100000, 60, strategies)\n",
"us = us.reindex_axis(sorted(us.columns, key=lambda i: i.taste), axis=1)\n",
"\n",
"m = us.mean()\n",
"\n",
"max_strategy_index = m.argmax()\n",
"max_feynman_index = strategies.index([s for s in strategies if s.name.find('feynman') != -1][-1])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 66
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next cell is mostly style stuff: labeling strategies, making a graph, and adding color."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"colors = ['#369bd2' if s.name in ['feynman_floor', 'feynman_ceil'] else '#839496' for s in strategies]\n",
"colors[max_strategy_index] = '#dc322f'\n",
"\n",
"def show_plot():\n",
" figure(figsize=[10, 5])\n",
" idx = arange(len(m))\n",
" width = .85\n",
" rc(\"font\", size=14)\n",
"\n",
" def short_labels(v):\n",
" if v.__class__ == Strategy:\n",
" return \"S: try \" + str(v.taste)\n",
" else:\n",
" return \"FS: try \" + str(v.taste)\n",
"\n",
" labels = map(lambda l: l if l in ['S: try 1',\n",
" 'S: try 10',\n",
" 'S: try 20',\n",
" 'S: try 25', \n",
" 'S: try 30', \n",
" 'S: try 35',\n",
" 'S: try 40'] else '', map(short_labels, m.index))\n",
" title('Mean utility by strategy (100,000 trials)')\n",
" xticks(idx + 0.5 * width, labels, rotation=90)\n",
" bar(idx, m.values, width, color=colors)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 67
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And here's the result. The red bar represents the optimum strategy, while blue bars are Feynman strategies:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"show_plot()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\nyy/14osvau/evfm2m5ubq+7du+u6667TtGnT9Mknn2jatGlq1KiRHnzwwSKPoahrpfLamzVrpmee\neUZPP/20HnjgAXXo0EGS1KJFC7f+JZHX76abbtIjjzyiWbNm6cknn1TTpk0lSdHR0YqOjtbUqVO1\nbNkyjRw50rVuTk6Oli1bpt69e6t69erF7mvgwIGqX7++pk6dqs2bN+u1117T3r179eGHH0o6+0fp\nzTff1EcffaRevXq51jt69Kg++ugjPfLII0Ue1x133KGtW7dq5MiRCg8P1y+//KKNGzdq9+7datas\nmWbOnKmRI0cqMDBQTz75pCTlCxJTpkxRlSpV9Oijj8oYI39/fx07dkyvvfaaBg0apOHDhyszM1NL\nly5V3759tWbNGnXv3l2S9MYbb+i+++7Tdddd5woCoaGhkqTMzEx16tRJP//8sx588EE1bNhQX3/9\nteuat3nz5kk6+9rp1auXvvnmGz388MNq2rSp3nvvPQ0ZMsStzgEDBmjUqFFavHixWrVq5bZs8eLF\natu2ra655ppCf1f79+/X3r171aZNm8KfsGLkhbvzt1GnTh3Vr19fqampbn0bN26soKAgt75t27aV\nJKWmpqpBgwZF7qsk6+/fv1+//vprgcfVtm1brV69utj6o6Ki5HA4lJqamu/3nqck78Hc3FzFxsbq\nuuuu0wsvvCAvr//703f+6/hCPl/O9euvv6pbt25yOp16/PHHFRwcrJ9//lmrV6/WH3/8IR8fH7fj\n+v333/Wf//xHLVu2LHSbqOA8ev4Mlc65wxivvvqq8ff3N3/88Ycxxpi7777bXH/99caYs8ND5w6T\nffHFF8ayLLN48WK37W3atMlYlmVee+01V1ve9s41ZcoU43A4zN69e11teddwPPvss259o6KiTJs2\nbYo9loYNGxZ4Dc/5Q3xFXf9R0DBCQUOElmWZiRMnun4u6hqs9u3b5xuK+de//mUsyzKrV68u8pjy\n6jl/KObpp582lmWZtWvXGmOMycnJMfXq1TP9+/d36/fqq68ay7LM999/X+g+jhw5YizLMtOmTSuy\nlvNfA3nWr19vLMsyDRo0yPdc5+TkmNOnT7u1nT592lx77bWma9eubu0BAQEFPn+TJ082fn5+ZufO\nnfnaLctytb/zzjvGsiwzffp0V5/c3FzTpUuXfM/3wIEDTZ06ddyG53bu3GksyzKzZ88u8veQN2T2\n3nvvFdmvqCHC559/3liWZf73v//lW9a2bVu310thQ7M//PBDvqG7gpR0/aKG7caOHWssy3I9v3Fx\ncYUOtzmdznyvw/MV9R7M+xx47LHH8i0r6P1Z0s+X89ddtWqVsSzLfPvtt0XWaowxycnJxrIs8+ab\nbxbbFxUXQ4QoM/369dOZM2e0atUqZWZmatWqVYUODy5fvlwBAQGKjY3VoUOHXI9rrrlGTqdT69ev\nd/X19fWVdPZ/pceOHdOhQ4d0ww03yBhT4DDN/fff7/bzjTfeqJ9++snGI720hgwZopSUFO3atcvV\ntnjxYtWqVUs9evQo0Tb+8pe/uP38yCOPSJJrKMbhcOiuu+7S6tWr3YYcFy9erJYtW+raa68tdNu+\nvr7y9vbW+vXrdeTIkRIf1/nuuece13Odx+FwqGrVqpKk06dP67ffftOxY8fUoUMHffvttyXa7vLl\ny9WhQweFhIS4vda6dOkiSfrss88kSR9//LG8vLz0wAMPuNa1LEtxcXH5tjlkyBClp6dr7dq1rrbF\nixfLy8tLAwcOLLKevCHw4ODgEtVfkMzMTElyneU9l4+Pj2t5Xt/C+p27raL2VZL1i6vp/L55z+v5\nqlWrVmxNJfHwww+XqN+Ffr7kqVGjhiRp9erVBQ6tnyvvuT506FCJakLFRMBCmQkODtbNN9+sxYsX\n6/3331dmZqYGDBhQYN9du3bpxIkTCg0NldPpdHv88ssvbtccbd26VT179lRgYKCCg4PldDoVExMj\n6ey1Nefy9vZ2DQ2dW1dp/vB72sCBA1WtWjUtXrxYkvTHH3/o3Xff1cCBA1WlSpUSbSMiIsLt55CQ\nEAUHB7tdPzNkyBBlZWXp7bffliTt2bNHX3zxhe6+++4it12tWjU999xz+vjjjxUaGqoOHTpo6tSp\n2rdv34UcptvtCs41f/58RUZGytfXV7Vq1ZLT6dQrr7xSomvPpLOvtaSkJNWuXdvtdXb99dfLsizX\nLQT27Nmj0NBQ+fn5FVtXbGyswsLCXM+JJC1ZskTdu3dXrVq1SlSXKcX1OHmhoKDrhLKystyCqq+v\nb6H9zt1WUfsqyfrF1XR+3zNnzhS4v/PrvxgOh0MNGzYsUd8L+Xw510033aQ77rhDEydOVEhIiHr3\n7q358+frjz/+yNc377kuzS0iUP5xDRbK1ODBg3XPPffo+PHj6tatW6F/bHJzcxUSEqK33nqrwOV5\n/+M7duyYOnXqpMDAQE2ZMkWNGzeWr6+v9u3bp6FDh+a7SLks7nGTk5Nz0TcntEONGjV06623asmS\nJXrmmWe0atUqnTx5stjgU5zz/8A3bdpUrVu31uLFizVs2DAtWbJElmVp8ODBxW5r1KhR6tOnj957\n7z198sknevbZZzVlyhR98MEHuummm0pUT0F/VJcsWaIRI0aod+/eGj9+vJxOp7y8vLRgwQItXbq0\nxMfZpUsXjR8/vsDlV111lVvfknA4HLrzzjv1yiuv6I8//lBqaqrS0tL097//vdh1894TpQn9derU\nkSQdPHgw3/VTBw8edLu2qU6dOvr555/zbePgwYOSpLp16xa7r5Ksf25NBfUNCgpyPcd5fdPT0xUW\nFubql3eWsriaiuPt7V2i9+yFfr6cb/ny5UpJSdEHH3ygTz75RCNGjNDUqVP11VdfqXbt2q5+ec91\nScM3KiYCFspUnz59VK1aNSUnJxd5U8lGjRpp7dq1uu666+Tv719ov/Xr1+vw4cNauXKl62JWSfrk\nk09srVsq/EzXnj171LhxY9fPZfG/0OK2OWTIEL3zzjv64osvtHjxYl1zzTWui4xLYteuXW7HcOjQ\nIR09ejTf//KHDBmiUaNGad++fVqyZIm6du3q9gewKA0bNtSoUaM0atQo7d+/X3/60580efJkV8C6\nmN/bihUr1KhRI61atcqt/fXXXy/whq4FadSokY4fP17gt/bO1aBBA61bt04nT550e03++OOPBfYf\nMmSIpk2bpnfffVdffPGFgoKC1KdPn2KPKe9LDGlpacX2Lcyf/vQnSVJKSorat2/vaj9w4ID279+v\n++67z9XWqlUrrV+/XkePHnUNa0ly3cA0b1uFKen69erVU+3atZWSkpJvG998843bfvK+HJCSkuL2\npYp///vfys3NLbam4l5LJQ3Kdny+tG3bVm3bttXEiRP18ccfq2fPnpo3b56eeOIJV5+85zrvuUfl\nxBAhypSvr69efvllxcfH67bbbiu038CBA5Wbm+v6avW5cnJydPToUUlyDYGd+z/J3NxcTZ8+vcDt\nlib8NGrUSF999ZXb0MUHH3yQb6gr74/vb7/9dtH7Ol9x2+zRo4ecTqemT5+utWvXXvDZqzlz5rj9\nPGvWLElyfeMzz6BBg+Tl5aXHHntM27dv1z333FPstjMzM/NdM5P3x/bcIRZ/f/8L/p15eXnJnL1/\nn6vtp59+0rvvvpuvb2HbHzBggFJSUgqcruT333/X6dOnJUndu3dXTk6OXn31Vdfy3NxcvfTSSwXW\ndu2116pVq1ZauHChVqxYoX79+snb27vYY6pTp47Cw8MLDCIlFRkZqSZNmmj+/PnKyclxtb/88suS\nzn6rM88dd9yh3Nxcvfbaa662U6dOaeHChWrTpk2R3yC80PVvv/12rVmzxu2M16effqrdu3erX79+\nrrbOnTurZs2arnrPrd/X19d1W4XCFPd+KennwIV+vpzr6NGj+YJcXnA8f2jx22+/VWBgoJo3b16i\nulAxcQYLZe6uu+4qtk+HDh0UFxen559/Xv/5z38UGxuratWq6ccff9Q777yjZ599Vvfcc49uvPFG\nhYSEaMiQIRo5cqS8vLz09ttvu93D6Vylua7lvvvu09tvv63u3burX79++u9//6slS5aoUaNGbttt\n1KiRgoOD9fLLL8vf39/1wRkZGVnotourKyoqSlWqVNHUqVN15MgR+fr6qn379q4zTFWqVNGgQYM0\nc+ZM1wXpF+LAgQPq2bOnbrnlFm3ZskXz58/XzTff7LrQO09ISIh69uypFStWKCAgQH379i122zt3\n7lTnzp3Vv39/NWvWTNWqVdOaNWu0Y8cOTZs2zdWvbdu2mjt3rp555hlFREQoMDCw2D+kvXv31sqV\nK9W7d2/16tVL+/fv18svv6wmTZq43YpAOvuV/7Vr12ratGmqV6+eQkND1alTJ40dO1arV69Wnz59\nNGTIEEVFRSkzM1Nbt27V22+/ra1bt+rKK6/Ubbfdpnbt2mncuHFKS0tTkyZN9P7777v+iBf0R/ue\ne+7Ro48+KsuyLij09unTR2+++aaMMW7bPX78uCv85l1gvXDhQiUlJSk4ONjtgvvnn39evXv3Vmxs\nrAYOHKgffvhBc+bM0bBhw9xei+3atVO/fv00YcIEHTp0SI0bN9Y///lP7dmzR/Pnz3era9GiRRo2\nbJgWLlzouk3Chaz/xBNPaMWKFercubNGjRqlkydP6vnnn1dkZKTbWTUfHx89++yziouL0x133KHu\n3bvr888/dw2Dh4SEFPn7K+49WNLPgQv9fDn/d/XSSy/pz3/+s6666iplZmZq4cKF8vLycgu40tkz\nYr169eIarMru0n9xEZXZwoULjcPhKPRu03kKu5P7ggULTLt27Yyfn5+pXr26ad68uRk7dqzb16O/\n/vprc+ONNxp/f38TFhZm4uLizPfff5/va9pDhw41vr6++faRkJBgHA5HiY5n+vTppn79+sbHx8d0\n6NDBfPfddyYmJiZf7R9++KFp0aKF8fb2Ng6Hw3XLhfj4+Hz7Kmj982/TYMzZ32VERITx8vIyDocj\n31fQN2/ebCzLMjfddFOJjsWY/zv2bdu2mcGDB5ugoCATHBxsRowY4bpj+PneffddY1mWGTJkSIn2\ncfjwYTNy5EjTrFkzExgYaKpXr27atm1rFi5c6Nbvl19+MX369DFBQUHGsiwTHh5ujDl7mwaHw2He\neuutArf//PPPm6uuusr4+PiY5s2bmyVLlhT4nO7evdt07tzZBAQEGMuy3H7nJ0+eNBMmTDBXX321\nqVatmqlVq5aJjo42zz//vNsULocOHTJ33nmnqV69uqlRo4YZMmSI69Yhy5cvz1fbL7/8Yry8vFzH\nUlJ5r9/169e7taelpRnLslwPh8Ph+ndB+3jvvfdMVFSU8fHxMfXr1zcTJkzIN5uCMWfvvD5u3DhT\nt25d4+PjY9q2bWs+/vjjfP1mz55tLMsySUlJF7W+MWdv39C9e3cTEBBgatasae68885CZxKYP3++\nadq0qalWrZpp3LixefHFFwv7leVT2HuwsM8BYwr+LCjp58v5627evNnceeedpmHDhsbHx8c4nU7T\nvXt38/nnn7ttP2+qnLxboqDyKjJgffbZZ6ZXr16mXr16hd7PZOfOnaZv376mRo0axs/Pz0RFRZnt\n27e7lmdlZZm//OUvplatWsbf39/07t3b7Nu3z/4jAS4zW7duNZZlmfnz55fpfj744AP+IJwjL3Am\nJyfnW/bbb7+ZatWqmQkTJlzwdm+++WYzYMAAO0q0Tb9+/cx1113n6TIqlZEjR5rWrVt7ugxcAkVe\ng3Xy5Em1aNFCM2fOlK+vb77TmWlpabrhhhvUqFEjrV+/Xj/88IMmT57sdkfm0aNHa+XKlVq2bJk+\n//xzHT9+XLfeemuJpioBULh58+bJz8/PNa1OWe7niiuuyDd8eDk4f4qTnJwczZ49W0FBQYqKisrX\nPzExUadPny70ruNFmTx5slauXKn//ve/F12vnYwx+uyzzzRp0iRPl1Jp/Prrr3r99df5nV4mLGNK\nNjgdGBiol156ye0i18GDB6tKlSp64403Clzn2LFjcjqdWrRokQYNGiRJ2rdvnxo0aKCPPvpIsbGx\nNhwCcHlZvXq1tm/f7poaZObMmWWyn2XLlmnr1q2aMmWKpk2bpkcffbRM9lOe3XfffcrKylL79u11\n6tQprVy5Ul9++aWmTp2qxx9/3NVv3bp12r59u5566il16NAh39yIAC5DJT3VFRAQ4Db+nJOTYwID\nA83kyZPNzTffbGrXrm3atm3rdt3Ep59+aizLyjcTemRkpImPjy/lyTfg8tSwYUPj6+tr+vTpY44f\nP15m+7EsywQGBpphw4aZ7OzsMttPebZ06VLTunVrExQUZKpVq2auvfZa89JLL+XrFxMTY7y9vU1M\nTAyXQAAwxhRzDda5zg9YBw8eNJZlGX9/f/Piiy+aLVu2mOnTpxsvLy/z4YcfGmOMWbJkifHy8sq3\nrc6dO5sHH3zQvRCJBw8ePHjw4MGjwjyKctH3wcq7huq2227T6NGj1aJFCz366KPq379/vnvslNT/\nD3y2POLj423d3qV8UDv1U3vFeVA7tVN7xXjYXXtxLjpg1apVS15eXmrWrJlbe5MmTVw3lQsLC1NO\nTo5rMtM850+HAAAAUJlcdMDy9vZW27ZttWPHDrf2Xbt2uW6G2Lp1a1WtWlVJSUmu5fv27dOOHTsU\nHR19sbsGAAAo14q8k/vJkye1e/duSWeHBPfs2aPU1FSFhIToiiuu0Lhx49S/f3916NBBnTp10vr1\n6/XWW2+5vkETFBSk4cOHa9y4cXI6napZs6bGjBmjli1bqmvXrmV6YHmzn1dE1O45Fbl+avcMavcM\navcMai+5Im/TsGHDBteEqJZlucYchw4dqgULFkg6e9+XKVOmaO/evbr66qs1fvx4DRgwwLWN06dP\n669//auWLl2qzMxMde3aVXPnzlW9evXcCzln+wAAAOVZcbmlxPfBKmsELAAAUFEUl1su+hosAAAA\nFIyABQAAYDMCFgAAgM0IWAAAADYjYAEAANiMgAUAAGAzAhYAAIDNCFgAAAA2I2ABAADYjIAFAABg\nMwIWAACAzQhYAAAANiNgAQAA2IyABQAAYDMCFgAAgM0IWAAAADYjYAEAANiMgAUAAGAzAhYAAIDN\nCFgAAAA2I2ABAADYjIAFAABgMwIWAACAzQhYAAAANisyYG3cuFG9e/dW/fr15XA4lJiYWGjfBx54\nQA6HQ9OmTXNrP3XqlEaOHKnatWsrICBAffr00f79++2pHgAAoBwqMmCdPHlSLVq00MyZM+Xr6yvL\nsgrs9/bbbyslJUV169bN12f06NFauXKlli1bps8//1zHjx/XrbfeqtzcXPuOAsAlVTMoSJZlldtH\nzaCgQmuvERzs8fqKetQIDr6EzySAsuJV1MIePXqoR48ekqShQ4cW2GfPnj0aPXq0Pv30U3Xv3t1t\n2bFjx7RgwQItWrRIXbp0kSS98cYbatCggdauXavY2FgbDgHApXbk+HH9GNXS02UUqvF3Wwpdduzo\nUT07Z+4lrObCPPWXhz1dAgAblOoarOzsbA0aNEhPPfWUrrnmmnzLv/32W505c8YtSNWvX19NmzZV\ncnJyaXYNVHhBwTU9frakqEdQcE1P/4oAoMIq8gxWceLj4+V0OvXAAw8UuDw9PV1VqlRRSEiIW3to\naKgyMjLy9U9ISHD9OyYmRjExMaUpDyjXjh89onbz/uPpMgr1zf0tPF0CzlMjOFjHjh71dBmFCqpR\nQ0ePHPF0GUCZ2LBhgzZs2FDi/hcdsDZs2KDExESlpqa6tRtjLnaTbgELAOCO4U3Ac84/8TNx4sQi\n+1/0EOFnn32mgwcPqk6dOqpataqqVq2qPXv26PHHH9eVV14pSQoLC1NOTo4OHz7stm56errCwsIu\ndtcAAADl2kUHrIcffljff/+9tmzZoi1btig1NVV169bVmDFj9Omnn0qSWrdurapVqyopKcm13r59\n+7Rjxw5FR0eXvnoAAIByqMghwpMnT2r37t2SpNzcXO3Zs0epqakKCQnRFVdcodq1a7v1r1q1qsLC\nwhQRESFJCgoK0vDhwzVu3Dg5nU7VrFlTY8aMUcuWLdW1a9cyOiQAAADPKvIMVkpKiqKiohQVFaWs\nrCzFx8crKipK8fHxJd7BjBkz1LdvXw0YMEA33nijqlevrtWrVxd6Ty3gQvBNPKBi4P5juNwUeQYr\nJibmgm4ImpaWlq/N29tbs2bN0qxZsy68OqAYfBMPqBi4QB+XG+YiBAAAsBkBCwAAwGYELAAAAJsR\nsAAAAGxGwAIAALAZAQsAAMBmpZrsGQCAyo5JtnExCFgAABSBe3jhYjBECAAAYDPOYF3mOPUNAID9\nCFiXOU59AwBgP4YIAQAAbEbAAgAAsBkBCwAAwGYELAAAAJsRsAAAAGzGtwgBAKikuBWP5xCwAACo\npLgVj+cwRAgAAGAzAhYAAIDNCFgAAAA2I2ABAADYjIAFAABgsyID1saNG9W7d2/Vr19fDodDiYmJ\nrmXZ2dl6/PHH1bJlSwUEBKhu3bq68847tXfvXrdtnDp1SiNHjlTt2rUVEBCgPn36aP/+/WVzNAAA\nAOVAkQGwlepvAAAbQklEQVTr5MmTatGihWbOnClfX19ZluW2bPPmzZowYYI2b96s9957T3v37lX3\n7t2Vk5Pj6jd69GitXLlSy5Yt0+eff67jx4/r1ltvVW5ubtkdFQAAgAcVeR+sHj16qEePHpKkoUOH\nui0LCgpSUlKSW9urr76qyMhI7dixQ5GRkTp27JgWLFigRYsWqUuXLpKkN954Qw0aNNDatWsVGxtr\n46EAAACUD7Zeg3Xs2DFJUnBwsCTp22+/1ZkzZ9yCVP369dW0aVMlJyfbuWsAAIByw7aAdfr0aT32\n2GPq3bu36tatK0lKT09XlSpVFBIS4tY3NDRUGRkZdu0aAACgXLFlqpzs7GzdddddOn78uD744IOL\n3k5CQoLr3zExMYqJiSl9cZcAcz0BAGCv8v63tTilDljZ2dkaNGiQfvjhB23YsME1PChJYWFhysnJ\n0eHDh93OYqWnp6tjx475tnVuwKpImOsJAAB7VfS/raUaIjxz5owGDBigrVu3av369XI6nW7LW7du\nrapVq7pdDL9v3z7t2LFD0dHRpdk1AABAuVXkGayTJ09q9+7dkqTc3Fzt2bNHqampCgkJUd26ddWv\nXz/9+9//1urVq2WMUXp6uiSpRo0a8vHxUVBQkIYPH65x48bJ6XSqZs2aGjNmjFq2bKmuXbuW/dEB\nAAB4QJFnsFJSUhQVFaWoqChlZWUpPj5eUVFRio+P1759+/T+++/r4MGDat26terWret6LF++3LWN\nGTNmqG/fvhowYIBuvPFGVa9eXatXr3a7pxYAAEBlUuQZrJiYmCJvCFqSm4V6e3tr1qxZmjVr1oVX\nBwAAUAExFyEAAIDNCFgAAAA2I2ABAADYjIAFAABgMwIWAACAzQhYAAAANiNgAQAA2IyABQAAYDMC\nFgAAgM0IWAAAADYjYAEAANiMgAUAAGAzAhYAAIDNCFgAAAA2I2ABAADYjIAFAABgMwIWAACAzQhY\nAAAANiNgAQAA2IyABQAAYDMCFgAAgM0IWAAAADYjYAEAANiMgAUAAGCzIgPWxo0b1bt3b9WvX18O\nh0OJiYn5+iQkJKhevXry8/NTp06dtG3bNrflp06d0siRI1W7dm0FBASoT58+2r9/v71HAQAAUI4U\nGbBOnjypFi1aaObMmfL19ZVlWW7Ln3vuOU2fPl1z5sxRSkqKnE6nunXrphMnTrj6jB49WitXrtSy\nZcv0+eef6/jx47r11luVm5tbNkcEAADgYUUGrB49emjSpEm6/fbb5XC4dzXGaMaMGRo/frz69u2r\nyMhIJSYm6vfff9fSpUslSceOHdOCBQv0wgsvqEuXLmrVqpXeeOMN/ec//9HatWvL7qgAAAA86KKv\nwUpLS1NGRoZiY2NdbT4+PurYsaOSk5MlSd9++63OnDnj1qd+/fpq2rSpqw8AAEBlc9EBKz09XZIU\nGhrq1u50Ol3L0tPTVaVKFYWEhLj1CQ0NVUZGxsXuGgAAoFzzKouNnn+tVkklJCS4/h0TE6OYmBh7\nCgIAACiFtN27lLZ7d4n7X3TACgsLkyRlZGSofv36rvaMjAzXsrCwMOXk5Ojw4cNuZ7HS09PVsWPH\nfNs8N2ABAACUF+ERVys84mrXz+vXfFhk/4seIgwPD1dYWJiSkpJcbVlZWdq0aZOio6MlSa1bt1bV\nqlXd+uzbt087duxw9QEAAKhsijyDdfLkSe3+/6fDcnNztWfPHqWmpiokJERXXHGFRo8erSlTpqhJ\nkyaKiIjQpEmTFBgYqMGDB0uSgoKCNHz4cI0bN05Op1M1a9bUmDFj1LJlS3Xt2rXsjw4AAMADigxY\nKSkp6ty5s6Sz11XFx8crPj5eQ4cO1YIFCzRu3DhlZmYqLi5OR44cUfv27ZWUlCR/f3/XNmbMmCEv\nLy8NGDBAmZmZ6tq1qxYvXnzR12kBAACUd0UGrJiYmGJvCJoXugrj7e2tWbNmadasWRdXIQAAQAVT\nJt8ivFjl+axWUI0aOnrkiKfLAAAAFUC5CljPzpnr6RIK9dRfHvZ0CQAAoIK46G8RAgAAoGAELAAA\nAJsRsAAAAGxGwAIAALAZAQsAAMBmBCwAAACbEbAAAABsRsACAACwGQELAADAZgQsAAAAmxGwAAAA\nbEbAAgAAsBkBCwAAwGYELAAAAJsRsAAAAGxGwAIAALAZAQsAAMBmBCwAAACbEbAAAABsRsACAACw\nGQELAADAZgQsAAAAm5UqYGVnZ+uJJ57QVVddJV9fX1111VV66qmnlJOT49YvISFB9erVk5+fnzp1\n6qRt27aVqmgAAIDyrFQBa8qUKXr11Vc1e/Zs7dy5UzNnztTcuXM1depUV5/nnntO06dP15w5c5SS\nkiKn06lu3brpxIkTpS4eAACgPPIqzcopKSnq3bu3brnlFknSlVdeqVtvvVVff/21JMkYoxkzZmj8\n+PHq27evJCkxMVFOp1NLly7ViBEjSlk+AABA+VOqM1g9evTQunXrtHPnTknStm3btH79elfgSktL\nU0ZGhmJjY13r+Pj4qGPHjkpOTi7NrgEAAMqtUp3Bevjhh7Vv3z41bdpUXl5eys7O1oQJE/Tggw9K\nktLT0yVJoaGhbus5nU4dOHAg3/bWrfnQ9e/wiAiFR1xdmvIAAABskbZ7l9J27y5x/1IFrFmzZmnh\nwoVatmyZIiMjtXnzZo0aNUoNGzbUsGHDilzXsqx8bZ173lKacgAAAMpEeMTVbid+1p9zUqggpQpY\nkydP1oQJE9S/f39JUmRkpPbs2aOpU6dq2LBhCgsLkyRlZGSofv36rvUyMjJcywAAACqbUl2DZYyR\nw+G+CYfDIWOMJCk8PFxhYWFKSkpyLc/KytKmTZsUHR1dml0DAACUW6U6g3Xbbbfp73//u8LDw9Ws\nWTNt3rxZL774ooYMGSLp7DDg6NGjNWXKFDVp0kQRERGaNGmSAgMDNXjwYFsOAAAAoLwpVcB68cUX\nVb16dcXFxSkjI0N16tTRiBEj9PTTT7v6jBs3TpmZmYqLi9ORI0fUvn17JSUlyd/fv9TFAwAAlEel\nClj+/v564YUX9MILLxTZLz4+XvHx8aXZFQAAQIXBXIQAAAA2I2ABAADYjIAFAABgMwIWAACAzQhY\nAAAANiNgAQAA2IyABQAAYDMCFgAAgM0IWAAAADYjYAEAANiMgAUAAGAzAhYAAIDNCFgAAAA2I2AB\nAADYjIAFAABgMwIWAACAzQhYAAAANiNgAQAA2IyABQAAYDMCFgAAgM0IWAAAADYjYAEAANiMgAUA\nAGAzAhYAAIDNSh2wDh48qCFDhsjpdMrX11eRkZHauHGjW5+EhATVq1dPfn5+6tSpk7Zt21ba3QIA\nAJRbpQpYR48e1Q033CDLsrRmzRrt2LFDc+bMkdPpdPV57rnnNH36dM2ZM0cpKSlyOp3q1q2bTpw4\nUeriAQAAyiOv0qz8j3/8Q/Xq1dOiRYtcbQ0aNHD92xijGTNmaPz48erbt68kKTExUU6nU0uXLtWI\nESNKs3sAAIByqVRnsFatWqV27dppwIABCg0NVatWrfTSSy+5lqelpSkjI0OxsbGuNh8fH3Xs2FHJ\nycml2TUAAEC5VaozWD/99JPmzp2rMWPG6IknntDmzZs1cuRISVJcXJzS09MlSaGhoW7rOZ1OHThw\nIN/21q350PXv8IgIhUdcXZryAAAAbJG2e5fSdu8ucf9SBazc3Fy1a9dOkydPliS1bNlSu3fv1ksv\nvaS4uLgi17UsK19b5563lKYcAACAMhEecbXbiZ/155wUKkiphgjr1q2rZs2aubU1adJEP//8syQp\nLCxMkpSRkeHWJyMjw7UMAACgsilVwLrhhhu0Y8cOt7Zdu3apYcOGkqTw8HCFhYUpKSnJtTwrK0ub\nNm1SdHR0aXYNAABQbpUqYD366KP66quvNGXKFP34449asWKFZs+e7RoetCxLo0eP1nPPPad3331X\nW7du1dChQxUYGKjBgwfbcgAAAADlTamuwWrTpo1WrVqlJ554Qs8++6waNGigSZMm6aGHHnL1GTdu\nnDIzMxUXF6cjR46offv2SkpKkr+/f6mLBwAAKI9KFbAkqWfPnurZs2eRfeLj4xUfH1/aXQEAAFQI\nzEUIAABgMwIWAACAzQhYAAAANiNgAQAA2IyABQAAYDMCFgAAgM0IWAAAADYjYAEAANiMgAUAAGAz\nAhYAAIDNCFgAAAA2I2ABAADYjIAFAABgMwIWAACAzQhYAAAANiNgAQAA2IyABQAAYDMCFgAAgM0I\nWAAAADYjYAEAANiMgAUAAGAzAhYAAIDNCFgAAAA2I2ABAADYzNaANXXqVDkcDo0cOdKtPSEhQfXq\n1ZOfn586deqkbdu22blbAACAcsW2gPXVV19p3rx5atGihSzLcrU/99xzmj59uubMmaOUlBQ5nU51\n69ZNJ06csGvXAAAA5YotAevYsWO66667tHDhQgUHB7vajTGaMWOGxo8fr759+yoyMlKJiYn6/fff\ntXTpUjt2DQAAUO7YErBGjBihfv366aabbpIxxtWelpamjIwMxcbGutp8fHzUsWNHJScn27FrAACA\ncsertBuYN2+efvrpJ9cZqXOHB9PT0yVJoaGhbus4nU4dOHAg37bWrfnQ9e/wiAiFR1xd2vIAAABK\nLW33LqXt3l3i/qUKWDt37tSTTz6pTZs2qUqVKpLODgueexarMOcGsTyde95SmnIAAADKRHjE1W4n\nftafc1KoIKUaIvzyyy916NAhRUZGqmrVqqpatao2btyouXPnytvbW7Vq1ZIkZWRkuK2XkZGhsLCw\n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\n"
}
],
"prompt_number": 68
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This time \"try 8\" eked out a little more utility than the Feynman strategies. However, I've found that the results aren't reliably significant unless you commit to drinking 28 total beers over your monthly visits, in which case you probably have bigger problems than this one:\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"strategies = all_strategies(29)\n",
"strategies.sort(key=lambda i: i.taste)\n",
"\n",
"us = utility_frame(100000, 60, strategies)\n",
"us = us.reindex_axis(sorted(us.columns, key=lambda i: i.taste), axis=1)\n",
"\n",
"m = us.mean()\n",
"\n",
"max_strategy_index = m.argmax()\n",
"max_feynman_index = strategies.index([s for s in strategies if s.name.find('feynman') != -1][-1])\n",
"\n",
"show_plot()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\nY8d8P3Cys7MVHByst956K8/5Of/5nT59Wu3bt1dAQICmTJmi2rVry9fXV4cOHdLgwYNzXbhsxRg4\nWVlZVz2AYUmoWLGiunXrpqVLl+q5557Te++9p7NnzxYafgpz5Yd8gwYN1Lx5cyUkJOihhx7S0qVL\nZRiGBgwYUGhfI0eOVM+ePfX+++/rk08+0aRJkzRlyhR9+OGHuv3224tUT14frEuXLtXQoUPVo0cP\njRs3Tna7XZ6enlqwYIGWLVtW5PXs0KGDxo0bl+f8mjVrOrUtCpvNpvvuu0+vvvqq/vjjD23fvl0p\nKSn6xz/+Uehzc7aJawn+YWFhkqSjR4/mup7q6NGjTtc6hYWF6ZdffsnVx9GjRyVJN910U6HLKsrz\nL68pr7aBgYGO9zinbWpqqkJDQx3tco5WFlZTYby8vIq0zRZ3/3KlFStWKDk5WR9++KE++eQTDR06\nVFOnTtXXX3+tKlWqONrlvNdFDeC4PhGyYLmePXvK29tbSUlJBQ48WatWLa1fv16tWrWSv79/vu02\nbNigEydOaNWqVY4LXCXpk08+KdG6pfyPeB04cEC1a9d2/G7Ff6OF9Tlo0CC988472rx5sxISElSv\nXj3HhcdFsXfvXqd1OH78uNLT03P9tz9o0CCNHDlShw4d0tKlSxUbG+v0IViQGjVqaOTIkRo5cqQO\nHz6sP/3pT3r++ecdIetqXreVK1eqVq1aeu+995ymv/HGG3kO+pqXWrVq6cyZM3l+m+9y1atX12ef\nfaazZ886/U3u378/z/aDBg3SSy+9pHfffVebN29WYGCgevbsWeg65XyxISUlpdC2+fnTn/4kSUpO\nTlbr1q0d048cOaLDhw/r4Ycfdkxr2rSpNmzYoPT0dMcpLkmOQU5z+spPUZ9ftWpVValSRcnJybn6\n2LJli9Nycr4wkJyc7PRFi//85z/Kzs4utKbC/paKGpZLYv/SsmVLtWzZUhMnTtS6devUtWtXzZs3\nT08//bSjTc57nfPe48bE6UJYztfXV3PnzlVcXJzuuuuufNv169dP2dnZjq9dXy4rK0vp6emS5Dgd\ndvl/lNnZ2Zo+fXqe/V5LAKpVq5a+/vprp9MYH374Ya7TXjkfwCdPnrzqZV2psD67dOkiu92u6dOn\na/369cU+ijVr1iyn32fOnClJjm+C5ujfv788PT3117/+Vbt379bAgQML7TsjIyPXNTQ5H7iXn27x\n9/cv9mvm6ekp89IYf45pP/30k959991cbfPrv2/fvkpOTs7z1ia//fabzp8/L0nq3LmzsrKy9Npr\nrznmZ2dna/bs2XnW1qhRIzVt2lQLFy7UypUrdc8998jLy6vQdQoLC1NERESeYaSoIiMjVb9+fc2f\nP19ZWVmO6XPnzpV06dueOfr06aPs7Gy9/vrrjmnnzp3TwoUL1aJFiwK/WVjc5/fu3Vtr1651OvL1\n6aefat++fbrnnnsc02JiYlSpUiVHvZfX7+vr6xhyIT+FbS9F3Q8Ud/9yufT09FxhLic8XnmacevW\nrQoICFDjxo2LVBeuTxzJQqm4//77C23Ttm1bDRs2TNOmTdOOHTvUqVMneXt7a//+/XrnnXc0adIk\nDRw4ULfddpuCg4M1aNAgjRgxQp6ennr77bedxni63LVc5/Lwww/r7bffVufOnXXPPffov//9r5Yu\nXapatWo59VurVi0FBQVp7ty58vf3d+w8IyMj8+27sLqaNWsmDw8PTZ06VadOnZKvr69at27tONLk\n4eGh/v376+WXX3ZcpF4cR44cUdeuXXXnnXfqu+++0/z583XHHXc4Lv7OERwcrK5du2rlypUqX768\nevXqVWjfP/74o2JiYnTvvfeqYcOG8vb21tq1a7Vnzx699NJLjnYtW7bUnDlz9Nxzz6lOnToKCAgo\n9MO0R48eWrVqlXr06KHu3bvr8OHDmjt3rurXr+80TIF0aTiA9evX66WXXlLVqlUVEhKi9u3ba8yY\nMVq9erV69uypQYMGqVmzZsrIyNDOnTv19ttva+fOnbr55pt111136dZbb9XYsWOVkpKi+vXr64MP\nPnB8kOf1wT1w4EA9+eSTMgyjWMG3Z8+eevPNN2WaplO/Z86ccQTgnIuuFy5cqMTERAUFBTldhD9t\n2jT16NFDnTp1Ur9+/fTDDz9o1qxZeuihh5z+Fm+99Vbdc889Gj9+vI4fP67atWvr3//+tw4cOKD5\n8+c71bVo0SI99NBDWrhwoWMIheI8/+mnn9bKlSsVExOjkSNH6uzZs5o2bZoiIyOdjq75+Pho0qRJ\nGjZsmPr06aPOnTtr48aNjlPiwcHBBb5+hW2DRd0PFHf/cuVrNXv2bN19992qWbOmMjIytHDhQnl6\nejqFXOnSkbHu3btzTdaNrvS/0Igb3cKFC02bzZbvqNQ58hvxfcGCBeatt95q+vn5mRUqVDAbN25s\n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\n"
}
],
"prompt_number": 70
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Although it turns out Feynman's answer is pretty good, I think we can do better. Our existing strategies assume very little outside knowledge. They model selecting beers in a completely random manner, and decisions about when to switch are by formula, not based on past information. What if the first beer you try is fantastic? Let's add a weak assumption: although it might be difficult to judge exact utility, it's possible to put a beer in a general category:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def category(u):\n",
" if u <= 1.4:\n",
" return 'Bud Light'\n",
" elif u > 1.4 and u <= 5.7:\n",
" return 'Not for me'\n",
" elif u > 5.7 and u <= 14.3:\n",
" return 'Pretty good'\n",
" elif u > 1.43 and u <= 18.6:\n",
" return 'Great'\n",
" elif u > 18.7:\n",
" return 'Exceptional'"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 82
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These categories are based on the standard deviation of our beer distribution. \"Bud Light\" and \"Exceptional\" are more than two sigmas from the mean, \"Not for me\" and \"Great\" between one and two, and \"Pretty good\" within one sigma of the mean. Here's a class that's sensitive to these distinctions, and bails out early if it encounters a good enough beer:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class SmartStrategy(Strategy):\n",
" \n",
" def category(u):\n",
" if u <= 1.4:\n",
" return 'Bud Light'\n",
" elif u > 1.4 and u <= 5.7:\n",
" return 'Not for me'\n",
" elif u > 5.7 and u <= 14.3:\n",
" return 'Pretty good'\n",
" elif u > 1.43 and u <= 18.6:\n",
" return 'Great'\n",
" elif u > 18.7:\n",
" return 'Exceptional'\n",
"\n",
" def __init__(self, switch_category, drink=1, taste=1, name=None):\n",
"\n",
" if taste > drink:\n",
" err = \"\"\"Drink must be <= taste.\n",
" You can't taste more beers than you drink!\"\"\"\n",
" raise Exception(err)\n",
"\n",
" def make_strategy(self, taste, total):\n",
"\n",
" def strategy(taps):\n",
" beers = np.random.choice(taps, taste, replace=False)\n",
" utility = 0\n",
" tasted = 0\n",
" best = beers.max()\n",
" for beer in beers:\n",
" utility += beer\n",
" tasted += 1\n",
" if category(beer) == switch_category:\n",
" return utility + diminishing_utility(total - tasted, beer)\n",
" return utility + diminishing_utility(total - tasted, best)\n",
" \n",
" return strategy\n",
"\n",
" self.taste = taste\n",
" self.drink = drink\n",
" self.total_utility = make_strategy(self, self.taste, self.drink)\n",
" if name:\n",
" self.name = name\n",
" else:\n",
" self.name = \"Smart d\" + str(self.drink) + \"t\" + str(self.taste) + \", switch on\" + switch_category"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 83
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, let's add these smart strategies to `all_strategies`. I'll add a set that switch only for exceptional beers, and a set that switch as soon as they taste something pretty good."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def all_strategies(n):\n",
" f1 = FeynmanStrategy(n, name=\"feynman_floor\")\n",
" f2 = FeynmanStrategy(n, roundfunc=np.ceil, name=\"feynman_ceil\")\n",
" strategies = ([Strategy(n, t) for t in xrange(1, n + 1) \n",
" if Strategy(n, t).taste not in [f1.taste, f2.taste]] +\n",
" [SmartStrategy('Pretty good', n, t) for t in xrange(1, n + 1)] +\n",
" [SmartStrategy('Exceptional', n, t) for t in xrange(1, n + 1)] + \n",
" [f1, f2])\n",
" return strategies"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 108
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's run the simulation again (with the 12 beer limit):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"strategies = all_strategies(6)\n",
"strategies.sort(key=lambda i: i.taste)\n",
"\n",
"us = utility_frame(100000, 60, strategies)\n",
"us = us.reindex_axis(sorted(us.columns, key=lambda i: i.taste), axis=1)\n",
"\n",
"m = us.mean()\n",
"\n",
"max_strategy_index = m.argmax()\n",
"max_feynman_index = strategies.index([s for s in strategies if s.name.find('feynman') != -1][-1])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 119
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our graph needs a little tweaking to differentiate different strategies. I'll add slightly darker bars for the two `SmartStrategy` classes, so light gray will indicate a regular `Strategy`, medium gray a strategy switching on \"pretty good,\" and dark gray a strategy switching on \"exceptional.\""
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def assign_color(s):\n",
" if s.name in ['feynman_floor', 'feynman_ceil']: return '#369bd2'\n",
" if s.name.find('Exceptional') != -1: return '#545E60'\n",
" if s.name.find('Pretty good') != -1: return '#697678'\n",
" else: return '#839496'\n",
"\n",
"colors = map(assign_color, strategies)\n",
"colors[max_strategy_index] = '#dc322f'\n",
"\n",
"def show_plot():\n",
" figure(figsize=[10, 5])\n",
" idx = arange(len(m))\n",
" width = .85\n",
" rc(\"font\", size=14)\n",
"\n",
" def short_labels(v):\n",
" if v.__class__ == Strategy:\n",
" return \"S: try \" + str(v.taste)\n",
" else:\n",
" return \"FS: try \" + str(v.taste)\n",
"\n",
" labels = map(lambda l: l if l in ['S: try 1',\n",
" 'S: try 5',\n",
" 'S: try 10',\n",
" 'S: try 15',\n",
" 'S: try 20',\n",
" 'S: try 25', \n",
" 'S: try 30', \n",
" 'S: try 35',\n",
" 'S: try 40'] else '', map(short_labels, m.index))\n",
" title('Mean utility by strategy (100,000 trials)')\n",
" xticks(idx + 0.5 * width, labels, rotation=90)\n",
" bar(idx, m.values, width, color=colors)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 120
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"show_plot()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAFuCAYAAABOeiYFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtcVHX+x/H3GUluIpI6oGhKSplkrXekvJZolpqblpqJ\n3dyKTGtXdy03sEwzf7qWly66Kq2X0i6mZS65urVGGVtimVa68lNTGe94CTTh+/vDH7OOIMxBYBBf\nz8djHg/mO99zvp8zwxzenO+ZM5YxxggAAABec/i6AAAAgEsNAQoAAMAmAhQAAIBNBCgAAACbCFAA\nAAA2EaAAAABsIkABFyE5OVkOh+fbqEuXLuratatHm8Ph0Pjx4yusnv3795f7WLDn3//+t6644gr9\n5z//8XUpl42i3p/lueyBAwcUFBSkjz/+uFRj4tJCgIItCxYskMPhkMPh0Pr164vs07RpUzkcjkIh\n4lK1d+9eJScna9OmTYUesyxLlmWV2FbQXmDLli1KTk7Wzp07y77gSmL27NlKSUkpt/VPnDhRH3zw\nQbmtv6w9/fTT6t+/v5o0aeJu+/HHH/XUU0/p5ptvVnBwsBwOhzZs2HDBdaxYsUKtW7dWUFCQrrrq\nKj377LM6c+ZMoX6nTp3Sn/70J0VGRiooKEjt27dXamqq17XaWX7r1q267bbbVLNmTdWuXVtDhgy5\nYICfN2+emjdvrsDAQEVHR+vll1/2qp7i3oPFudB70c7ydtStW1cPP/yw/vznP5d6TFxCDGDD/Pnz\njWVZJigoyDz66KOFHv/iiy+MZVkmMDDQdO3a1QcVlr309HRjWZZJSUkp9NiZM2fMqVOnPNo6d+5c\naNtPnTplzpw5476/bNkyY1mW+fTTT8u01qSkJGNZlnG5XGW63tKIiYkxXbp0Kbf1BwcHm/vvv7/c\n1l+WMjIyjGVZ5p///KdH+/z58021atVMTEyMad++vbEsy2zYsKHIdaxatcpYlmW6detm5s6da0aO\nHGmqVatmHn744UJ9Bw4caK644gozevRoM2fOHHPTTTcZPz8/r3/fvF1+9+7dpk6dOqZp06ZmxowZ\nZtKkSebKK680LVq0MLm5uR59X3vtNWNZlunfv7/561//ahISEoxlWeaFF14osZ7i3oPFKer96a2C\n95JdW7ZsMZZlmX/84x+lGheXDgIUbCkIUHfddZepU6eO+fXXXz0eHzFihLnuuuvM9ddfX+UC1IIF\nC7zqX1SAOl9BgDr/D+rFulQD1PkB0xs1atQww4YNK01pFe6JJ54w9erVK9R++PBhc/z4cWPMf99b\nFwpQzZs3NzfccIPJy8tzt40bN844HA7z/fffu9s2bNhgLMsyL730krstNzfXNG3a1LRr167EWu0s\n/+ijj5rAwECza9cud9uaNWuMZVlm9uzZ7rZffvnF1K5d2/Tq1ctj+SFDhpigoCBz8ODBYmuy+x48\nceKEV/2KU9oAZYwxLVq0MEOGDLnoGlC5MYWHUhk0aJAOHz6sv//97+62vLw8LV26VPfee2+Ryxhj\nNGPGDLVo0UKBgYEKDw/XQw89pEOHDnn0W7FihXr37q2GDRsqICBAjRs31pgxY3Tq1CmPfsOGDVNg\nYKD27t2rO++8UyEhIXI6nRo9erTy8/NL3IbGjRvr/vvvL9R+7jlM//znP9WuXTtJ0v333++evnzu\nueckeX+exLnnQC1YsEB33323JKlr167udaakpOiZZ55R9erVdeDAgULreOqppxQYGKhjx46VON6h\nQ4c0ePBg1apVS1deeaUeeeQRnTx50v34vffeq7p16xY5/fPb3/5WkZGRMsV8y5PL5dJDDz3kfo0i\nIiLUq1cvbdmyRdLZ53bLli369NNP3dsXFRUl6exz6nA4tHjxYiUnJ+uqq65SUFCQ9uzZo19//VVJ\nSUlq27atrrzySvf00flTdQ6HQydPnlRKSop7/edOGWdnZ+upp57SVVddJX9/fzVp0kQTJkwo9Htx\n6NAh3XfffapZs6bCwsI0bNgwZWRkyOFw6M0335QkzZkzRw6HQxs3biz0PLzyyityOBz68ccfi309\nli9frm7duhVqDwsLU40aNYpdVjo75bt161Y9/PDDHr9vjz32mIwxWrZsmbvtnXfekcPh0PDhw91t\n/v7+evDBB5Wenl7itLGd5d9991316tVLDRs2dLfdcsstuuaaa7R06VJ327p163T48GE9+uijHmMl\nJiYqJydHH3744QXrKek9WLAf2Llzp/r06aPQ0FDdcccdkop+f3q7fynKN998o169esnpdCowMFCN\nGzfW0KFDlZub69Gve/fuWrFiRbHvIVz6/HxdAC5NDRo0UMeOHbV48WLdfvvtkqQ1a9Zo//79GjRo\nkJYsWVJomUcffVTz5s3TsGHD9MQTT2jXrl2aMWOGvvrqK6Wnp8vf31/S2YARGBiokSNHKjQ0VF98\n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\nODjYREREmMTERPPdd98V+hjzsGHDTGBgYKExkpOTjcPh8Gp7pk2bZho0aGACAgJMx44dzTfffGO6\ndOlSqPaPPvrI3HDDDaZ69erG4XC4L0mQlJRUaKyilj//MgbGnH0uo6OjjZ+fn3E4HIU+or1x40Zj\nWZbp3LmzV9tizH+3fcuWLWbw4MEmNDTUhIWFmeHDh7uveH2+999/31iWZRISErwa49ChQ2bEiBGm\nefPmJiQkxNSsWdO0bdvWzJ8/36Pf/v37Td++fU1oaKixLMtERUUZY85exsDhcJi33367yPVPmTLF\nXH311SYgIMC0aNHCLFq0qMjXdNu2baZbt26mRo0axrIsj+f85MmTZty4ceaaa64x/v7+pk6dOiYu\nLs5MmTLF4ytGDh48aO69915Ts2ZNU6tWLZOQkOC+tMbSpUsL1bZ//37j5+fn3hZvFfz+rlu3zqM9\nMzPTWJblvjkcDvfPRY3xwQcfmFatWpmAgADToEEDM27cuELfBmDM2SuHjxkzxtSvX98EBASYtm3b\nmtWrVxfqN2PGDGNZlklNTS3V8sacvbxBz549TY0aNcyVV15p7r333gteCX/u3LnmuuuuM/7+/qZp\n06bmL3/5y4WeskIu9B680H7AmKL3Bd7uX85fduPGjebee+81jRs3NgEBAcbpdJqePXuaf/3rXx7r\nL/gql4JLhqDqKjZANWrUyOPNXXC7/fbbjTFnr5mSlJRk6tevbwIDA02XLl08vlIAQOlt3rzZWJZl\n5s6dW67jfPjhh+zwz1EQKNPS0go9dvjwYePv72/GjRtne709evQw99xzT1mUWGYGDBhg2rdv7+sy\nqpQRI0aY1q1b+7oMVIBiA9TBgweNy+Vy3zZu3GgcDod58803jTHGvPjiiyYkJMS89957ZvPmzebu\nu+829evXv+B/ugC8N3LkSBMcHGyOHTtWruP07dvXXHXVVeU6RmWVk5Pjcf/MmTOmW7duplatWoW+\nDNcYY/7yl78Yy7LMtm3bbI/173//21xxxRVm+/btpa63LOXn5xun02k++eQTX5dSZezfv98EBQWZ\njz/+2NeloAIUew7U+fPSc+bMUWhoqO6++24ZYzR9+nSNHTvWfd5ESkqKnE6nFi9e7PE9SgC8t3Ll\nSm3dulWvvfaafve73ykkJKRcxnnrrbe0efNmrVixwuPcpcvJ448/rtzcXMXGxurUqVN677339MUX\n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\nm/4PX1LHBwaAj0MAAAAASUVORK5CYII=\n"
}
],
"prompt_number": 122
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's mean utility for each strategy (the first `SmartStrategy` is a \"pretty good\" switch):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 121,
"text": [
"SmartStrategy: drink 6, taste 1 55.127067\n",
"SmartStrategy: drink 6, taste 1 55.265760\n",
"Strategy: drink 6, taste 1 55.069213\n",
"FeynmanStrategy: drink 6, taste 2 66.026072\n",
"SmartStrategy: drink 6, taste 2 66.379115\n",
"SmartStrategy: drink 6, taste 2 57.255817\n",
"FeynmanStrategy: drink 6, taste 3 68.831598\n",
"SmartStrategy: drink 6, taste 3 69.328696\n",
"SmartStrategy: drink 6, taste 3 56.491818\n",
"SmartStrategy: drink 6, taste 4 69.165045\n",
"SmartStrategy: drink 6, taste 4 56.091527\n",
"Strategy: drink 6, taste 4 68.179270\n",
"SmartStrategy: drink 6, taste 5 66.791461\n",
"SmartStrategy: drink 6, taste 5 56.044182\n",
"Strategy: drink 6, taste 5 65.041653\n",
"SmartStrategy: drink 6, taste 6 62.810312\n",
"SmartStrategy: drink 6, taste 6 55.990631\n",
"Strategy: drink 6, taste 6 59.936515"
]
}
],
"prompt_number": 121
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And here are the results for a 12 beer total:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"strategies = all_strategies(12)\n",
"strategies.sort(key=lambda i: i.taste)\n",
"\n",
"us = utility_frame(100000, 60, strategies)\n",
"us = us.reindex_axis(sorted(us.columns, key=lambda i: i.taste), axis=1)\n",
"\n",
"m = us.mean()\n",
"\n",
"max_strategy_index = m.argmax()\n",
"max_feynman_index = strategies.index([s for s in strategies if s.name.find('feynman') != -1][-1])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 127
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 128,
"text": [
"SmartStrategy: drink 12, taste 1 96.437151\n",
"SmartStrategy: drink 12, taste 1 96.175565\n",
"Strategy: drink 12, taste 1 96.283702\n",
"SmartStrategy: drink 12, taste 2 100.556718\n",
"SmartStrategy: drink 12, taste 2 120.003372\n",
"Strategy: drink 12, taste 2 119.678124\n",
"SmartStrategy: drink 12, taste 3 99.281673\n",
"SmartStrategy: drink 12, taste 3 131.023567\n",
"Strategy: drink 12, taste 3 130.983441\n",
"FeynmanStrategy: drink 12, taste 4 137.003401\n",
"SmartStrategy: drink 12, taste 4 98.491197\n",
"SmartStrategy: drink 12, taste 4 137.502274\n",
"FeynmanStrategy: drink 12, taste 5 140.472765\n",
"SmartStrategy: drink 12, taste 5 98.130018\n",
"SmartStrategy: drink 12, taste 5 141.221219\n",
"SmartStrategy: drink 12, taste 6 98.076125\n",
"SmartStrategy: drink 12, taste 6 143.094130\n",
"Strategy: drink 12, taste 6 141.930594\n",
"SmartStrategy: drink 12, taste 7 97.909379\n",
"SmartStrategy: drink 12, taste 7 143.455663\n",
"Strategy: drink 12, taste 7 141.643570\n",
"SmartStrategy: drink 12, taste 8 98.039732\n",
"SmartStrategy: drink 12, taste 8 142.688891\n",
"Strategy: drink 12, taste 8 139.830689\n",
"SmartStrategy: drink 12, taste 9 98.022803\n",
"SmartStrategy: drink 12, taste 9 140.788986\n",
"Strategy: drink 12, taste 9 136.724374\n",
"SmartStrategy: drink 12, taste 10 98.083500\n",
"SmartStrategy: drink 12, taste 10 137.951030\n",
"Strategy: drink 12, taste 10 132.395378\n",
"SmartStrategy: drink 12, taste 11 97.952732\n",
"SmartStrategy: drink 12, taste 11 134.319260\n",
"Strategy: drink 12, taste 11 126.845119\n",
"SmartStrategy: drink 12, taste 12 97.978925\n",
"SmartStrategy: drink 12, taste 12 129.414041\n",
"Strategy: drink 12, taste 12 119.945538"
]
}
],
"prompt_number": 128
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"colors = map(assign_color, strategies)\n",
"colors[max_strategy_index] = '#dc322f'\n",
"show_plot()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAF3CAYAAAB5dDWiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlcVPX+x/H3GZEdAZEBxFJTSiX1umaUhhuppebNvRLT\nMotrml3tWhZYLpllbmmluZSaaYtlWZdMzYwWrok3c8luXndITTENVOD8/vAyP0aQbQ4C+no+HvN4\nyDnf7/l+zjAzvD3fM+cYpmmaAgAAgGVs5V0AAADAlYaABQAAYDECFgAAgMUIWAAAABYjYAEAAFiM\ngAUAAGAxAhZQhhISEmSzOb/NoqOj1b59e6dlNptNEyZMuGz1/Pbbb2U+FkrmX//6l6pWrar//Oc/\n5V3KVaOg92dZ9j169Ki8vb316aeflmpMVC4ELFhq8eLFstlsstls2rx5c4Ft6tevL5vNli9kVFaH\nDx9WQkKCtm3blm+dYRgyDKPIZbnLc+3YsUMJCQnat2+f9QVXEHPnztWSJUvKbPuTJ0/Whx9+WGbb\nt9qTTz6p3r17q169eo5lu3fv1ujRo3XrrbfKx8dHNptN33333SW38dFHH6lFixby9vbWtddeq2ee\neUZZWVn52p09e1b/+Mc/FB4eLm9vb910001KTEwsdq0l6b9z50517dpV1apVU1BQkO69995LBvyF\nCxeqUaNG8vLyUkREhGbOnFmsegp7DxbmUu/FkvQvieDgYD344IN6+umnSz0mKhETsNCiRYtMwzBM\nb29v8+GHH863/ptvvjENwzC9vLzM9u3bl0OF1ktOTjYNwzCXLFmSb11WVpZ59uxZp2W33XZbvn0/\ne/asmZWV5fh51apVpmEY5pdffmlprfHx8aZhGGZaWpql2y2NyMhIMzo6usy27+PjY95///1ltn0r\npaSkmIZhmBs3bnRavmjRIrNKlSpmZGSkedNNN5mGYZjfffddgdtYu3ataRiG2aFDB3PBggXmyJEj\nzSpVqpgPPvhgvrb9+/c3q1atao4ZM8acP3++ecstt5hubm7Ffr0Vt/+BAwfMGjVqmPXr1zdnz55t\nTpkyxaxevbrZuHFjMzMz06ntq6++ahqGYfbu3dt84403zNjYWNMwDHPSpElF1lPYe7AwBb0/iyv3\nvVRSO3bsMA3DML/44otSjYvKg4AFS+UGrLvvvtusUaOGef78eaf1I0aMMBs2bGjeeOONV1zAWrx4\ncbHaFxSwLpYbsC7+g+uqyhqwLg6gxeHr62sOHjy4NKVddo8++qgZFhaWb/nvv/9u/vHHH6Zp/v97\n61IBq1GjRmaTJk3M7Oxsx7Lx48ebNpvN/OmnnxzLvvvuO9MwDPOFF15wLMvMzDTr169vtm7dusha\nS9L/4YcfNr28vMz9+/c7lq1bt840DMOcO3euY9mff/5pBgUFmd26dXPqf++995re3t7msWPHCq2p\npO/B06dPF6tdYUobsEzTNBs3bmzee++9LteAio0pQpSJAQMG6Pfff9c///lPx7Ls7GytXLlS99xz\nT4F9TNPU7Nmz1bhxY3l5eSkkJEQPPPCAjh8/7tTuo48+Uvfu3XXNNdfI09NTderU0dixY3X27Fmn\ndoMHD5aXl5cOHz6su+66S35+frLb7RozZoxycnKK3Ic6dero/vvvz7c87zlUGzduVOvWrSVJ999/\nv2N69Nlnn5VU/PM08p6DtXjxYvXt21eS1L59e8c2lyxZoqeeekru7u46evRovm2MHj1aXl5eOnXq\nVJHjHT9+XAMHDlRAQICqV6+u4cOH68yZM47199xzj4KDgwucXvrrX/+q8PBwmYXcZSstLU0PPPCA\n43cUGhqqbt26aceOHZIuPLc7duzQl19+6di/unXrSrrwnNpsNi1fvlwJCQm69tpr5e3trUOHDun8\n+fOKj49Xq1atVL16dcf01MVTgTabTWfOnNGSJUsc2887JZ2enq7Ro0fr2muvlYeHh+rVq6eJEyfm\ne10cP35c9913n6pVq6bAwEANHjxYKSkpstlsevPNNyVJ8+fPl81m09atW/M9D7NmzZLNZtPu3bsL\n/X2sXr1aHTp0yLc8MDBQvr6+hfaVLkwp79y5Uw8++KDT6+2RRx6RaZpatWqVY9m7774rm82mYcOG\nOZZ5eHho6NChSk5OLnJauiT933vvPXXr1k3XXHONY1nHjh11/fXXa+XKlY5lGzZs0O+//66HH37Y\naay4uDhlZGTo448/vmQ9Rb0Hcz8H9u3bpx49esjf31933nmnpILfn8X9fCnIDz/8oG7duslut8vL\ny0t16tTRoEGDlJmZ6dSuc+fO+uijjwp9D6HycyvvAnBlqlWrltq2bavly5frjjvukCStW7dOv/32\nmwYMGKC33347X5+HH35YCxcu1ODBg/Xoo49q//79mj17tr7//nslJyfLw8ND0oUA4uXlpZEjR8rf\n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\nBa7P/R9fenq62rdvLz8/P02ePFn169eXl5eXDh48qMGDB+c7SbksrnGTnZ1d6osTWiEgIEB33nmn\nli1bpmeffVarV6/WmTNnigw+Rbn4D3zDhg3VokULLV26VEOGDNGyZctkGIYGDhxY5LZGjhypnj17\n6sMPP9Tnn3+u5557TpMnT9bHH3+s2267rVj1FPRHddmyZRo2bJh69OihcePGyW63y83NTQsXLtTy\n5cuLvZ8dO3bUuHHjClx/3XXXObUtDpvNpnvuuUevvvqq/vzzT6WkpGjv3r16/vnni+yb+55wJfSH\nhYVJko4cOZLv/KkjR444ndsUFham/fv359vGkSNHJEk1a9Yscqzi9M9bU0Ft/f39Hb/j3LapqakK\nDQ11tMs9SllUTUVxd3cv1nu2pJ8vF1u5cqWSk5P18ccf6/PPP9ewYcM0ZcoUffvttwoODna0y/1d\nFzd8o3IiYKFM9ezZUx4eHkpKSir0opL16tXTunXrdNNNN8nHx+eS7TZs2KDjx4/r/fffd5zMKkmf\nf/65pXVLlz7StW/fPtWvX9/xc1n8L7SobcbGxuq9997T119/raVLl+qGG25wnGRcHD///LPTPhw7\ndkwnT57M97/82NhYjRw5UgcPHtSyZcvUqVMnpz+AhalTp45GjhypkSNH6tChQ/rLX/6iSZMmOQJW\naZ63VatWqV69elq9erXT8jfeeKPAC7oWpF69ejp16lSB39rLq3bt2lq/fr3OnDnj9Jr85ZdfCmwf\nGxurl156SR988IG+/vpr+fv7q2fPnkXuU+6XGPbu3Vtk20v5y1/+IklKTk5WmzZtHMsPHz6sQ4cO\n6YEHHnAsa9asmTZs2KCTJ086prUkOS5gmrutSylu//DwcAUHBys5OTnfNr7//nuncXK/HJCcnOz0\npYp//etfysnJKbKmol5LxQ3KVny+tGrVSq1atdKECRP02WefqVu3bpo/f76efPJJR5vc33Xu7x5X\nJqYIUaa8vLw0b948xcfH66677rpku/79+ysnJ8fx1eq8srOzdfLkSUlyTIHl/Z9kTk6Opk+fXuB2\nXQk/9erV07fffus0dfHxxx/nm+rK/eP7+++/l3qsixW1za5du8put2v69Olat25diY9ezZkzx+nn\nWbNmSZLjG5+5BgwYIDc3Nz3++OPauXOnBg0aVOS2MzIy8p0zk/vHNu8Ui4+PT4mfMzc3N5kXrt/n\n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\n"
}
],
"prompt_number": 132
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Turns out, in any reasonable situation, either switch strategy will blow the others out of the water. If you are going to drink less than about 12 beers per session and think you can accurately determine whether a beer is >1 standard deviation above average, your best strategy is to taste until you find one and then switch. This holds up under diminishing marginal utility, and beats everything else by a significant margin. So the answer is \"taste beers until you find one you like and then drink it for a while but not so long that you stop liking it.\" Thanks, math!"
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment