2017-08-30 33 views
-1

我是Netlogo的新成員,我遇到了一些問題。如何編碼值和列表之間的和?

當我檢查代碼一切正常,但是當我運行模擬時發生錯誤。

這裏是我的代碼:

breed [ factories factory ] 
breed [ customers customer ] 
breed [ warehouses warehouse ] 

Factories-own [ 
    orders 
    stock_f 
    kilograms-of-products 
] 

Customers-own [ 
    stock_c 
    demand 
    kilograms-of-products 
] 

Warehouses-own [ 
    orders 
    stock_w 
    kilograms-of-product 
] 

to setup 
    clear-all 
    reset-ticks 
    ask patches [ set pcolor white] 

    create-Factories 1 [ 
    setxy -12 -5 
    set size 3 
    set color red 
    set label (word "Factory" [who] of self " ") 
    set shape "house" 
    set stock_f 77482.1 
    ] 

    create-warehouses 1 [ 
    setxy 0 0 
    set size 3 
    set color blue 
    set label (word "warehouse" [who] of self " ") 
    set shape "house" 
    set stock_w 108 
    set orders [ 86.34 70.43 5000.89 148.22 54.39 3055.76 0.66 1.69 7.2 4553.56 40.6 116.53 6130.37 5.18 2698.57 79.55 2405.85 41.3 11.41 36.5 7877.06 18.93 14.99 4041.12 10.3 728.16 59.68 4703.43 50.93 93.16 31.5 3689.66 21.6 9.8 83.48 1.18 121.02 5441.62 796.53 162.29 6874.33 97.29 2749.3 1.48 47.13 5056.77 2163.82 1406.06 12.6 4753.59 257.46 1374.46 186.37 ] 
    ] 

    create-customers 1 [ 
    setxy random 30 - 0 random 30 - 15 
    set size 1 
    set color green 
    set shape "box" 
    set stock_c 0 
    set demand [ 13.8 29.9 58.3 18.5 0.8 6.6 12.1 14.1 8.7 56 3.3 0.1 9.5 11.7 0.2 6.7 10.5 16 3.6 94.1 5.2 69.1 7.2 29 15.8 7.7 20.2 21 39.8 83.2 10.6 48.6 25.1 13.1 66.1 16.7 85 27.5 7.5 31.5 9.4 16 2.6 5.8 5.5 134.8 108.7 159 49 0.4 90.6 25.2 2.6 1.7 56.1 49.5 21.4 10.6 3.9 1.4 35.7 10.7 62.9 49.5 ] 
    ] 

    ask customers [ create-link-with turtle 1 ] 
    ask turtle 1 [ create-link-with turtle 0 ] 

end 

to go 
    send-products 
    buy-products 
    if count customers with [ not empty? demand] = 0 
    [stop] 
    tick 
end 

to send-products 
    ask turtles with [ breed = factories ] [ 
    let i 0 
    while [ i < length(orders)] [ 
     ask turtle (item i orders) [ 
     set stock_f (stock_f - item i orders) 
     set i i + 1] 
    set i 0 
    while [i < length(orders)] 
    [if last (item i orders) = ticks 
     [set orders replace-item i orders [0 0]] 
     set i i + 1]] 
    let list1 [] 
    set list1 lput (stock_f - item i orders) list1 
    show list1 
    ] 
    ask turtles with [breed = warehouses] [ 
    let x 0 
    while [ x < length(orders)] [ 
     ask turtle (item x orders) [ 
     set stock_w (stock_w + item x orders) 
     set x x + 1] 
    set x 0 
    while [x < length(orders)] 
    [if last (item x orders) = ticks 
     [set orders replace-item x orders [0 0]] 
     set x x + 1]] 
    let list2 [] 
    set list2 lput (stock_w + item x orders) list2 
    show list2 
    ] 
end 

to buy-products 
    ;Customers go shopping according to their demand and their stock 
    ask turtles with [ breed = customers ] [ 
    let a 0 
    while [ a < length(demand)] [ 
     ask turtle (item a demand) [ 
     set stock_c (stock_c + item a demand) 
     set stock_w (stock_w - item a demand) 
     set a a + 1] 
     set a 0 
     while [ a < length(demand)] 
     [if last (item a demand) = ticks 
     [ set demand replace-item a demand [0 0]] 
     set a a + 1]] 
    let list3 [] 
    set list3 lput (stock_c + item a demand) list3 
    show list3 
    let list4 [] 
    set list4 lput (stock_w - item a demand) list4 
    show list4 
    ] 
end 

爲什麼length(orders)也不行?這是一個問題,因爲烏龜自己的[訂單]?或者我必須將訂單定義爲清單?我怎麼做? 如果我有不同訂單的n-costumers,代碼是否可以工作?

我想在我的代碼中做的是創建一個產品流程,從工廠到倉庫,最後到客戶。

請幫幫我。

+0

請看看的要求準則有關設置[最小的,完整的,和可覈查的示例](HTTPS提示:// stackoverflow.com/help/mcve)。避免使用圖片來顯示代碼(或錯誤 - 只需粘貼);相反,粘貼你的代碼並使用「代碼示例」按鈕。你可以在你設置'訂單'的地方加入代碼嗎?看起來您在將訂單定義爲列表之前調用了「send-products」,但這只是猜測而沒有看到其他代碼。 –

回答

1

您還沒有告訴我們錯誤是什麼,只是發生錯誤。至少告訴我們錯誤信息是什麼總是好的。但看起來問題是,你沒有告訴NetLogo哪個列表需要長度。你碰巧只有一個工廠,但是如果你創建了兩個工廠呢?嘗試while [i < length([orders] of factory NN)]其中NN是工廠的編號。

這將解決您詢問的具體錯誤。但是,還有一些更一般的問題。 NetLogo的一個很好的經驗法則是,如果您使用while循環遍歷代理,那麼您幾乎可以肯定需要ask而不是while。而且,在你的代碼中使用誰的數字幾乎總是一個壞主意。在你的情況下,索引while循環和顯式編碼誰將導致運行一個(我所假設的)列表的訂單並將每個訂單發送給不同的烏龜 - 工廠,倉庫和客戶。更重要的是,您的訂單清單比您的龜數量長得多。

小記 - 你永遠需要說ask turtles with [breed = factories],你就可以說ask factories

+0

感謝您解決第一個問題。但是現在,如您所料,問題會在while循環中發生。在行動「寄送產品」時,我希望將產品從工廠發送到倉庫,而不是全部烏龜。我認爲用「同時」Netlogo將逐步從工廠庫存中扣除「訂單」的每一個數量,並將創建stock_f的新列表。如果我做錯了 - 什麼是正確的方法來做到這一點?我是否定義變量「我」好嗎? – Emilly

+0

這些都與更一般的問題有關。你的名單實際上代表什麼?它是在時間1訂購,然後在時間2訂購?如果是這樣,那麼你需要使用'tick'逐步完成時間,並且根本不需要'while',只需要取得與tick相對應的項目。 – JenB

+0

是的,列表中的第一個數字表示時間1的訂單,列表中的第二個數字表示時間2的訂單,依此類推。你能幫我寫下代碼,它會從列表中的第一個數字「訂單」,並從工廠庫存中扣除它,然後在第二步將列表中的第二個數字「訂單」,並從新的工廠庫存的價值等等,直到訂單清單中的最後一個數字。 – Emilly

相關問題