{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Abreu-Sannikov Algorithm for Repeated Two-player Games" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Zejin Shi*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook demonstrates the usage of Python implementation of Abreu-Sannikov algorithm (hereafter AS algorithm) for computing the set of payoff pairs of all pure-strategy subgame-perfect equilibria with public randomization for any repeated two-player games with perfect monitoring and discounting, which is proposed by Abreu and Sannikov (2014).\n", "\n", "The idea of how to compute the equilibrium payoff set of a repeated two-player game is first proposed by Abreu et al. (1990) (hereafter APS). They suggest to apply a set operator $B$ to the initial guess of equilibrium payoff set $W_0$ iteratively, until it reaches a fxied point $B(W_N)=W_N = V^*$. The convergence is guaranteed, as proven in the paper.\n", "\n", "Judd et al. (2003) (usually referred to as JYC) solves linear programming problems to implement the procedure of applying $B$ to $W_N$ iteratively. They approximate set $W_N$ by supporting hyperplanes, and each operation of $B$ is to iterate the action profiles and update supporting hyperplanes of the new set $W_{N+1}$.\n", "\n", "AS algorithm has computational gains relative to APS algorithm (and its numerical implementation JYC algorithm) by understanding how the extreme points of the equilibrium payoff set are generated. They find that each action profile can at most generates 4 extreme points of $V^*$. This makes sure the complexity of approximating and operating of $W_N$ at each round will not increase exponentially.\n", "\n", "In the following, I will demonstrate how to apply the Python implementation of AS algorithm to three examples. The speed of the algorithm is quite fast." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from quantecon import game_theory as gt\n", "import numpy as np\n", "from scipy.spatial import ConvexHull\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Abreu and Sannikov (2014) Example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We start with the example used in Abreu and Sannikov (2014)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "p1 = gt.Player([[16, 3, 0], [21, 10, -1], [9, 5, -5]])\n", "p2 = gt.Player([[9, 1, 0], [13, 4, -4], [3, 0, -15]])\n", "\n", "# the stage game\n", "sg = gt.NormalFormGame([p1, p2])\n", "\n", "# discount rate\n", "δ = 0.3\n", "\n", "# create a repeated two-player game\n", "rpg = gt.RepeatedGame(sg, δ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "AS algorithm is implemented as a method of `RepeatedGame` class. It can be called by `RepeatedGame.equilibrium_payoffs(method='AS', options={\"u_init\": u_init})` where `u_init` should be the initial guess of the threat points. It will return a `scipy.spatial.ConvexHull` instance which is $V^*$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# compute the equilibrium payoff set V*\n", "hull = rpg.equilibrium_payoffs(method='AS', options={\"u_init\": np.zeros(2)})\n", "\n", "# get the initial guess of payoff set W0\n", "# which can be simply the convex hull of action profile payoffs\n", "hull0 = ConvexHull(sg.payoff_profile_array.reshape(np.prod(sg.nums_actions), 2))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot V*\n", "for simplex in hull.simplices:\n", " plt.plot(hull.points[simplex, 0], hull.points[simplex, 1], 'r-')\n", "\n", "# plot W0\n", "for simplex in hull0.simplices:\n", " plt.plot(hull0.points[simplex, 0], hull0.points[simplex, 1], 'k-')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because the default `method` and `u_init` option of `RepeatedGame.equilibrium_payoffs()` are set to be `'AS'` and `np.zeros(2)`, we can skip passing their values in this example.\n", "\n", "The speed of AS algorithm is showed below." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "20.4 ms ± 2.81 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", "26.7 ms ± 1.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "25.6 ms ± 4.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%timeit rpg.equilibrium_payoffs()\n", "%timeit rpg.equilibrium_payoffs()\n", "%timeit rpg.equilibrium_payoffs()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Prisoner's Dilemma" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we apply AS algorithm to the classical Prisoner's dilemma example." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "pd_payoff = [[9.0, 1.0],\n", " [10.0, 3.0]]\n", "p1 = gt.Player(pd_payoff)\n", "p2 = gt.Player(pd_payoff)\n", "\n", "sg = gt.NormalFormGame((p1, p2))\n", "δ = 0.9\n", "\n", "rpg = gt.RepeatedGame(sg, δ)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# we set the initial guess of threat points as [3, 3], which is the minimax payoffs\n", "hull = rpg.equilibrium_payoffs(options={'u_init': np.array([3., 3.])})\n", "hull0 = ConvexHull(sg.payoff_profile_array.reshape(np.prod(sg.nums_actions), 2))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XtU1Ped//HnhwEUBILIWEBUQLwgKg6iJiHHmItNjNFqWrt2k42b1rrGnxc4u2d/2/7RPXtOz+/0nGarIbGtNrptdDfRJE1MUo3G3NekNsqAlyjxEu+iQxARUG7z+f3BRRCQ28x8Zr7zfpyTg47jd14z0Rdf39/LR2mtEUIIEfhCTAcQQgjhGVLoQghhEVLoQghhEVLoQghhEVLoQghhEVLoQghhEVLoQghhEVLoQghhEVLoQghhEaG+fLH4+HidkpLiy5cUQoiAd+DAgTKttb275/m00FNSUti/f78vX1IIIQKeUupMT54nIxchhLAIKXQhhLAIKXQhhLAIKXQhhLAIKXQhhLCIbgtdKbVJKXVFKXW4zWNxSqn3lVLHm78O9m5MIYQQ3enJHvofgUdve+zfgA+01qOBD5p/LoQQwqBuz0PXWn+qlEq57eHvATObf/wn4GPg/3owVzsrV67k3LlzzJkzh/j4eOx2e+t/sbGxhITI5EgIIVRP1hRtLvR3tdYTmn9eobWObfPrV7XWnY5dlFJLgaUAI0aMmHLmTI/Oj28nMTGR0tLSTn/NZrMxZMiQdiVvt9s7FH/Lz+Pj4wkLC+t1BiGEMEUpdUBrndPd87x+pajWegOwASAnJ6dPK1K/8cYb5Obm8stf/pLZs2fjcrkoKyvD5XK1+6+srIyDBw/icrkoLy/vcnuxsbGdln5X3wgGDRrUtzcvhBA+1Nc99BJgptb6klIqEfhYaz22u+3k5OTovlz6r7Xm7rvvpqKigqNHj/ZoxNLQ0EB5eXmnpd/VzxsaGjrdVkRExB1L//bHYmNjUUr1+n0KIURnvL2H/jawGPhV89ftfdxOjyilyMvL4+///u/ZuXMnc+bM6fb3hIaGMnToUIYOHdqj19Bac+3atTvu/bf8+OjRo5SVlVFdXd3la/d2DBQa6tPb6gghLKjbPXSl1Cs0HQCNBy4D/w68BWwDRgBngYVa665nHM36uocOUF9fT2pqKuPGjWPPnj192oan1dTUtCv67r4RXL16tcttDR48+I6l3/pffDzxUVFEDhniw3cqhDCpp3voPRq5eEp/Ch3gV7/6FT/72c84ePAgEydO9GAy36ivr+/VGKisrKzLMVAkYLfZsA8YgH3QIOKjo7EPHow9Ph57QgLxw4ZhHzkSe2oq9jFjuGv4cJScDSREQLJkoZeXlzN8+HAWLVrExo0bPZjMP2mtqaioaF/6587h+sUvKKuvx2W347p+HVdNDa7aWsoaG6npYluhQHxICPbwcOwREdijorDHxhI/ZAj273wHe1IS9hEjiE9JwZ6ezpD0dEIHDvTl2xVCdMGShQ6wfPlyNm3axNmzZ3s8H7ecmTObvn78cYdfqikrw1VSguvkSVynT1N24QKu0lJcV67gKi+nrLISV3U1rps3cTU0UNHF/38FDFYKe1gY8QMHYh80CPtdd2GPi8M+dCjxCQnYk5OxN38DiB8zhojBcsGwEN5g2UIvKSlh3Lhx/Md//Ae/+MUvPJQswNyh0HurvqaGb48fx3XiBK7Tp3GdPYvr4kXKmr8BuCoqcFVVUXbjBq76esrcbhq72NYgwB4a2jQGiowkPiYGe/Mpoq1joBEjsI8ahX30aGKSk2UMJEQPWLbQAebMmcOBAwc4c+YMAwYM8ECyAOPBQu8td0MDFWfO4Pr6a8q++aZpBNT8r4CysrKmbwCVlU1joLo6XI2N3OxiW2HcNgaKju58DJSain3UKIaMHo0tPNyXb1cIv+A3FxZ5Q35+PrNmzeLVV19l8eLFpuMElZDQUOJGjSJu1Ci6vfAAQGuqXS5cX3/dfgx06VLTMYE2Y6D9ly7hOnuWa11sSgFxnY2Bhgwh3m7HnpiIffjwdmOggXfd5bk3L4SfC8g9dK01kyZNwmaz4XQ6g+8iHoN76L5QV1XVNAY6eRJXy78CLl6kzOXC9e23t8ZAN2/iqqujTGvcXWwrijZjoLZnA7WMgZKTm8ZAaWnYx4whOilJxkDC71h6D73lQqMlS5bw8ccf88ADD5iOJDwoPCqKRIeDRIejR893NzRw9ZtvcB0/3jQGOnu2aQx0+TKusjLKKipwXb/OxevXKf72W1wnT1Lb1WvTZgwUGdlxDNR8HKDlbKC4UaNkDCT8RkDuoQPcuHGDESNGcO+997J9u1cvVPU/Ft9D9zbtdlN95cqtMdCZM5SdP990NpDLhevq1Q5nA1V2sS0FDGk7BoqK6nwM1HwcIH7MGAbExPjy7QoLsPQeOjTdX+XZZ5/ll7/8JSdOnCA9Pd10JBEgVEgIUQkJRCUkkDpjRo9+T21l5a0x0OnTHcdA167hqqriWFkZn126xLd3GANFc9sYKCbm1hgoMbH92UBjxhCVkCBjINEjAbuHDlBaWsqIESNYtmwZBQUFHtuu35M9dL/XWFd3awzUcjpo8xio7NtvcV292nRR2I0buGprcbnd1HWxrQE0j4EGDGg9Gyh+8GDst4+BUlNbx0Ahcm8gS7H0aYttLV68mDfeeIPz588TGxvb/W+wAil0y9FuN1Wlpe3HQBcv3jobqO0YqLYWV0MD17vYVgjNY6Dw8I5joKFDOz0bKDwqypdvV/SS5UcuLfLz83n55Zd56aWX+Jd/+RfTcYToExUSQnRSEtFJSaS1fMPuRu21a5TddjZQWcs3gDZjoK9cLlwXL/Kt1nS1+xZD8xio+XTQTsdAI0e2joEGDR0qYyA/FPB76AAPPPAAp06d4uTJk8FxG1rZQxd90FhXR/nJk01joDNnOo6Bms8Gar0ozO2mvottDQTibbb2ZwMNHtz+bKCRI5vOBho9msGpqTIG6oeg2UMHyMvLY/78+bz55pssXLjQdBwh/JItPBx7Rgb2jIwePV+73Vy/eLFpDHTqVNMYqOXeQC1joOvXcVVXc/zaNVynT1PV1WvTyRgoNvbW2UBJSbfOBmq+OZyMgXrPEnvojY2NjB07lqFDh/L55597fPt+R/bQhZ+6WVHRNAZquTdQZ2Og6uqmi8Lq6ym/wxjoLsAeFtZ0MDgqqumisLi49mOglJR2YyCrCqo9dJvNxqpVq1i9ejX79u1j+vTppiMJEZQGxsaSPHUqyVOn9uj5DTdvNo2BTpy4dTbQxYsdxkCnKyr48soVyo4f73IMFEH7MVBkeDhnr13jZ88+y/efe85j79GfWWIPHeD69eskJyfz2GOP8corr3jlNfyG7KGLIKXdbirPn8fVcjC45Wyg28dANTVcunGD8243Px03jg1Hj5qO3i9BtYcOEB0dzU9/+lPWrl3Lr3/9a5KTk01HEkJ4mAoJ4a4RI7hrxAjSH3rojs/VbjdDQkPx5U6raZY672jFihVorXnxxRdNRxFCGKZCQnDExlJ07pzpKD5jqUJPSUnhiSeeYMOGDVRXV5uOI4QwLHvUKA7V1FBf09XijNZiqUKHpguNrl69yssvv2w6ihDCMMe0adQCR3fsMB3FJyxX6Pfccw9Tp05l7dq1uN1d3R5JCBEMHLNnA+DctctwEt+wXKErpcjPz+frr79m586dpuMIIQwa893vEgk4vXR2nb+xXKED/OAHP2DYsGGsXbvWdBQhhEG28HCyoqIoPHXKdBSfsGShh4WFsWLFCvbs2cOhQ4dMxxFCGORISaGoshJ3Q4PpKF5nyUIHWLp0KRERETz//POmowghDHJkZ3MdOPXJJ6ajeJ1lCz0uLo7FixezZcsWrly5YjqOEMKQ7O9+FwDnX/5iOIn3WbbQoekujLW1tfz+9783HUUIYUjm3LmEAoVffGE6itdZutDHjh3LY489xm9/+1tqa7ta510IYWUDYmLIHDgQ5/HjpqN4naULHZr20i9fvsyrr75qOooQwhBHcjLO8nK0xa9NsXyhP/zww2RmZrJmzZqgukmPEOKW7KwsrmjNpaIi01G8yvKFrpQiLy+P4uJiPgmCo9xCiI4cDz4IQOFbbxlO4l2WL3SAJ598kvj4eNasWWM6ihDCgKz581GAc+9e01G8KigKPSIigmeffZZ33nmHEydOmI4jhPCx6KQk0sPCcAb4QhfdCYpCB3j22WcJDQ2loKDAdBQhhAHZCQk4LX5NSr8KXSmVr5Q6opQ6rJR6RSk10FPBPC0xMZEf/ehHbNq0iYqKCtNxhBA+5sjM5HRjI+UnT5qO4jV9LnSl1DBgFZCjtZ4A2IBFngrmDXl5eVRXV7Nx40bTUYQQPuaYMQOAIgsfGO3vyCUUiFBKhQKRwMX+R/Ieh8PB/fffT0FBAQ1BcKMeIcQtjvnzAXBaeHH1Phe61voC8BxwFrgEXNNa7779eUqppUqp/Uqp/S6Xq+9JPSQ/P5+zZ8/y5ptvmo4ihPAhe0YGyTYbhRa+A2t/Ri6Dge8BqUASMEgp9dTtz9Nab9Ba52itc+x2e9+Tesjjjz9OWlqa3CtdiCDkiI/HeemS6Rhe05+Ry8PAN1prl9a6HvgzcK9nYnmPzWZj9erVfP755/ztb38zHUcI4UOOsWMpqaujpqzMdBSv6E+hnwXuVkpFKqUU8BAQECd5PvPMM8TExMheuhBBJjs3Fzdw0KIHRvszQ98HvA4UAoeat7XBQ7m8Kjo6miVLlvDaa69x/vx503GEED7imDsXgMI9ewwn8Y5+neWitf53rfU4rfUErfU/aK0D5h61K1euxO128+KLL5qOIoTwkeHTpxOnFE6L3qQraK4UvV1KSgpPPPEEGzZsoLq62nQcIYQPqJAQHIMH4zx3znQUrwjaQoemC42uXr3Kyy+/bDqKEMJHskeN4lBNDfU1NaajeFxQF/q9997L1KlTef7553Fb/Mb3QogmjunTqQO+evdd01E8LqgLveVe6SUlJbz33num4wghfMAxezYAzt0droMMeEFd6AALFy5k2LBhcq90IYLE6IcfZhDg3L/fdBSPC/pCDwsLY8WKFezZs4fDhw+bjiOE8DJbeDhZ0dEUfvON6SgeF/SFDrB06VIiIiLkQiMhgoQjJYWiykrcFrtJnxQ6EBcXx+LFi9myZQtXLH4DfCEEOLKzqQJOfvSR6SgeJYXebPXq1dTW1rJ+/XrTUYQQXpb9yCMAOHfsMJzEs6TQm40bN47Zs2ezbt06amsD5oJXIUQfZM6dSxhQ+MUXpqN4lBR6G/n5+Vy+fJmtW7eajiKE8KLwqCgyIyJwWmzReCn0Nh5++GEyMzNZs2YNWmvTcYQQXuRITsZZXo620EWFUuhttFxoVFRUxCeffGI6jhDCi7KzsnBpzcUDB0xH8Rgp9Ns8+eSTxMfHyymMQlic48EHASh8+23DSTxHCv02ERERLFu2jLfffpsTFpuvCSFuyVqwAAU49+41HcVjpNA7sXz5ckJDQykoKDAdRQjhJVEJCYwJD8d57JjpKB4jhd6JxMREfvSjH7Fp0yYqKipMxxFCeIkjIYFCC11MKIXehby8PKqrq9m4caPpKEIIL3FkZnK2sZFvjx83HcUjpNC74HA4uP/++3nhhRdosNj9HoQQTRwzZgBQZJFFo6XQ7yAvL48zZ87wlkX+Zwsh2nMsWACA0yKnKUuh38HcuXNJS0uTe6ULYVHxY8cy3Gaj0CK3zpZCvwObzcbq1av5/PPP+dvf/mY6jhDCCxx2O85Ll0zH8Agp9G4888wzxMTEyIVGQliUY+xYSurqqLbA2S5S6N2Ijo5myZIlvPbaa5w/f950HCGEh2Xn5qKBgxY4ViaF3gMrV67E7Xazbt0601GEEB7mmDcPgMI9ewwn6T8p9B5ISUlhwYIFrF+/nurqatNxhBAelDx1KkOUwllcbDpKv0mh91B+fj5Xr15l8+bNpqMIITxIhYSQPXgwznPnTEfpNyn0Hrr33nvJyclh7dq1uC10/2QhBDjS0zl04wZ1VVWmo/SLFHoPKaXIz8+npKSE9957z3QcIYQHOaZPpx746i9/MR2lX6TQe2HhwoUkJSXJKYxCWIxj9mwAnLt2GU7SP1LovRAWFsaKFSt4//33OWyRK8uEEDB61iyiAGeAr14khd5L//RP/0RERITspQthISGhoWRFR1P4zTemo/SLFHovxcXFsXjxYrZs2YLL5TIdRwjhIY6UFIqvX8cdwHdXlULvg9WrV1NbW8vvf/9701GEEB7iyMmhCjjxwQemo/RZvwpdKRWrlHpdKXVMKXVUKXWPp4L5s3HjxjF79mx++9vfUltbazqOEMIDsh95BADnjh2Gk/Rdf/fQnwfe01qPA7KAo/2PFBjy8vIoLS1l69atpqMIITxg/Jw5hAGFf/2r6Sh91udCV0rFADOAjQBa6zqtddAswDlr1iwyMzNZs2YNWmvTcYQQ/RQeFcWEiAicJ06YjtJn/dlDTwNcwH8ppZxKqZeUUoM8lMvvKaXIy8ujqKiITz/91HQcIYQHZA8fjvPqVXSAXg3en0IPBbKB32mtHUA18G+3P0kptVQptV8ptd9qZ4U8+eSTxMfHy4pGQliEIyuLMq25sH+/6Sh90p9CPw+c11rva/756zQVfDta6w1a6xytdY7dbu/Hy/mfiIgIli1bxttvv83JkydNxxFC9JPjoYcAKNy+3XCSvulzoWutS4FzSqmxzQ89BHzlkVQBZPny5YSGhlJQUGA6ihCinyZ973sowPn556aj9El/z3JZCfy3UuogMBn4f/2PFFgSExNZtGgRmzZt4tq1a6bjCCH6ISohgbHh4TiPHTMdpU/6Veha66LmccokrfV8rfVVTwULJHl5eVRVVbFx40bTUYQQ/eRITKQwQI/3yZWiHpCdnc2MGTMoKCigIYAvGxZCgCMzk3ONjXx7/LjpKL0mhe4h+fn5nDlzhrcssNCsEMHMcf/9ADjffNNwkt6TQveQuXPnkpaWJndhFCLAOZ54AgDnJ58YTtJ7UugeYrPZWLVqFXv37uXLL780HUcI0UdD0tMZYbNRGIBrHkihe9CPf/xjYmJiZC9diADnsNtxlpaajtFrUugeFB0dzZIlS9i2bRsXLlwwHUcI0UeOceP4uq6OqgArdSl0D1u5ciVut5sXX3zRdBQhRB9l33cfGjgYYCc5SKF7WEpKCgsWLGD9+vXU1NSYjiOE6APHvHkAFAbYYhdS6F6Ql5fH1atXefnll01HEUL0wbApU4hXCmdxsekovSKF7gW5ubnk5OSwdu1a3AF6G04hgpkKCSE7Lg7n+fOmo/SKFLoXKKXIz8+npKSEXbt2mY4jhOgDR3o6h2/coK6qynSUHpNC95If/OAHJCUlyb3ShQhQjunTqQeOvPOO6Sg9JoXuJeHh4axYsYL333+fI0eOmI4jhOglx5w5ADh37zacpOek0L1o6dKlREREyIVGQgSg9AcfJApwHjhgOkqPSaF70ZAhQ3j66afZvHkzVlt+TwirCwkNZXJMDIWnT5uO0mNS6F62evVqamtrWb9+vekoQohecqSkUHz9Oo11daaj9IgUupdlZGTw6KOPsm7dOmpra03HEUL0giMnh2rgRIBcYCSF7gP5+fmUlpaydetW01GEEL2Q/cgjADh37DCcpGek0H1g1qxZjB8/nrVr16K1Nh1HCNFD4x9/nHCgcN8+01F6RArdB5RS5OXl4XQ6+fTTT03HEUL0UFhkJBMiI3GePGk6So9IofvIU089RXx8vJzCKESAyR4+HOfVq+gAuI2HFLqPREREsGzZMrZv387JAPluL4QAx+TJfKs15wJg7CKF7kPLly8nNDSUgoIC01GEED3kePBBAJwBcAsAKXQfSkxMZNGiRWzatIlr166ZjiOE6IFJ8+ejAOfnn5uO0i0pdB/Ly8ujqqqKjRs3mo4ihOiBQUOHMi48HOexY6ajdEsK3ceys7OZMWMGBQUFNDQ0mI4jhOgBR2IihWVlpmN0SwrdgPz8fM6cOcP27dtNRxFC9IBjwgTONzZSVlJiOsodSaEbMHfuXNLS0uRe6UIECMfMmQA433zTbJBuSKEbYLPZWLVqFXv37uXLL780HUcI0Q3HggUAOP38wkApdEN+/OMfExMTIxcaCREA4kaNYqTNRuHhw6aj3JEUuiHR0dH85Cc/Ydu2bVy4cMF0HCFENxxDh+IsLTUd446k0A1auXIlbrebdevWmY4ihOhGdkYGx+vruX7xoukoXZJCNyg1NZX58+ezfv16ampqTMcRQtyBIzcXDRS/9ZbpKF2SQjcsPz+f8vJyNm/ebDqKEOIOHPPmAeD88EPDSbomhW5Ybm4uOTk5rF27FncA3M1NiGCVlJ2NXSmcBw+ajtKlfhe6UsqmlHIqpd71RKBg03Kv9GPHjrFr1y7TcYQQXVAhIWTHxeE8d850lC55Yg99NXDUA9sJWgsXLiQpKUlOYRTCzzlGj+bwzZvUVlaajtKpfhW6UioZmAO85Jk4wSk8PJwVK1awe/dujhw5YjqOEKILjrvvpgE44qe30u3vHvpa4F8BGf7209KlS4mIiJC9dCH8mGPOHACcu3cbTtK5Phe6Uupx4IrW+kA3z1uqlNqvlNrvcrn6+nKWN2TIEJ5++mk2b96MfE5C+KdRM2cSDTgLC01H6VR/9tBzgXlKqdPAq8CDSqkttz9Ja71Ba52jtc6x2+39eDnrW716NbW1taxfv950FCFEJ0JCQ5kcE0Ph6dOmo3Sqz4Wutf6Z1jpZa50CLAI+1Fo/5bFkQSgjI4NHH32UdevWUVdXZzqOEKITjrQ0iquqaPTDv6NyHrqfyc/Pp7S0lK1bt5qOIoToRHZODjXA8fffNx2lA48Uutb6Y631457YVrCbNWsW48ePZ82aNWitTccRQtzG8cgjADh37jScpCPZQ/czLRcaOZ1OPvvsM9NxhBC3yXjsMQYAhfv2mY7SgRS6H3rqqacYMmSIrGgkhB8Ki4xkQmQkzpMnTUfpQArdD0VERLBs2TK2b9/OST/8QyNEsMseMQJnRQXaz+6/JIXup5YvX05oaCgvvPCC6ShCiNs4Jk+mXGvOfvGF6SjtSKH7qaSkJP7u7/6OjRs3cu3aNdNxhBBtOB56CADnu/51T0IpdD+Wn59PVVUVmzZtMh1FCNHGpPnzCQGce/eajtKOFLofy87OZsaMGRQUFNDY2Gg6jhCiWWR8POMGDMD59demo7Qjhe7n8vLyOH36NG/58bJXQgQjR2IihX523yUpdD83b9480tLS5C6MQvgZx8SJXHC7cX31lekoraTQ/ZzNZmPVqlX87//+L/v37zcdRwjRLHvmTACcfvSvZyn0APDMM88QHR0tFxoJ4UcmL1gAgNOPruiWQg8AMTExLFmyhG3btnHhwgXTcYQQwODUVFJCQyn0o1XGpNADxMqVK3G73axbt850FCFEM8fQoThLS03HaCWFHiBSU1OZP38+69evp0ZOYRTCL2RnZHC8vp7K8+dNRwGk0ANKfn4+5eXlbL582XQUIQTguO8+AIr95MCoFHoAyc3NZcqUKay9cAG33CtdCOMc8+YB4PzoI8NJmoSaDiB6TinFypUr+cd//Ece2buXx9LTmTxoEFlRUcSFhZmOJ0TQSXS7GQo4P/jAdBRACj3gPPjgg8TabOx3u9nT5ta6wwcMIGvQICZHRZEVFcXkqCjSBg4kRCmDaYWwNhUSQvaAATj9ZH1RKfQAM3z4cK42NABw+fJliouLKSoqav26s6Sk9b4vUVFRTJo0iaysLCZPnkxWVhYTJ04kMjLS5FsQwlIcP/85e379a2praxkwYIDRLMqX61bm5ORoudrRu27cuMGRI0faFX1xcTGVlZUAhISEMHr0aCZPntxa8pMnTyYhIQEle/NC9Nprr73GD3/4Q/bv38+UKVO88hpKqQNa65zunid76BYTERFBTk4OOTm3/t9rrTl9+nS7Pfl9+/axdevW1ufY7fZ2BZ+VlcXYsWMJk9m8EHeUnZ0NgNPp9Fqh95QUehBQSpGamkpqaioLmi9XBqioqODgwYPtir6goIC65nnggAEDyMzMbFf0kyZNIjY21tRbEcLvpKamEhMTg9PpNB1FRi6ivfr6ekpKSjrM5l1tbhOakpLSbk9+8uTJpKSkyMhGBK3777+furo6vvDSknQ9HblIoYtuaa0pLS1tV/DFxcWUlJTQ8ucnJiaGrKysdkWfmZlJRESE4fRCeF9eXh5/+MMfqKysxGazeXz7MkMXHqOUIjExkcTERGbPnt36eE1NDYcPH25X9H/84x+pqqoCmm79O3bs2A6z+e985zum3ooQXpGdnU1NTQ1ff/01GRkZxnJIoYs+i4yMZNq0aUybNq31MbfbzalTp9rtyX/22Wf8z//8T+tzEhISOoxsRo8eTWio/HEUgcnhcABQWFhotNBl5CJ8ory8vPUUypaiP3LkCPX19QAMHDiQiRMntiv6SZMmERMTYzi5EN2rr68nOjqaFStW8Nxzz3l8+zJDF36vrq6Oo0ePtiv6oqIiysvLW5+TlpbWYWQzYsQIOQAr/M7UqVOJiYnhAy/cBkBm6MLvhYeHtx5IbaG15sKFCx3OsnnzzTdbD8DGxsZ2GNmMHz/e+FV6IrhlZ2fz2muvobU2tsMhhS78ilKK5ORkkpOTmTNnTuvjVVVVHDp0qF3R/+EPf6CmpgaA0NBQMjIy2hV9VlYWdrvd1FsRQcbhcLBhwwbOnDlDSkqKkQxS6CIgREVFcc8993DPPfe0PtbY2MiJEyfalfxHH33Eli1bWp+TlJTUYWSTnp7ulVPLRHBrOTDqdDql0IXorZbTIseOHcsPf/jD1sfLyso6jGx2795NQ/NNzSIjI5k4cWK7op84cSJRUVGm3oqwgEmTJmGz2XA6ne2uyPYlOSgqgkJtbS1fffVVu4OvxcXFVFRUAE2jnvT09A6z+WHDhskBWNFjEyZMIDU1lXfeecej25WDokK0MWDAABwOR+s/i6HpAOzZs2fb7c0XFhby+uuvtz4nLi6uw8gmIyOD8PBwE29D+DmHw8GHH35o7PWl0EUNDmLhAAAH5UlEQVTQUkoxcuRIRo4cybzmpcQAKisrOXToULuRze9+9ztu3rwJQFhYGOPHj293C+KsrCzi4uJMvRXhJxwOB1u2bOHKlSsMHTrU56/f50JXSg0HXgYSADewQWv9vKeCCWFKTEwMubm55Obmtj7W0NDA8ePH241sdu3axZ/+9KfW5wwfPrzD3nxaWhohIbJ0b7BoeyvdRx55xOev35899Abgn7XWhUqpaOCAUup9rfVXHsomhN9oOS0yIyODRYsWtT7e2apRO3bskFWjgtTkyZOBplsAmCh0jx0UVUptB17UWr/f1XPkoKgIBm1XjWpb9rJqVHBIS0sjJyeHbdu2eWybPj0oqpRKARzAPk9sT4hAdqdVo9qObGTVKGtyOBzGFrvod6ErpaKAN4A8rXVlJ7++FFgKMGLEiP6+nBABqe2qUfPnz299vLNVo1544QVqa2sBWTUqEGVnZ/PnP/+ZyspKn99crl8jF6VUGPAusEtr/Zvuni8jFyG6J6tGBbYdO3YwZ84cPvnkE2bMmOGRbXp95KKa/uRsBI72pMyFED0TFhbGhAkTmDBhAk8++STQ9apR77zzDm63G5BVo/xF21sAeKrQe6o/I5dc4B+AQ0qpoubHfq613tH/WEKItmTVqMCRmJhIQkKCkTm6XPovhMV0tmpUUVER586da31OZ6tGjRkzRm5a5iGPPfZY622gPUEu/RciSIWEhJCenk56ejrf//73Wx/vbNWo3/zmN7JqlBc4HA52797NzZs3GThwoM9eVwpdiCARFxfHAw88wAMPPND6WF1dHceOHeuwmMhLL73U+hxZNar3HA4HjY2NHD58uN3pq94mhS5EEAsPD2fSpElMmjSp9TFZNar/2t4CQApdCGGMrBrVf6mpqdx1110+PzAqB0WFEH3W2NjIyZMnO5xOeeHChdbnBOuqUTNnzuTmzZv89a9/7fe25KCoEMLrbDYbY8aMYcyYMbJq1G0cDgfr16+nsbHRZ9+8ZA9dCOETt68a1fLVqqtGbd68maeffpojR44wfvz4fm1L9tCFEH6lq1Wjzp07167gnU6nJVaNanmfhYWF/S70npI9dCGE3+ls1ahDhw4F1KpRDQ0NREdHs3z5cv7zP/+zX9vq6R66FLoQIiDcvmpUy9fS0tLW5/jbqlHTp09n0KBB/V5nVEYuQghL6W7VqLZF39mqUW2LfsKECT5ZNcrhcLB161a01j45DiB76EIIy7l58yZHjhzpcDpl21WjxowZ0+EArKdXjVq/fj3Lli3j1KlTpKam9nk7socuhAhaAwcOZMqUKUyZMqX1sdtXjSouLvb6qlFtb6Xbn0LvKSl0IURQ6G7VqLZF76lVoyZOnIjNZsPpdPLEE0947b21kJGLEELcpqGhgZKSknYjm76uGjVx4kRGjhzJu+++2+c8MnIRQog+Cg0NJTMzk8zMzA6rRt1+lk13q0ZNnDiRjz/+2Ce5ZQ9dCCH6oWXVqLZFX1xc3LpqVEhICG63m88++4z77ruvT68he+hCCOEDkZGRTJs2jWnTprU+5na7+eabbygqKmLnzp3s3LnTJ/epkT10IYTwcz3dQzdz+ZQQQgiPk0IXQgiLkEIXQgiLkEIXQgiLkEIXQgiLkEIXQgiLkEIXQgiLkEIXQgiL8OmFRUopF3DGZy/oHfFAmekQfkI+i/bk82hPPo9b+vtZjNRa27t7kk8L3QqUUvt7csVWMJDPoj35PNqTz+MWX30WMnIRQgiLkEIXQgiLkELvvQ2mA/gR+Szak8+jPfk8bvHJZyEzdCGEsAjZQxdCCIuQQu8BpdRwpdRHSqmjSqkjSqnVpjP5A6WUTSnlVEr1fbFEi1BKxSqlXldKHWv+c3KP6UymKKXym/+eHFZKvaKUGmg6ky8ppTYppa4opQ63eSxOKfW+Uup489fB3nhtKfSeaQD+WWudAdwN/B+l1HjDmfzBauCo6RB+4nngPa31OCCLIP1clFLDgFVAjtZ6AmADFplN5XN/BB697bF/Az7QWo8GPmj+ucdJofeA1vqS1rqw+cfXafrLOsxsKrOUUsnAHOAl01lMU0rFADOAjQBa6zqtdYXZVEaFAhFKqVAgErhoOI9Paa0/Bcpve/h7wJ+af/wnYL43XlsKvZeUUimAA9hnNolxa4F/Bdymg/iBNMAF/FfzCOolpdQg06FM0FpfAJ4DzgKXgGta691mU/mF72itL0HTDiIw1BsvIoXeC0qpKOANIE9rXWk6jylKqceBK1rrA6az+IlQIBv4ndbaAVTjpX9S+7vm2fD3gFQgCRiklHrKbKrgIYXeQ0qpMJrK/L+11n82ncewXGCeUuo08CrwoFJqi9lIRp0HzmutW/7V9jpNBR+MHga+0Vq7tNb1wJ+Bew1n8geXlVKJAM1fr3jjRaTQe0AppWiajx7VWv/GdB7TtNY/01ona61TaDrg9aHWOmj3wrTWpcA5pdTY5oceAr4yGMmks8DdSqnI5r83DxGkB4hv8zawuPnHi4Ht3niRUG9s1IJygX8ADimlipof+7nWeofBTMK/rAT+WykVDpwCnjGcxwit9T6l1OtAIU1nhzkJsitGlVKvADOBeKXUeeDfgV8B25RSP6Hpm95Cr7y2XCkqhBDWICMXIYSwCCl0IYSwCCl0IYSwCCl0IYSwCCl0IYSwCCl0IYSwCCl0IYSwCCl0IYSwiP8P6wXO+tjNgzUAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# V*\n", "for simplex in hull.simplices:\n", " plt.plot(hull.points[simplex, 0], hull.points[simplex, 1], 'r-')\n", " \n", "# W0\n", "for simplex in hull0.simplices:\n", " plt.plot(hull0.points[simplex, 0], hull0.points[simplex, 1], 'k-')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.22 ms ± 256 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", "1.88 ms ± 184 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n", "1.74 ms ± 106 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" ] } ], "source": [ "%timeit rpg.equilibrium_payoffs(options={'u_init': np.array([3., 3.])})\n", "%timeit rpg.equilibrium_payoffs(options={'u_init': np.array([3., 3.])})\n", "%timeit rpg.equilibrium_payoffs(options={'u_init': np.array([3., 3.])})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cournot Duopoly Game" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because the complexity of computation of AS algorithm is bounded, it can be used to deal with large scale games (in terms of the number of actions). Here we apply it to the Cournot Duopoly Game which is also used in JYC." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# copy and paste from \n", "# http://nbviewer.jupyter.org/github/QuantEcon/QuantEcon.notebooks/blob/master/game_theory_py.ipynb\n", "from quantecon import cartesian\n", "\n", "\n", "def cournot(a, c, N, q_grid):\n", " \"\"\"\n", " Create a `NormalFormGame` instance for the symmetric N-player Cournot game\n", " with linear inverse demand a - Q and constant marginal cost c.\n", "\n", " Parameters\n", " ----------\n", " a : scalar\n", " Intercept of the demand curve\n", "\n", " c : scalar\n", " Common constant marginal cost\n", "\n", " N : scalar(int)\n", " Number of firms\n", "\n", " q_grid : array_like(scalar)\n", " Array containing the set of possible quantities\n", "\n", " Returns\n", " -------\n", " NormalFormGame\n", " NormalFormGame instance representing the Cournot game\n", "\n", " \"\"\"\n", " q_grid = np.asarray(q_grid)\n", " payoff_array = \\\n", " cartesian([q_grid]*N).sum(axis=-1).reshape([len(q_grid)]*N) * (-1) + \\\n", " (a - c)\n", " payoff_array *= q_grid.reshape([len(q_grid)] + [1]*(N-1))\n", " payoff_array += 0 # To get rid of the minus sign of -0\n", "\n", " player = gt.Player(payoff_array)\n", " return gt.NormalFormGame([player for i in range(N)])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "a, c = 6, 0.6\n", "N = 2\n", "q_grid = np.linspace(0, 6, 15)\n", "\n", "sg = cournot(a, c, N, q_grid)\n", "δ = 0.8\n", "\n", "# create the repeated cournot game\n", "rpg = gt.RepeatedGame(sg, δ)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "hull = rpg.equilibrium_payoffs()\n", "hull0 = ConvexHull(sg.payoff_profile_array.reshape(np.prod(sg.nums_actions), 2))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# V*\n", "for simplex in hull.simplices:\n", " plt.plot(hull.points[simplex, 0], hull.points[simplex, 1], 'r-')\n", " \n", "# W0\n", "for simplex in hull0.simplices:\n", " plt.plot(hull0.points[simplex, 0], hull0.points[simplex, 1], 'k-')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# focus on the shape of V*\n", "for simplex in hull.simplices:\n", " plt.plot(hull.points[simplex, 0], hull.points[simplex, 1], 'r-')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "57.9 ms ± 2.62 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "62.9 ms ± 2.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "67.2 ms ± 7.93 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%timeit rpg.equilibrium_payoffs()\n", "%timeit rpg.equilibrium_payoffs()\n", "%timeit rpg.equilibrium_payoffs()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# References\n", "\n", "- Abreu, D., Pearce, D., & Stacchetti, E. (1990). Toward a theory of discounted repeated games with imperfect monitoring. Econometrica: Journal of the Econometric Society, 1041-1063.\n", "- Judd, K. L., Yeltekin, S., & Conklin, J. (2003). Computing supergame equilibria. Econometrica, 71(4), 1239-1254.\n", "- Abreu, D., & Sannikov, Y. (2014). An algorithm for two‐player repeated games with perfect monitoring. Theoretical Economics, 9(2), 313-338." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 1 }