{
"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": [
""
],
"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": [
"