---supermarket checkout.nlogo
来自「NETLOGO」· NLOGO 代码 · 共 611 行 · 第 1/2 页
NLOGO
611 行
Breeds [checkouts customers servers]turtles-own [state]checkouts-own [server customers_waiting customer_loads current_customer start_time] ;state: 0 - checkout closed, 1 - open, 2 - busyservers-own [checkout busy?]customers-own [load checkout_num q_start_time next_event anxiety] ; state: 0 - looking, 1 - moving, 2 - in queue, 3 - being served, 4 - finishedGlobals [Time q_lengths q_loads q_times cum_q_size total_waiting next_arrival Average_Q_Size Average_Q_Time]to setup locals [checkout_xpos] ca if (Number_of_Servers > Number_of_Checkouts) [show "error message: too many servers" stop] ask patches [set pcolor grey + random 3]; set patch colour ;setup checkouts set checkout_xpos (0 - screen-edge-x) set q_lengths [] repeat Number_of_Checkouts [ ask patch-at checkout_xpos (screen-edge-y - 2) [ sprout 1 [set breed checkouts set shape "box" set color brown set state 0 set customers_waiting [] set customer_loads []] set q_lengths lput 0 q_lengths] set checkout_xpos checkout_xpos + 2] setup_servers ;setup customers - add options here for distinguishing different types of customers ;setup globals set total_waiting 0 set q_times [] set Time 0.0 set next_arrival 0.0 set cum_q_size 0 set Average_Q_Size 0endto setup_servers locals [i checkout_xpos] set checkout_xpos (0 - screen-edge-x) set i 0 repeat Number_of_Servers [ ask patch-at checkout_xpos (screen-edge-y - 1) [sprout 1 [set breed servers set shape "person" set color blue set busy? false set checkout i set server-of turtle i who set state-of turtle i 1]] set checkout_xpos checkout_xpos + 2 set i i + 1]endto go customer_arrives move_to_queue_start move_to_queue_finish move_in_queue start_service end_service plot_graphs do_stats wait 0.1 set Time Time + 0.1endto customer_arrives ;new customers arrive according to a negative exponential distribution if (Time > next_arrival) [ ask patch-at (random screen-size-x) (0 - screen-edge-y) [ sprout 1 [set breed customers set shape "person" set color pink set load (1 + random 9) set checkout_num queue_choice ]] set next_arrival Time + random-exponential mean_arrival_rate]endto-report queue_choice locals [q_scores i j l] ;choice will be based on 1 - lengths of queues, 2 - shopping loads, 3 - proximity set i 0 set q_scores [] repeat Number_of_Servers [set l Length customers_waiting-of turtle i set q_scores lput ((l + 1) * (distance-nowrap turtle i)) q_scores set i i + 1] set j position ( min q_scores) q_scores report j endto move_to_queue_start ;customer chooses queue and heads towards itlocals [chk_x chk_y] ask customers with [state = 0] [ set chk_x (1 - screen-edge-x + (2 * checkout_num)); set target cordinates set chk_y screen-edge-y - 3 - (length customers_waiting-of turtle checkout_num) ifelse (pxcor != chk_x or pycor != chk_y) [set heading towardsxy-nowrap chk_x chk_y fd 1 set state 1 set next_event (Time + 0.2)] ; + (count other-customers-here)) ]; people slow down to pass each other ? [set heading 0 set state 2 set customers_waiting-of turtle checkout_num lput who customers_waiting-of turtle checkout_num set q_lengths replace-item checkout_num q_lengths (length customers_waiting-of turtle checkout_num) set q_start_time Time]]endto move_to_queue_finish ask customers with [state = 1] [if (Time >= next_event) [set checkout_num queue_choice set state 0]] end to move_in_queue ;customers move up the queue ask customers with [state = 2] [if (count turtles-at dx dy = 0) [fd 1]] ;also need to check other queuesendto start_service ;if a server is free and a customer is in the queue, serving can start ;service time depends on a negative exponential distribution locals [service_time] ask checkouts with [state = 1][ without-interruption[ if (length customers_waiting > 0) [set busy?-of turtle server true set state 2 set current_customer first customers_waiting set state-of turtle current_customer 3 set service_time random-exponential Mean_Service_Time set next_event-of turtle current_customer (Time + service_time) set xcor-of turtle current_customer xcor + 1 set ycor-of turtle current_customer (screen-edge-y - 1) set q_times fput (Time - q_start_time-of turtle current_customer) q_times]]]endto end_service ;if service time is finished, the customer moves on, and the server is now free ask checkouts with [state = 2][ if (Time >= (next_event-of turtle current_customer)) [set customers_waiting but-first customers_waiting set state-of turtle current_customer 4 set state 1 set busy?-of turtle server false ]] ask customers with [state = 4] [fd 1 wait 0.1 die]endto do_stats locals [i] set i 0 set cum_q_size 0 repeat Number_of_Servers [ set cum_q_size cum_q_size + length customers_waiting-of turtle i set i i + 1] if (length q_times > 0 )[set Average_Q_Time mean q_times set Average_Q_Size (cum_q_size / Number_of_servers)]endto plot_graphs set-current-plot "Queue Size" set-current-plot-pen "black" plotxy Time cum_q_size set-current-plot "Queue Time Hist" set-current-plot-pen "black" histogram-list q_timesend@#$#@#$#@GRAPHICS-WINDOW1841076734110527.311000CC-WINDOW16407303512Command CenterSLIDER8139151172Mean_Arrival_RateMean_Arrival_Rate0.5100.50.51NILBUTTON10177750NILsetupNIL1TOBSERVERSLIDER9174150207Mean_Service_TimeMean_Service_Time0205.00.51NILSLIDER6100153133Number_of_ServersNumber_of_Servers110811NILBUTTON831914652NILgoT1TOBSERVERPLOT566364767514Queue SizeTimeNIL0.0100.00.020.0truefalsePENS"black" 1.0 0 -16777216 truePLOT349364549514Queue Time HistNILFrequency0.050.00.030.0truefalsePENS"black" 1.0 0 -16777216 trueMONITOR1722983278NILTime21MONITOR20339122388NILAverage_Q_Time21
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?