An introduction to A Modified Deffuant Model - Multiopinion and Network Structure.
The modified Deffuant basic model.
powered by NetLogo
view/download model file: modified_deffuant_network_model.nlogo
This is a model of opinion dynamics developed on network structures: random graph, small-world and network scale-free.
An agent is randomly chosen; then, another agents, belonging to the neighbourhood of the first one, is chosen: if their difference in opinion is below a given threshold the interaction takes place following Deffuant's equations.
With the chooser button, it’s possible to choose the type of network to use. For the random graph, it’s also necessary to define the average degree and the number of nodes. For the small-world, you have to decide which value to give to the rewiring probability. For the preferential graph, you can choose to select “layout” to esthetically re-arrange the graph.
The user can use the graphics to better understand how the distribution of opinion changes in time. With the counter it's possible to compare the number of interactions with the number of the time steps.
The user can hold the same parameter and compare what happens on the three networks or use different values for mu and d on the same graph.
It's possible to create new networks as adaptive networks or to introduce some variations: different value of d for each agents, extremists, group of media, and so on.
The user can see the same model on a full mixing topology.
globals [temp1 partner protagonist neighbour interactions] links-own [ rewired? ; in the Small World Network it memorizes wether a link has been rewired and kills the old one ] turtles-own [opinion1] to setup set interactions 0 clear-all set-default-shape turtles "person" if NetworkType = "RandomGraph"[ setup-spatially-clustered-network] if NetworkType = "SmallWorld" [ setup-SmallWorld] if NetworkType ="Preferential" [setup-Preferential] end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Network Setup Procedures ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to setup-Preferential make-node nobody ;an unlinked node is created make-node turtle 0 ask links [ set color gray ] repeat number-of-nodes - 2 [ ;we start with 2 nodes and we need to create the remaining n-2 nodes make-node find-partner if layout? [ layout ] ] end ;; used for creating a new node to make-node [old-node] crt 1 [ set size 2 set opinion1 random 100 set color opinion1 if old-node != nobody [ create-link-with old-node [ set color green ] ;; position the new node near its partner move-to old-node fd 8 ] ] end ; the preferential partner is chosen in the following way. A random number (total) is generated between 0 and the total number of links. Then turtles are asked ; to check wether their number of links is greater than total. If yes, that turtle is the partner. In this way a node with more links is more likely to be chosen to-report find-partner let total random-float sum [count link-neighbors] of turtles set partner nobody ask turtles [ let nc count link-neighbors ; it counts the number of nodes linked to the "asked" turtle if partner = nobody ;once a winner is found nothing is asked to the turtles anymore [ ifelse nc > total [ set partner self ] [ set total total - nc ] ] ] report partner ;immediately exits from the current to-report procedure and reports value as the result of that procedure end to layout repeat 3 [ ;not to make calculations heavy let factor sqrt count turtles layout-spring turtles links (1 / factor) (7 / factor) (1 / factor) ; link repel each other to find an equilibrium display ; view updated immediately ] ;; 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) ] ; the world is rescaled end to-report limit-magnitude [number limit] ;limit is the maximum value reported if number > limit [ report limit ] if number < (- limit) [ report (- limit) ] report number end to setup-spatially-clustered-network crt number-of-nodes [ ;slider set size 2 setxy (random-xcor * 0.95) (random-ycor * 0.95) ; we avoid the turtles to be on the edges set opinion1 random 100 ; we initialize the opinion values set color opinion1 ] ;setting the number of nodes and the average node degree is equivalent to setting the total number of links let num-links (average-node-degree * number-of-nodes) / 2 ;links are undirected, so we need to count them twice while [count links < num-links ]; the cylce goes on until there is the desidered number of links [ ask one-of turtles [ ;choose the closest turtle I am not linked to let choice (min-one-of (other turtles with [not link-neighbor? myself]) ; set of turtles among which to look for the minimizing turtle [distance myself]) ;value that has to be minimized from "min-one-of" if choice != nobody [ create-link-with choice ] ] ] repeat 10 ;esthetical rearrangement [ layout-spring turtles links 0.3 (world-width / (sqrt number-of-nodes)) 1 ] end to setup-SmallWorld crt number-of-nodes [ set size 2 set opinion1 random 100 set color opinion1 ] layout-circle turtles max-pxcor - 1 ; we keep things separate, layout has to work on an already existing agentset let n 0 ;while cycle that wires all the first and second neighbours while [n < count turtles] [ make-edge turtle n turtle ((n + 1) mod count turtles) make-edge turtle n turtle ((n + 2) mod count turtles) set n n + 1 ] ask links [ if (random-float 1) < rewiring-probability [ let node1 end1 ; node1 is the turtle (node) at the end of the link if [ count link-neighbors ] of end1 < (count turtles - 1) [ let node2 one-of turtles with [ (self != node1) and (not link-neighbor? node1) ] ask node1 [ create-link-with node2 [ set color cyan ] ] set rewired? true ] ] if (rewired?) [ die ;if the link has been rewired, the old one dies ] ] end to make-edge [node1 node2] ask node1 [ create-link-with node2 [ set rewired? false ; we initialize as false the rewiring variable ] ] end ;;;;;;;;;;;;;; ;;;;;;GO;;;;;; ;;;;;;;;;;;;;; to go set protagonist one-of turtles set temp1 [opinion1] of protagonist ; we save the opinion of the interacting turtle in order to use it in a later interaction interact protagonist find-neighbour do-plots tick end to interact [ turtle1 turtle2] ifelse turtle2 != nobody [ ask turtle1 [ set opinion1 (opinion1 + mu * ( ([opinion1] of turtle2) - opinion1)) set color opinion1 ] ask turtle2 [ set opinion1 (opinion1 + mu * (temp1 - opinion1)) ; we use temp1 because the opinion of the first turtle has already been changed set color opinion1 ] set interactions (interactions + 1) ] [] ;the ifelse structure is needed to avoid a error caused if the the program asks nobody. if the second turtles does not exist, the program simply moves on end to-report find-neighbour set neighbour nobody set neighbour one-of other turtles with [ link-neighbor? protagonist] ;network structure if neighbour != nobody and abs (temp1 - [opinion1] of neighbour) < d ; Deffuant condition [report neighbour] report nobody end ;;;;;;;;;;;;;;;; ;;; Plotting ;;; ;;;;;;;;;;;;;;;; to do-plots set-current-plot "Turtles for each opinion" histogram [opinion1] of turtles set-histogram-num-bars 10 end