{"data":{"markdownRemark":{"html":"<h2 id=\"model-overview\"><a href=\"#model-overview\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Model overview</h2>\n<p>In this tutorial we will present an implementation of the classic Schelling model of segregation. This model illustrates how the interaction of people with \"mild\" in-group preference towards their own group can lead to highly segregated societies.</p>\n<p>This model is embedded in a 2-dimensional grid forming the model environment. This model environment is inhabited by two types of agents (blue and red agents). Every agent occupies one cell in the 2-d grid. All agents have a preference for living in a neighborhood with agents of the same type, with a threshold parameter defining the level of similarity needed for an agent to be satisfied.\nIf there are not enough similar agents (i.e. agents of the same colour) in a neighborhood, agents can decide to move to a cell where the neighborhood has more agents of similar type.</p>\n<p>The model simulates the segregation of neighborhoods over time based on the agents' preferences for similarity.</p>\n<p>The code for this tutorial is available as a zip download, containing a complete model as a Maven project. This project should be able to be run from any Maven or Java IDE environment.</p>\n<a href=\"https://simudynecontent.blob.core.windows.net/$web/2.5.2/schelling_segregation_tutorial_2.5.2.zip\" class=\"ui button primary\" download>\n\tDownload Tutorial Files\n</a>\n<h2 id=\"summary-of-the-model-implementation\"><a href=\"#summary-of-the-model-implementation\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary of the model implementation</h2>\n<p>In the Simudyne SDK implementation, the model has the following core components:</p>\n<ul>\n<li>Schelling agents: blue and red agents</li>\n<li>Environment: saving information about the 2-d grid environment (e.g. which cells are occupied) and communicating these information to the Schelling agents</li>\n<li>Evaluation of neighborhoods with respect to similarity between agents</li>\n<li>Agents' decision to move to a different cell if the neighborhood is not similar enough</li>\n<li>Assignment of new cells for agents that decided to move</li>\n</ul>\n<h2 id=\"globals\"><a href=\"#globals\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Globals</h2>\n<p>The following global variables are defined in the Schelling model.</p>\n<blockquote>\n<p>SchellingModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Globals</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">GlobalState</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Grid Size\"</span><span class=\"token punctuation\">)</span>  \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> gridSize <span class=\"token operator\">=</span> <span class=\"token number\">40</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Empty Cells Proportion\"</span><span class=\"token punctuation\">)</span>  \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">double</span> emptyCellsPcg <span class=\"token operator\">=</span> <span class=\"token number\">0.1</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Similarity Threshold\"</span><span class=\"token punctuation\">)</span>  \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">double</span> similarityThreshold <span class=\"token operator\">=</span> <span class=\"token number\">0.4</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token annotation punctuation\">@Input</span><span class=\"token punctuation\">(</span>name <span class=\"token operator\">=</span> <span class=\"token string\">\"Data Export Tick\"</span><span class=\"token punctuation\">)</span>  \n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> dataExportTick <span class=\"token operator\">=</span> <span class=\"token number\">49</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token keyword\">public</span> GridParameters gridParameters<span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>The variable <code class=\"language-text\">gridSize</code> defines the length of the dimension of the grid environment. For example, a <code class=\"language-text\">gridSize</code> of 40 will result in a 40*40 environment, i.e. creating 1600 cells.</li>\n<li>The variable <code class=\"language-text\">emptyCellsPcg</code> defines the percentage of empty cells overall. For instance, a <code class=\"language-text\">emptyCellsPcg</code> of 0.1 will result in a 10% empty cells.</li>\n<li>The variable <code class=\"language-text\">similarityThreshold</code> defines the threshold of percentage of similar agents needed in a neighborhood to satisfy the agents. If the similarity in a neighborhood drops below this threshold the agent will decide to move neighborhoods. For example, if the similarity threshold is 0.4 and an agents neighborhood has 3 agents of the same color and 5 agents of the opposite type (i.e. 37.5% similarity) the agent will decide to move.</li>\n<li>The variable <code class=\"language-text\">dataExportTick</code> defines the tick on which the data should be exported. Please ensure here that this tick is the last tick of the iteration.</li>\n<li>The variable <code class=\"language-text\">gridParameters</code> initializes an object of class GridParameters, which defines the 2-d grid.</li>\n</ul>\n<h2 id=\"setup\"><a href=\"#setup\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setup</h2>\n<p>In the setup,  the environment, all agents and all links are initialized to setup the initial state of the model.\nCreating the initial agents is done through the concept of a topology of groups. A group represents a set of agents, where each group has a type of agent, a number of agents in that group, and optionally an initialiser, which can customise the state for each agent.</p>\n<p>In this model, we have a group of Schelling agents and an environment.</p>\n<blockquote>\n<p>SchellingModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">     Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>BlueAgent<span class=\"token punctuation\">></span></span> blueAgentGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>BlueAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters<span class=\"token punctuation\">.</span>nbBlue<span class=\"token punctuation\">,</span>  \n         blueAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> blueAgent<span class=\"token punctuation\">.</span>similarityThreshold <span class=\"token operator\">=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>similarityThreshold<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n        Group<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>RedAgent<span class=\"token punctuation\">></span></span> redAgentGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>RedAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters<span class=\"token punctuation\">.</span>nbRed<span class=\"token punctuation\">,</span>  \n         redAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> redAgent<span class=\"token punctuation\">.</span>similarityThreshold <span class=\"token operator\">=</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>similarityThreshold<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The Schelling agents are further divided into a group of blue and red agents, whereby both groups have the same number of agents which is defined by the number of cells minus the percentage of empty cells. On initialization, each agents <code class=\"language-text\">similarityThreshold</code> is equated to the variable <code class=\"language-text\">similarityThreshold</code> defined in Globals.</p>\n<blockquote>\n<p>SchellingModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridParameters <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">GridParameters</span><span class=\"token punctuation\">(</span><span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>gridSize<span class=\"token punctuation\">,</span> <span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>emptyCellsPcg<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \nGroup<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Environment<span class=\"token punctuation\">></span></span> environmentGroup <span class=\"token operator\">=</span> <span class=\"token function\">generateGroup</span><span class=\"token punctuation\">(</span>Environment<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> Environment<span class=\"token operator\">:</span><span class=\"token operator\">:</span>initEnvironment<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  </code></pre></div>\n<p>In addition to the agent groups, there is also the environment which saves the information about the 2-d grid, the type of agent occupying a cell, the similarity of neighborhood and a list of empty cells. the  The environment can provide the Schelling agents with information about their surrounding and point towards empty cells in case an agent decides to move.</p>\n<blockquote>\n<p>SchellingModel.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">environmentGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>blueAgentGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>EnvironmentToSchellingLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \nenvironmentGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>redAgentGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>EnvironmentToSchellingLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \nblueAgentGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>environmentGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>SchellingToEnvironmentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \nredAgentGroup<span class=\"token punctuation\">.</span><span class=\"token function\">fullyConnected</span><span class=\"token punctuation\">(</span>environmentGroup<span class=\"token punctuation\">,</span> Links<span class=\"token punctuation\">.</span>SchellingToEnvironmentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>To enable the interaction between agents and environment, all agents display a connection to the environment and conversely the environment has a connection will all agents.</p>\n<h2 id=\"step\"><a href=\"#step\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step</h2>\n<p>The step takes care of the logic that happens between each tick, in an ABM this is mostly concerned with running behavioural sequences over the system to move the system forwards through time.</p>\n<p>In this model, the main components of each step are evaluating an agents environment and moving cells in case an agent is unhappy with its neighborhood.</p>\n<p>The line <code class=\"language-text\">run(Environment.updateAgentStates(), SchellingAgent.updateState());</code> runs an evaluation of the agents environment based on movement that occurred in the previous step. After this process, each agent has an updated measure of the percentage of similar agents in its neighborhood.</p>\n<p>After the update, each agent will evaluate whether its neighborhood is similar enough, and if not move to a different cell. This evaluation is conducted in the  <code class=\"language-text\">SchellingAgent.step()</code> function. If an agent decides to move, the movement to a new empty cell is coordinated by the <code class=\"language-text\">Environment.moveAgents()</code> function.</p>\n<p>Moreover, on the first step, the function <code class=\"language-text\">run(SchellingAgent.registerToEnvironment(), Environment.receiveRegistrations())</code> is executed in order to assign an initial location for each agent in the 2-d grid.</p>\n<p>Each of these behaviors will be explained in more detail in the following section.</p>\n<h2 id=\"behaviors\"><a href=\"#behaviors\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Behaviors</h2>\n<p>We'll run through the actions in this sequence in order, to see how they progress. When we see each agent for the first time, we'll also have a quick look at how it's defined.</p>\n<h3 id=\"schellingagentregistertoenvironment\"><a href=\"#schellingagentregistertoenvironment\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SchellingAgent#registerToEnvironment</h3>\n<blockquote>\n<p>SchellingAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">   <span class=\"token keyword\">public</span> <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SchellingAgent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SchellingModel<span class=\"token punctuation\">.</span>Globals<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">public</span> <span class=\"token keyword\">final</span> AgentState<span class=\"token punctuation\">.</span>AgentRace race<span class=\"token punctuation\">;</span>  \n        <span class=\"token keyword\">public</span> <span class=\"token keyword\">double</span> similarityThreshold<span class=\"token punctuation\">;</span>  \n        <span class=\"token keyword\">public</span> AgentState state<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">public</span> <span class=\"token function\">SchellingAgent</span><span class=\"token punctuation\">(</span>AgentState<span class=\"token punctuation\">.</span>AgentRace race<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>race <span class=\"token operator\">=</span> race<span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  </code></pre></div>\n<p>Each Schelling Agent has a <code class=\"language-text\">race</code> which describes whether the agent is of type blue or red. Moreover, the Schelling agents have a <code class=\"language-text\">similarityThreshold</code> which is the same for all Schelling agents and is defined in the Globals. Moreover, each agent has a <code class=\"language-text\">state</code> which describes whether this agent is <em>happy</em> or <em>unhappy</em> in its environment (i.e. whether the agents wants to move or not), its current location and the similarity of its neighborhood.</p>\n<blockquote>\n<p>SchellingAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">     <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SchellingAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">registerToEnvironment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \t <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SchellingAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> schellingAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n\t         schellingAgent<span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">AgentState</span><span class=\"token punctuation\">(</span>schellingAgent<span class=\"token punctuation\">.</span>race<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t AgentState state <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">AgentState</span><span class=\"token punctuation\">(</span>schellingAgent<span class=\"token punctuation\">.</span>race<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t schellingAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getLinks</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>SchellingToEnvironmentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span>\n\t\t\t  <span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>StateMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span>  \n\t            <span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">,</span> link<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> msg<span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n         <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n      <span class=\"token punctuation\">}</span></code></pre></div>\n<p>On the first tick of each simulation, each Schelling agent registers to the environment by sending a <code class=\"language-text\">StateMessage</code> to the environment.</p>\n<blockquote>\n<p>Messages.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">   <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">StateMessage</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Message</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">public</span> AgentState state<span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>Such  <code class=\"language-text\">StateMessage</code> entails a <code class=\"language-text\">state</code> object which encorporates all relevant information about the agent, such as whether the agent is happy or not and its type.</p>\n<h3 id=\"environmentreceiveregistrations\"><a href=\"#environmentreceiveregistrations\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Environment#receiveRegistrations</h3>\n<p>The environment stores all information about the 2-d grid and the agents such as their position and state.</p>\n<blockquote>\n<p>Environment.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Environmenenter</span> link description heret <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Agent</span><span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SchellingModel<span class=\"token punctuation\">.</span>Globals<span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>  \n     <span class=\"token keyword\">public</span> HashMap<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">,</span> AgentState<span class=\"token punctuation\">></span></span> agentMap<span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> Random random<span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> Grid grid<span class=\"token punctuation\">;</span>  \n     <span class=\"token keyword\">public</span> DataOutput dataOutput<span class=\"token punctuation\">;</span>  \n     <span class=\"token annotation punctuation\">@Variable</span>  \n     <span class=\"token keyword\">public</span> <span class=\"token keyword\">double</span> averageSimilarity<span class=\"token punctuation\">;</span>  \n     <span class=\"token annotation punctuation\">@Variable</span>  \n     <span class=\"token keyword\">public</span> <span class=\"token keyword\">int</span> unhappyAgentCount<span class=\"token punctuation\">;</span></code></pre></div>\n<p>In the field <code class=\"language-text\">agentMap</code> the environment saves a hashmap with each agents identifier as key and their state as value.\nMoreover, the environment saves the <code class=\"language-text\">grid</code> and overall statistics such as <code class=\"language-text\">averageSimilarity</code> and <code class=\"language-text\">unhappyAgentCount</code> which are displayed as outputs in the console.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Environment<span class=\"token punctuation\">></span></span> <span class=\"token function\">receiveRegistrations</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n\t<span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Environment<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> environment <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n        environment<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>StateMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>stateMessage <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n                environment<span class=\"token punctuation\">.</span>agentMap<span class=\"token punctuation\">.</span><span class=\"token function\">put</span><span class=\"token punctuation\">(</span>stateMessage<span class=\"token punctuation\">.</span><span class=\"token function\">getSender</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> stateMessage<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>When the agents register to the environment, each agent is added to the <code class=\"language-text\">agentMap</code> saving their identifier and their state.</p>\n<h3 id=\"environmentinitpositions\"><a href=\"#environmentinitpositions\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Environment#initPositions</h3>\n<p>During the first step, the environment also assigns an initial location to each agent to create the starting conditions of the 2-d grid.</p>\n<blockquote>\n<p>Environment.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Environment<span class=\"token punctuation\">></span></span> <span class=\"token function\">initPositions</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Environment<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> environment <span class=\"token operator\">-</span><span class=\"token operator\">></span> environment<span class=\"token punctuation\">.</span>agentMap<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>agentID<span class=\"token punctuation\">,</span> \t\t\t\t agentState<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n        Optional<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Cell<span class=\"token punctuation\">></span></span> optionalCell <span class=\"token operator\">=</span> environment<span class=\"token punctuation\">.</span>grid<span class=\"token punctuation\">.</span>cellList<span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n                <span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">-</span><span class=\"token operator\">></span> x<span class=\"token punctuation\">.</span><span class=\"token function\">sameAgentState</span><span class=\"token punctuation\">(</span>agentState<span class=\"token punctuation\">.</span>race<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>x<span class=\"token punctuation\">.</span>occupied<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">findFirst</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>optionalCell<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  \n            <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IllegalArgumentException</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"No position found.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  \n  Cell cell <span class=\"token operator\">=</span> optionalCell<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  cell<span class=\"token punctuation\">.</span><span class=\"token function\">switchState</span><span class=\"token punctuation\">(</span>agentState<span class=\"token punctuation\">.</span>race<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  agentState<span class=\"token punctuation\">.</span>position <span class=\"token operator\">=</span> cell<span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Here, the environment searches for empty cells that are also in line with the agents preferences (i.e. enough similar agents in the surrounding neighborhood) and if a cell exists that satisfies these constraints the agent is assigned to this cell.</p>\n<h3 id=\"environmentupdateagentstates\"><a href=\"#environmentupdateagentstates\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Environment#updateAgentStates</h3>\n<p>After the initialization, the first action in each tick is to update the state associated with each agent.</p>\n<blockquote>\n<p>Environment.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Environment<span class=\"token punctuation\">></span></span> <span class=\"token function\">updateAgentStates</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Environment<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> environment <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n        environment<span class=\"token punctuation\">.</span>averageSimilarity <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>  \n\t    environment<span class=\"token punctuation\">.</span>agentMap<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>agentID<span class=\"token punctuation\">,</span> agentState<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n            <span class=\"token keyword\">double</span> similarityMetric <span class=\"token operator\">=</span> environment<span class=\"token punctuation\">.</span><span class=\"token function\">calculateSimilarityMetric</span><span class=\"token punctuation\">(</span>agentState<span class=\"token punctuation\">.</span>position<span class=\"token punctuation\">.</span>coordinates<span class=\"token punctuation\">,</span> agentState<span class=\"token punctuation\">.</span>race<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t    agentState<span class=\"token punctuation\">.</span><span class=\"token function\">changeSimilarityMetric</span><span class=\"token punctuation\">(</span>similarityMetric<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t    environment<span class=\"token punctuation\">.</span>averageSimilarity <span class=\"token operator\">+=</span> similarityMetric<span class=\"token punctuation\">;</span>  \n\t\t    environment<span class=\"token punctuation\">.</span><span class=\"token function\">getLinksTo</span><span class=\"token punctuation\">(</span>agentID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>StateMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">,</span> link<span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n                    msg<span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> agentState<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t   environment<span class=\"token punctuation\">.</span>averageSimilarity <span class=\"token operator\">=</span> environment<span class=\"token punctuation\">.</span>averageSimilarity <span class=\"token operator\">/</span> environment<span class=\"token punctuation\">.</span>agentMap<span class=\"token punctuation\">.</span><span class=\"token function\">size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>For each agent, the similarity of agents in the neighborhood is calculated and each agent is informed about the new similarity of its surrounding by the environment.  This is done by sending a <code class=\"language-text\">StateMessage</code> entailing an altered <code class=\"language-text\">state</code> object which incorporates the new <code class=\"language-text\">similarityMetric</code> for the agent's cell.</p>\n<h3 id=\"schellingagentupdatestate\"><a href=\"#schellingagentupdatestate\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SchellingAgent#updateState</h3>\n<blockquote>\n<p>SchellingAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"> <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SchellingAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">updateState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SchellingAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> schellingAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n              schellingAgent<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span><span class=\"token function\">update</span><span class=\"token punctuation\">(</span>schellingAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getMessageOfType</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>StateMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Based on the newly calculated similarity of each agents' neighborhood the agents' update their states to incorporate this new information about their environment.</p>\n<h3 id=\"schellingagentstep\"><a href=\"#schellingagentstep\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SchellingAgent#step</h3>\n<blockquote>\n<p>SchellingAgent.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"> <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>SchellingAgent<span class=\"token punctuation\">></span></span> <span class=\"token function\">step</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n            <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>SchellingAgent<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> schellingAgent <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n                schellingAgent<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span><span class=\"token function\">changeSatisfaction</span><span class=\"token punctuation\">(</span>schellingAgent<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>similarityMetric <span class=\"token operator\">&lt;</span> schellingAgent<span class=\"token punctuation\">.</span>similarityThreshold <span class=\"token operator\">?</span> AgentState<span class=\"token punctuation\">.</span>Satisfaction<span class=\"token punctuation\">.</span>UNHAPPY <span class=\"token operator\">:</span> AgentState<span class=\"token punctuation\">.</span>Satisfaction<span class=\"token punctuation\">.</span>HAPPY<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>schellingAgent<span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>satisfaction <span class=\"token operator\">==</span> AgentState<span class=\"token punctuation\">.</span>Satisfaction<span class=\"token punctuation\">.</span>UNHAPPY<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                    schellingAgent<span class=\"token punctuation\">.</span><span class=\"token function\">getLinks</span><span class=\"token punctuation\">(</span>Links<span class=\"token punctuation\">.</span>SchellingToEnvironmentLink<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>UnhappyMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    <span class=\"token punctuation\">}</span>  \n\t\t\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>   \n\t\t\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>After updating the similarity of its neighborhood, each agent needs to decide whether to move or not. For this, the agent compares its neighborhood similarity to its similarity threshold and decides whether it is still happy in the current cell.\nIf the agent is unhappy, it will send a message to the environment indicating that it would like to move.</p>\n<blockquote>\n<p>Messages.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">   <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">UnhappyMessage</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Message<span class=\"token punctuation\">.</span>Empty</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code class=\"language-text\">UnhappyMessage</code> is an empty message, as no additional information is needed besides the agent's wish to move cells.</p>\n<h3 id=\"environmentmoveagents\"><a href=\"#environmentmoveagents\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Environment#moveAgents</h3>\n<blockquote>\n<p>Environment.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Environment<span class=\"token punctuation\">></span></span> <span class=\"token function\">moveAgents</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Environment<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> environment <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n        ArrayList<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Long<span class=\"token punctuation\">></span></span> unhappyAgents <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t    environment<span class=\"token punctuation\">.</span><span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>Messages<span class=\"token punctuation\">.</span>UnhappyMessage<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>msg <span class=\"token operator\">-</span><span class=\"token operator\">></span> unhappyAgents<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>msg<span class=\"token punctuation\">.</span><span class=\"token function\">getSender</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t    Collections<span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span>unhappyAgents<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t    Collections<span class=\"token punctuation\">.</span><span class=\"token function\">shuffle</span><span class=\"token punctuation\">(</span>unhappyAgents<span class=\"token punctuation\">,</span> environment<span class=\"token punctuation\">.</span>random<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t    environment<span class=\"token punctuation\">.</span>unhappyAgentCount <span class=\"token operator\">=</span> unhappyAgents<span class=\"token punctuation\">.</span><span class=\"token function\">size</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n        unhappyAgents<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>agentID <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n                    AgentState<span class=\"token punctuation\">.</span>AgentRace race <span class=\"token operator\">=</span> environment<span class=\"token punctuation\">.</span>agentMap<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>agentID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>race<span class=\"token punctuation\">;</span>  \n\t\t\t\t    Optional<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Cell<span class=\"token punctuation\">></span></span> optionalCell <span class=\"token operator\">=</span> environment<span class=\"token punctuation\">.</span>grid<span class=\"token punctuation\">.</span>cellList<span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">-</span><span class=\"token operator\">></span>  \n                            <span class=\"token operator\">!</span>x<span class=\"token punctuation\">.</span>occupied <span class=\"token operator\">&amp;&amp;</span> environment<span class=\"token punctuation\">.</span><span class=\"token function\">calculateSimilarityMetric</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">.</span>coordinates<span class=\"token punctuation\">,</span> race<span class=\"token punctuation\">)</span><span class=\"token operator\">>=</span> environment<span class=\"token punctuation\">.</span><span class=\"token function\">getGlobals</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>similarityThreshold<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">findAny</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>optionalCell<span class=\"token punctuation\">.</span><span class=\"token function\">isPresent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  \n                        <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    Cell oldCell <span class=\"token operator\">=</span> environment<span class=\"token punctuation\">.</span>agentMap<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>agentID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>position<span class=\"token punctuation\">;</span>  \n\t\t\t\t    oldCell<span class=\"token punctuation\">.</span><span class=\"token function\">vacate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n \t\t\t\t    Cell newCell <span class=\"token operator\">=</span> optionalCell<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    newCell<span class=\"token punctuation\">.</span><span class=\"token function\">switchState</span><span class=\"token punctuation\">(</span>race<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t\t    environment<span class=\"token punctuation\">.</span>agentMap<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>agentID<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">changePosition</span><span class=\"token punctuation\">(</span>newCell<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t    <span class=\"token punctuation\">}</span>  \n        <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The environment will receive messages from all agents that wish to move their cell. Based on this list of agents, the environment aims to find an appropriate cell available for each agent. This means the environment goes through the list of empty cells and evaluates whether this empty cell is in line with the similarity requirements of the agent. If a suitable cell is available, the environment indicates this to the agent and the agent moves to the new location.</p>\n<h3 id=\"environmentwritedata\"><a href=\"#environmentwritedata\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Environment#writeData</h3>\n<p>At the end of each tick, the configuration of the 2-d grid is saved to enable exporting data for additional analysis outside the SDK.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">   <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Environment<span class=\"token punctuation\">></span></span> <span class=\"token function\">writeData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Environment<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> environment <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n            environment<span class=\"token punctuation\">.</span>dataOutput<span class=\"token punctuation\">.</span><span class=\"token function\">addDataValue</span><span class=\"token punctuation\">(</span>environment<span class=\"token punctuation\">.</span><span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getTick</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">DataValue</span><span class=\"token punctuation\">(</span>environment<span class=\"token punctuation\">.</span>grid<span class=\"token punctuation\">.</span>cells<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"environmentexportjsonoutput\"><a href=\"#environmentexportjsonoutput\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Environment#exportJSONOutput</h3>\n<p>At the end of the simulation (i.e. on the last tick), the data is exported as <code class=\"language-text\">JSON</code> file.</p>\n<blockquote>\n<p>Environment.java</p>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> Action<span class=\"token generics function\"><span class=\"token punctuation\">&lt;</span>Environment<span class=\"token punctuation\">></span></span> <span class=\"token function\">exportJSONOutput</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n        <span class=\"token keyword\">return</span> Action<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span>Environment<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">,</span> environment <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>  \n            <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>  \n                PrintWriter pw <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PrintWriter</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Grid_History.json\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t\t    pw<span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span>environment<span class=\"token punctuation\">.</span>dataOutput<span class=\"token punctuation\">.</span>gridHistory<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t      pw<span class=\"token punctuation\">.</span><span class=\"token function\">flush</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t      pw<span class=\"token punctuation\">.</span><span class=\"token function\">close</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">FileNotFoundException</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n                e<span class=\"token punctuation\">.</span><span class=\"token function\">printStackTrace</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n\t\t      <span class=\"token punctuation\">}</span>  \n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span></code></pre></div>\n<p>The data export enables to further analyze the simulation data in any data science tool of choice.</p>\n<h2 id=\"analyzing-data-output-in-jupyter-notebook\"><a href=\"#analyzing-data-output-in-jupyter-notebook\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Analyzing data output in Jupyter Notebook</h2>\n<p>After having exported the simulation data as JSON file, this provides us with a great opportunity to exemplify how to conduct more detailed analysis of the simulation by pulling the data into an external analysis tool. In this example, we will use a Jupyter Notebook to analysis and visualize this data.</p>\n<p>The JSON file contains information about the 2-d grid at every tick. In the Jupyter Notebook we load in the JSON file and animate the change in the position of agents over time.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">    <span class=\"token keyword\">import</span> numpy <span class=\"token keyword\">as</span> np\n    <span class=\"token keyword\">import</span> pprint\n    <span class=\"token keyword\">import</span> matplotlib<span class=\"token punctuation\">.</span>pyplot <span class=\"token keyword\">as</span> plt\n    <span class=\"token keyword\">import</span> matplotlib\n    <span class=\"token keyword\">from</span> IPython<span class=\"token punctuation\">.</span>display <span class=\"token keyword\">import</span> HTML\n    <span class=\"token keyword\">import</span> matplotlib<span class=\"token punctuation\">.</span>patches <span class=\"token keyword\">as</span> mpatches\n    <span class=\"token keyword\">import</span> matplotlib<span class=\"token punctuation\">.</span>animation <span class=\"token keyword\">as</span> animation\n   \n    <span class=\"token keyword\">with</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">'GridHistory.json'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">as</span> f<span class=\"token punctuation\">:</span>\n    \tdata <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>load<span class=\"token punctuation\">(</span>f<span class=\"token punctuation\">)</span>\n    time_steps <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>step<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> step <span class=\"token keyword\">in</span> data<span class=\"token punctuation\">.</span>keys<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    grid_idx <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> idx <span class=\"token keyword\">in</span> data<span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>time_steps<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>keys<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    grid_history <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>array<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span> <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>grid_idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>grid_idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>time_steps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> \n    \n    <span class=\"token keyword\">for</span> t <span class=\"token keyword\">in</span> time_steps<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> grid_idx<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> grid_idx<span class=\"token punctuation\">:</span>\n                grid_history<span class=\"token punctuation\">[</span>t<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>t<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>j<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    \n    im1<span class=\"token operator\">=</span>grid_history<span class=\"token punctuation\">.</span>shape\n    values <span class=\"token operator\">=</span> np<span class=\"token punctuation\">.</span>unique<span class=\"token punctuation\">(</span>grid_history<span class=\"token punctuation\">.</span>ravel<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    \n    fig<span class=\"token operator\">=</span>plt<span class=\"token punctuation\">.</span>figure<span class=\"token punctuation\">(</span>figsize<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    \n    cmap <span class=\"token operator\">=</span> matplotlib<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">.</span>ListedColormap<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'royalblue'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'lightgrey'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'red'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    schelling <span class=\"token operator\">=</span>plt<span class=\"token punctuation\">.</span>imshow<span class=\"token punctuation\">(</span>grid_history<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> cmap<span class=\"token operator\">=</span>cmap<span class=\"token punctuation\">,</span> interpolation<span class=\"token operator\">=</span><span class=\"token string\">'none'</span><span class=\"token punctuation\">)</span>\n    colors <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>schelling<span class=\"token punctuation\">.</span>cmap<span class=\"token punctuation\">(</span>schelling<span class=\"token punctuation\">.</span>norm<span class=\"token punctuation\">(</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> value <span class=\"token keyword\">in</span> values<span class=\"token punctuation\">]</span>\n    patches <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>mpatches<span class=\"token punctuation\">.</span>Patch<span class=\"token punctuation\">(</span>color<span class=\"token operator\">=</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"blue agents\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> mpatches<span class=\"token punctuation\">.</span>Patch<span class=\"token punctuation\">(</span>color<span class=\"token operator\">=</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"empty cells\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">,</span> mpatches<span class=\"token punctuation\">.</span>Patch<span class=\"token punctuation\">(</span>color<span class=\"token operator\">=</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> label<span class=\"token operator\">=</span><span class=\"token string\">\"red agents\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n    plt<span class=\"token punctuation\">.</span>legend<span class=\"token punctuation\">(</span>handles<span class=\"token operator\">=</span>patches<span class=\"token punctuation\">,</span> bbox_to_anchor<span class=\"token operator\">=</span><span class=\"token punctuation\">(</span><span class=\"token number\">0.8</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n              ncol<span class=\"token operator\">=</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> fancybox<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">,</span> shadow<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    plt<span class=\"token punctuation\">.</span>grid<span class=\"token punctuation\">(</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    plt<span class=\"token punctuation\">.</span>axis<span class=\"token punctuation\">(</span><span class=\"token string\">'off'</span><span class=\"token punctuation\">)</span>\n    \n    <span class=\"token keyword\">def</span> <span class=\"token function\">animate_noise</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        schelling<span class=\"token punctuation\">.</span>set_array<span class=\"token punctuation\">(</span>grid_history<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>schelling<span class=\"token punctuation\">]</span>\n    anim <span class=\"token operator\">=</span> animation<span class=\"token punctuation\">.</span>FuncAnimation<span class=\"token punctuation\">(</span>fig<span class=\"token punctuation\">,</span> animate_noise<span class=\"token punctuation\">,</span> frames<span class=\"token operator\">=</span>dim1<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> interval<span class=\"token operator\">=</span><span class=\"token number\">500</span><span class=\"token punctuation\">,</span> blit<span class=\"token operator\">=</span><span class=\"token boolean\">True</span><span class=\"token punctuation\">)</span>\n    plt<span class=\"token punctuation\">.</span>close<span class=\"token punctuation\">(</span>fig<span class=\"token punctuation\">)</span>\n    \n    HTML<span class=\"token punctuation\">(</span>anim<span class=\"token punctuation\">.</span>to_html5_video<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<video controls=\"controls\">\n  <source type=\"video/mp4\" src=\"https://simudynecontent.blob.core.windows.net/$web/tutorials/zips/schelling_model_animation.mp4\"></source>\n  <p>Your browser does not support the video element.</p>\n</video>\n<h2 id=\"summary\"><a href=\"#summary\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>In this tutorial we have walked through an implementation of the classic Schelling model. This is an example of how a geospatial component (2-d grid) can be incorporated within the SDK.\nIn this implementation, information about the 2-d grid is saved in the environment which communicates information about this grid to the Schelling agents. Based on this information, the Schelling agents decide whether to move cells or remain in their current cell. Through multiple iterations the model will show how people segregate based on their preferences for similarity. enter link description here</p>","headings":[{"value":"Model overview","depth":2},{"value":"Summary of the model implementation","depth":2},{"value":"Globals","depth":2},{"value":"Setup","depth":2},{"value":"Step","depth":2},{"value":"Behaviors","depth":2},{"value":"SchellingAgent#registerToEnvironment","depth":3},{"value":"Environment#receiveRegistrations","depth":3},{"value":"Environment#initPositions","depth":3},{"value":"Environment#updateAgentStates","depth":3},{"value":"SchellingAgent#updateState","depth":3},{"value":"SchellingAgent#step","depth":3},{"value":"Environment#moveAgents","depth":3},{"value":"Environment#writeData","depth":3},{"value":"Environment#exportJSONOutput","depth":3},{"value":"Analyzing data output in Jupyter Notebook","depth":2},{"value":"Summary","depth":2}],"frontmatter":{"title":"Schelling Segregation Tutorial","toc":true,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.5/docs/tutorials/schelling.md","versioned":true,"version":"2.5","kind":"docs","pagePath":"/tutorials/schelling","chronology":{"prev":{"name":"Mortgage Portfolio Tutorial","path":"/tutorials/mortgage"},"next":{"name":"SIR Epidemiology Tutorial","path":"/tutorials/sir"}},"lastUpdated":"2026-04-21T13:56:54.858Z"}}