Skip to content

Instantly share code, notes, and snippets.

@warchildmd
Last active October 28, 2016 16:24
Show Gist options
  • Save warchildmd/9b3d0d1ac6e3a483f79216c7016b6338 to your computer and use it in GitHub Desktop.
Save warchildmd/9b3d0d1ac6e3a483f79216c7016b6338 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets import the libraries we'll be using. Also, tell matplot lib to display plots inline in the notebook."
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"import random"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once we have imported all the neccesary goodies, we will define the classes used in the code. Player class will contain the methods to easily save the results of the matches played by a player.\n",
"\n",
"The Game class will contain the simulation method. It will select the outcome for a match between the two players given as input to the class constructor. The only tunable parameter here is draw chance when the opponents are equal in terms of skill. I set it to 0.25, which means that if two players with equal skill play, the outcomes are:\n",
"HOME 37.5%\n",
"DRAW 25%\n",
"AWAY 37.5."
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class Player(object):\n",
" \n",
" def __init__(self, id, skill):\n",
" self.skill = skill\n",
" self.games = 0\n",
" self.points = 0\n",
" self.id = id\n",
" \n",
" def reset(self):\n",
" self.points = 0\n",
" self.games = 0\n",
" \n",
" def win(self):\n",
" self.games += 1\n",
" self.points += 3\n",
" \n",
" def draw(self):\n",
" self.games += 1\n",
" self.points += 1\n",
" \n",
" def lose(self):\n",
" self.games += 1\n",
"\n",
"class Game(object):\n",
" \n",
" def __init__(self, home, away):\n",
" self.home = home\n",
" self.away = away\n",
" self.result = -1\n",
" \n",
" def simulate(self):\n",
" if self.result == -1:\n",
" seed = random.random()\n",
" t = self.home.skill + self.away.skill\n",
" h = self.home.skill / t\n",
" a = self.away.skill / t\n",
" d = 0.25 * (1.0 - abs(h - a) / 1.0)\n",
" h -= d / 2\n",
" a -= d / 2\n",
" chances = [h, d, a]\n",
" for result, prob in enumerate(chances):\n",
" if seed < prob:\n",
" self.result = result\n",
" break\n",
" seed -= prob\n",
" return self.result"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets generate the values which will be used as player skill. The values are generated randomly using a normal distribution with a mean of 100 and a standard deviation of 15.\n",
"We plot the result to see that it looks like a normal distribution indeed."
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(array([ 1.53855353e-04, 8.37656923e-04, 5.21398697e-03,\n",
" 1.52744176e-02, 2.55656312e-02, 2.24970717e-02,\n",
" 1.18383147e-02, 3.42755537e-03, 6.23968933e-04,\n",
" 4.27375981e-05]),\n",
" array([ 42.9139617 , 54.61326213, 66.31256256, 78.01186298,\n",
" 89.71116341, 101.41046384, 113.10976427, 124.80906469,\n",
" 136.50836512, 148.20766555, 159.90696597]),\n",
" <a list of 10 Patch objects>)"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n+v/4jYheqzEN3AAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x21e8ca71eb8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"mu, sigma = 100, 15\n",
"num_players = 10000\n",
"skills = np.random.normal(mu, sigma, num_players)\n",
"\n",
"plt.hist(players, normed=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here are some simulations of games and the outcome probabilities for each of them."
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[0, 2, 0, 100]"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\npDQLhCRJSvv/HmRrdrSJbS4AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x21e8cf0c6d8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"axes = plt.gca()\n",
"\n",
"data = []\n",
"for i in range(100): \n",
" p1 = Player(1, 50.0)\n",
" p2 = Player(2, 50.0)\n",
" data.append(Game(p1, p2).simulate())\n",
"plt.subplot(131)\n",
"plt.hist(data, bins=3)\n",
"plt.axis([0, 2, 0, 100])\n",
"\n",
"data = []\n",
"for i in range(100): \n",
" p1 = Player(1, 30.0)\n",
" p2 = Player(2, 70.0)\n",
" data.append(Game(p1, p2).simulate())\n",
"plt.subplot(132)\n",
"plt.hist(data, bins=3)\n",
"plt.axis([0, 2, 0, 100])\n",
"\n",
"data = []\n",
"for i in range(100): \n",
" p1 = Player(1, 95.0)\n",
" p2 = Player(2, 5.0)\n",
" data.append(Game(p1, p2).simulate())\n",
"plt.subplot(133)\n",
"plt.hist(data, bins=3)\n",
"plt.axis([0, 2, 0, 100])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Utility functions used in computation below. The check function determines if a player must end the season, and the new division if he was promoted or relegated."
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def get_random_division(divisions):\n",
" division = random.randint(0, 9)\n",
" while len(divisions[division]) < 100:\n",
" division = random.randint(0, 9)\n",
" return division\n",
"\n",
"def get_random_players(division):\n",
" return random.sample(division, 2)\n",
"\n",
"def check(x, t, p, h):\n",
" if x.points + (10 - x.games) * 3 < h:\n",
" return True, 1\n",
" if x.points >= t:\n",
" return True, -1\n",
" if x.games == 10:\n",
" if x.points >= p:\n",
" return True, -1\n",
" elif x.points >= h:\n",
" return True, 0\n",
" else:\n",
" return True, 1\n",
" return False, 0\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will simulate 3 million games. This means that each player will have played aproximately 300 matches. Each match is selected randomly. First, we select a division that has at least 100 players, then we select two random players within the region and simulate the match between them.\n",
"\n",
"Each player is updated, and moved to the new division if that is the case."
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Div 1: Players: 0 Average skill: 0\n",
"Div 2: Players: 0 Average skill: 0\n",
"Div 3: Players: 0 Average skill: 0\n",
"Div 4: Players: 0 Average skill: 0\n",
"Div 5: Players: 0 Average skill: 0\n",
"Div 6: Players: 0 Average skill: 0\n",
"Div 7: Players: 0 Average skill: 0\n",
"Div 8: Players: 0 Average skill: 0\n",
"Div 9: Players: 0 Average skill: 0\n",
"Div 10: Players: 10000 Average skill: 100.15101555809595\n",
"-------------------------------------------------\n",
"Div 1: Players: 102 Average skill: 124.64431561711288\n",
"Div 2: Players: 101 Average skill: 118.06900893886186\n",
"Div 3: Players: 789 Average skill: 111.42823915174728\n",
"Div 4: Players: 4300 Average skill: 105.26312040326995\n",
"Div 5: Players: 402 Average skill: 99.34011319626113\n",
"Div 6: Players: 3908 Average skill: 93.08353182988513\n",
"Div 7: Players: 101 Average skill: 88.30682908238352\n",
"Div 8: Players: 99 Average skill: 80.8121166222237\n",
"Div 9: Players: 99 Average skill: 76.18593425716487\n",
"Div 10: Players: 99 Average skill: 82.38588272655888\n",
"-------------------------------------------------\n",
"Div 1: Players: 99 Average skill: 119.75328063043118\n",
"Div 2: Players: 99 Average skill: 113.02294383654879\n",
"Div 3: Players: 3012 Average skill: 105.81308406223691\n",
"Div 4: Players: 6196 Average skill: 98.86949870593656\n",
"Div 5: Players: 99 Average skill: 90.92929808216316\n",
"Div 6: Players: 99 Average skill: 82.21076407324765\n",
"Div 7: Players: 99 Average skill: 76.8802037862268\n",
"Div 8: Players: 99 Average skill: 71.53281855589535\n",
"Div 9: Players: 99 Average skill: 72.77593250021773\n",
"Div 10: Players: 99 Average skill: 82.04357069199378\n",
"-------------------------------------------------\n",
"Div 1: Players: 99 Average skill: 117.93267122692043\n",
"Div 2: Players: 102 Average skill: 110.672870155179\n",
"Div 3: Players: 6607 Average skill: 103.50003951939115\n",
"Div 4: Players: 2593 Average skill: 95.44852419202353\n",
"Div 5: Players: 104 Average skill: 88.07355799324765\n",
"Div 6: Players: 99 Average skill: 81.99173623947524\n",
"Div 7: Players: 99 Average skill: 76.98489698519886\n",
"Div 8: Players: 99 Average skill: 72.46113692740742\n",
"Div 9: Players: 99 Average skill: 71.00102287142704\n",
"Div 10: Players: 99 Average skill: 82.04357069199378\n"
]
}
],
"source": [
"games_to_play = 3000000\n",
"\n",
"title = [100, 21, 21, 19, 19, 19, 17, 15, 13, 12]\n",
"promotion = [100, 18, 18, 16, 16, 16, 14, 12, 10, 9]\n",
"holding = [14, 12, 12, 10, 10, 10, 8, 8, 6, 0]\n",
"\n",
"# generate division\n",
"divisions = [[] for i in range(0, 10)]\n",
"# generate players\n",
"# skills = np.random.normal(mu, sigma, num_players)\n",
"divisions[9] = [Player(i + 1, skills[i]) for i in range(0, num_players)]\n",
"\n",
"for i in range(games_to_play):\n",
" if i % 1000000 == 0:\n",
" for idx in range(0, 10):\n",
" if len(divisions[idx]) == 0:\n",
" print('Div {0}: Players: {1} Average skill: {2}'.format(idx + 1, 0, 0)) \n",
" else:\n",
" print('Div {0}: Players: {1} Average skill: {2}'.format(idx + 1, len(divisions[idx]), (sum([x.skill for x in divisions[idx]]) / float(len(divisions[idx]))))) \n",
" print('-------------------------------------------------')\n",
" division = get_random_division(divisions)\n",
" matchup = get_random_players(divisions[division])\n",
" h, a = matchup[0], matchup[1]\n",
" result = Game(h, a).simulate()\n",
" \n",
" if result == 0:\n",
" h.win()\n",
" a.lose()\n",
" elif result == 1:\n",
" h.draw()\n",
" a.draw()\n",
" elif result == 2:\n",
" h.lose()\n",
" a.win()\n",
" \n",
" \n",
" h_promote, h_direction = check(h, title[division], promotion[division], holding[division])\n",
" if h_promote:\n",
" divisions[division].remove(h)\n",
" divisions[division + h_direction].append(h)\n",
" h.reset()\n",
" \n",
" a_promote, a_direction = check(a, title[division], promotion[division], holding[division])\n",
" if a_promote:\n",
" divisions[division].remove(a)\n",
" divisions[division + a_direction].append(a)\n",
" a.reset()\n",
" \n",
"for idx in range(0, 10):\n",
" print('Div {0}: Players: {1} Average skill: {2}'.format(idx + 1, len(divisions[idx]), (sum([x.skill for x in divisions[idx]]) / float(len(divisions[idx]))))) \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The point of the simulation was to obtain the skills of the players per division in FUT Seasons. This plot shows exactly what types of players is expected within each division. \n",
"\n",
"The red line shows the average value per divisi"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x21e8e4dc470>]"
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nIiLSmqyoWRH4NXNWOJhZB+BB4HvApylvXwJc45yb5pxbCIwGegNn5CofERGR1qZXh16BXzOXIw53\nAU84555tetDM9gN6As9sPeacWw+8AhyXw3xERERalSmjptC/Z/9Ar5mTwsHMzgaOAC7fwds9AQdU\npRyvSrwnIiIiAejevjsVp1cEes2iQK8GmFkf4DbgZOdcXZDXHj9+PJ06dUo6Vl5eTnl5eZBfRkRE\nJJIqKyuprKxMOrZu3bpAv4Y554K9oNnpwBSgAbDE4UL8KEMDcDDwLnCEc+71Jr/veWCec278Dq45\nAJgzZ84cBgwYEGi+IiIicTZ37lwGDhwIMNA5Nzfb6+XiUcX/A76Af1TRP/F6DT9Rsr9zbjGwEhiy\n9TeYWUfgWODfOchHREREAhL4owrn3AbgzabHzGwDsMY5tyhx6Dbg12b2LvABcA2wFJgadD4iIiIS\nnMALh51Ieh7inLvBzNoBE4A9gJeAU51ztS2Uj4iISOzlonNkixQOzrmv7ODYlcCVLfH1RUREWqPI\ndY4UERGR8ESqc6SIiIiEK2qdI0VERCREkekcKSIiIuHLRedIFQ4iIiKSMRUOIiIikjEVDiIiIpIx\nFQ4iIiKSMRUOIiIikjEVDiIiIpIxFQ4iIiKSMRUOIiIikjEVDiIiIpIxFQ4iIiKSMRUOIiIikjEV\nDiIiIpIxFQ4iIiKSMRUOIiIikjEVDiIiIpIxFQ4iIiKSMRUOIiIikjEVDiIiIpIxFQ4iIiKSMRUO\nIiIikjEVDiIiIpIxFQ4iIiKSMRUOIiIikjEVDiIiIpIxFQ4iIiKSMRUOIiIikjEVDiIiIpIxFQ4i\nIiKSMRUOIamsrAw7hUDF6X7idC+g+8lncboX0P20FoEXDmZ2uZnNNrP1ZlZlZn83s8/v4LyrzWy5\nmW00s6fN7ICgc8lncfsLGaf7idO9gO4nn8XpXkD301rkYsThBOAO4FjgZKAYeMrM2m49wcwuAy4C\nLgCOATYAT5pZSQ7yERERkYAUBX1B59w3msZm9h1gFTAQmJE4fAlwjXNuWuKc0UAVcAYwKeicRERE\nJBgtMcdhD8ABnwCY2X5AT+CZrSc459YDrwDHtUA+IiIi0kyBjzg0ZWYG3AbMcM69mTjcE19IVKWc\nXpV4b0faACxatCgXaYZi3bp1zJ07N+w0AhOn+4nTvYDuJ5/F6V5A95OvmvzsbBPE9cw5F8R1dnxx\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x21e8e458240>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for idx in range(0, 10):\n",
" xes = [idx + 1] * len(divisions[idx])\n",
" yes = [p.skill for p in divisions[idx]]\n",
" plt.plot(xes, yes, 'g.')\n",
"mx, my = [], []\n",
"for idx in range(0, 10):\n",
" mx.append(idx + 1)\n",
" my.append(sum([x.skill for x in divisions[idx]]) / float(len(divisions[idx])))\n",
"plt.plot(mx, my, 'r-')\n",
"plt.plot(range(1, 11), [100] * 10)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda root]",
"language": "python",
"name": "conda-root-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment