{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Coping with Complexity: The Adaptive Value of Changing Utility" ] }, { "cell_type": "markdown", "metadata": { "raw_mimetype": "text/latex" }, "source": [ "\n", "How to make choices in light of our cognitive limitations is a widely discussed issue in decision theory. Herbert Simon's \"bounded rationality\" approach has been highly influential and only recently (2017) has Richard Bradley published a book on this topic entitled *Decision Theory with a Human Face*.\n", "\n", "In a 1984 Michael D. Cohen and Robert Axelrod published an unusual proposal in this debate, which has been unduly neglected. Their paper \"Coping with Complexity: The Adaptive Value of Changing Utility\" suggests that to deal with complexity and to overcome our limited knowledge motivational change might help. Their paper presents a case in which changing utility is adaptive, that is in which motivational change leads to better outcomes because the agents has wrong or incomplete beliefs.\n", "\n", "Their paper has received relatively little attention given the deserved fame of its authors, but its approach invites a reconstruction in an interactive Jupyter Notebook. In the following I will walk you through the basic idea of the paper and provide some visualisation. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Basic Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A factory manager faces a repeated choice of splitting a fixed number of labour hours between production work and maintenance work. The manager seeks to choose the level of labour devoted to production (production labour for short), which maximises the plant's output y. In addition, Cohen and Axelrod stipulate that the manager believes the following relationship to obtain:\n", "\n", "$\\hat{y}_t = -x^2_t + \\hat{b}_{t-1}*x_t$\n", "\n", "(The hats over y and b indicate that the variable tracks the believed rather than the actual output ($y$) and paramater ($b$).)\n", "\n", "The factory manager can estimate the $\\hat{b}$ given this believed relationship, a choice of $x_t$ and an observed level of output $y_t$:\n", "\n", "$\\hat{b}_{t}=y_t/x_t+x_t$ with $x_t\\not= 0$\n", "\n", "The $x_{t+1}$ maximising $\\hat{y}_{t+1}$ is then given by \n", "\n", "$x_{t+1}=\\hat{b}_t/2$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Error" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But human agents are fallibe and so is the factory manager. Her believed production function fails to track reality accurately. Cohen and Axelrod stipulate that there is an unknown source of lost output in the factory due to pilferage. The variable $c$ $(c<0)$ will track this loss in the actual production function:\n", "\n", "$y_t = -x^2_t + b_{t-1}*x_t+c$\n", "\n", "We are limited beings and are unaware of all relevant variables and this leads us to make sub-optimal decisions. The factory manager will choose to devote a sub-optimal level of productive labour which leads to a negative surprise. Cohen and Axelrod model the surprise ($D$) as the difference between expected ($\\hat{U}$) and actually experienced utility ($U$). For their toy model two variables govern the overall utility: the output ($y$) and the intrinsic utility for produtive labour ($w*x$).\n", "\n", "Equation for expected utility: $\\hat{U}_{t}=\\hat{y}_t+w_t*x_t$ \n", "\n", "Equation for actual utility: $U_{t}=y_t+w_t*x_t$ \n", "\n", "Surprise: $D_t = U_t-\\hat{U}_t$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Changing Utility" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cohen and Axelrod point out that the factory manager can do better by changing her utility for productive labour, that is the $w$, based on the surpise. For illustration they propose the following updating equation:\n", "\n", "$w_{t+1}=\\frac{x_t-x_{t-1}}{|x_t|} * \\frac{D_t}{x_t} + w_t$\n", "\n", "They chose this equation because it gives surprise a significant role while avoiding runaway preference change.\n", "\n", "Of course, the preference for productive labour should also inform the decision. Accordingly we have a new updating equation for $x$:\n", "\n", "$x_{t+1}=\\hat{b}_t+w/2$\n", "\n", "That's it. We now have an agent with changing utility. Cohen and Axelrod use a flowchart to illustrate the resulting process, which I have recreated with some simplifications." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " image/svg+xml\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import SVG\n", "SVG(filename='flowchart_no_text.svg')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Central for Cohen and Axelrod's purpose is that this adaptive factory manager outperforms one who keeps the utility paramter ($w$) for production labour ($x$) constant. But how should we measure the performance? If we used experienced utility as the evaluative criterion, then of course the agent who gets extra utility from productive labour would win but that's not interesting. What's interesting is that the agent undergoing motivational change and not just valuing output ($y$) might make choices that create more output. Indeed that is the case for a range of numbers and we can explore this with the following lines of Python." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# making visualisation more beautiful\n", "sns.set()\n", "sns.set_style(\"whitegrid\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following function lets the factory run for a few rounds." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def produce(w=0, x=20, b=100, b_exp=50, c=-10, adapt=False):\n", " if c > 0:\n", " print(\"Warning: c should be <= 0 for the model to make sense.\")\n", " columns = pd.Index(['w', 'x', 'y', 'y_exp', 'b_exp'])\n", " data = pd.DataFrame(columns=columns)\n", " \n", " t = 0\n", " epsilon = 1\n", " while(epsilon > 0.1 and t < 10): # the loop runs 10 rounds or until the numbers have converged so much that there will be no further significant changes\n", " data.loc[t] = [None for _ in columns]\n", " \n", " # saving variables\n", " data['w'][t] = w\n", " data['x'][t] = x\n", " data['b_exp'][t] = b_exp\n", " \n", " # production and expected production\n", " data['y'][t] = -(x**2) + b*x + c\n", " data['y_exp'][t] = -(x**2) + b_exp*x\n", " \n", " \n", " # updating values for next round\n", " if x != 0: #avoid division by zero\n", " b_exp = data['y'][t]/x + x\n", " else:\n", " print(\"Warning: Avoided division by 0 for updating b_exp.\")\n", " \n", " if adapt and t > 0: # w is updated only if adaptive.\n", " if x != 0:\n", " # Utility and expected utility are only needed to calculate the updated w\n", " U = data['y'][t] + w*x\n", " U_exp = data['y_exp'][t] + w*x\n", " \n", " w = (x-data['x'][t-1])/abs(x) \\\n", " * (U - U_exp)/x + w\n", " else:\n", " print(\"Warning: Avoided division by 0 for updating w.\")\n", " \n", "\n", " x = (b_exp+w)/2\n", " \n", " # The epsilon determines whether there has been enough change to go on\n", " if t > 0:\n", " epsilon = abs(data['b_exp'][t] - data['b_exp'][t]) \\\n", " + abs(data['x'][t] - data['x'][t-1]) \\\n", " + abs(data['w'][t] - data['w'][t-1])\n", " t += 1 #increment number of rounds\n", " \n", " # save data from last cycle\n", " data['w'][-1] = w\n", " data['x'][-1] = x\n", " \n", " return data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The extract_y function returns the last y, that is the output achieved at the end (usually it's going to stay there)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def extract_y(w=0, x=20, b=100, b_exp=50, c=-10, adapt=False):\n", " data = produce(w, x, b, b_exp, c, adapt)\n", " return data['y'].iloc[-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a start, we visualize the difference between the plant without and the plant with dynamic utility using the standard values and varying only parameter c (pilferage).\n", "The other starting parameters are:\n", "- $b=100$\n", "- $\\hat{b}_0=50$\n", "- $x_0=20$" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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GxvrljmvXbvWuST9kSNHqKmpISAggK+++grLsigsLHTWbs6/uaioKP71r39hWZaz7q9//Wu3zBng448/5o477gDOvOHy9fV1+ZxDQkKcL/RXX301p0+fdtvf9s6dO4mKiiI3N5d+/fpx0003uWXOZzVlnqaxTdWq76R253Iehw4dYvr06axZs4aDBw8ye/Zs6urqCA8PJysrC29vb7KzsykoKMDhcDBr1qxL+oWelZWVxXvvvUd4eLhz25NPPklWVpZL6wJ8//33zJo1i2PHjnH69GkeeughunTp4vI5/9C4cePIyMjAy8vLLXXPXt1SXl6OzWZjxowZeHl5MW/ePOrr64mJiWHatGku+ZtbuHAhW7duxbIspk2bRseOHd32b/3yyy/j4+PDgw8+CJx5MXT1nO12O2lpaRw9epS6ujrGjx9Pr1693DLnyspKpk+fTk1NDcHBwTz99NNUVFS4dM6X+tpxrrFN0aoDQkREzq1VH2ISEZFzU0CIiIiRAkJERIwUECIiYqSAEBERIwWEiIgYKSBERMRIASHiQsePHycpKYm7776b+Ph4tmzZ4umWRC6aAkLEhZYuXUqnTp147733WLhwIc8995ynWxK5aLqTWsSF7rnnHp599lm6devm6VZEmqxVr+Yq4gpLly7lgw8+AM4se352yWWAAwcOEBYW1vRP9hLxAO1BiLhQVlYWAQEBTJ8+nQMHDvDQQw+xadOmBqEh0lIpIERc6MSJE6Snp/Pll186Py+4uVasFXE1BYSIiBjpQKiIiBgpIERExEgBISIiRgoIERExUkCIiIiRAkJERIwUECIiYvT/AD+GDJpIITvgAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def visualise_performance(b=100):\n", " # creating the pandas DataFrame, which will be plotted\n", " index = pd.Index(range(20))\n", " columns = pd.Index(['y', '-c', 'type'])\n", " plot_data = pd.DataFrame(index=index, columns=columns)\n", "\n", " i = 0\n", " for c in range(0, -1100, -100):\n", " plot_data['-c'][i] = abs(c)\n", " plot_data['y'][i] = extract_y(b=b, c=c)\n", " plot_data['type'][i] = \"Static\" \n", " i += 1\n", "\n", " plot_data['-c'][i] = abs(c)\n", " plot_data['y'][i] = extract_y(b=b, c=c, adapt=True)\n", " plot_data['type'][i] = \"Adaptive\"\n", " i += 1\n", "\n", " sns.barplot(x='-c', y='y', hue=\"type\", data=plot_data)\n", "\n", "visualise_performance()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen with the amount of pilferage the plant's output decreases, but the dynamic version does somewhat better. We can also visualise what happens if we change the parameter b." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "460dc9e197c4487eb114fef688427a79", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=100, description='b', max=210, min=90, step=10), Output()), _dom_classes…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from ipywidgets import widgets\n", "widgets.interact(visualise_performance, b=(90, 210, 10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that I have carefully chosen the values here. If the $b$ get's too small, the values become implausible. For example if $b$ = 50:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Warning: Avoided division by 0 for updating b_exp.\n", "Warning: Avoided division by 0 for updating b_exp.\n", "Warning: Avoided division by 0 for updating b_exp.\n", "Warning: Avoided division by 0 for updating w.\n", "Warning: Avoided division by 0 for updating b_exp.\n", "Warning: Avoided division by 0 for updating w.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "visualise_performance(b=50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nonetheless, Cohen and Axelrod have shown that for a large number of starting values the dynamic agent outperforms the static agent. Generally, whether the change of utility is adaptive depends on the ratio between the values of $c$ and the initial value of $x$. Cohen and Axelrod offer an illustrating graph on , but we can visualise the idea using a heatmap. The color of the heatmap cells indicates the ratio between the output ($y$) of the dynamic and the static factory." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def show_heatmap(c_values, x_values, b=100):\n", " \n", " plot_data = pd.DataFrame(index=x_values,\n", " columns=c_values,\n", " dtype=float)\n", " plot_data.index.names = ['x (initial production labour)']\n", " plot_data.columns.names = ['c (pilferage)']\n", " \n", " for c in c_values:\n", " for x in x_values:\n", " static_y = extract_y(c=c, x=x)\n", " adapt_y = extract_y(c=c, x=x, adapt=True)\n", "\n", " plot_data[c][x] = adapt_y / static_y\n", " \n", " sns.heatmap(plot_data)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def recreate_graphic():\n", " b = 100\n", " c_values = [-(b**2)//c_param for c_param in range(15, 65, 5)]\n", " x_values = [int(b*(x_param/5)) for x_param in range(1, 11)]\n", " \n", " show_heatmap(c_values, x_values)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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r18vUbyxY8eqH374odC2f/zjH+b9b9++Xc2aNUvl5+er5557TmVlZak7d+6ovn37qhs3bpT4+NatW6f69eun5s2bp5RS6osvvlATJkxQSin13XffqWHDhimllOrZs6fKyMhQJpNJDR48WJ04ccKq/RcUFKguXbqo27dvq4KCAvX888+rX3/9VX355Zdq4sSJSimlDh48aI6jlFInT55U/fv3V6+88kqJjiUvL0917txZ5ebmKqWUGj16tNq1a5f68ssv1VtvvaWUUmr//v1q5MiRSimlJkyYoHbs2KGUUiolJUXt2bPH5li///676tWr133PL+3rV1yszZs3q4SEBKWUUrdu3VIdOnRQSik1fPhwdfjwYfMx7ty506Y49n5P3HP8+HHVp08f9eyzz6qzZ88qpVSRv6uYmBh18uRJpdTd9+zs2bNtjuWoz3BFUq66WS5cuEBAQAAfffQRsbGxZGVl0aBBA/bv30+jRo0YMWIEw4YNo2PHjoXKLVq0iNjYWKpXr16ieGlpaaxYsYKoqCiWL18OwNGjR2nXrh0A7du3JyUlhXPnzhEYGEjlypXR6XSEhobeN9GYJd999x3ff/89ERER5m3/HevJJ5/kxIkT6PV68vPzCQwMxM3NjbZt25KSkmJVDI1Gw2effYafnx9ZWVkA+Pj48NxzzzFr1izg7jz091pZmZmZvPvuu0yePLlExwKg0+lYv349Xl5ewN2lBD09Palfvz5GoxGTyYRer8fD4+6Xw2+//Zbr168zcOBAkpOTadWqlc2xTp8+TV5eHq+99hr9+/fn2LFjNr1+xcXq2rUro0aNMj/vXut70aJFPP300+Tn53Pz5k2qVq1qUxx7vyfuyc/PZ8mSJTRo0MC8rajf1f/+7//SuHFjAIxGI56enjbHctRnuCIpV8k8MzOT7777jujoaFatWsXBgwdJSUkhMzOTEydO8Le//Y2ZM2cybtw489QBv/76KykpKfTt27fE8bp3786MGTP46KOPOHr0KHv27EGv15u/tvv4+JCdnV1o273ter3e6jg3btxg8eLFTJs2rdB2vV6Pr6+v+b5Go7lv2706WMvDw4OdO3fSq1cvWrZsaf6Aenh4MGHCBGbNmsULL7yA0WhkypQpTJ48GR8fH6v3f4+7u7v5j8KaNWvIzc2lTZs2eHt7c+XKFV588UWmTp1KXFwccPcr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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "recreate_graphic()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, we can also have an interactive version (smaller for performance reasons):" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def interactive_map(start_c=-300, start_x=50):\n", " c_values = [c for c in range(start_c-50*4, start_c+50, 50)]\n", " x_values = [x for x in range(start_x, start_x+80, 20)]\n", " show_heatmap(c_values, x_values)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "11cc88d0117e4cbeafbc17214f4e8366", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=-300, description='start_c', max=0, min=-400, step=100), IntSlider(value…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "widgets.interact(interactive_map, start_c=(-400, 0, 100), start_x=(10, 110, 10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The idea behind Cohen and Axelrod's paper is simple and ingenious: We are limited beings who constantly get things wrong and neglect important variables (such as the pilferage). One way of dealing with our ignorance is to introduce another flexible part into our choice system, namely changing motivations. To show that this additional degree of freedom helps, they sketch a plausible factory example.\n", "\n", "But that can only be the beginning. The factory is just a toy example and starts to break down for certain numbers. There remains a lot of room to improve their model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sources:\n", "\n", "- Bradley, R. (2017). *Decision Theory with a Human Face*. Cambridge: Cambridge University Press.\n", "\n", "- Cohen, M. D., & Axelrod, R. (1984). Coping with Complexity: The Adaptive Value of Changing Unity. *American Economic Review*, 74(1), 30.\n" ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.13" } }, "nbformat": 4, "nbformat_minor": 4 }