2017-03-30 54 views
0

每當代理爲他們正在執行的某個操作獲取新值時,我都希望他們將其添加到列表的末尾。如果列表上有十個或更多項目,我希望他們刪除列表中的第一個項目,以便該列表具有代理已查看的十個最新值,按順序排列。我該怎麼做? (編輯:忘了問一個實際的問題。)NetLogo:從列表中添加和刪除項目

我想能夠應用數學運算到列表上的每個項目,所以我不想列出類似cons單元格的列表,除非有一些簡單將數學運算應用於我不知道的列表中的每個項目的方法。

+1

包括你已經寫了一些代碼,並說明不工作。 –

回答

3

讓我們建立一個簡單的例子,其中每個龜使得在每個替隨機角度稍微向右轉,並存儲這些角度的歷史列表:

turtles-own [ history ] 

to setup 
    clear-all 
    create-turtles 3 [ 
    set history [] ; initialize history to an empty list 
    ] 
    reset-ticks 
end 

to go 
    ask turtles [ 
    let angle random 5 
    right angle 
    ; add the angle of the most recent turn 
    ; at the end of the list 
    set history lput angle history 
    if length history > 10 [ 
     ; remove the first item from the list 
     set history but-first history 
    ] 
    forward 0.1 
    ] 
    tick 
end 

我不想要一個類似於單元格列表的列表,除非有一些簡單的方法可以將數學運算應用於我不知道的列表中的每個項目。

我不知道你是什麼意思的「一個缺點列表」,但像我們這裏建立的一個簡單的列表是目前爲止你可以使用的最好的東西,如果你想要做的數學。

要應用操作的每個項目,使用map。然後你可以使用像summean這樣的功能來操作整個列表。例如:

to do-math 
    ask turtles [ 
    let doubled-history map [ a -> a * 2 ] history 
    show history 
    show doubled-history 
    show mean doubled-history 
    ] 
end 

(注意,這裏使用的NetLogo 6.0.1語法)。

讓我們來看看一個示範:

observer> setup repeat 5 [ go ] do-math 
(turtle 2): [4 3 2 1 2] 
(turtle 2): [8 6 4 2 4] 
(turtle 2): 4.8 
(turtle 1): [4 0 1 1 4] 
(turtle 1): [8 0 2 2 8] 
(turtle 1): 4 
(turtle 0): [2 0 4 1 0] 
(turtle 0): [4 0 8 2 0] 
(turtle 0): 2.8