{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## CSCS530 Winter 2015\n", "#### Complex Systems 530 - Computer Modeling of Complex Systems (Winter 2015)\n", "\n", " * Course ID: CMPLXSYS 530\n", " * Course Title: Computer Modeling of Complex Systems\n", " * Term: Winter 2015\n", " * Schedule: Wednesdays and Friday, 1:00-2:30PM ET\n", " * Location: 120 West Hall (http://www.lsa.umich.edu/cscs/research/computerlab)\n", " * Teachers: [Mike Bommarito](https://www.linkedin.com/in/bommarito) and [Sarah Cherng](https://www.linkedin.com/pub/sarah-cherng/35/1b7/316)\n", "\n", "#### [View this repository on NBViewer](http://nbviewer.ipython.org/github/mjbommar/cscs-530-w2015/tree/master/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Schelling Model (basic)\n", "\n", "\n", " __TODO__: Describe Schelling model and reference Think Complexity chapter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Imports\n", "\n", " In this model, we'll be importing a few extra libraries that we haven't seen before:\n", " \n", " * [copy](https://docs.python.org/2/library/copy.html)\n", " * [itertools](https://docs.python.org/2/library/itertools.html)" ] }, { "cell_type": "code", "execution_count": 270, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "# Imports\n", "import copy\n", "import itertools\n", "\n", "import numpy\n", "import matplotlib.pyplot as plt\n", "import pandas\n", "\n", "import seaborn; seaborn.set()\n", "\n", "# Import widget methods\n", "from IPython.html.widgets import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building a grid\n", "\n", " In the sample below, we'll create a simple square grid and fill the grid with households. The parameters below will guide our model as follows:\n", " \n", " * __``grid_size``__: the number of cells per row or column; the total number of cells is $grid\\_size^2$.\n", " * __``group_proportion``__: the percentage of households that will be of type 1\n", " * __``density``__: the percentage of grid cells that will be populated with a household\n", " \n", " The logic for our grid initialization can be described as follows:\n", " \n", " * For each cell in every row and column\n", " * Draw a random value on $[0, 1)$ and compare to $density$ to determine if we will fill this cell\n", " * If the cell will be filled, draw a random value on $[0, 1)$ and compare to $group\\_proportion$ to determine whether the household will be 1 or 2" ] }, { "cell_type": "code", "execution_count": 273, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "qVcMPklSr/w/EmUTmQJLwHkAAAAASUVORK5CYII=\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Set parameters\n", "grid_size = 20\n", "group_proportion = 0.25\n", "density = 0.5\n", "\n", "# Create the space and activate random cells\n", "space = numpy.zeros((grid_size, grid_size), dtype=numpy.int8)\n", "\n", "# Now sample the agents.\n", "for row_id in range(grid_size):\n", " for col_id in range(grid_size):\n", " # Determine if this cell will be populated\n", " if numpy.random.random() <= density:\n", " # Determine this cell's initial group\n", " if numpy.random.random() <= group_proportion:\n", " cell_type = 1\n", " else:\n", " cell_type = 2\n", " \n", " # Set the space\n", " space[row_id, col_id] = cell_type\n", " \n", "# Now show the space\n", "f = plt.figure()\n", "p = plt.pcolor(space, snap=True)\n", "c = plt.colorbar()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Initialization method\n", "\n", " Below, we wrap the test method above in a method named ``initialize_space``. We need to setup the following parameters:\n", " \n", " * __``grid_size``__: number of cells in each row or column\n", " * __``group_proportion``__: percentage of initial population that will be of group 1\n", " * __``density``__: percentage of cells that will be occupied in the space" ] }, { "cell_type": "code", "execution_count": 274, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def initialize_space(grid_size, group_proportion, density):\n", " \"\"\"\n", " Initialize a space.\n", " \"\"\"\n", " \n", " # Create the space and activate random cells\n", " space = numpy.zeros((grid_size, grid_size), dtype=numpy.int8)\n", "\n", " # Now sample the agents.\n", " for row_id in range(grid_size):\n", " for col_id in range(grid_size):\n", " # Determine if this cell will be populated\n", " if numpy.random.random() <= density:\n", " # Determine this cell's initial group\n", " if numpy.random.random() <= group_proportion:\n", " cell_type = 1\n", " else:\n", " cell_type = 2\n", "\n", " # Set the cell\n", " space[row_id, col_id] = cell_type\n", "\n", " return space" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Testing out space initialization\n", "\n", " Let's test out our ``initialize_space`` method by visualizing for given parameters below." ] }, { "cell_type": "code", "execution_count": 278, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 278, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "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\n", "TkSuQmCC\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Set parameters\n", "grid_size = 10\n", "group_proportion = 0.25\n", "happy_proportion = 0.5\n", "density = 0.5\n", "window = 1\n", "\n", "def display_space(grid_size=10, group_proportion=0.5, density=0.5):\n", " # Check\n", " assert(grid_size > 1)\n", " assert(group_proportion >= 0.0)\n", " assert(group_proportion <= 1.0)\n", " assert(density >= 0.0)\n", " assert(density <= 1.0)\n", "\n", " # Initialize space\n", " space = initialize_space(grid_size, group_proportion, density)\n", "\n", " # Plot\n", " f = plt.figure()\n", " p = plt.pcolor(space)\n", " c = plt.colorbar()\n", "\n", "# Setup widget\n", "interact(display_space,\n", " grid_size=IntSliderWidget(min=2, max=100, value=10),\n", " group_proportion=FloatSliderWidget(min=0.0, max=1.0, value=0.5),\n", " density=FloatSliderWidget(min=0.0, max=1.0, value=0.5))" ] }, { "cell_type": "code", "execution_count": 281, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Household type: 2\n", "Neighborhood:\n", "[[2 2 0]\n", " [0 2 1]\n", " [0 2 0]]\n", "Number of similar neighbors:\n", "3\n", "Fraction of similar neighbors:\n", "0.375\n" ] } ], "source": [ "# Pick a random household\n", "household_list = numpy.column_stack(numpy.where(space > 0))\n", "household_id = numpy.random.choice(range(len(household_list)))\n", "\n", "# Check if the household is happy\n", "row, col = household_list[household_id]\n", "household_type = space[row, col]\n", "\n", "# Get the set of positions with grid wrapping for neighbors\n", "neighbor_pos = [(x % grid_size, y % grid_size)\n", " for x, y in itertools.product(range(row-window, row+window+1),\n", " range(col-window, col+window+1))]\n", "neighborhood = numpy.reshape([space[x, y] for x, y in neighbor_pos],\n", " (2*window+1, 2*window+1))\n", "\n", "# Count the number of neighbors of same type\n", "neighbor_count = len(numpy.where(neighborhood == household_type)[0]) - 1\n", "neighbor_fraction = float(neighbor_count) / ((2 * window + 1) **2 - 1)\n", "\n", "# Output counts\n", "print(\"Household type: {0}\".format(household_type))\n", "print(\"Neighborhood:\")\n", "print(neighborhood)\n", "print(\"Number of similar neighbors:\")\n", "print(neighbor_count)\n", "print(\"Fraction of similar neighbors:\")\n", "print(neighbor_fraction)" ] }, { "cell_type": "code", "execution_count": 383, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def run_model_step(space, happy_proportion, window):\n", " \"\"\"\n", " Run a step of the model.\n", " \"\"\"\n", " space = copy.copy(space)\n", " grid_size = space.shape[0]\n", " \n", " # Get list of empty and occupied\n", " household_list = numpy.column_stack(numpy.where(space > 0))\n", " \n", " # Pick a random house\n", " household_id = numpy.random.choice(range(len(household_list)))\n", "\n", " # Check if the household is happy\n", " row, col = household_list[household_id]\n", " household_type = space[row, col]\n", " \n", " # Get the set of positions with grid wrapping for neighbors\n", " neighbor_pos = [(x % grid_size, y % grid_size)\n", " for x, y in itertools.product(range(row-window, row+window+1),\n", " range(col-window, col+window+1))]\n", " neighborhood = numpy.reshape([space[x, y] for x, y in neighbor_pos],\n", " (2*window+1, 2*window+1))\n", "\n", " # Count the number of neighbors of same type\n", " neighbor_count = len(numpy.where(neighborhood == household_type)[0]) - 1\n", " neighbor_fraction = float(neighbor_count) / ((2 * window + 1) **2 - 1)\n", " \n", " # If the house is unhappy, move.\n", " if neighbor_fraction < happy_proportion:\n", " # Get empty cells\n", " empty_list = numpy.column_stack(numpy.where(space == 0))\n", " \n", " # Get empty target cell\n", " target_cell_id = numpy.random.choice(range(len(empty_list)))\n", " target_row, target_col = empty_list[target_cell_id]\n", " \n", " # Move the agent\n", " space[row, col] = 0\n", " space[target_row, target_col] = household_type\n", "\n", " return space" ] }, { "cell_type": "code", "execution_count": 384, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Set parameters\n", "grid_size = 50\n", "group_proportion = 0.33\n", "happy_proportion = 0.33\n", "density = 0.5\n", "window = 3\n", "max_steps = 100000\n", "\n", "# Initialize space\n", "space = initialize_space(grid_size, group_proportion, density)\n", "\n", "# Setup space\n", "space_history = [space]\n", "\n", "# Iterate\n", "for i in range(max_steps):\n", " # Append step history\n", " space_history.append(run_model_step(space_history[-1],\n", " happy_proportion,\n", " window))" ] }, { "cell_type": "code", "execution_count": 385, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def display_space_step(step=1):\n", " f = plt.figure()\n", " plt.pcolor(space_history[step])\n", " ax = f.gca()\n", " ax.set_aspect(1./ax.get_data_ratio()) " ] }, { "cell_type": "code", "execution_count": 400, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "FaDA/wHBOX56mO7yRwAAAABJRU5ErkJggg==\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "interact(display_space_step,\n", " step=IntSliderWidget(min=1, max=len(space_history)-1,\n", " step=1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Automate simulation" ] }, { "cell_type": "code", "execution_count": 395, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "FaDA/wHBOX56mO7yRwAAAABJRU5ErkJggg==\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%time\n", "\n", "def run_model_simulation(grid_size = 50, group_proportion = 0.33, happy_proportion = 0.33,\n", " density = 0.5, window = 1, max_steps = 100000):\n", " \"\"\"\n", " Run a full model simulation.\n", " \"\"\"\n", "\n", " # Initialize space\n", " space = initialize_space(grid_size, group_proportion, density)\n", "\n", " # Setup space\n", " space_history = [space]\n", "\n", " # Iterate\n", " for i in range(max_steps):\n", " # Append step history\n", " space_history.append(run_model_step(space_history[-1],\n", " happy_proportion,\n", " window))\n", "\n", " return space_history\n", "\n", "# Run the simulation and output\n", "space_history = run_model_simulation(grid_size=25, happy_proportion=0.25, window=1, max_steps=10000)\n", "interact(display_space_step,\n", " step=IntSliderWidget(min=1, max=len(space_history)-1,\n", " step=1))" ] }, { "cell_type": "code", "execution_count": 396, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def get_neighbor_distribution(space, window=1):\n", " \"\"\"\n", " Get distribution of neighbor fractions.\n", " \"\"\"\n", " \n", " fractions = numpy.full(space.shape, numpy.nan)\n", " grid_size = space.shape[0]\n", " \n", " # Get a measure of clustering\n", " for row in range(grid_size):\n", " for col in range(grid_size):\n", " # Check if cell is occupied\n", " if space[row, col] == 0:\n", " continue\n", " else:\n", " household_type = space[row, col]\n", " \n", " neighbor_pos = [1 for x, y in itertools.product(range(row-window, row+window+1),\n", " range(col-window, col+window+1))\n", " if space[x % grid_size, y % grid_size] == household_type]\n", " fractions[row, col] = float(sum(neighbor_pos)-1) / ((2 * window + 1) **2 - 1)\n", " \n", " return fractions\n", "\n", "# Get the full happiness history\n", "happy_history = []\n", "happy_mean_ts = []\n", "for step in range(len(space_history)):\n", " happy_history.append(get_neighbor_distribution(space_history[step]))\n", " happy_mean_ts.append(numpy.nanmean(happy_history[-1]))" ] }, { "cell_type": "code", "execution_count": 397, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n", "AaCkGjvRNq+HAAAAAElFTkSuQmCC\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Method to plot happiness surface\n", "def display_happy_step(step=1):\n", " # Create figures\n", " f = plt.figure()\n", " plt.pcolor(happy_history[step])\n", " plt.colorbar()\n", " \n", "\n", "# Create widget\n", "interact(display_happy_step,\n", " step=IntSliderWidget(min=1, max=len(happy_history)-1,\n", " step=1))" ] }, { "cell_type": "code", "execution_count": 398, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 398, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": [ "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\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot the average time series\n", "f = plt.figure()\n", "plt.plot(range(len(happy_mean_ts)), happy_mean_ts)" ] } ], "metadata": { "kernelspec": { "display_name": "IPython (Python 2)", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.3" }, "signature": "sha256:a87e5db3603cc8085b11eb7d58a5964843d51b8a17fc0756b1faa170b8fa9e5f" }, "nbformat": 4, "nbformat_minor": 0 }