globals [ pa-tellers-pxcor pa-clerk-pxcor pa-tick-adv paCustLabel-seq paCustLabel-server gvInterrarrivalList ] breed [excepts an-exch] ;; system police. these agents are raised whenever an exception is out there. breed [mechanisms a-servant] ;; active agents. they attend customers. breed [events an-event] ;; meta-agents. they care about triggering news. they make the future event list. breed [entities a-customer] ;; passive agents. they require a service and queue waiting for it. mechanisms-own [dmAndon dmCustomer svLastStateChgTime acIdleTime acBusyTime] events-own [dmNextEvent dmSource dmReason] entities-own [crDate ;; momento en que este cliente ingresa en el sistema dmArrival ;; momento en que el cliente entra en la next queue dmServiceTime ;; tiempo de servicio en la next estacion a la que va a entrar dmTeller ;; agente que atiende al cliente para terminar el servicio dmDeparture ;; salida de la next station dmLeadTime] ;; tiempo total de permanencia en el sistema to setup clear-all set pa-tick-adv 0.16 set pa-tellers-pxcor 10 set pa-clerk-pxcor -9 set paCustLabel-seq (list "SOc" "WOc" "SOt" "WOt" "history") ;; each entity traverse the system doing this metamorphosis of phases. set paCustLabel-server (list "clerk" "clerk" "teller" "teller" nobody) ;; each entity phase needs a tyep of mechanism to get service. set gvInterrarrivalList [] ask patches with [pa-tellers-pxcor = pxcor ] [set pcolor turquoise - 2] ask n-of paNumTellers patches with [(pa-tellers-pxcor = pxcor) and (0 > pycor)] [ sprout-mechanisms 1 [ set label "teller" set color blue set shape "person" set size 3 set dmAndon task wait-customer set dmCustomer nobody set svLastStateChgTime 0 show (word " Info: acabo de instanciarme en abscisa " pa-tellers-pxcor " en el patch " xcor "," ycor) ] ] ;; ifelse use-pull-FIFO? ;; marcamos el pasillo de cada cola de espera a un teller. [ask patches with [(pycor = int mean [ycor] of mechanisms with ["teller" = label] ) ] [if ( pa-clerk-pxcor < pxcor) and (pxcor < pa-tellers-pxcor) [set pcolor pink]] ] [ask patches with [member? pycor ([ycor] of mechanisms with ["teller" = label] ) ] [if ( pa-clerk-pxcor < pxcor) and (pxcor < pa-tellers-pxcor) [set pcolor pink]] ] ;; ask patches with [pa-clerk-pxcor = pxcor ] [set pcolor turquoise - 2] ask one-of patches with [(pa-clerk-pxcor = pxcor) and (0 > pycor)] [ sprout-mechanisms 1 [ set label "clerk" set color blue set shape "person" set size 3 set dmAndon task wait-customer set dmCustomer nobody show (word " Info: acabo de instanciarme en el patch " xcor "," ycor) ask patches with [pycor = [pycor] of myself] [if ( pxcor < pa-clerk-pxcor ) [set pcolor pink]] ;; marcamos pasillo de cola de espera al clerk. ] ] set-default-shape events "wheel" create-events 1 ; create one turtle [ set label "SO-generator" set color blue set size 2 setxy 0 14 set pcolor turquoise - 2 set dmNextEvent 0 set dmSource patch-here set dmReason " generate customer arrivals at system." show (word " Info: acabo de instanciarme en el patch " xcor "," ycor) ] show (word " info: decidimos si nos ponemos en modo de verificacion del modelo, o si experimentamos con leyes estocasticas ... " set-verify-mode?) reset-ticks reset-timer end to go carefully [ ask events with ["SO-generator" != label] [die] ask mechanisms with ["teller" = label] [ run dmAndon ] ask mechanisms with ["clerk" = label] [ run dmAndon ] ask events with ["SO-generator" = label] [ mtCustomerArrival ] update-plots tick-advance mtAdvTick ] [ create-excepts 1 [set shape "bug" set color red setxy 0 0 set label "PANIC – EXCEPTION CAUGHT!"] show (word " Cron:" precision ticks 1 " Exception Caught! " error-message ) stop ] end to serves-customer if not (is-a-servant? self) [error (word self " label:" label " serve customer method expected a mechanism.") ] if (nobody = dmCustomer) [error (word self " label:" label " serve customer method assumes a customer is here - but there is nobody. " ) ] ifelse ticks < [dmDeparture] of dmCustomer [ show (word " Cron:" precision ticks 1 " server " label " despachando cliente " dmCustomer " cuyo servicio culmina a las " [dmDeparture] of dmCustomer ) mtInsertFEL [dmDeparture] of dmCustomer self "servant will finish a customer service at scheduled departure." ] [ set color green ifelse "teller" = label [ mtTellerDispatchCustomer ] [ mtClerkDispatchCustomer] mtAcctTime "busy" ;; hace el recuento de tiempo ocupado por esta unidad de servicio. set dmAndon task wait-customer ;; se quedara ocioso a la espera del siguiente cliente set dmCustomer nobody ;; desaloja al cliente que ha estado atendiendo. mtInsertFEL (0.1 + ticks) self "servant has completed a customer service, goes idle. " ] end to wait-customer if not (is-a-servant? self) [error (word self " receive customer method is only valid for mechanism agents.")] if (nobody != dmCustomer) [error (word self " wait customer method is called when I am busy with " dmCustomer) ] let waitingCust nobody set color red ifelse "clerk" = label [ set waitingCust entities with ["SOc" = label] ] [ ifelse use-pull-FIFO? [ set waitingCust entities with [ "SOt" = label] ] [ set waitingCust entities with [("SOt" = label) and (myself = dmTeller)] ] ] show (word " Cron: " precision ticks 1 " Info soy el mecanismo " self " del tipo " label " y selecciono next customer de la lista " waitingCust " idle:" acIdleTime " busy:" acBusyTime " %busy: " (acBusyTime / (0.001 + ticks)) ) if any? waitingCust [ set dmCustomer min-one-of waitingCust [dmArrival] ;; tomo cliente de la cola pertinente. ask dmCustomer [mtAssignCustomerTo myself] mtAcctTime "idle" ;; hace el recuento de tiempo que ha estado ociosa esta unidad de servicio. set dmAndon task serves-customer mtRearrangeCustomerQueue waitingCust self mtInsertFEL (0.1 + ticks) self " servant will begin a customer service." ] end to mtCustomerArrival if ("SO-generator" != label) [error (word self " customer arrival method is only valid for a WO generator event.")] ifelse ticks < dmNextEvent [ show (word " Cron: " precision ticks 1 " Info! el proximo cliente no llegara hasta... " dmNextEvent) ] [ ask my-links [die] hatch-entities 1 [ ;; a new customer enters the system. set shape "arrow" set color red - 2 set label (item 0 paCustLabel-seq) let waitingCust entities with [label = [label] of myself] let tb-xcor sentence [xcor] of other waitingCust (pa-clerk-pxcor - 2) let lv-ycor [ycor] of one-of mechanisms with [label = mtCustLabelServer ([label] of myself)] let lv-xcor max (list (-1 + min tb-xcor) -16) setxy lv-xcor lv-ycor face one-of mechanisms with [ label = mtCustLabelServer ([label] of myself) ] set dmTeller nobody set crDate [dmNextEvent] of myself set dmArrival [dmNextEvent] of myself set dmServiceTime rptClerkServiceTime ;; service time for the clerk show (word " Cron: " precision ticks 1 " Info: me acaba de instanciar " myself ", y me pongo a esperar al clerk en xcor " xcor "; service time: " dmServiceTime ) create-link-with myself mtInsertFEL ticks myself "llegada de cliente a la cola del clerk implica crear evento en FEL." ] set dmNextEvent (rptInterarrival + ticks);; programamos siguiente llegada de cliente al sistema. ] end to mtClerkDispatchCustomer let k-mylabel "WOc" if not ( [label] of dmCustomer = k-mylabel) [error (word self " customer label " [label] of dmCustomer " unexpected.") ] let waitingCust entities with [mtNextCustomerLabel (k-mylabel) = label] ;; el cliente ingresara en esta cola tras el servicio en el clerk ask dmCustomer [ ask link-with myself [die] set color red set label mtNextCustomerLabel (k-mylabel) let tb-xcor sentence [xcor] of other waitingCust (pa-tellers-pxcor - 2) let lv-ycor mean [pycor] of mechanisms with ["teller" = label] if not use-pull-FIFO? [ set dmTeller one-of mechanisms with ["teller" = label] set lv-ycor [pycor] of dmTeller ] let lv-xcor max (list (-1 + min tb-xcor) pa-clerk-pxcor) setxy lv-xcor lv-ycor set dmArrival dmDeparture ;; refrescamos el atributo arrival para la nueva cola a la que este cliente ingresa ahora. set dmServiceTime rptTellerServiceTime set shape "tree" show (word " Cron: " precision ticks 1 " server " [label] of myself " me ha despachado, y ahora espero en la fila del teller " dmTeller ". xcor list " tb-xcor ) ] end to mtTellerDispatchCustomer let k-mylabel "WOt" if not ( [label] of dmCustomer = k-mylabel) [error (word self " customer label " [label] of dmCustomer " unexpected.") ] ask dmCustomer [ set dmLeadTime (dmDeparture - crDate) set label mtNextCustomerLabel (k-mylabel) set shape "box" set size 1.5 setxy (4 + xcor) random-ycor set color magenta face myself show (word " Cron: " precision ticks 1 " server " [label] of myself " me ha despachado, y ha abandonado el sistema; label:" label " lead time: " dmLeadTime ) ] end to mtAssignCustomerTo [rhsServer] if not (is-a-customer? self) [error (word self " label:" label " the mtAssignCustomerTo expects me to be a customer.") ] if not (is-a-servant? rhsServer) [error (word self " label:" label " assign customer to ... expected a mechanism.") ] if (mtCustLabelServer label != [label] of rhsServer) [error (word rhsServer "no es del tipo que esperamos para un cliente " label ) ] set label (mtNextCustomerLabel label) if ("teller" = [label] of rhsServer) [ ;; si el customer entra al clerk, puede que el clerk ya le haya asignado un teller al customer ;; y entonces comprobamos que le atiende eltal teller preasignado. ;; si no lo hizo, entonces anotamos el teller que le atiende. if (nobody = dmTeller) [set dmTeller rhsServer] ;; the clerk did not assign a teller to me. if dmTeller != rhsServer [ error (word rhsServer " el cliente tenia previsto que teller fuera " dmTeller) ] ] set color green create-link-with rhsServer move-to rhsServer back 1 set dmDeparture (ticks + dmServiceTime) ;; scheduled departure from clerk show (word " Cron: " precision ticks 1 " Info: me va a atender " rhsServer " del tipo " [label] of rhsServer "; departure time: " dmDeparture) end to mtInsertFEL [#time #author #reason] hatch-events 1 [ set label "other-event-FEL" set color blue set size 1.5 setxy (-2 + min [xcor] of other events) 14 set pcolor turquoise - 4 set dmNextEvent #time set dmSource #author set dmReason #reason show (word " Cron: " precision ticks 1 " Info: evento FEL " dmReason " due at " dmNextEvent " requerido por " dmSource [label] of dmSource " - acabo de instanciarme en el patch " xcor "," ycor) ] end to mtAcctTime [rhsState] if not (is-a-servant? self) [error (word self " can not account idle or busy time; only servants can do this.")] if not (member? rhsState ["idle" "busy"]) [error (word self " send an invalid argument about its state " rhsState " to mtAcctTime.")] ifelse "idle" = rhsState [set acIdleTime (ticks - svLastStateChgTime + acIdleTime)] [set acBusyTime (ticks - svLastStateChgTime + acBusyTime)] set svLastStateChgTime ticks end to mtRearrangeCustomerQueue [rhsCustomers rhsServant] foreach sort-by [[dmArrival] of ?1 < [dmArrival] of ?2] rhsCustomers [ ask ? [if (xcor < ([xcor] of rhsServant - 2) ) [fd 1 ] ] ] end to-report mtCustLabelServer [rhsCustLabel] if not member? rhsCustLabel paCustLabel-seq [error (word " label " rhsCustLabel " is not member of the list " paCustLabel-seq)] let lv-pos position rhsCustLabel paCustLabel-seq report item lv-pos paCustLabel-server end to-report mtNextCustomerLabel [rhsCurrentLabel] if not member? rhsCurrentLabel paCustLabel-seq [error (word " label " rhsCurrentLabel " is not member of the list " paCustLabel-seq)] let lv-nxt (1 + position rhsCurrentLabel paCustLabel-seq) if not (length paCustLabel-seq > lv-nxt ) [error (word " label " rhsCurrentLabel " has no next element in list " paCustLabel-seq)] report item lv-nxt paCustLabel-seq end to-report rptInterarrival ;; tiempo desde ahora hasta la llegada del siguiente cliente. let lvInterarrival 10 if not set-verify-mode? [set lvInterarrival (random-exponential 10) ] set gvInterrarrivalList lput lvInterarrival gvInterrarrivalList report lvInterarrival end to-report rptClerkServiceTime ifelse set-verify-mode? [report 9 ] [report (8 + random-float 2)] ;; service time for the clerk end to-report rptTellerServiceTime ifelse set-verify-mode? [report 18 ] [ report (16 + random-float 4) ] ;; service time for the teller end to-report mtAdvTick let lvAdv (min [dmNextEvent] of events) - ticks if 0 > lvAdv [error (word "malfunction managing the future event list and the clock advance " lvAdv) ] ask events [show (word " FEL at: " precision ticks 1 " is :" precision dmNextEvent 1 " reason:" dmReason " inserted by :" dmSource " experiment duration:" timer) ] ifelse buUseFEL? [report lvAdv] [report pa-tick-adv] end ; Author: J.Costas ; Date: April, 2013. @#$#@#$#@ GRAPHICS-WINDOW 210 10 649 470 16 16 13.0 1 10 1 1 1 0 0 0 1 -16 16 -16 16 1 1 1 ticks 30.0 BUTTON 24 60 90 93 NIL setup NIL 1 T OBSERVER NIL NIL NIL NIL 1 BUTTON 25 113 106 146 go go T 1 T OBSERVER NIL NIL NIL NIL 0 TEXTBOX 26 29 176 47 READ INFO TAB. 11 105.0 1 MONITOR 670 72 897 117 total customers now in the system count entities with [(\"history\" != label) and (xcor <= pa-tellers-pxcor ) ] 17 1 11 SWITCH 23 165 172 198 use-pull-FIFO? use-pull-FIFO? 0 1 -1000 MONITOR 788 457 893 502 mean lead time mean [dmLeadTime] of entities with [\"history\" = label] 1 1 11 MONITOR 670 19 908 64 total customers that quit the system count entities with [\"history\" = label] 17 1 11 MONITOR 711 124 899 169 customers queueing at clerk count entities with [\"SOc\" = label] 17 1 11 MONITOR 714 187 920 232 customers queueing for a teller count entities with [\"SOt\" = label] 17 1 11 PLOT 693 304 893 454 histogram lead-time lead time freq 0.0 321.0 0.0 100.0 true false "" "set-histogram-num-bars 8" PENS "lead-time-pen" 1.0 1 -5825686 true "" "histogram [dmLeadTime] of entities with [\"history\" = label]" SLIDER 19 214 191 247 paNumTellers paNumTellers 1 5 2 1 1 tellers HORIZONTAL MONITOR 958 18 1121 63 Clerk - IDLE accum.time sum [acIdleTime] of mechanisms with [\"clerk\" = label] 0 1 11 MONITOR 1142 22 1303 67 clerk - busy accumTime sum [acBusyTime] of mechanisms with [\"clerk\" = label] 0 1 11 MONITOR 713 244 899 289 customers receiving service count mechanisms with [nobody != dmCustomer] 17 1 11 MONITOR 958 85 1090 130 tellers–accum. IDLE sum [acIdleTime] of mechanisms with [\"teller\" = label] 0 1 11 MONITOR 1143 84 1276 129 tellers- accumBUSY sum [acBusyTime] of mechanisms with [\"teller\" = label] 0 1 11 PLOT 957 137 1157 287 capacity utilization chart time % of busy time 0.0 500.0 0.0 1.0 true true "" "" PENS "busy-pen" 1.0 0 -14439633 true "" "plot 100 * sum [acBusyTime] of mechanisms / (0.01 + count mechanisms * ticks)" "WIP-pen" 1.0 0 -955883 true "" "plot count entities with [(\"history\" != label) and (xcor <= pa-tellers-pxcor ) ]" PLOT 909 302 1221 452 histogram service time of tellers service time freq 0.0 40.0 0.0 10.0 true false "" "set-histogram-num-bars 7" PENS "teller-serviceTime-pen" 1.0 1 -14070903 true "" "histogram [dmServiceTime] of entities with [ (\"history\" = label) and \"teller\" = [label] of dmTeller ]" "clerkServTime-pen" 1.0 1 -2064490 true "" "histogram [dmServiceTime] of entities with [ \"SOc\" = label ]" MONITOR 911 458 1068 503 mean clerk service time mean [dmServiceTime] of entities with [ \"SOc\" = label] 1 1 11 MONITOR 1081 457 1222 502 mean serv time teller mean [dmServiceTime] of entities with [ (\"history\" = label) and (\"teller\" = [label] of dmTeller) ] 1 1 11 MONITOR 1167 239 1252 284 %busy time 100 * sum [acBusyTime] of mechanisms / (0.01 + count mechanisms * ticks) 0 1 11 SWITCH 22 263 186 296 set-verify-mode? set-verify-mode? 1 1 -1000 SWITCH 25 321 148 354 buUseFEL? buUseFEL? 0 1 -1000 MONITOR 36 398 157 443 inter arrival stdev standard-deviation gvInterrarrivalList 1 1 11 @#$#@#$#@ ## WHAT IS IT? Customers arrive at an order counter. Interarrival Law: exp(lambda = 10 min) A single clerk accepts and checks their orders and process payments; service law: unif (8,10) Upon completion this step, orders are assigned randomly to one of 2 available stock-persons; service law : unif (16,20) Customers then leave the system. Develop a model and experiment 5,000 min. Describe the experience of customers in terms of total time in the system. A kaizen-team proposes to improve by changing the assignment policy of the stock-person following a FIFO PULL rule: each one of stock-persons pulls next order from a FIFO line. Verify the improvement. ## HOW IT WORKS (1) There is a breed of events to represent the future event list. Next customer arrival to the system has always one event; as soon as it is due, this event is re-scheduled, and another event is created to represent the current customer arrival to the system now. Each time a servant is still providing service to her customer at this tick of time (system clock), a "next departure" event is created. Once the current customer on a servant reaches her departure time, then it is created a new event to represent that now this clerk or teller (the servant who has completed her service to her customer) is ready to start another piece of work now. Once the work to do in the go procedure is completed, the FEL (future event list) is recalculared using this breed of events. Each time a new run of the go procedure starts, the FEL is cleaned, except the next customer arrival event. (2) There is a breed of mechanisms to represent the active agents that carry out job (value adding stations) of the system. The final VA (value added) received by each customer is given to her by one of the tellers. It depends on what has done the clerk (former work station). The clerk may have assigned the customer a teller or she may have not. When the clerk assigns the teller to the customer, the customer queues for this concrete teller. When the clerk does not assign a teller to the customer, the customer works in a single queue from which any teller picks next customer when she becomes idle. Mechanisms work like finit-state machines. They schedule its next task each time the go procedure runs. (3) There us a breed of entities to represent customers in any phase of the process. The label of the customer entity represents the phase this customer is having now; she may have just arrived to the system and is queueing in front of the clerk; she may be serviced now by the clerk, she may be queueing to receive a teller service, she may be at a teller station receiving service, or she may habe left the system. Notice that entities traverse the systmen horizontally from left to right. The worksflow os customers is managed using a list that represents the sequence of phases; this list matches the servant (workstation) that corresponds to this phase. (4) There are exception turtles; its purpose is to manage exceptions; they form the 'police' of the model. Each procedure takes care of implementing controls in order to have early detection of a potential system malfunction. ## HOW TO USE IT On the left side of the UI (user interface) we see the classical setup and go buttons. Before using these buttons, you must select if you want the clerk to be the one who routes the customer to one teller or another, or if you want to work with a single coomon queue of customers waiting for a teller. Each queue in the model uses FIFO policy. You can select how many tellers you want to have in the system. (The clerk is always unique). You will see that the clerk is placed on the left side and all tellers are spread on the same column, to the right of the clerk. You can decide to set the verify model ON, and in this case instead of using the sthocastic laws mentioned in the specifications (interarrival law, clerk service law, tellers service law), fixed constants are used. This option is interesting in order to verifiy system behavior in a tied-controlled conditions. You can also decide to use the to select if you want to use the FEL apprach (the system runs faster) to manage the simulator-system-clock, or if you want it to move with a fixed time interval in each tick advance. This feature is also important to verify the model. On the right side of the window you can see a set of monitor gadgets to to see what is going on on the queues (queue lenght). You see also several monitors with the purpose to clarify idle versus busy time of the servants. You see a capacity plot (time series plot) that shows the % of occupations of the staff, and the lenght of the customer queuing in the system. And you can see one histogram to verify the distribution of service time. Finally, you see what the model is required to show: one histogram with the customers lead time (time that customers spend to traverse the system). ## THINGS TO NOTICE It is important to see if the system reaches or not a steady-state condition. For instance, the lenght of the WIP (num.customers queueing in the system) might be continuously growing, which is a signal of not being in a steady state. The same consideration about the busy time of the value-adding stations. Have a look to the service time data. It should adhere to the service law said in the specifications. And, of course, look the result "mean lead time" in order to see if it stabilizes to the voisinage of some value. ## THINGS TO TRY Experiment with more tellers in the system (use slidebar). Experiment using the FEL versus not using it. Do you get comparable results? ## EXTENDING THE MODEL You may try to change the model in order to attend different kind of customers. Try to use a priority for VIP customers. Compare VIP and regular customers in terms of their experience of total lead time in the system. ## NETLOGO FEATURES (1) traversing a list (sequence of phases) using the item and position commands. (2) making associations between items of different lists: assing a teller based on the customer phase in the system. (3) run task command feature to manage the activity of each teller and clerk. (4) advancing the system-clock by using a FEL implemented with a special breed of turtles; part of this agentset is stationary and part of it is renewed at each run of the go procedure. ## RELATED MODELS Review literature about queing theory. ## AUTHOR Jose Costas. April, 2013 ## REFERENCES David Kelton. Simulation with ARENA. Mc-Graw Hill, 2004. @#$#@#$#@ default true 0 Polygon -7500403 true true 150 5 40 250 150 205 260 250 airplane true 0 Polygon -7500403 true true 150 0 135 15 120 60 120 105 15 165 15 195 120 180 135 240 105 270 120 285 150 270 180 285 210 270 165 240 180 180 285 195 285 165 180 105 180 60 165 15 arrow true 0 Polygon -7500403 true true 150 0 0 150 105 150 105 293 195 293 195 150 300 150 box false 0 Polygon -7500403 true true 150 285 285 225 285 75 150 135 Polygon -7500403 true true 150 135 15 75 150 15 285 75 Polygon -7500403 true true 15 75 15 225 150 285 150 135 Line -16777216 false 150 285 150 135 Line -16777216 false 150 135 15 75 Line -16777216 false 150 135 285 75 bug true 0 Circle -7500403 true true 96 182 108 Circle -7500403 true true 110 127 80 Circle -7500403 true true 110 75 80 Line -7500403 true 150 100 80 30 Line -7500403 true 150 100 220 30 butterfly true 0 Polygon -7500403 true true 150 165 209 199 225 225 225 255 195 270 165 255 150 240 Polygon -7500403 true true 150 165 89 198 75 225 75 255 105 270 135 255 150 240 Polygon -7500403 true true 139 148 100 105 55 90 25 90 10 105 10 135 25 180 40 195 85 194 139 163 Polygon -7500403 true true 162 150 200 105 245 90 275 90 290 105 290 135 275 180 260 195 215 195 162 165 Polygon -16777216 true false 150 255 135 225 120 150 135 120 150 105 165 120 180 150 165 225 Circle -16777216 true false 135 90 30 Line -16777216 false 150 105 195 60 Line -16777216 false 150 105 105 60 car false 0 Polygon -7500403 true true 300 180 279 164 261 144 240 135 226 132 213 106 203 84 185 63 159 50 135 50 75 60 0 150 0 165 0 225 300 225 300 180 Circle -16777216 true false 180 180 90 Circle -16777216 true false 30 180 90 Polygon -16777216 true false 162 80 132 78 134 135 209 135 194 105 189 96 180 89 Circle -7500403 true true 47 195 58 Circle -7500403 true true 195 195 58 circle false 0 Circle -7500403 true true 0 0 300 circle 2 false 0 Circle -7500403 true true 0 0 300 Circle -16777216 true false 30 30 240 cow false 0 Polygon -7500403 true true 200 193 197 249 179 249 177 196 166 187 140 189 93 191 78 179 72 211 49 209 48 181 37 149 25 120 25 89 45 72 103 84 179 75 198 76 252 64 272 81 293 103 285 121 255 121 242 118 224 167 Polygon -7500403 true true 73 210 86 251 62 249 48 208 Polygon -7500403 true true 25 114 16 195 9 204 23 213 25 200 39 123 cylinder false 0 Circle -7500403 true true 0 0 300 dot false 0 Circle -7500403 true true 90 90 120 face happy false 0 Circle -7500403 true true 8 8 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Polygon -16777216 true false 150 255 90 239 62 213 47 191 67 179 90 203 109 218 150 225 192 218 210 203 227 181 251 194 236 217 212 240 face neutral false 0 Circle -7500403 true true 8 7 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Rectangle -16777216 true false 60 195 240 225 face sad false 0 Circle -7500403 true true 8 8 285 Circle -16777216 true false 60 75 60 Circle -16777216 true false 180 75 60 Polygon -16777216 true false 150 168 90 184 62 210 47 232 67 244 90 220 109 205 150 198 192 205 210 220 227 242 251 229 236 206 212 183 fish false 0 Polygon -1 true false 44 131 21 87 15 86 0 120 15 150 0 180 13 214 20 212 45 166 Polygon -1 true false 135 195 119 235 95 218 76 210 46 204 60 165 Polygon -1 true false 75 45 83 77 71 103 86 114 166 78 135 60 Polygon -7500403 true true 30 136 151 77 226 81 280 119 292 146 292 160 287 170 270 195 195 210 151 212 30 166 Circle -16777216 true false 215 106 30 flag false 0 Rectangle -7500403 true true 60 15 75 300 Polygon -7500403 true true 90 150 270 90 90 30 Line -7500403 true 75 135 90 135 Line -7500403 true 75 45 90 45 flower false 0 Polygon -10899396 true false 135 120 165 165 180 210 180 240 150 300 165 300 195 240 195 195 165 135 Circle -7500403 true true 85 132 38 Circle -7500403 true true 130 147 38 Circle -7500403 true true 192 85 38 Circle -7500403 true true 85 40 38 Circle -7500403 true true 177 40 38 Circle -7500403 true true 177 132 38 Circle -7500403 true true 70 85 38 Circle -7500403 true true 130 25 38 Circle -7500403 true true 96 51 108 Circle -16777216 true false 113 68 74 Polygon -10899396 true false 189 233 219 188 249 173 279 188 234 218 Polygon -10899396 true false 180 255 150 210 105 210 75 240 135 240 house false 0 Rectangle -7500403 true true 45 120 255 285 Rectangle -16777216 true false 120 210 180 285 Polygon -7500403 true true 15 120 150 15 285 120 Line -16777216 false 30 120 270 120 leaf false 0 Polygon -7500403 true true 150 210 135 195 120 210 60 210 30 195 60 180 60 165 15 135 30 120 15 105 40 104 45 90 60 90 90 105 105 120 120 120 105 60 120 60 135 30 150 15 165 30 180 60 195 60 180 120 195 120 210 105 240 90 255 90 263 104 285 105 270 120 285 135 240 165 240 180 270 195 240 210 180 210 165 195 Polygon -7500403 true true 135 195 135 240 120 255 105 255 105 285 135 285 165 240 165 195 line true 0 Line -7500403 true 150 0 150 300 line half true 0 Line -7500403 true 150 0 150 150 pentagon false 0 Polygon -7500403 true true 150 15 15 120 60 285 240 285 285 120 person false 0 Circle -7500403 true true 110 5 80 Polygon -7500403 true true 105 90 120 195 90 285 105 300 135 300 150 225 165 300 195 300 210 285 180 195 195 90 Rectangle -7500403 true true 127 79 172 94 Polygon -7500403 true true 195 90 240 150 225 180 165 105 Polygon -7500403 true true 105 90 60 150 75 180 135 105 plant false 0 Rectangle -7500403 true true 135 90 165 300 Polygon -7500403 true true 135 255 90 210 45 195 75 255 135 285 Polygon -7500403 true true 165 255 210 210 255 195 225 255 165 285 Polygon -7500403 true true 135 180 90 135 45 120 75 180 135 210 Polygon -7500403 true true 165 180 165 210 225 180 255 120 210 135 Polygon -7500403 true true 135 105 90 60 45 45 75 105 135 135 Polygon -7500403 true true 165 105 165 135 225 105 255 45 210 60 Polygon -7500403 true true 135 90 120 45 150 15 180 45 165 90 sheep false 15 Circle -1 true true 203 65 88 Circle -1 true true 70 65 162 Circle -1 true true 150 105 120 Polygon -7500403 true false 218 120 240 165 255 165 278 120 Circle -7500403 true false 214 72 67 Rectangle -1 true true 164 223 179 298 Polygon -1 true true 45 285 30 285 30 240 15 195 45 210 Circle -1 true true 3 83 150 Rectangle -1 true true 65 221 80 296 Polygon -1 true true 195 285 210 285 210 240 240 210 195 210 Polygon -7500403 true false 276 85 285 105 302 99 294 83 Polygon -7500403 true false 219 85 210 105 193 99 201 83 square false 0 Rectangle -7500403 true true 30 30 270 270 square 2 false 0 Rectangle -7500403 true true 30 30 270 270 Rectangle -16777216 true false 60 60 240 240 star false 0 Polygon -7500403 true true 151 1 185 108 298 108 207 175 242 282 151 216 59 282 94 175 3 108 116 108 target false 0 Circle -7500403 true true 0 0 300 Circle -16777216 true false 30 30 240 Circle -7500403 true true 60 60 180 Circle -16777216 true false 90 90 120 Circle -7500403 true true 120 120 60 tree false 0 Circle -7500403 true true 118 3 94 Rectangle -6459832 true false 120 195 180 300 Circle -7500403 true true 65 21 108 Circle -7500403 true true 116 41 127 Circle -7500403 true true 45 90 120 Circle -7500403 true true 104 74 152 triangle false 0 Polygon -7500403 true true 150 30 15 255 285 255 triangle 2 false 0 Polygon -7500403 true true 150 30 15 255 285 255 Polygon -16777216 true false 151 99 225 223 75 224 truck false 0 Rectangle -7500403 true true 4 45 195 187 Polygon -7500403 true true 296 193 296 150 259 134 244 104 208 104 207 194 Rectangle -1 true false 195 60 195 105 Polygon -16777216 true false 238 112 252 141 219 141 218 112 Circle -16777216 true false 234 174 42 Rectangle -7500403 true true 181 185 214 194 Circle -16777216 true false 144 174 42 Circle -16777216 true false 24 174 42 Circle -7500403 false true 24 174 42 Circle -7500403 false true 144 174 42 Circle -7500403 false true 234 174 42 turtle true 0 Polygon -10899396 true false 215 204 240 233 246 254 228 266 215 252 193 210 Polygon -10899396 true false 195 90 225 75 245 75 260 89 269 108 261 124 240 105 225 105 210 105 Polygon -10899396 true false 105 90 75 75 55 75 40 89 31 108 39 124 60 105 75 105 90 105 Polygon -10899396 true false 132 85 134 64 107 51 108 17 150 2 192 18 192 52 169 65 172 87 Polygon -10899396 true false 85 204 60 233 54 254 72 266 85 252 107 210 Polygon -7500403 true true 119 75 179 75 209 101 224 135 220 225 175 261 128 261 81 224 74 135 88 99 wheel false 0 Circle -7500403 true true 3 3 294 Circle -16777216 true false 30 30 240 Line -7500403 true 150 285 150 15 Line -7500403 true 15 150 285 150 Circle -7500403 true true 120 120 60 Line -7500403 true 216 40 79 269 Line -7500403 true 40 84 269 221 Line -7500403 true 40 216 269 79 Line -7500403 true 84 40 221 269 wolf false 0 Polygon -16777216 true false 253 133 245 131 245 133 Polygon -7500403 true true 2 194 13 197 30 191 38 193 38 205 20 226 20 257 27 265 38 266 40 260 31 253 31 230 60 206 68 198 75 209 66 228 65 243 82 261 84 268 100 267 103 261 77 239 79 231 100 207 98 196 119 201 143 202 160 195 166 210 172 213 173 238 167 251 160 248 154 265 169 264 178 247 186 240 198 260 200 271 217 271 219 262 207 258 195 230 192 198 210 184 227 164 242 144 259 145 284 151 277 141 293 140 299 134 297 127 273 119 270 105 Polygon -7500403 true true -1 195 14 180 36 166 40 153 53 140 82 131 134 133 159 126 188 115 227 108 236 102 238 98 268 86 269 92 281 87 269 103 269 113 x false 0 Polygon -7500403 true true 270 75 225 30 30 225 75 270 Polygon -7500403 true true 30 75 75 30 270 225 225 270 @#$#@#$#@ NetLogo 5.0.4 @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ default 0.0 -0.2 0 1.0 0.0 0.0 1 1.0 0.0 0.2 0 1.0 0.0 link direction true 0 Line -7500403 true 150 150 90 180 Line -7500403 true 150 150 210 180 @#$#@#$#@ 0 @#$#@#$#@