An introduction to A Modified Deffuant Model - Multiopinion and Network Structure.
Go to the modified Deffuant network model.
powered by NetLogo
view/download model file: modified_deffuant_basic_model.nlogo
This is a model of opinion dynamics.The agents adjust their opinion on the occasion of random binary encounters whenever their opinion difference is below a given threshold. We add some news: the introduction of extremists with fixed opinion, the possibility to restrict the interacting region, the possibility to discuss about more topics, choosing randomly one or following a particular order.
Click the setup button to set up the agent with opinion in range 0-100.
Click the go button to start the simulation.
With the chooser button you can select what type of interaction you want to simulate. You have also to give a value (through the slider buttons) to d and mu parameter.
If you want to include extremists, set “on” the relative button and select how many of them you need.
With Place “on”, the interaction takes place only if the two agents are in the range defined by slider.
The interaction among agents follows the equation defined by Deffuant. With the “Multi-by-one-one” option the agents discuss about one topic at time and the discussion goes on only if the two agents are agree on the previous topics (the order is: color, size and position); with the “Multi-Random” instead the agents discuss about only one, randomly chosen, topic if they are agree at least on two topics.
Mu is the parameter which controls the convergence in opinion, d is that which describes the tolerance of agents.
There are two graphics for each topic: the first one give a visual description of what it’s happened (each colored bar represents an opinion range and the width shows how many agents have that opinion); the second one is similar to the first one but presents the results in a histogram.
There are then three counters that shows how many interactions take place.
Holding the same parameter it’s possible to compare the results for different interaction types. It’s also possible to study how the parameter influence the dynamics: mu is related only with convergence time; d, instead, is responsible for the number of final opinion.
It could be interesting add some other restrictions on the interaction or to study the dynamics with more topics for discussion. It could also be developed a similar model, in which not only the opinions are up-to-date but also the value of parameter d for each agent.
The starting point for this work is the following article:
"Mixing beliefs among interacting agents", G. Deffuant, D. Neau, F. Amblard and G. Weisbuch
globals [interactions2 interactions1 interactions3 temp1 temp2 temp3 templace]
turtles-own [opinion1 opinion2 opinion3 place]
breed [extremists100]
breed[extremists0]
;;;;;;;;;;;;;;;;;;;
;;;SETTING UP;;;;;;
;;;;;;;;;;;;;;;;;;;
to setup
ca
set-default-shape turtles "person"
create-turtles Number-of-Agents [
set interactions1 0
set interactions2 0
set interactions3 0
set size 5
set place random 100 ; auxiliary variable used when "place" button is on, we create a "parallel" world
; where the turtles move
set opinion1 random 100
setxy opinion1 opinion1 ; each turtle is placed on the square diagonal according to its opinion
ifelse InteractionType = "Multi-OneByOne" or InteractionType = "Multi-Random"
; initializing opinion values
[set opinion2 random 100
set opinion3 random 100]
[set opinion2 -10 ; so they are not counted in the graphs for opinion 2 and opinion 3
set opinion3 -10]
]
if Extremists [
create-extremists100 Extremists-100 [ ; the slider indicates the number of extremists
set place random 100
set opinion1 100
setxy opinion1 opinion1
set shape "face happy" ; 100 is better than 0
set size 5
set color white
ifelse InteractionType = "Multi-OneByOne" or InteractionType = "Multi-Random"
; in order to avoid plotting graphs of opinion 2/3
[set opinion2 100
set opinion3 100]
[set opinion2 -10
set opinion3 -10]
]
create-extremists0 Extremists-0 [
set place random 100
set opinion1 0
setxy opinion1 opinion1
set size 5
set shape "face sad"
set color white
ifelse InteractionType = "Multi-OneByOne" or InteractionType = "Multi-Random"
[set opinion2 0
set opinion3 0]
[set opinion2 -10
set opinion3 -10]
]
] ;end create
end
;;;;;;;;;;;;;;;;;;
;;;;;LET'S GO;;;;;
;;;;;;;;;;;;;;;;;;
to go
if InteractionType = "Basic" [
ask one-of turtles [
set temp1 opinion1 ;saves variables of the interatcting turtle in order to use it later in other procedures
set templace place
interact
set opinion1 temp1 ;completed the interaction, we update the old values
setxy opinion1 opinion1 ; we graphically show the new opinion
set color opinion1
]
; we reset the values for the extremists before plotting because they cannot change opinion,
; we chose to modify it temporarily and then to move them back to the original value
if Extremists [
ask extremists100 [set opinion1 100 setxy 100 100 set color white]
ask extremists0 [set opinion1 0 setxy 0 0 set color white ]
]
] ;end basic
if InteractionType = "Multi-OneByOne"[
ask one-of turtles [
set temp1 opinion1
set temp2 opinion2
set temp3 opinion3
set templace place
multi-interact-onebyone
set opinion1 temp1
set opinion2 temp2
set opinion3 temp3
setxy opinion3 opinion3
set color opinion1
set size (opinion2 / 10)
] ;endask
if Extremists
[
ask extremists100 [set opinion1 100 set opinion2 100 set opinion3 100 set size 5 setxy 100 100 set color white] ; we reset the values for the extremists before plotting
ask extremists0 [set opinion1 0 set opinion2 0 set opinion3 0 set size 5 setxy 0 0 set color white ]
]
];endif interaction
if InteractionType = "Multi-Random"
[
ask one-of turtles [
set temp1 opinion1
set temp2 opinion2
set temp3 opinion3
set templace place
multi-interact-random
set opinion1 temp1
set opinion2 temp2
set opinion3 temp3
setxy opinion3 opinion3
set color opinion1
set size (opinion2 / 10)
];endask
if Extremists
[
ask extremists100 [set opinion1 100 set opinion2 100 set opinion3 100 set size 5 setxy 100 100 set color white] ; we reset the values for the extremists before plotting
ask extremists0 [set opinion1 0 set opinion2 0 set opinion3 0 set size 5 setxy 0 0 set color white ]
]
] ;endif interaction
do-plots
tick
end
;;;;;;;;;;;;;;;;;;;
;;; Interacting ;;;
;;;;;;;;;;;;;;;;;;;
to interact
;with the place button on the turtles interact only with neighbouring turtles
ifelse Place?
[let partner one-of other turtles with [ place < templace + range and place > templace - range ] ;range given by slider
ifelse partner != nobody [
ask partner [
if abs (temp1 - opinion1) < d [
set opinion1 (opinion1 + mu *(temp1 - opinion1)) ; interaction equations
set temp1 (temp1 + mu * (opinion1 - temp1))
setxy opinion1 opinion1 ;we update the values of the partner
set color opinion1
set interactions1 (interactions1 + 1) ; we count the interaction number
] ; endif
] ;ask
] ;ifelse partner first option
[ set place random 100] ; if in range there are no other turtles, the turtle moves on
;if else partner second option
] ;ifelse Place?
; without "place" the turtles interact randomly
[ ask one-of other turtles [
if abs (temp1 - opinion1) < d [
set opinion1 (opinion1 + mu *(temp1 - opinion1))
set temp1 (temp1 + mu * (opinion1 - temp1))
setxy opinion1 opinion1
set color opinion1
set interactions1 (interactions1 + 1)
] ;endif
] ;endask
]; end block second ifelse Place?
end
to multi-interact-onebyone
ifelse Place?
[let partner one-of other turtles with [ place < templace + range and place > templace - range ]
ifelse partner != nobody [
ask partner [
;if-chain to take into consideration that the following opinion is discussed
; only if the previous one has been discussed before. The cylce is interrupted at the first "diasgreement"
if abs (temp1 - opinion1) < d [
set opinion1 (opinion1 + mu *(temp1 - opinion1))
set temp1 (temp1 + mu * (opinion1 - temp1))
set color opinion1
set interactions1 (interactions1 + 1)
if abs (temp2 - opinion2) < d [
set opinion2 (opinion2 + mu *(temp2 - opinion2))
set temp2 (temp2 + mu * (opinion2 - temp2))
set size ( opinion2 / 10 ) ; we lose "resolution", but we need to rescale in order to avoid excessively huge turtles
set interactions2 (interactions2 + 1)
if abs (temp3 - opinion3) < d [
set opinion3 (opinion3 + mu *(temp3 - opinion3))
set temp3 (temp3 + mu * (opinion3 - temp3))
setxy opinion3 opinion3
set interactions3 (interactions3 + 1)
]; endif 3
]; endif 2
] ; endif 1
] ;ask
] ;ifelse partner first option
[ set place random 100] ;if else partner second option
] ;ifelse Place?
[ ask one-of other turtles [
if abs (temp1 - opinion1) < d [
set opinion1 (opinion1 + mu *(temp1 - opinion1))
set temp1 (temp1 + mu * (opinion1 - temp1))
set color opinion1
set interactions1 (interactions1 + 1)
if abs (temp2 - opinion2) < d [
set opinion2 (opinion2 + mu *(temp2 - opinion2))
set temp2 (temp2 + mu * (opinion2 - temp2))
set size ( opinion2 / 10 )
set interactions2 (interactions2 + 1)
if abs (temp3 - opinion3) < d [
set opinion3 (opinion3 + mu *(temp3 - opinion3))
set temp3 (temp3 + mu * (opinion3 - temp3))
setxy opinion3 opinion3
set interactions3 (interactions3 + 1)
]; endif 3
]; endif 2
] ; endif 1
] ;endask
]; end block second ifelse Place?
end
to multi-interact-random
; turtles interact in one opinion only if they agree on at least two opinions
ifelse Place?
[ let partner one-of other turtles with [ place < templace + range and place > templace - range ]
ifelse partner != nobody [
ask partner [
let agreement 0 ; variable that counts the number of opinions in range d
if abs( temp1 - opinion1) < d [ set agreement (agreement + 1)]
if abs( temp2 - opinion2) < d [ set agreement (agreement + 1)]
if abs( temp3 - opinion3) < d [ set agreement (agreement + 1)]
if agreement >= 2 [
let numberopinion random 3 ; the interacting opinion is chosen at random
if numberopinion = 0 [
set opinion1 (opinion1 + mu *(temp1 - opinion1))
set temp1 (temp1 + mu * (opinion1 - temp1))
set color opinion1
set interactions1 (interactions1 + 1)
];if 1
if numberopinion = 1 [
set opinion2 (opinion2 + mu *(temp2 - opinion2))
set temp2 (temp2 + mu * (opinion2 - temp2))
set size ( opinion2 / 10)
set interactions2 (interactions2 + 1)
] ;if 2
if numberopinion = 2 [
set opinion3 (opinion3 + mu *(temp3 - opinion3))
set temp3 (temp3 + mu * (opinion3 - temp3))
setxy opinion3 opinion3
set interactions3 (interactions3 + 1)
] ; if3
];ifagreement
];endask
];ifelse partner 1
[set place random 100] ;ifelse partner 2
] ;ifplace 1
[
ask one-of other turtles [
let agreement 0
if abs( temp1 - opinion1) < d [ set agreement (agreement + 1)]
if abs( temp2 - opinion2) < d [ set agreement (agreement + 1)]
if abs( temp3 - opinion3) < d [ set agreement (agreement + 1)]
if agreement >= 2 [
let numberopinion random 3
if numberopinion = 0 [
set opinion1 (opinion1 + mu *(temp1 - opinion1))
set temp1 (temp1 + mu * (opinion1 - temp1))
set color opinion1
set interactions1 (interactions1 + 1)
set place random 100 ;DA TOGLIERE????????
];if 1
if numberopinion = 1 [
set opinion2 (opinion2 + mu *(temp2 - opinion2))
set temp2 (temp2 + mu * (opinion2 - temp2))
set size ( opinion2 / 10)
set interactions2 (interactions2 + 1)
set place random 100
] ;if 2
if numberopinion = 2 [
set opinion3 (opinion3 + mu *(temp3 - opinion3))
set temp3 (temp3 + mu * (opinion3 - temp3))
setxy opinion3 opinion3
set interactions3 (interactions3 + 1)
set place random 100
] ; if3
];ifagreement
] ;endask
] ;ifplace 2
end
;;;;;;;;;;;;;;;;
;;; Plotting ;;;
;;;;;;;;;;;;;;;;
to do-plots
set-current-plot "Topic1"
set-plot-y-range 0 count turtles
let partial 0 ; remembers the number of turtles in the previous set in order to build a continuous coloured column
set-current-plot-pen "5"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 >= 0 and opinion1 <= 10]
plot-pen-down plotxy ticks partial
set-current-plot-pen "15"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 10 and opinion1 <= 20]
plot-pen-down plotxy ticks partial
set-current-plot-pen "25"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 20 and opinion1 <= 30]
plot-pen-down plotxy ticks partial
set-current-plot-pen "35"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 30 and opinion1 <= 40]
plot-pen-down plotxy ticks partial
set-current-plot-pen "45"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 40 and opinion1 <= 50]
plot-pen-down plotxy ticks partial
set-current-plot-pen "55"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 50 and opinion1 <= 60]
plot-pen-down plotxy ticks partial
set-current-plot-pen "65"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 60 and opinion1 <= 70]
plot-pen-down plotxy ticks partial
set-current-plot-pen "75"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 70 and opinion1 <= 80]
plot-pen-down plotxy ticks partial
set-current-plot-pen "85"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 80 and opinion1 <= 90]
plot-pen-down plotxy ticks partial
set-current-plot-pen "95"
plot-pen-up plotxy ticks partial
set partial partial + count turtles with [opinion1 > 90 and opinion1 <= 101]
plot-pen-down plotxy ticks partial
set-current-plot "Topic2"
set-plot-y-range 0 count turtles
let partial2 0
set-current-plot-pen "5"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 >= 0 and opinion2 <= 10]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "15"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 10 and opinion2 <= 20]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "25"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 20 and opinion2 <= 30]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "35"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 30 and opinion2 <= 40]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "45"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 40 and opinion2 <= 50]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "55"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 50 and opinion2 <= 60]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "65"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 60 and opinion2 <= 70]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "75"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 70 and opinion2 <= 80]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "85"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 80 and opinion2 <= 90]
plot-pen-down plotxy ticks partial2
set-current-plot-pen "95"
plot-pen-up plotxy ticks partial2
set partial2 partial2 + count turtles with [opinion2 > 90 and opinion2 <= 100]
plot-pen-down plotxy ticks partial2
set-current-plot "Topic3"
set-plot-y-range 0 count turtles
let partial3 0
set-current-plot-pen "5"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 >= 0 and opinion3 <= 10]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "15"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 10 and opinion3 <= 20]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "25"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 20 and opinion3 <= 30]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "35"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 30 and opinion3 <= 40]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "45"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 40 and opinion3 <= 50]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "55"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 50 and opinion3 <= 60]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "65"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 60 and opinion3 <= 70]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "75"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 70 and opinion3 <= 80]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "85"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 80 and opinion3 <= 90]
plot-pen-down plotxy ticks partial3
set-current-plot-pen "95"
plot-pen-up plotxy ticks partial3
set partial3 partial3 + count turtles with [opinion3 > 90 and opinion3 <= 100]
plot-pen-down plotxy ticks partial3
set-current-plot "Turtles-Opinion1"
histogram [opinion1] of turtles
set-histogram-num-bars 10
set-current-plot "Turtles-Opinion2"
histogram [opinion2] of turtles
set-histogram-num-bars 10
set-current-plot "Turtles-Opinion3"
histogram [opinion3] of turtles
set-histogram-num-bars 10
end