So far we have been working on the setup of the model and the update of the households. Now we need to define the dynamics of the model. The dynamics will be defined in a procedure called go. This procedure will be called every tick of the simulation. In this procedure, we will ask the unhappy agents to move to a new location. We will also update the shape of the agents based on their happiness and update the global variables.
to go
  if all households [happy?] [ stop ] ; stop the simulation if all agents are happy
  move-unhappy-households ; procedure to move unhappy agents
  update-households ; update the shape of the agents based on their happiness
  update-global-variables ; update the global variables
  tick ; increment the tick counter
endThe procedure to move the unhappy agents is as follows:
to move-unhappy-households
  ask households with [not happy?] [
    move-to one-of patches with [not any? households-here] ; move to a random empty patch
  ]
endFinally, we need to fill the update-global-variables procedure. This procedure will count the number of happy and unhappy agents and update the global variables accordingly.
to update-global-variables
  set happy-households count households with [happy?] ; count happy agents
  set unhappy-households count households with [not happy?] ; count unhappy agents
  set proportion-similarity (sum [similarity] of households) / count households
endNow we can go back to the interface tab and create a button to call the go procedure. Make sure to set the button to “forever” so that it will keep calling the go procedure until all agents are happy. You can also create two buttons to call the go procedure (once and forever).

And this is the final code for our Segregation Model. You can now run the model and see how the agents move around the environment until they are all happy.
globals [
  happy-households ; The number of happy agents in the model
  unhappy-households ; The number of unhappy agents in the model
  proportion-similarity ; proportion of similar households for the overall population
]
breed [households household] ; define a breed for the agents as a household
households-own [
  happy?          ; boolean indicating if the household is happy
  similar-neighbors ; number of similar neighbors
  different-neighbors ; number of different neighbors
  total-neighbors ; total number of neighbors
  similarity ; proportion of neighbors of the same color
]
to setup
    clear-all ; clear the environment
    make-households ; procedure to create the households
    update-households ; procedure to update the shape of the households based on their happiness
    update-global-variables ; procedure to update the global variables
    reset-ticks ; reset the tick counter
end
to make-households
  ask patches [ 
    set pcolor white ; set all patches to white
    if random-float 100 < density [
      sprout-households 1 [ ; create a household with a probability defined by density
        set color one-of [red blue] ; randomly assign red or blue color
        set size 1 ; set the size of the household
      ]
    ]
  ]
end
to update-households
  ask households [
    set similar-neighbors count (households-on neighbors) with [color = [color] of myself]; count similar neighbors
    set different-neighbors count (households-on neighbors) with [color != [color] of myself] ; count different neighbors
    set total-neighbors similar-neighbors + different-neighbors ; total neighbors
    
    ifelse total-neighbors > 0 [ set similarity  (similar-neighbors / total-neighbors) * 100 ]
    [ set similarity 100  ] ; if no neighbors, consider happy
    
    set happy? (similarity >= similar-wanted)
    ifelse happy?   [ set shape "square" ][ set shape "x" ] ; set shape to x if unhappy and square if happy
  ]
end
to update-global-variables
  set happy-households count households with [happy?] ; count happy agents
  set unhappy-households count households with [not happy?] ; count unhappy agents
  set proportion-similarity (sum [similarity] of households) / count households
end
to go
  if all? households [happy?] [ stop ] ; stop the simulation if all agents are happy
  move-unhappy-households ; procedure to move unhappy agents
  update-households ; update the shape of the agents based on their happiness
  update-global-variables ; update the global variables
  tick ; increment the tick counter
end
to move-unhappy-households
  ask households with [not happy?] [
    move-to one-of patches with [not any? households-here] ; move to a random empty patch
  ]
end