If the Java does not work on your machine, you can download the model file and run in on your computer. You need to have NetLogo installed on your computer.
Download model file: NetLogoModel.nlogo
turtles-own [belief ;; belief on the likelihood the rumor being true converted? ;; whether the turtle just receive the message and believe distance-from-other-turtles ;; list of distances of this node from other turtles node-clustering-coefficient ] globals [ clustering-coefficient ;; the clustering coefficient of the network; this is the ;; average of clustering coefficients of all turtles average-path-length ;; average path length of the network infinity ;; a very large number. ;; used to denote distance between two turtles which ;; don't have a connected or unconnected path between them ] to setup clear-all set infinity 9999999 ;; just an arbitrary choice for a large number set-default-shape turtles "circle" ask patches [set pcolor white] if network-type = "small-world" [ ;; generate a small-world network create-turtles node-count layout-circle sort turtles (world-width / 2 - 2) let d 1.001 * [distance-to-nearest-neighbor] of one-of turtles ask turtles [create-links-with other turtles in-radius (d * neighbor-count / 2)] rewire ] if network-type = "scale-free" [ ;; generate a scale-free network make-node nobody ;; first node, unattached make-node turtle 0 ;; second node, attached to first node repeat node-count - 2 [ make-node find-partner layout ] layout ] ask turtles [ ifelse binary-belief? [set belief random 2] [set belief random-float 1 ] ;[set belief (random 2) * 2 - 1 ] ;[set belief random-float 2 - 1 ] if show-belief? [ set label precision belief 2 set label-color black set color 9 ] ] ask one-of turtles with [belief > 0.5] [ set color red set converted? true ;if devout-spreader? [ set belief 1] set belief 1 if show-belief? [set label precision belief 2] ] do-calculations reset-ticks end to go if not any? turtles with [converted? = true] [stop] ask turtles with [converted? = true] [ ;; update the beliefs of neighbors of newly converted node set converted? false ask link-neighbors with [ color = 9] [ set belief (belief + [belief] of myself) / 2 ; set belief (belief + 1) / 2 if show-belief? [set label precision belief 2] if belief > 0.5 [ set color red set converted? true ] ] ] tick end ;; ;; Procedures for small-world network to-report distance-to-nearest-neighbor ;; turtle method. spatial, NOT graph distance! report distance min-one-of other turtles [distance myself] end to rewire ;; the Watts - Strogatz algorithm to rewire a small world network ask turtles [foreach sort my-links ;; 'sort' just to get a list [if random-float 1 < p [ask ? [die] create-link-with one-of other turtles with [not link-neighbor? myself]]]] ;ask turtles [ ;; make sure all turtles are connected ; if count link-neighbors = 0 [ create-link-with one-of other turtles ] ;] end ;; ;; Procedures for scale-free network ;; used for creating a new node to make-node [old-node] crt 1 [ set color gray if old-node != nobody [ create-link-with old-node ;; position the new node near its partner move-to old-node fd 8 ] ] end ;; This code is the heart of the "preferential attachment" mechanism, and acts like ;; a lottery where each node gets a ticket for every connection it already has. ;; While the basic idea is the same as in the Lottery Example (in the Code Examples ;; section of the Models Library), things are made simpler here by the fact that we ;; can just use the links as if they were the "tickets": we first pick a random link, ;; and than we pick one of the two ends of that link. to-report find-partner report [one-of both-ends] of one-of links end to layout ;; the number here is arbitrary; more repetitions slows down the ;; model, but too few gives poor layouts repeat 10 [ ;; the more turtles we have to fit into the same amount of space, ;; the smaller the inputs to layout-spring we'll need to use let factor sqrt count turtles ;; numbers here are arbitrarily chosen for pleasing appearance layout-spring turtles links (1 / factor) (15 / factor) (1 / factor) display ;; for smooth animation ] ;; don't bump the edges of the world let x-offset max [xcor] of turtles + min [xcor] of turtles let y-offset max [ycor] of turtles + min [ycor] of turtles ;; big jumps look funny, so only adjust a little each time set x-offset limit-magnitude x-offset 0.1 set y-offset limit-magnitude y-offset 0.1 ask turtles [ setxy (xcor - x-offset / 2) (ycor - y-offset / 2) ] end to-report limit-magnitude [number limit] if number > limit [ report limit ] if number < (- limit) [ report (- limit) ] report number end ;; ;; Calculate the statistics of the graph ;; do-calculations reports true if the network is connected, ;; and reports false if the network is disconnected. ;; (In the disconnected case, the average path length does not make sense, ;; or perhaps may be considered infinite) to do-calculations ;; set up a variable so we can report if the network is disconnected let connected? true ;; find the path lengths in the network find-path-lengths let num-connected-pairs sum [length remove infinity (remove 0 distance-from-other-turtles)] of turtles set average-path-length (sum [sum distance-from-other-turtles] of turtles) / (num-connected-pairs) if average-path-length > infinity / num-connected-pairs [set average-path-length -1] ;; when the graph is not connected, set average path length to -1 find-clustering-coefficient ;; report whether the network is connected or not ;; report connected? end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Clustering computations ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to-report in-neighborhood? [ hood ] report ( member? end1 hood and member? end2 hood ) end to find-clustering-coefficient ifelse all? turtles [count link-neighbors <= 1] [ ;; it is undefined ;; what should this be? set clustering-coefficient 0 ] [ let total 0 ask turtles with [ count link-neighbors <= 1] [ set node-clustering-coefficient "undefined" ] ask turtles with [ count link-neighbors > 1] [ let hood link-neighbors set node-clustering-coefficient (2 * count links with [ in-neighborhood? hood ] / ((count hood) * (count hood - 1)) ) ;; find the sum for the value at turtles set total total + node-clustering-coefficient ] ;; take the average set clustering-coefficient total / count turtles with [count link-neighbors > 1] ] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Path length computations ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Implements the Floyd Warshall algorithm for All Pairs Shortest Paths ;; It is a dynamic programming algorithm which builds bigger solutions ;; from the solutions of smaller subproblems using memoization that ;; is storing the results. ;; It keeps finding incrementally if there is shorter path through ;; the kth node. ;; Since it iterates over all turtles through k, ;; so at the end we get the shortest possible path for each i and j. to find-path-lengths ;; reset the distance list ask turtles [ set distance-from-other-turtles [] ] let i 0 let j 0 let k 0 let node1 one-of turtles let node2 one-of turtles ;; initialize the distance lists while [i < node-count] [ set j 0 while [j < node-count] [ set node1 turtle i set node2 turtle j ;; zero from a node to itself ifelse i = j [ ask node1 [ set distance-from-other-turtles lput 0 distance-from-other-turtles ;show distance-from-other-turtles ] ] [ ;; 1 from a node to it's neighbor ifelse [ link-neighbor? node1 ] of node2 [ ask node1 [ set distance-from-other-turtles lput 1 distance-from-other-turtles ;show distance-from-other-turtles ] ] ;; infinite to everyone else [ ask node1 [ set distance-from-other-turtles lput infinity distance-from-other-turtles ;show distance-from-other-turtles ] ] ] set j j + 1 ] set i i + 1 ] set i 0 set j 0 let dummy 0 while [k < node-count] [ set i 0 while [i < node-count] [ set j 0 while [j < node-count] [ ;; alternate path length through kth node set dummy ( (item k [distance-from-other-turtles] of turtle i) + (item j [distance-from-other-turtles] of turtle k)) ;; is the alternate path shorter? if dummy < (item j [distance-from-other-turtles] of turtle i) [ ask turtle i [ set distance-from-other-turtles replace-item j distance-from-other-turtles dummy ;show distance-from-other-turtles ] ] set j j + 1 ] set i i + 1 ] set k k + 1 ] end ;; Huanren Zhang June 2014 @GWCSS