powered by NetLogo
view/download model file: Molecular_Self_Organization.nlogo
This example demonstrates how to create a square grid for turtles to walk around on using links. When turtles come into contact they merge and become one. Different colors represent different charges (-/+/netural : red/blue/black). The total energy is calculated at each step according to nearest neighbor interactions.
globals [ colors ;; colors we are using energy ;; total energy of the system ] breed [nodes node] breed [walkers walker] walkers-own [location leader agg_id] ;; holds a node ; Set up routine: creates a grid of patches. Puts nodes on each patch, links them and then puts ; a number of walkers on the nodes. to setup clear-all set-default-shape nodes "square" ask patches [ sprout-nodes 1 [ set color white ;; white set size 1.2 ] ] ;; connect the nodes to make a lattice ask nodes [ create-links-with nodes-on patches at-points [[0 1] [1 0] ] ] ask links [ hide-link ] ;; put some "walker" turtles on the lattice set-default-shape walkers "square" set colors [red blue black] ; different colors represent -/+/neutral charges. let countr 0 create-walkers number [ set color item random 3 colors set location one-of nodes set leader self set agg_id countr move-to location set countr countr + 1 ] end ;Main loop. to go choose_direction ask walkers [ let cands_on_neighbs walkers-on neighbors4 let candidates cands_on_neighbs with [leader != [leader] of myself] if any? candidates[ create-links-with candidates [tie] ask candidates [merge] ] ] find_energy update-plot tick end ;Takes test steps in each of the four directions. to choose_direction ask walkers with [leader = self] [ find_energy let energy_zero energy let left_right 0 let up_down 0 set-location one-of [link-neighbors at-points [[0 -1] ] ] of location find_energy if energy < energy_zero [set up_down -1 set left_right 0 set energy_zero energy] set-location one-of [link-neighbors at-points [[0 1] ] ] of location set-location one-of [link-neighbors at-points [[0 1] ] ] of location find_energy if energy < energy_zero [set up_down 1 set left_right 0 set energy_zero energy] set-location one-of [link-neighbors at-points [[0 -1] ] ] of location set-location one-of [link-neighbors at-points [[1 0] ] ] of location find_energy if energy < energy_zero [set up_down 0 set left_right 1 set energy_zero energy] set-location one-of [link-neighbors at-points [[-1 0] ] ] of location set-location one-of [link-neighbors at-points [[-1 0] ] ] of location find_energy if energy < energy_zero [set up_down 0 set left_right -1 set energy_zero energy] set-location one-of [link-neighbors at-points [[1 0] ] ] of location ; show up_down ; show left_right if left_right = 0 and up_down = 1 [ set-location one-of [link-neighbors at-points [[0 1] ] ] of location rt (random 4) * 90 ] if left_right = 1 and up_down = 0 [ set-location one-of [link-neighbors at-points [[1 0] ] ] of location rt (random 4) * 90 ] if left_right = -1 and up_down = 0 [ set-location one-of [link-neighbors at-points [[-1 0] ] ] of location rt (random 4) * 90 ] if left_right = 0 and up_down = -1 [ set-location one-of [link-neighbors at-points [[0 -1] ] ] of location rt (random 4) * 90 ] if left_right = 0 and up_down = 0 [ set-location one-of [link-neighbors] of location rt (random 4) * 90 ] ; rt (random 4) * 90 ] end ;Finds the total energy (Note the /2 is to avoid double counting). to find_energy set energy 0 ask walkers [ let cands_on_neighbs walkers-on neighbors4 if [color] of self = blue [ ;show "blue" if any? cands_on_neighbs with [color = blue] [set energy energy + (9 / 2)] if any? cands_on_neighbs with [color = red] [set energy energy - (11 / 2)] if any? cands_on_neighbs with [color = black] [set energy energy - (1 / 2)] ] if [color] of self = red [ if any? cands_on_neighbs with [color = blue] [set energy energy - (11 / 2)] if any? cands_on_neighbs with [color = red] [set energy energy + (9 / 2)] if any? cands_on_neighbs with [color = black] [set energy energy - (1 / 2)] ] if [color] of self = black [ if any? cands_on_neighbs with [color = blue] [set energy energy - (1 / 2)] if any? cands_on_neighbs with [color = red] [set energy energy - (1 / 2)] if any? cands_on_neighbs with [color = black] [set energy energy - (1 / 2)] ] ] end ; Merges agents when they are next to each other. to merge set leader [leader] of myself set agg_id [agg_id] of myself ask link-neighbors with [leader != [leader] of myself] [ merge ] end ; Required to move agants on the grid to set-location [new-location] ;; walker procedure set location new-location move-to new-location end ;Basic plotting. to update-plot set-current-plot "Energy" plot energy end