Add files via upload
This commit is contained in:
1 parent
2807ac61c1
commit
b703a7c38a
1 file changed
+165
-148
+165
-148
@@ -9,17 +9,16 @@
|
||||
" \n",
|
||||
"# Wei-Hwa's Diamond-Buying Game \n",
|
||||
"\n",
|
||||
"Wei-Hwa Huang poses this puzzle (slightly reworded by me): *You are playing a game where you are buying bags of diamonds with coins. You can buy a random bag of diamonds for 12 coins, look in the bag to see how many diamonds there are, and immediately decide whether to keep it or sell it back for 11 coins. You can also, for free, peek at as many random bags as you want, to get an idea of the distribution of diamonds. What is a general strategy for maximizing the number of diamonds in the bags you keep?*\n",
|
||||
"[Wei-Hwa Huang](https://en.wikipedia.org/wiki/Wei-Hwa_Huang) poses this puzzle (slightly reworded by me): *You are playing a game where you are buying bags of diamonds with coins. You can buy a random bag of diamonds for 12 coins, look in the bag to see how many diamonds there are, and immediately decide whether to keep it or sell it back for 11 coins. You can also peek at as many random bags as you want, for free, to get an idea of the distribution of diamonds. What is a general strategy for maximizing the number of diamonds in the bags you keep?*\n",
|
||||
"\n",
|
||||
"## Strategy\n",
|
||||
"## Estimating the Distribution of Bags\n",
|
||||
"\n",
|
||||
"A good strategy starts by peeking at multiple bags to form a discrete probability distribution estimate. The number of peeks you take will depend on how heavy-tailed you think the distribution might be, and on how much patience you have. \n",
|
||||
"A good strategy starts by peeking at multiple bags to form a discrete probability distribution estimate of the number of diamonds per bag. The number of peeks you take will depend on how heavy-tailed you think the distribution might be, and on how much patience you have. \n",
|
||||
"\n",
|
||||
"## Probability Distributions\n",
|
||||
" \n",
|
||||
"I define `ProbDist` as a class to represent a discrete probability distribution as a dict of `{number_of_diamonds: probability}`. \n",
|
||||
" \n",
|
||||
"I also define `normal(mu, sigma, k)` to return a `ProbDist` formed from peeking at `k` random samples from a normal distribution with mean `mu` and standard deviation `sigma` (but limited to non-negative integer values)."
|
||||
"I also define `normal(σ, μ, k)` to return a `ProbDist` formed from peeking at *k* random samples from a normal distribution with standard deviation σ and mean μ (but limited to non-negative integer values)."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -34,6 +33,8 @@
|
||||
"import random\n",
|
||||
"import statistics\n",
|
||||
"\n",
|
||||
"random.seed(99)\n",
|
||||
"\n",
|
||||
"class ProbDist(Counter):\n",
|
||||
" \"\"\"A discrete probability distribution, {item: probability}; sum of probabilities is 1.0\"\"\"\n",
|
||||
" def __init__(self, iterable):\n",
|
||||
@@ -42,10 +43,10 @@
|
||||
" for x in self:\n",
|
||||
" self[x] /= k\n",
|
||||
" \n",
|
||||
"def normal(mu=100, sigma=10, k=1_000) -> ProbDist: \n",
|
||||
"def normal(σ=10, μ=100, k=1_000) -> ProbDist: \n",
|
||||
" \"\"\"Probability distribution formed from k samples from a normal distribution, \n",
|
||||
" 𝓝(mu, sigma); each sample is a non-negative integer.\"\"\" \n",
|
||||
" return ProbDist(max(0, round(random.gauss(mu, sigma))) \n",
|
||||
" with mean μ and standard deviation σ; each sample is a non-negative integer.\"\"\" \n",
|
||||
" return ProbDist(max(0, round(random.gauss(sigma=σ, mu=μ))) \n",
|
||||
" for _ in range(k))\n",
|
||||
"\n",
|
||||
"assert ProbDist([1, 2, 3, 1]) == {1: 0.5, 2: 0.25, 3: 0.25}"
|
||||
@@ -56,9 +57,9 @@
|
||||
"id": "3173b10c-7dc6-4ca2-aa7d-13e209547d9a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Maximizing Expected Number of Diamonds\n",
|
||||
"## Maximizing Expected Value\n",
|
||||
"\n",
|
||||
"Given a discrete probability distribution, and assuming that our task is to optimally maximize the expected (average) number of diamonds, we can define a strategy that, in each situation, chooses to keep a bag or sell it back based on which action has the highest expected value, assuming the optimal strategy continues to be played.\n",
|
||||
"Given a discrete probability distribution, and assuming that our task is to maximize the expected value of the number of diamonds, we can define an optimal strategy that, in each situation, chooses to keep a bag or sell it back based on which action has the highest expected value.\n",
|
||||
"\n",
|
||||
"The function `expectation_fn` returns a function `E` such that `E(c)` returns the expected number of diamonds you can obtain starting with `c` coins under the optimal strategy."
|
||||
]
|
||||
@@ -71,9 +72,10 @@
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def expectation_fn(p:ProbDist, buy=12, sell=11) -> Callable:\n",
|
||||
" \"\"\"Returns a function to compute the optimal expected number of diamonds, given `coins`.\n",
|
||||
" This is 0 if you can't afford a bag, or is the weighted average, over all bag values, of\n",
|
||||
" the probability of the bag times the maximum expectation of keeping the bag or selling it back.\"\"\"\n",
|
||||
" \"\"\"Returns a function to compute the expected number of diamonds, given `coins`,\n",
|
||||
" and assuming optimal choices of keep or sell back. The value is 0 if you can't \n",
|
||||
" afford a bag, or is the sum, over all bag values, of the probability of the bag \n",
|
||||
" times the maximum of the expected value of keeping the bag and the expected value of selling it back.\"\"\"\n",
|
||||
" @functools.lru_cache(None)\n",
|
||||
" def E(coins:int) -> float:\n",
|
||||
" def keep(bag): return bag + E(coins - buy)\n",
|
||||
@@ -90,9 +92,11 @@
|
||||
"id": "ac96e139-6681-4c81-af6a-36ff9100072d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"(Note: Why did I define `expectation_fn` to return the function `E`, rather than to do the computation directly? Because, for efficiency, it is critical to use dynamic programming, caching intermediate results rather than recomputing them again and again. And it is not possible to use `lru_cache` on a function with a mutable, unhashable argument such as a `ProbDist`.)\n",
|
||||
"\n",
|
||||
"## Examing the Results\n",
|
||||
"\n",
|
||||
"Here I define `E` and call `E(121)`. With 121 coins, I can buy ten bags, and sell back one; the expected result is a little more than 10 times 100:"
|
||||
"Here I define an `E` for a particular probability distribution `p` and call `E(121)`. With 121 coins, I can buy ten bags, and sell back one; the expected result is a little more than 10 times the mean of 100:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -104,7 +108,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"1010.1308028938253"
|
||||
"1015.1963478237786"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
@@ -113,7 +117,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"E = expectation_fn(normal(100, 10))\n",
|
||||
"p = normal(10)\n",
|
||||
"E = expectation_fn(p)\n",
|
||||
"E(121)"
|
||||
]
|
||||
},
|
||||
@@ -134,7 +139,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"1014.2406267797492"
|
||||
"1015.7985888235405"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
@@ -143,7 +148,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"E = expectation_fn(normal(100, 10))\n",
|
||||
"p = normal(10)\n",
|
||||
"E = expectation_fn(p)\n",
|
||||
"E(121)"
|
||||
]
|
||||
},
|
||||
@@ -152,7 +158,7 @@
|
||||
"id": "b07e7e0a-9909-401a-b01b-3c49fae783ba",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The expected result for 12 coins is about 100; for 11 coins it is zero."
|
||||
"The expected number of diamonds for 12 coins is about 100; for 13 coins a bit more; for 11 coins it is zero."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -164,7 +170,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"100.08699999999996"
|
||||
"100.28199999999998"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
@@ -179,6 +185,27 @@
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "f7c4de10-5b89-485a-9313-9787a629efef",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"104.20628199999996"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"E(13)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "56845df1-5ef4-4d16-b183-fd8e2ecbbcfe",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
@@ -188,7 +215,7 @@
|
||||
"0"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -209,13 +236,13 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"execution_count": 8,
|
||||
"id": "3ff6635c-170b-43b8-9591-2717d8007eb8",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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NZ91Xbp0sdijeOsQnKLiioK6jz/++GOaNWuGs7MzPj4+3H///Rw5ciTfedzd3Tlx4gS9e/fG3d2dkJAQJk+enO9ztLjv4RapYvjkk08UoHbs2KFyc3PNfvLy8szKjh8/Xjk6Oqrdu3crpZTauHGjsrOzUy+88IKpzKlTpxSgQkJCVIcOHdTq1avV119/rVq3bq0cHBzUtm3bTGUPHTqkvLy8VGRkpPrss8/U+vXr1eTJk5WdnZ2aOXOmqVxaWppq3LixcnNzUy+//LL65Zdf1OrVq9XTTz+tNm3apLKystS6desUoB5++GG1fft2tX37dnXixIlinScpKUn5+/urGjVqqE8++UT99NNP6qGHHlK1atVSgPr1118LvZYzZsxQgKpfv7566aWXVFxcnFqwYIFycnJSo0ePzneNPvnkk3zHANSMGTMsHvOVV15RcXFxaurUqQpQTzzxhGrQoIH6z3/+o+Li4tTo0aMVoFavXm3a/9dffzU9HwMGDFA//PCDWrZsmapTp47y9PRUf//9t6nspk2blKOjo+rYsaP68ssv1bp169SoUaPy1dX4mqlRo4YaO3as+vnnn9WqVavyvV6MkpOTVY0aNVT16tXVe++9p9atW6eeeOIJBagJEyYopZRKTU1V27dvV4GBgap9+/am5zArK8viMfV6veratatycnJSr732mlq/fr2aMWOGql27dr5raKzvqVOnTNuWLFmiXn/9dfX999+rzZs3q6VLl6pmzZqp+vXrq5ycnFK7/tY89ltfE2FhYapnz57qu+++U999952KjIxU3t7e6urVq/kez+3PZ0hIiAoNDTWVW7lypQLUk08+qdavX682bNig3nvvPfXUU09ZvKZFPQ/FfSw1atRQXbt2VatWrVLr1683u/6l9VzGx8erhx9+WAFq3bp1avv27erMmTNq+/btqnfv3srFxcX0GJKTk5VSSj366KPKwcFBTZ48Wa1bt06tWLFCNWjQQAUEBKikpCTTuTp37qx8fHxUSEiIWrx4sfr111/V5s2b1fXr11Xz5s2Vn5+fWrBggdqwYYN66623lJeXl7r33nuVXq83HcP4nEZHR6uvvvpK/fTTT6pLly7K3t7e9Ld35swZ9eSTTypAffPNN6b6pqamFvg81a9fX9WpU0d9/vnnavPmzWr16tVq8uTJpveo+Ph4Vbt2bdWiRQvT8eLj45VSSl29elWNGjVKff7552rTpk1q3bp1asqUKcrOzk4tXbrU7DzG57Fp06ZqxYoVatOmTWr//v2Fvt9a+nvr3Lmz8vX1VXXr1lXvvfeeiouLU4899pgCzM55/vx55evrq2rVqqU+/fRT9dNPP6nhw4ersLAwq96D9+/fr9zd3VVYWJh677331MaNG9WyZcvU4MGDVVpamlJKqaNHjyoPDw8VERGhPvvsM/Xjjz+qIUOGKEDNnTvXdCxL79PWvsdv27ZNaTQa9a9//Uv99NNPatOmTeqTTz5Rw4cPL7T+Sin1zDPPqCVLlqh169apTZs2qYULFyo/Pz+z4xfnmt7p59qGDRuUVqtVHTp0UN98843p89y4/61CQ0PVyJEjTbdff/11pdVq1YwZM9TGjRvVunXr1KJFi0yfu0W99kNDQ1VQUJCqXbu2+vjjj9Wvv/6qdu3aZfFcxfms69y5s+rcuXO+xzpy5EjTe2hRcYWl1/ns2bMVoIYMGaJ+/PFH9dlnn6natWsrLy8v9ddff5mdx9HRUTVs2FC9+eabasOGDeqll15SGo1GzZo1y1SuJO/hlpQoKLT0o9VqzcpmZWWpFi1aqPDwcHX48GEVEBCgOnfubBYMGP+QgoODVWZmpml7Wlqa8vHxUd27dzdti42NVTVr1sz35vfEE08oZ2dnlZKSopRS6uWXX1aAiouLK/BxXLx4Md8HSHHPM23aNKXRaNT+/fvNyvXo0aNYQeG8efPMtj/22GPK2dnZ9GFRkqBw/vz5ZuWaN29u+kMyys3NVdWrV1cDBw40bTP+oURFRZl9WJ0+fVo5ODioRx55xLStQYMGqkWLFio3N9fsXH379lVBQUFKp9MppW6+ZkaMGFHo9TCaPn26AtTOnTvNtk+YMEFpNBp17Ngx07bQ0FDVp0+fIo/5888/K0C99dZbZttfe+01q4LCW+n1epWbm6sSEhIUoNasWWO6706vv7WP3fiaiIyMNPt72rVrlwLUypUrlVJK6XQ6FRwcXODzeWtQ+MQTT6hq1apZfMxFsfQ8FPexREREmAXYBbnT59L4HF28eNFs/5EjRyo3Nzezbdu3b7f4fJ45c0a5uLioqVOnmrZ17txZAWrjxo1mZV9//XVlZ2dn+nJstGrVKgWon376ybQNUAEBAaaARCnDh7SdnZ16/fXXTdveeOONQl+jt7p06ZIC1KJFiwot17hxY4sffLfLy8tTubm56uGHH1YtWrQwuw9QXl5epvdIo8LebwsKCi29dho1aqRiY2NNt5999lml0WjUoUOHzMrFxsZa9R587733qmrVqpm+AFjyr3/9Szk5Oal//vnHbHuvXr2Uq6ur6QtYYUFhUe/xb775pgLMvsyVhE6Line truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 1 Axes>"
|
||||
]
|
||||
@@ -227,12 +254,12 @@
|
||||
"source": [
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"def plot(sigmas=(50, 25, 5), coins=range(45, 76)):\n",
|
||||
" \"\"\"Plot the expected number of diamonds for different sigma/starting coins combinations.\"\"\"\n",
|
||||
" for sigma in sigmas:\n",
|
||||
" E = expectation_fn(normal(100, sigma))\n",
|
||||
"def plot(dist=normal, σs=(50, 25, 5), coins=range(45, 76)):\n",
|
||||
" \"\"\"Plot the expected number of diamonds for different (σ, starting coins) combinations.\"\"\"\n",
|
||||
" for σ in σs:\n",
|
||||
" E = expectation_fn(dist(σ))\n",
|
||||
" vals = [E(c) for c in coins]\n",
|
||||
" plt.plot(coins, vals, 'o:', label=f'sigma={sigma}')\n",
|
||||
" plt.plot(coins, vals, 'o:', label=f'σ = {σ}')\n",
|
||||
" plt.title('Expected number of diamonds for different starting coins and distributions')\n",
|
||||
" plt.legend(); plt.xlabel('starting coins'); plt.ylabel('diamonds'); plt.grid(True)\n",
|
||||
"\n",
|
||||
@@ -244,7 +271,36 @@
|
||||
"id": "946b1ca2-3099-4991-8703-10bbd1d3daec",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"In this plot, the lowest line, corresponding to a standard deviation of 5, has big jumps when we reach 48, 60, and 72 coins, which corresponds to being able to buy 4, 5, and 6 bags. Basically, for standard deviation 5, the strategy with, say, 48 coins is \"buy 4 bags, and keep them, no matter what.\" For distributions with larger standard deviations, the jump is less pronounced, because the strategy with 48 coins is \"if we get 4 good bags, then keep them, but if we get a bad bag at the beginning, sell it back and there is a good chance that a careful selection of 3 bags will result in more diamonds than 4 bags that include the bad one.\""
|
||||
"In this plot, the lowest line, corresponding to a standard deviation of 5, has big jumps when we reach 48, 60, and 72 coins, which corresponds to being able to buy 4, 5, and 6 bags. Basically, for standard deviation 5, the strategy with, say, 48 coins is \"buy 4 bags, and keep them, no matter what.\" For distributions with larger standard deviations, the jump is less pronounced, because the strategy with 48 coins is \"if we get 4 good bags, then keep them, but if we get a bad bag at the beginning, sell it back and there is a good chance that a careful selection of 3 bags will result in more diamonds than 4 bags that include the bad one.\"\n",
|
||||
"\n",
|
||||
"Below we see that sampling from a normal distribution is not critical; we get similar-looking results by sampling from a uniform distribution."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "e5e3d911-912e-4d1b-9c19-e393d6e05af2",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def uniform(w=10, μ=100, k=1_000) -> ProbDist: \n",
|
||||
" \"\"\"Probability distribution formed from k samples from a uniform distribution, \n",
|
||||
" with mean μ and width 4w. Each sample is a non-negative integer.\"\"\" \n",
|
||||
" ints = range(max(0, μ - 2 * w), μ + 2 * w)\n",
|
||||
" return ProbDist(random.choice(ints) for _ in range(k))\n",
|
||||
"\n",
|
||||
"plot(dist=uniform)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -254,12 +310,12 @@
|
||||
"source": [
|
||||
"# Visualizing the Strategy\n",
|
||||
"\n",
|
||||
"Now we know how many diamonds to expect from the optimal strategy, but what **is** the optimal strategy? Is it equivalent to, or similar to, the cutoff strategy, for some cutoff? I'll show scatter plots where each dot indicates a situation where the optimal strategy, given a number of coins and a bag value, is to sell the bag back; each empty space means to keep the bag."
|
||||
"Now we know how many diamonds to expect from the optimal strategy, but what **is** the optimal strategy? "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"execution_count": 10,
|
||||
"id": "f8d70f31-7fd3-47f2-9d7e-642c0e80b605",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
@@ -273,7 +329,7 @@
|
||||
"def scatter(p:ProbDist, coins=range(45, 76)):\n",
|
||||
" \"\"\"Plot (coins, bag value) points for which the optimal action is to sell back.\"\"\"\n",
|
||||
" fn = decision_fn(p)\n",
|
||||
" XY = [(c, x) for c in coins for x in range(max(min(p), 60), max(p) + 1) \n",
|
||||
" XY = [(c, x) for c in coins for x in range(max(min(p), 70), max(p) + 1) \n",
|
||||
" if fn(c, x) == 'sellback']\n",
|
||||
" X, Y = zip(*XY)\n",
|
||||
" plt.scatter(X, Y, marker='.'); \n",
|
||||
@@ -281,15 +337,23 @@
|
||||
" plt.title('Combinations of coins / bag value that should be sold back')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "06dd357a-ceaf-4e73-a03f-e6898d54b6f8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Below is a scatter plot for a distribution with standard deviation of 5, where each dot indicates a situation (the number of coins and the value of the current bag) where the optimal strategy is to sell the bag back. Each non-dot location means to keep the bag."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"execution_count": 11,
|
||||
"id": "ea737adf-801a-4eb2-96db-e84abd46c994",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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tLQ0sWHDBtGvXz9hMBjE77//btouMzNTNGrUSFSrVk28/vrrIjU1VXz++efixRdfFDt27DDb75w5c4QQQly/fl107NhRhIWFiZ9++umux2wJm50SLl68KACIAQMGKNr+yJEjAoAYPXq02eX//e9/BQAxefJk02Xt27cXAMzupGvXrgl3d3dhMBjMGpv9+/cLAOLdd981XVZcwGPHjjXb1+rVqwUAsWrVKrN9WfpjGR8fb/Zks3fvXgHA9AfZkoKCAnHz5k1RrVo18e9//9t0+aefflrmSb5Y6SehLVu2CABi9uzZZtslJycLAGLRokWmy6Kjo4W3t7c4deqU6bKcnBwREBAgRo0aZbqscePGol+/fuUed3kGDBggvLy8xOnTp80u79GjhzAajWaNg6U/3pasWLFCABCLFy8udxtrclDZ++/q1asCgJg/f36Fx2xJv379RJ8+fSrcrriWN27caHb5iBEjhJubm9l9V1JhYaHIz88Xr7/+uggMDBRFRUVCiDt/kACIiRMnmm2/du1aAaDCJ+MDBw6UyaEQQrRo0ULcf//95cYVFBSI/Px88c9//lPce++9ZtdVttm5deuWCAgIKJPHwsJC0bRpU9GiRYu7riU9PV0AEEuXLi1z3dChQwUA8cknn5hd3rNnT1GvXr1yb7O8vAshRKNGjSw2Epa8/fbbAoDZY6S04nz07NnT7PJPPvlEADD9o+H69evCYDCU2e706dPCy8tLDBo0yHSZmmbn8ccfFwaDwazZKCgoEPXr11fc7AAwe+4TQojp06cLAGLXrl1CCGH6x9E777xjtt2ZM2eEwWAQL7/88l33U716dTFmzJhyr7cmX6WbneK/U+X97VDa7ERERIicnBzT5ZmZmSIgIEB06dKl3NiCggKRl5cn4uLizPb/+uuvCwBi27ZtFe53zpw54sSJE6Jhw4aiYcOG4uTJk3c93vLwZSwVvv32WwAoc5q9RYsWaNCgQZlTfOHh4bj//vtNvwcEBCAkJATNmjVDRESE6fIGDRoAgNlLR8WeeOIJs98fe+wxeHh4mI7lbnr16gV3d3fT702aNCmzn5s3b2LixIm455574OHhAQ8PD1SvXh23bt1SdLrUkh07dgAom6dHH30U1apVK5OnZs2aISoqyvS7t7c36tata3acLVq0wNdff41XXnkFO3fuRE5OjuJj6dy5MyIjI80uHzZsGLKzs7Fnzx5rlgYA+Prrr+Ht7W3xdH7J/Rbvp6TycmBJRfdfQEAA6tSpgzlz5mDu3Ln45ZdfUFRUpGgNt27dQmpqquKXsHx8fMxezgWAQYMGoaioCN99953psh07dqBLly7w8/ODu7s79Ho9pk6dimvXruHy5csAgLS0NAB3armLine truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABiQUlEQVR4nO3de3wTVf4//te0TduktJG2UFqgF1zAC60XqKjwAwELUkDYuoqgArpeVtcLijdwgaBCARX4qOsFl5WLol21gpfKxUW6YnGtuC4FFRWp3MqlCEmhpaTt+f3Bt1nSpnSSmclkpq/n48EjdjKvzJx3TiZvcxtJCCFAREREZFJheu8AERERkZbY7BAREZGpsdkhIiIiU2OzQ0RERKbGZoeIiIhMjc0OERERmRqbHSIiIjI1NjtERERkamx2iIiIyNTY7LRg69atuPXWW5GRkYHo6Gi0a9cOl156KebPn4/ffvst6PvjcDggSRIqKytbXfeqq67CVVddpen+fPfdd3A4HCgvL2923aRJk5Cenq7p9oPhP//5DwYOHAi73Q5JkrBo0aKgbDcY919LfvvtN1gsFrz//vstrnPVVVehV69eQdyr4EtPT8ekSZOCvt39+/fD4XDg22+/bXbdpEmT0K5dO1W399JLL2Hp0qWq3d7GjRshSRLeffdd1W7TH5IkweFwtLre0qVLIUmSz+PXmbSoudYanyvkkDPPy8vLIUkSnn32WRX2Tj61txuhyq2YzGuvvYZ77rkHPXv2xCOPPIILLrgAbrcbX3/9NV555RVs3rz5rE8GenvppZc038Z3332HWbNm4aqrrmrW2EyfPh0PPPCA5vugtdtuuw0nTpzA22+/jfbt2wetgQvG/deS1atXIzIyEtdcc41u+9CW7d+/H7NmzUJ6ejouvvhizbf30ksvITExUZfGjiiY2Ow0sXnzZtx9993IycnBqlWrEBUV5bkuJycHU6ZMwZo1a3Tcw9ZdcMEFum7/3HPP1XX7atm2bRvuuOMODB8+PKjb1fP+e/fdd5Gbmwur1arbPhARqY1vYzUxZ84cSJKExYsXezU6jSIjI3Httdd6/m5oaMD8+fNx3nnnISoqCh07dsSECROwd+9er1zjS/+bN2/GlVdeCavVivT0dLz++usAgI8//hiXXnopbDYbMjMzW2yo9uzZg7y8PMTFxcFut+Pmm2/G4cOHm23rzLdBznw5cMGCBcjIyEC7du1wxRVX4Msvv/TKfv3117jxxhuRnp7u2cdx48bh119/9ayzdOlSXH/99QCAQYMGQZIkSJLkeTnc19tYJ0+exNSpU5GRkYHIyEh07twZf/7zn3Hs2DGv9dLT0zFy5EisWbMGl156KaxWK8477zz8/e9/91qvuroaDz/8sOdtxvj4ePTp0wdvvfWWz7qdadu2bRg9ejTat2+P6OhoXHzxxVi2bJnX+CRJQl1dHV5++WXP+M6mtrYWTz75JM4//3xER0cjISEBgwYNQklJid81UHL//fLLL7jxxhuRkpKCqKgoJCUlYciQIT7fFmnK5XLh008/xXXXXdfqugDw+eef4/LLL4fVakXnzp0xffp01NfXe60za9Ys9O3bF/Hx8YiLi8Oll16KJUuWoOn5h2trazFlyhR06tQJNpsNAwYMwJYtW1p9md3tdqNjx4645ZZbml137NgxWK1WPPTQQwBO13/KlCm4+OKLYbfbER8fjyuuuAKrV69udawtve3R+LbNxo0bvZZ/+umnGDJkCOLi4mCz2dCvXz/885//POs2Nm7ciOzsbADArbfe6pl3Td+W+fnnn5Gbm4t27dqha9eumDJlCmpra73WkVP39PR0bN++HcXFxZ5ttfbq5TvvvIO+ffvCbrfDZrOhW7duuO2225qt53a78cQTTyAlJQVxcXG4+uqrsWPHjmbr/f3vf8dFF13keQz//ve/x/fff++1Tktv68p9u/zLL79Ev379EB0djZSUFEydOhVut7vV3Jm2b9+OIUOGICYmBh06dMC9996L6upqr3WEEHjppZdw8cUXw2q1on379vjDH/6AX375pdXbP3z4MO6880507doVUVFR6NChA/r164dPP/3Uaz059fLF7Xbj0Ucf9Ty++vfvj6+++sqvGjQ0NGD27NlITU1FdHQ0+vTp02xO//zzz7j11lvRvXt32Gw2dO7cGaNGjUJZWVmz2zt27BimTJmCbt26eZ47c3Nz8cMPP5x1HBMnTkS7du3w0Ucf+bX/EORRV1cnbDab6Nu3r+zMnXfeKQCIe++9V6xZs0a88sorokOHDqJr167i8OHDnvUGDhwoEhISRM+ePcWSJUvE2rVrxciRIwUAMWvWLJGZmSneeustUVRUJC6//HIRFRUl9u3b58nPnDlTABBpaWnikUceEWvXrhULFiwQMTEx4pJLLhGnTp3y2tbAgQM9f+/atUsAEOnp6eKaa64Rq1atEqtWrRKZmZmiffv24tixY55133nnHTFjxgzx/vvvi+LiYvH222+LgQMHig4dOnjGc+jQITFnzhwBQPz1r38VmzdvFps3bxaHDh0SQggxceJEkZaW5rnNhoYGMWzYMBERESGmT58u1q1bJ5599lnPvp88edKzblpamujSpYu44IILxPLly8XatWvF9ddfLwCI4uJiz3p33XWXsNlsYsGCBeKzzz4TH330kZg7d6544YUXznp//fDDDyI2Nlace+65Yvny5eLjjz8W48aNEwDEvHnzPOPbvHmzACD+8Ic/eMbXErfbLQYNGiQiIiLEww8/LIqKisQHH3wgpk2bJt566y2/a6Dk/uvZs6f43e9+J1asWCGKi4vFe++9J6ZMmSI+++yzs9ZFCCHeeOMNERUVJVwu11nXa5zLKSkp4vnnnxdr164V999/vwAg/vznP3utO2nSJLFkyRKxfv16sX79evHUU08Jq9UqZs2a5bXeuHHjRFhYmHj88cfFunXrxKJFi0TXrl2F3W4XEydOPOv+PPjgg8JqtQqn0+m1/KWXXhIAxNatW4UQQhw7dkxMmjRJrFixQmzYsEGsWbNGPPzwwyIsLEwsW7bMK5uWlua13ddff10AELt27fJa77PPPhMAvOq7YsUKIUmSGDNmjCgsLBQffvihGDlypAgPDxeffvppi+NwOp2e7fzlL3/xzLs9e/YIIU4/riIjI8X5558vnn32WfHpp5+KGTNmCEmSmtVTTt2/+eYb0a1bN3HJJZd4tvXNN9+0uH8lJSVCkiRx4403iqKiIrFhwwbx+uuvi1tuuaVZPdLT08VNN90kPv74Y/HWW2+J1NRU0b17d1FXV+dZt/EYMm7cOPHxxx+L5cuXi27dugm73S5+/PFHz3pNHw+Nmh5nhBACgJg5c6bn7+3btwubzSYuuOAC8dZbb4nVq1eLYcOGidTUVJ/3p69tREZGitTUVDF79myxbt064XA4REREhBg5cqTXunfccYewWCxiypQpYs2aNWLlypXivPPOE0lJSeLAgQNn3c6wYcNEhw4dxOLFi8XGjRvFqlWrxIwZM8Tbb7/td70anyuajkOSJPHII4+IdevWiQULFojOnTuLuLi4Vh9fjcefrl27iv79+4v33ntPvPPOOyI7O1tYLBZRUlLiWbe4uFhMmTJFvPvuu6K4uFi8//77YsyYMcJqtYoffvjBs57L5RIXXnihiImJEU8++aRYu3ateO+998QDDzwgNmzY4LXdZ555RgghxNGjR8WgQYNEp06dxNdff33WffaFzc4ZDhw4IACIG2+8Udb633//vQAg7rnnHq/l//73vwUAMW3aNM+ygQMHCgBed9KRI0dEeHi4sFqtXo3Nt99+KwCI559/3rOscQI/+OCDXtt68803BQDxxhtveG3L15NlZmam18Hmq6++EgA8T8i+1NXViePHj4uYmBjxf//3f57l77zzTrODfKOmB6E1a9YIAGL+/Ple6xUUFAgAYvHixZ5laWlpIjo6Wvz666+eZTU1NSI+Pl7cddddnmW9evUSY8aMaXG/W3LjjTeKqKgosXv3bq/lw4cPFzabzatx8PXk7cvy5csFAPHaa6+1uI4/NQj0/qusrBQAxKJFi1rdZ1/GjBkjRo0a1ep6jXN59erVXsvvuOMOERYW5nXfnam+vl643W7x5JNPioSEBNHQ0CCEOP2EBEA89thjXuu/9dZbAkCrB+OtW7c2q6EQQlx22WWid+/eLebq6uqE2+0Wf/zjH8Ull1zidV2gzc6JEydEfHx8szrW19eLiy66SFx22WVnHUtpaakAIF5//fVm102cOFEAEP/4xz+8lufm5oqePXu2eJst1V0IIS688EKfjYQvzz77rADg9RhpqrEeubm5Xsv/8Y9/CACe/2k4evSosFqtzdbbvXu3iIqKEuPHj/csU9LsjB07VlitVq9mo66uTpx33nmymx0AXsc+IYSYPXu2ACA2bdokhBCe/zl67rnnvNbbs2ePsFqt4tFHHz3rdtq1aycmT57c4vX+1Ktps9P4PNXSc4fcZiclJUXU1NR4lrtcLhEfHy+uvvrqFrN1dXXi1KlTonv37l7bf/LJJwUAsX79+la3+8wzz4hdu3aJCy64QFxwwQWivLz8rPvbEr6NpcBnn30GAM1eZr/ssstw/vnnN3uJLzk5Gb179/b8HR8fj44dO+Liiy9GSkqKZ/n5558PAF5vHTW66aabvP6+4YYbEBER4dmXsxkxYgTCw8M9f2dlZTXbzvHjx/HYY4/hd7/7HSIiIhAREYF27drhxIkTsl4u9WXDhg0Amtfp+uuvR0xMTLM6XXzxxUhNTfX8HR0djR49enjt52WXXYZPPvkEjz/+ODZu3IiamhrZ+zJkyBB07drVa/mkSZNQXV2NzZs3+zM0AMAnn3yC6Ohony/nn7ndxu2cqaUa+NLa/RcfH49zzz0XzzzzDBYsWID//Oc/aGhokDWGEydOYO3atbLfwoqNjfV6OxcAxo8fj4aGBvzLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 1 Axes>"
|
||||
]
|
||||
@@ -299,7 +363,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"scatter(normal(100, 5))"
|
||||
"p = normal(5)\n",
|
||||
"scatter(p)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -307,20 +372,20 @@
|
||||
"id": "c45ef1a0-6748-46a0-a135-5617d2bcf687",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This shows, for example, that with 48 coins there is no bag value that should be sold back; it is always better to get 4 bags than to sell one back and be left with only 3 bags. But with each extra coin, we can afford to be more picky, and the bag value that we sell back increases, until we get up to 60 coins, where again the best action is to keep all 5 bags.\n",
|
||||
"This shows, for example, that with 48 coins there are *no* bag values that should be sold back; it is always better to get 4 bags than to sell one back and be left with only 3 bags. But with each extra coin, we can afford to be more picky, and the bag value that we sell back increases. For example, with 59 coins, we should sell back any bag of 102 diamonds or less. When we get up to 60 coins the best action is to keep all 5 bags.\n",
|
||||
"\n",
|
||||
"However, with a larger standard deviation we get a different scatter plot:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": 12,
|
||||
"id": "50b2ab97-4323-44e7-a5dd-d6bf730cc45f",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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VKmSaNmypbh7967Fc3Xo0MH8+6lTpwQAERkZKR599FGxYcMGsWHDBtG0aVMREBAgbty4YV72008/FRMnThTr168XKSkp4uOPPxYdOnQQVatWNW/PlStXxJQpUwQA8e9//1vs2bNH7NmzR1y5ckUIIcTgwYNFrVq1zI9ZUFAgunXrJtzc3MSECRPEtm3bxMyZM83rfufOHfOytWrVEjVq1BCNGjUSy5cvF1u3bhX9+vUTAERKSop5uREjRggfHx8xa9Ys8c0334hNmzaJadOmiblz55b5ev3666/C19dX1K1bVyxfvlx89dVXYsCAAQKASE5ONm/fnj17BADx+OOPm7evNLm5uaJTp07Czc1NvPLKK2Lz5s3iiy++EG+88YZYs2aN1TVQ8/rVr19f/O1vfxMrVqwQKSkp4vPPPxdjx44V33zzTZl1EUKIlStXCk9PT5GZmVnmcoVjOTw8XLz33nti69at4qWXXhIAxD//+U+LZYcMGSIWL14stm/fLrZv3y4mTZokvL29RVJSksVyAwYMEC4uLuL1118X27ZtE3PmzBERERHC399fDB48uMz1GT16tPD29hYZGRkWt7///vsCgDh48KAQQogbN26IIUOGiBUrVoidO3eKLVu2iFdeeUW4uLiIZcuWWWRr1apl8bxLliwRAMSpU6cslvvmm28EAIv6rlixQphMJtGnTx+xbt068eWXX4q4uDjh6uoqduzYUep2ZGRkmJ/nrbfeMo+7c+fOCSHu7VceHh6iYcOGYubMmWLHjh1i4sSJwmQyFaunkrr/9NNPok6dOqJly5bm5/rpp59KXb/U1FRhMplE//79xebNm8XOnTvFkiVLxNNPP12sHpGRkeKpp54SX331lVizZo2oWbOmiIqKEnl5eeZlC/+GDBgwQHz11Vdi+fLlok6dOsLf31/89ttv5uWK7g+Fiv6dEUIIACIhIcH8+5EjR4SPj49o1KiRWLNmjdi4caPo1q2bqFmzZomvZ0nP4eHhIWrWrCkmT54stm3bJhITE4Wbm5uIi4uzWHbYsGHC3d1djB07VmzZskWsXr1aNGjQQISEhIhLly6V+TzdunUTVatWFQsXLhS7du0SGzZsEBMnThQff/yx1fUqfK8ouh0mk0m8+uqrYtu2bWLWrFmievXqws/Pr9z9q/DvT0REhHjkkUfE559/Lj799FPx4IMPCnd3d5GammpeNiUlRYwdO1Z89tlnIiUlRaxfv1706dNHeHt7i19//dW8XGZmpmjcuLGoVKmSePvtt8XWrVvF559/Ll5++WWxc+dOi+edMWOGEEKI69evi06dOonQ0FDx448/lrnOJeFk5z6XLl0SAET//v0VLX/06FEBQIwcOdLi9v/+978CgHjjjTfMt3Xo0EEAsHiRrl27JlxdXYW3t7fFxObAgQMCgHjvvffMtxUO4NGjR1s816pVqwQAsXLlSovnKunNsmnTphZ/bPbu3SsAmN+QS5KXlydu3bolKlWqJP71r3+Zb//000+L/ZEvVPSP0JYtWwQAMX36dIvl1q5dKwCIhQsXmm+rVauW8PLyEmfOnDHflp2dLQIDA8WIESPMtzVp0kT06dOn1PUuTf/+/YWnp6c4e/asxe3du3cXPj4+FhOHkt68S7J8+XIBQCxatKjUZaypQUVfv/T0dAFAzJkzp9x1LkmfPn1Er169yl2ucCxv3LjR4vZhw4YJFxcXi9fufvn5+SI3N1e8/fbbIigoSBQUFAgh7r0hARDjxo2zWH7NmjUCQLl/jA8ePFishkII0aZNG9GqVatSc3l5eSI3N1c8++yzomXLlhb3VXSyc/v2bREYGFisjvn5+aJ58+aiTZs2ZW5LWlqaACCWLFlS7L7BgwcLAOKTTz6xuL1Hjx6ifv36pT5maXUXQojGjRuXOJEoycyZMwUAi32kqMJ69OjRw+L2Tz75RAAw/0/D9evXhbe3d7Hlzp49Kzw9PUV8fLz5NjWTnSeffFJ4e3tbTDby8vJEgwYNFE92AFj87RNCiMmTJwsAYvfu3UIIYf6fo3fffddiuXPnzglvb2/x2muvlfk8lStXFqNGjSr1fmvqVXSyU/g+Vdp7h9LJTnh4uMjOzjbfnpmZKQIDA0XXrl1Lzebl5Ym7d++KqKgoi+d/++23BQCxffv2cp93xowZ4tSpU6JRo0aiUaNG4vTp02Wub2n4MZYK33zzDQAUO8zepk0bNGzYsNghvrCwMLRq1cr8e2BgIKpVq4YWLVogPDzcfHvDhg0BwOKjo0JPPfWUxe9PPPEE3NzczOtSlp49e8LV1dX8e7NmzYo9z61btzBu3Dj87W9/g5ubG9zc3FC5cmXcvn1b0eHSkuzcuRNA8Tr169cPlSpVKlanFi1aoGbNmubfvby8UK9ePYv1bNOmDb7++mu8/vrr2LVrF7KzsxWvS5cuXRAREWFx+5AhQ5CVlYU9e/ZYs2kAgK+//hpeXl4lHs6//3kLn+d+pdWgJOW9foGBgahbty5mzJiBWbNmYf/+/SgoKFC0Dbdv38bWrVsVf4Tl6+tr8XEuAMTHx6OgoADffvut+badO3eia9eu8PfLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 1 Axes>"
|
||||
]
|
||||
@@ -330,49 +395,8 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"scatter(normal(100, 25))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7ee02075-06c2-4c7c-a515-3f18d8ed89d4",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here, even with 48 (or 60) coins, we will sell back a very bad bag. Let's investigate this more carefully:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "3086e247-dce3-48ee-9819-ea8526a1289b",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{78: 'sellback',\n",
|
||||
" 79: 'sellback',\n",
|
||||
" 80: 'sellback',\n",
|
||||
" 81: 'sellback',\n",
|
||||
" 82: 'keep',\n",
|
||||
" 83: 'keep',\n",
|
||||
" 84: 'keep',\n",
|
||||
" 85: 'keep',\n",
|
||||
" 86: 'keep',\n",
|
||||
" 87: 'keep'}"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"p = normal(100, 25)\n",
|
||||
"E = expectation_fn(p)\n",
|
||||
"f = decision_fn(p)\n",
|
||||
"\n",
|
||||
"{bag: f(48, bag) for bag in range(78, 88)}"
|
||||
"p = normal(25)\n",
|
||||
"scatter(p)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -380,51 +404,7 @@
|
||||
"id": "f1281db2-373d-4f3e-9406-6f60f751e650",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This says that with 48 coins we should sell back a bag of value of 81 or less, even though selling back means we can only get 3 bags instead of 4. The 3 bags will, on average, make up for it, because we can sell back bad ones 11 times. (The exact point at which 'sellback' switches to 'keep' will vary, depending on the samples in the distribution.)\n",
|
||||
"\n",
|
||||
"Here we compare the expected values of keeping versus selling back a bag of value 78:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"id": "db3cd7f9-993e-47a0-bddc-6aff66b8e343",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"378.2457353813969"
|
||||
]
|
||||
},
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"78 + E(36) # Keep the 78 bag"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "3af8869b-75c0-4fe5-8e46-d780822d1919",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"382.1235957586821"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"E(47) # Sell back the 78 bag"
|
||||
"This says that with 48 coins we should sell back a bag of value of 82 or less, even though selling back means we can only get 3 bags instead of 4. The 3 bags will, on average, make up for it, because we can sell back bad ones 11 times. (The exact point at which 'sellback' switches to 'keep' will vary, depending on the samples in the distribution.)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -432,44 +412,41 @@
|
||||
"id": "5c6d203f-19d8-4640-84d6-460635ac8367",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We see that selling back is better.\n",
|
||||
"## Cutoff Threshold Strategy\n",
|
||||
"\n",
|
||||
"## Cutoff Threshold Strategy: Loss Compared to Optimal Strategy\n",
|
||||
"\n",
|
||||
"One suggested strategy was to keep all bags that are above a fixed **cutoff threshold** and sell back the rest (except that a bag should be kept if selling it back would not result in enough coins to buy another bag). How much worse is this strategy than the optimal strategy? "
|
||||
"One suggested strategy was to keep all bags that are above a fixed **cutoff threshold** and sell back the rest (except that a bag should be kept if selling it back would not result in enough coins to buy another bag). "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"execution_count": 13,
|
||||
"id": "aee8dc14-9334-4364-94fd-6fcee0e94594",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def cutoff_expectation_fn(p:ProbDist, cutoff, buy=12, sell=11) -> Callable:\n",
|
||||
" \"\"\"Returns a function that will compute the expected number of diamonds, given `coins`\n",
|
||||
" This is 0 if you can't afford a bag, or is the weighted average, over all possible bag values, of\n",
|
||||
" the probability of the bag times the maximum of the expectations of keeping the bag or selling it back.\"\"\"\n",
|
||||
" \"\"\"Returns a function to compute the expected number of diamonds, given `coins`,\n",
|
||||
" assuming we keep all bags with value greater than `cutoff`.\"\"\"\n",
|
||||
" @functools.lru_cache(None)\n",
|
||||
" def Ecut(coins:int) -> float:\n",
|
||||
" def action(bag): \n",
|
||||
" return (bag + Ecut(coins - buy) if (bag > cutoff or coins + sell < buy) \n",
|
||||
" else Ecut(coins - buy + sell))\n",
|
||||
" def keep(bag): return bag + Ecut(coins - buy)\n",
|
||||
" def sellback(bag): return Ecut(coins - buy + sell)\n",
|
||||
" if coins < buy:\n",
|
||||
" return 0\n",
|
||||
" else:\n",
|
||||
" return sum(p[bag] * action(bag) for bag in p)\n",
|
||||
" return sum(p[bag] * (keep(bag) if (bag > cutoff or coins + sell < buy) else sellback(bag))\n",
|
||||
" for bag in p)\n",
|
||||
" return Ecut\n",
|
||||
"\n",
|
||||
"def plot_loss(sigma=25, coins=range(45, 76)):\n",
|
||||
" \"\"\"Plot the expected number of diamonds for different sigma/starting coins combinations.\"\"\"\n",
|
||||
" p = normal(100, sigma)\n",
|
||||
"def plot_loss(σ=25, coins=range(45, 76), cutoffs=(95, 105, 115)):\n",
|
||||
" \"\"\"Plot the expected number of diamonds for different σ/starting coins combinations.\"\"\"\n",
|
||||
" p = normal(σ)\n",
|
||||
" E = expectation_fn(p)\n",
|
||||
" plt.plot(coins, [E(c) for c in coins], 'o:', label='optimal')\n",
|
||||
" for cutoff in range(100, 100 + sigma, 10):\n",
|
||||
" for cutoff in cutoffs:\n",
|
||||
" Ecut = cutoff_expectation_fn(p, cutoff)\n",
|
||||
" plt.plot(coins, [Ecut(c) for c in coins], 'o:', label=f'cutoff={cutoff}')\n",
|
||||
" plt.title('Expected number of diamonds for different cutoffs')\n",
|
||||
" plt.plot(coins, [Ecut(c) for c in coins], 'o:', label=f'cutoff = {cutoff}')\n",
|
||||
" plt.title(f'Expected number of diamonds for different cutoffs, σ={σ}')\n",
|
||||
" plt.legend(); plt.xlabel('starting coins'); plt.ylabel('diamonds'); plt.grid(True)\n",
|
||||
" "
|
||||
]
|
||||
@@ -479,18 +456,18 @@
|
||||
"id": "df3d72d3-a88d-4d75-8b64-6b170a7498a8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We see in the plot below that the cutoff strategy is worse, for various cutoffs, and a good cutoff choice can get within about 5% of optimal:"
|
||||
"We see in the plot below that the cutoff strategy is worse than the optimal strategy, for various cutoffs. A good cutoff choice can get within about 5% of optimal:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"execution_count": 14,
|
||||
"id": "30910eaf-a964-4056-ab7c-73bee8b58c76",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHFCAYAAAAUpjivAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADLLUlEQVR4nOydd3xUxRbHvze7m7LpdZNACCGhhd67tNCbooIFqaJYQUCKDVBEQKWoT6yAqIg+KygCCQrIoxNQ6UWakEaAFNJ35/2xyZJNdpNNSGe+fiLZuXNn5s692T07c87vKEIIgUQikUgkEkkNxa6yByCRSCQSiURSnkhjRyKRSCQSSY1GGjsSiUQikUhqNNLYkUgkEolEUqORxo5EIpFIJJIajTR2JBKJRCKR1GiksSORSCQSiaRGI40diUQikUgkNRpp7EgkEolEIqnRSGOnirN69WoURbH6s23btsoeok2kpaUxd+7cchnvtm3bqtVc5Cdv7N9++21lD8Umzp8/z6BBg/Dy8kJRFKZMmVLiNhRFYe7cuabXec/4+fPny2ycVZGxY8dSt27dMmmrLO5DWWDrvXzppZeoU6cOarUaDw8PALKyspg0aRIBAQGoVCpatmxZYeMuKbt27WLu3LncuHGjUvpfsGABP/744221cejQIbp37467uzuKorBs2TIAtm7dStu2bXF2dkZRlNvup6qiruwBSGxj1apVNGrUqFB5eHh4JYym5KSlpTFv3jwAevToUbmDkZSa5557jr1797Jy5Ur8/f0JCAi47TYHDRrE7t27y6StO4XyuA9lgaV7+dNPP/H666/z4osvMmDAABwcHABYsWIFH374Ie+++y5t2rTBxcWlsoZdLLt27WLevHmMHTvWZKxVJAsWLOC+++7j7rvvLnUb48eP5+bNm6xbtw5PT0/q1q2LEIIRI0bQoEED1q9fj7OzMw0bNiy7gVchpLFTTWjatClt27at7GFIqinp6ek4OjqiKMpttXPkyBHat29/W2+6BfH19cXX17fM2rsTKOv7oNfrycnJMRkipcXSvTxy5AgAzz77LH5+fmblTk5OPP3007fVZ37S0tLQarVl1l5N4siRI0ycOJEBAwaYyi5fvsy1a9e455576N27dyWOrvyR21g1hHXr1qEoCu+9955Z+Zw5c1CpVERGRgLG5W9FUVi8eDGvv/46derUwdHRkbZt27J169ZC7Z4+fZqHHnoIPz8/HBwcaNy4Mf/5z38K1btx4wbTpk2jXr16ODg44Ofnx8CBAzlx4gTnz583vQHOmzfPtAU3duzYEvdz4sQJ+vfvj1arxcfHh0mTJpGSkmLTHM2dOxdFUTh69CgPPvgg7u7u6HQ6xo8fT1JSkqle3hytXr26UBsFl+3z2vzrr7+4//77cXd3x8vLi6lTp5KTk8PJkyfp378/rq6u1K1bl8WLF1scW0ZGBlOnTsXf3x8nJye6d+/OoUOHCtU7cOAAQ4cOxcvLC0dHR1q1asU333xjVidvK2HLli2MHz8eX19ftFotmZmZVufm4sWLjBo1ymz+3377bQwGA3Bru+3MmTP8+uuvpntY1NZTcnIyEydOxNvbGxcXF/r378+pU6cK1bO09REZGcmwYcOoXbs2jo6OhIWF8fjjj3P16lWzc8ti/ou7drj1TLz11lssWbKEkJAQXFxc6NSpE3v27LF4TQ0bNjS1t2bNGotztGLFClq0aIGLiwuurq40atSIF154weqcFncfSnItixcvZv78+YSEhODg4MDvv/9utd/S3su6devy0ksvAaDT6Ux/P4qi8Mknn5Cenm66hry/NyEE77//Pi1btsTJyQlPT0/uu+8+/vnnH7O+evToQdOmTdmxYwedO3dGq9Uyfvx403inT59OSEgI9vb21KpViylTpnDz5k2zNhRF4emnn+bzzz+ncePGaLVaWrRowc8//2yqM3fuXJ5//nkAQkJCbHYh2Lt3L0OGDMHb2xtHR0dCQ0PNthutbWvmzU/+Md68eZPPPvvM1Hf+1fEjR44wbNgwPD09cXR0pGXLlnz22WeF7klOTg4rVqwwtTF37lxq164NwMyZM1EUxTSehIQEHnvsMYKCgnBwcMDX15cuXboQFRVV5DVXaYSkSrNq1SoBiD179ojs7Gyzn5ycHLO6kyZNEvb29mL//v1CCCG2bt0q7OzsxEsvvWSqc+7cOQGIoKAg0bVrV/Hdd9+J//73v6Jdu3ZCo9GIXbt2meoePXpUuLu7i2bNmok1a9aILVu2iGnTpgk7Ozsxd+5cU73k5GTRpEkT4ezsLF599VWxefNm8d1334nJkyeL3377TWRkZIhNmzYJQEyYMEHs3r1b7N69W5w5c6ZE/cTGxgo/Pz9Rq1YtsWrVKrFx40bx8MMPizp16ghA/P7770XO5Zw5cwQgGjZsKF555RURGRkplixZIhwcHMS4ceMKzdGqVasKtQGIOXPmWGzztddeE5GRkWLGjBkCEE8//bRo1KiReOedd0RkZKQYN26cAMR3331nOv/333833Y9hw4aJDRs2iC+++EKEhYUJNzc3cfbsWVPd3377Tdjb24tu3bqJr7/+WmzatEmMHTu20FjznplatWqJxx57TPz666/i22+/LfS85BEfHy9q1aolfH19xQcffCA2bdoknn76aQGIJ554QgghRFJSkti9e7fw9/cXXbp0Md3DjIwMi20aDAbRs2dP4eDgIF5//XWxZcsWMWfOHFGvXr1Cc5g33nPnzpnKVqxYId544w2xfv16sX37dvHZZ5+JFi1aiIYNG4qsrKwym39brj3/M1G3bl3Rv39/8eOPP4off/xRNGvWTHh6eoobN24Uup6C9zMoKEgEBweb6n311VcCEM8884zYsmWLiIqKEh988IF49tlnLc5pcfehpNdSq1Yt0bNnT/Htt9+KLVu2mM1/Wd3L6OhoMWHCBAGITZs2id27d4tLly6J3bt3i4EDBwonJyfTNcTHxwshhJg4caLQaDRi2rRpYtOmTWLt2rWiUaNGQqfTidjYWFNf3bt3F15eXiIoKEi8++674vfffxfbt28XN2/eFC1bthQ+Pj5iyZIlIioqSixfvly4u7uLXr16CYPBYGoj7562b99efPPNN2Ljxo2iR48eQq1Wm/72Ll26JJ555hkBiO+//9403qSkJKv3adOmTUKj0YjmzZuL1atXi99++02sXLlSPPDAA6Y6Y8aMMXse8sh7pvPYvXu3cHJyEgMHDjT1ffToUSGEECdOnBCurq4iNDRUrFmzRvzyyy/iwQcfFIBYtGiREML4jO/evVsA4r777jO1cenSJfH999+bnsHdu3eL6OhoIYQQ/fr1E76+vuKjjz4S27ZtEz/++KN45ZVXxLp166xec1VHGjtVnLw3D0s/KpXKrG5GRoZo1aqVCAkJEceOHRM6nU50797d7EMu740uMDBQpKenm8qTk5OFl5eXiIiIMJX169dP1K5du9Af9dNPPy0cHR3FtWvXhBBCvPrqqwIQkZGRVq8jISGh0BtjSfuZOXOmUBRFHD582Kxenz59SmTsLF682Kz8ySefFI6OjqY3wdIYO2+//bZZvZYtW5reHPPIzs4Wvr6+Yvjw4aayPGOndevWZm/C58+fFxqNRjz66KOmskaNGolWrVqJ7Oxss74GDx4sAgIChF6vF0LcemZGjx5d5HzkMWvWLAGIvXv3mpU/8cQTQlEUcfLkSVNZcHCwGDRoULFt/vrrrwIQy5cvNyt//fXXbTJ28mMwGER2dra4cOGCAMRPP/1kOna782/rtec9E82aNTP7e9q3b58AxFdffSWEEEKv14vAwECr9zP/h9vTTz8tPDw8LF5zcVi6DyW9ltDQUDPD0Rq3ey/z7lFCQoLZ+WPGjBHOzs5mZXkfygXv56VLl4STk5OYMWOGqax79+4CEFu3bjWr+8Ybbwg7OzvTl748vv32WwGIjRs3msoAodPpRHJysqksNjZW2NnZiTfeeMNU9uabbxb5jBYkNDRUhIaGmr3HFsRWY0cIIZydncWYMWMK1X3ggQeEg4ODuHjxoln5gAEDhFarNTPCAfHUU0+Z1ct7Ft58802zchcXFzFlyhSrY6+OyG2sasKaNWvYv3+/2c/evXvN6jg4OPDNN9+QmJhI69atEULw1VdfoVKpCrU3fPhwHB0dTa9dXV0ZMmQIO3bsQK/Xk5GRwdatW7nnnnvQarXk5OSYfgYOHEhGRoZp+f7XX3+lQYMGRERElPi6StLP77//TpMmTWjRooVZGw899FCJ+hw6dKjZ6+bNm5ORkUF8fHyJx5/H4MGDzV43btwYRVHM9sfVajVhYWFcuHCh0PkPPfSQ2dJ1cHAwnTt3Nm0tnDlzhhMnTvDwww8DFJqnmJgYTp48adbmvffea9PYf/vtN8LDw2nfvr1Z+dixYxFC8Ntvv9nUTn7yxp033jxsvVfx8fFMmjSJoKAg1Go1Go2G4OBgAI4fP16ofmnnv6TXPmjQILO/p+bNmwOY2jx58iRXrlyxej/z0759e27cuMGDDz7ITz/9VGiLrqSU9FqGDh2KRqMptt3bvZcl4eeff0ZRFEaNGmX2jPv7+9OiRYtCW0eenp706tWrUBtNmzalZcuWZm3069fP4vZTz549cXV1Nb3W6XT4+flZ/Du1hVOnTnH27FkmTJhg9h5bHvz222/07t2boKAgs/KxY8eSlpbG7t27S9Vu+/btWb16NfPnz2fPnj1kZ2eXxXArFWnsVBMaN25M27ZtzX7atGlTqF5YWBjdunUjIyODhx9+2GqUhr+/v8WyrKwsUlNTSUxMJCcnh3fffReNRmP2M3DgQADTm3NCQoJp77eklKSfxMREq+MuCd7e3mav85wy09PTS3MJAHh5eZm9tre3R6vVFnqzs7e3JyMjo9D51q4rMTERgLi4OACmT59eaJ6efPJJgEIflrZG6CQmJlqsGxgYaDpeUhITE1Gr1YXm2pZLine truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 1 Axes>"
|
||||
]
|
||||
@@ -500,7 +477,47 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plot_loss()"
|
||||
"plot_loss(σ=25)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b72c153a-481c-42b0-8960-bdaee8f0ab9e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We can check that the optimal strategy is *always* better than a cutoff strategy, as expected:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"id": "6a60fe57-e387-4aa4-9e7e-52ff51992b46",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"True"
|
||||
]
|
||||
},
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def optimal_dominates(σs=range(10, 51, 5), cutoffs=range(90, 120), coins=range(200)):\n",
|
||||
" \"\"\"Assert that the optimal strategy is always as good or better than a cutoff\n",
|
||||
" strategy, for a wide range of σ, coins, and cutoff values.\"\"\"\n",
|
||||
" for σ in σs:\n",
|
||||
" p = normal(σ)\n",
|
||||
" E = expectation_fn(p)\n",
|
||||
" for cutoff in cutoffs:\n",
|
||||
" Ecut = cutoff_expectation_fn(p, cutoff)\n",
|
||||
" assert all(E(coin) >= Ecut(coin) for coin in coins)\n",
|
||||
" return True\n",
|
||||
" \n",
|
||||
"optimal_dominates()"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
Reference in new issue
Block a user