This page was automatically generated by NetLogo 4.1.3.
The applet requires Java 5 or higher. Java must be enabled in your browser settings. Mac users must have Mac OS X 10.4 or higher. Windows and Linux users may obtain the latest Java from Java site.
powered by NetLogo
view/download model file: Servers.nlogo
This model explores "queueing theory" (waiting in lines . . .)
Each time step (tick), a client wanders around. When a client's wandering time gets to zero, it gets in line and waits for its turn to be served. When it gets to the front of the line, it is served for a while. When it is finished being served, it starts wandering again.
Servers do just that, serve clients.
Using the sliders, choose the various variables.
The Average wait time plot shows the average time clients waited in line.
???
???
???
???
Links are used for modeling the network. The LAYOUT-SPRING primitive is used to position the nodes and links such that the structure of the network is visually clear.
This model was originally started by Tom Carter for his Simulations class . . .
breed [servers server]
servers-own
[client-list
serving
current-client
number-served
average-time
my-x
my-y
]
breed [clients client]
clients-own
[serve-time
wait-time
total-wait
average-wait
times-in-line
wander-time
is-in-line
place-in-line
is-being-served
my-x
my-y
]
globals [plotted-ave-wait-time client-list-all]
to setup
clear-all
setup-servers
setup-clients
set client-list-all []
end
to setup-servers
set-default-shape servers "square"
create-servers number-of-servers
[set my-x ((1.3 * who * max-pxcor / number-of-servers) - max-pxcor / 2 )
set my-y ( 18 )
setxy my-x my-y
set color yellow
set client-list []
set current-client nobody
set serving false
set number-served 0
set average-time 0.0]
end
to setup-clients
set-default-shape clients "circle"
create-clients number-of-clients
[ set my-x (random-xcor * .85)
set my-y ((random-ycor * .5) - max-pycor * .48)
setxy my-x my-y
set color green
set serve-time random max-serve-time
set wait-time 0
set total-wait 0
set average-wait 0.0
set times-in-line 0
set wander-time random max-wander-time
set is-in-line false
set place-in-line 0
set is-being-served false
]
end
to update-plot
set-current-plot "Average Wait Time"
set-current-plot-pen "ave-wait-time"
plot mean [ average-wait ] of clients
set plotted-ave-wait-time mean [ average-wait ] of clients
end
to go
ask clients with [ (not is-in-line) and (not is-being-served) ]
[ set wander-time wander-time - 1
ifelse wander-time < 1
[ ifelse not one-line
[ ifelse short-line
[ let serve one-of servers with [ length client-list = min [length client-list] of servers ]
ask serve [ set client-list lput myself client-list ]
set is-in-line true
set times-in-line times-in-line + 1
set my-x ([my-x] of serve)
set my-y (([my-y] of serve) - (2 + [length client-list] of serve))
setxy my-x my-y
set color 12 + 10 * floor (129 * (serve-time / max-serve-time) / 10) + serve-time mod 8
]
[ let serve one-of servers
ask serve [ set client-list lput myself client-list ]
set is-in-line true
set times-in-line times-in-line + 1
set my-x ([my-x] of serve)
set my-y (([my-y] of serve) - (2 + [length client-list] of serve))
setxy my-x my-y
set color 12 + 10 * floor (129 * (serve-time / max-serve-time) / 10) + serve-time mod 8
]
]
[ set is-in-line true
set times-in-line times-in-line + 1
set client-list-all lput self client-list-all
set place-in-line length client-list-all
set my-x ((place-in-line mod 30) - 15) * ( 1 - (2) * ((floor (place-in-line / 30)) mod 2 ))
set my-y 12 - 2 * (floor (place-in-line / 30))
setxy my-x my-y
set color 12 + 10 * floor (129 * (serve-time / max-serve-time) / 10) + serve-time mod 8
]
]
[ set my-x (random-xcor * .85)
set my-y ((random-ycor * .5) - max-pycor * .48)
setxy my-x my-y
]
]
ask clients with [ is-in-line ]
[ set wait-time wait-time + 1 ]
ask servers with [ serving ]
[ ask current-client
[ set serve-time serve-time - 1
set color floor ( 139 * serve-time / max-serve-time)
]
if ( 1 > ([serve-time] of current-client) )
[ ask current-client
[ set color green
set serve-time random max-serve-time
set wait-time 0
set wander-time random max-wander-time
set is-in-line false
set is-being-served false
set my-x (random-xcor * .85)
set my-y ((random-ycor * .5) - max-pycor * .48)
setxy my-x my-y
]
set current-client nobody
set serving false
set color yellow
]
]
ifelse one-line
[ ask servers with [ (not serving) ]
[ if 0 < length client-list-all
[ set serving true
set color blue
let serv-my-x my-x
let serv-my-y my-y
set current-client first client-list-all
ask current-client
[ set color red
set my-x [ my-x ] of myself
set my-y ([ my-y ] of myself) - 1
setxy my-x my-y
set is-in-line false
set is-being-served true
set place-in-line 0
set total-wait total-wait + wait-time
set wait-time 0
set average-wait total-wait / times-in-line
]
set client-list-all remove first client-list-all client-list-all
foreach client-list-all
[ ask ? [ set place-in-line place-in-line - 1 ]
ask ? [ set my-x ((place-in-line mod 30) - 15) * ( 1 - (2) * ((floor (place-in-line / 30)) mod 2 ))]
ask ? [ set my-y 12 - 2 * (floor (place-in-line / 30)) ]
ask ? [ setxy my-x my-y ]
]
]
]
]
[ ask servers with [ (not serving) and ( 0 < length client-list) ]
[ set serving true
set color blue
set current-client first client-list
ask current-client
[ set color red
set my-y my-y + 2
setxy my-x my-y
set is-in-line false
set is-being-served true
set place-in-line 0
set total-wait total-wait + wait-time
set wait-time 0
set average-wait total-wait / times-in-line
]
set client-list remove first client-list client-list
foreach client-list
[ ask ? [ set my-y my-y + 1 ]
ask ? [ setxy my-x my-y ]
ask ? [ set place-in-line place-in-line - 1 ]
]
]
]
tick
update-plot
end