2017-08-30 3 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)がOKではないのはなぜ?それはカメ自身の[命令]のために問題ですか?あるいは、注文をリストとして定義する必要がありますか?それ、どうやったら出来るの? 注文が異なるn-costumersがある場合、コードは機能しますか?

私のコードで何をしたいのですか?工場から倉庫、そして最終的には顧客への製品フローを作成しています。

私を助けてください。

+0

[、最小限の完全な、かつ検証例]の設定に関するヒントについて尋ねるガイドラインを見てください(httpsを言うことができます://をstackoverflow.com/help/mcve)。コードを表示するために写真を使用しないでください(またはエラーを貼り付けるだけです)。代わりにコードに貼り付け、[コードサンプル]ボタンを使用します。 'orders'を設定する場所にコードを含めることができますか?注文をリストとして定義する前に 'send-products'を呼び出すようですが、それは残りのコードを見ずに推測するだけです。 –

答えて

1

あなたはエラーが何であるかを教えてくれませんでした。エラーが発生しただけです。エラーメッセージが何であるか教えてください。しかし、NetLogoにどのような長さのリストを使用しているかを伝えていないという問題は正しいと思われます。あなたは1つの工場しか持っていませんが、2つを作った場合はどうなりますか? Try while [i < length([orders] of factory NN)]ここで、NNは工場の担当者番号です。

これは、あなたが質問した特定のエラーを修正します。しかし、より一般的な問題がいくつかあります。 NetLogoの良い経験則は、whileループを使用してエージェントを反復する場合、ほぼ確実にaskwhileではないことです。また、コード内の誰かの番号を使うことは、ほとんど常に悪い考えです。あなたのケースでは、インデックス付きwhileループと明示的なコーディングの組み合わせによって、(私が想定している)注文のリストを実行し、各注文を別のカメ(工場、倉庫、顧客)に送信することになります。さらに、あなたの注文リストはあなたのカメの数よりはるかに長くなります。

マイナー注 - ask turtles with [breed = factories]を言う必要はありません、あなただけask factories

+0

最初の問題を修正していただきありがとうございます。しかし今、あなたが期待したように、問題はwhileループで発生します。アクション "send-products"では、工場から倉庫に製品を送りたいが、すべてのカメには送っていない。私は、Netlogoがステップごとに段階的に工場在庫から「注文」を差し引いて、在庫の新しいリストを作成することを考えていました。私が間違っていたら - それを行う正しい方法は何ですか?そして、変数 "i"を定義しましたか? – Emilly

+0

これはすべてより一般的な問題に関連しています。あなたのリストは実際に何を表していますか?それは時間1で注文し、時間2で注文するなどですか?もしそうなら、あなたは 'tick 'を使って時間を刻み、' while'は決して必要としません。ちょうどtickに対応する項目を取るだけです。 – JenB

+0

はい、リストの最初の数字は、時刻1の順番を表し、リストの2番目の数字は、2の時の順番を表します。あなたは私がリスト "注文"の最初の数字を工場在庫から差し引くコードを書くのを手伝ってください。そして、2番目のステップでは、リスト "注文"の2番目の数字が新しいものから差し引かれます工場在庫の値など、注文リストの最後の番号まで。 – Emilly

関連する問題