2017-08-30 4 views
-1

Je suis nouveau sur Netlogo et j'ai quelques problèmes.Comment coder la somme entre la valeur et la liste?

Lorsque je vérifie le code, tout va bien, mais quand je lance la simulation, l'erreur se produit.

Voici mon code:

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 

Pourquoi le length(orders) n'est pas OK? Est-ce un problème parce que les tortues [commandes]? Ou dois-je définir les commandes en tant que liste? Comment je fais ça? Le code fonctionnera-t-il si j'ai des n-clients avec des commandes différentes?

Ce que je voudrais faire dans mon code, c'est créer un flux de produits de l'usine à l'entrepôt et à la fin aux clients.

S'il vous plaît aidez-moi.

+0

S'il vous plaît jeter un oeil sur les lignes directrices demandant des conseils sur la mise en place d'un (https [exemple minimal, complet, vérifiable]: // stackoverflow.com/help/mcve). Évitez d'utiliser des images pour afficher le code (ou une erreur - il suffit de le coller); à la place, collez votre code et utilisez le bouton "Exemple de code". Pouvez-vous inclure le code où vous configurez les commandes? Il semble que vous appeliez 'send-products' avant que vous ayez défini' des commandes en tant que liste - mais c'est juste une supposition sans voir le reste du code. –

Répondre

1

Vous ne nous avez pas dit ce qu'est l'erreur, juste qu'une erreur se produit. Il est toujours bon de nous dire au moins ce qu'est le message d'erreur. Mais il semble que vous ayez raison, le problème est que vous ne dites pas à NetLogo quelle liste doit prendre. Il se trouve que vous n'avez qu'une seule usine, mais que se passerait-il si vous en aviez créé deux? Essayez while [i < length([orders] of factory NN)] où NN est le numéro qui correspond à l'usine.

Ceci corrigera l'erreur spécifique que vous avez posée. Cependant, il y a quelques problèmes plus généraux. Une bonne règle de base dans NetLogo est que si vous utilisez une boucle while pour parcourir les agents, alors vous voulez certainement ask et non while. En outre, l'utilisation de numéros dans votre code est presque toujours une mauvaise idée. Dans votre cas, la combinaison de la boucle indexée et du codage explicite des numéros va conduire à parcourir une liste de commandes (ce que je suppose être) et à envoyer chaque commande à une tortue différente - une usine, un entrepôt et un client . De plus, votre liste de commandes est beaucoup plus longue que votre nombre de tortues.

Note mineure - vous ne devez jamais dire ask turtles with [breed = factories], vous pouvez juste dire ask factories

+0

Merci d'avoir corrigé le premier problème. Mais maintenant, comme vous vous y attendiez, le problème se produit avec while loop. En action "envoyer-produits" Je veux envoyer les produits de l'usine à l'entrepôt, pas à toutes les tortues. Je pensais qu'avec "tandis que" Netlogo va, étape par étape, déduire chaque nombre de "commandes" du stock d'usine, et va créer une nouvelle liste de stock_f. Si je l'ai fait mal - Quelle est la bonne façon de faire cela? Et ai-je défini la variable "i" ok? – Emilly

+0

Tout cela est associé aux problèmes plus généraux. Que représente réellement votre liste? Est-ce l'ordre à l'heure 1 puis l'ordre à l'heure 2 etc? Si oui, alors vous devez parcourir le temps en utilisant 'tick' et vous n'avez jamais besoin de' while ', vous prenez simplement l'élément qui correspond à la coche. – JenB

+0

Oui, le premier nombre de la liste représente l'ordre à l'instant 1, le deuxième nombre de la liste représente l'ordre à l'instant 2, et ainsi de suite. Pouvez-vous s'il vous plaît m'aider à écrire le code, qui prendra le premier numéro sur la liste "commande" et le déduire du stock d'usine, puis sur la deuxième étape prendra le deuxième numéro sur la liste "commande" et le déduire de nouveau valeur du stock d'usine, et ainsi de suite jusqu'au dernier numéro sur la liste de commande. – Emilly