---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 + -
显示快捷键?