2017-10-12 6 views
0

Existe-t-il un équivalent de la commande one-of pour tous les agents? Donc, une commande all-of? J'ai besoin que mes agents demandent à d'autres agents de faire la somme et de rapporter une valeur. La commande one-of sélectionne aléatoirement un autre agent, mais je dois sélectionner tous les agents dans une liste.Netlogo: Y at-il une commande `all-of`, similaire à` one-of`?

Détails: J'ai besoin household agents pour demander à d'autres agents household de résumer et de faire rapport à leur valeur HHwaterUse. Chaque agent household demandera à tous les autres agents sur leur liste SocialNetwork. La liste SocialNetwork est composée d'une valeur Public_ID, qui est une valeur que chaque agent possède.

Ex: Donc, si household-1 posses une liste SocialNetwork qui ressemble à [9126 3495 4197 8771], j'ai besoin tous les agents d'une valeur Public_ID de 9126, 3495, etc faire rapport à leur valeur HHwaterUse.

ask households [ 
    set NetUseSum sum [HHwaterUse] of households with [[Public_ID] of myself = all-of [SocialNetwork] of self] 
    ] 
+3

La réponse de Luc est correct, mais si vous allez représenter un réseau social, vous devriez utiliser [liens] (http://ccl.northwestern.edu/netlogo/docs/programming.html#links) au lieu de listes. Cela rendrait le code beaucoup plus agréable (et souvent plus rapide). Les difficultés que vous rencontrez maintenant avec votre liste de pièces d'identité ne sont que la pointe de l'iceberg; tout devient embarrassant et compliqué une fois que vous commencez à vous fier aux identifiants ou aux numéros de «qui». NetLogo brille lorsque vous vous basez sur des références d'agents directs, des jeux d'agents et des liens. Vous serez récompensé à long terme si vous l'acceptez. –

+2

sont des valeurs Public_ID propres à chaque agent ou sont-elles plus proches d'un indicateur de catégorie. Si elles sont uniques à chaque agent (et pour une raison quelconque, vous ne voulez pas utiliser les liens comme suggéré par Nicolas), alors vous pouvez travailler avec des ensembles d'agents au lieu de listes d'identifiants. – JenB

Répondre

2

La member? primitive devrait fonctionner, consultez la dictionary entry pour plus de détails. Voici un exemple où juste un seul ménage vérifie la somme de son utilisation de l'eau du réseau social:

breed [ households household ] 
households-own [ Public_ID Social_Network HH_Water_Use] 

to setup 
    ca 
    create-households 10 [ 
    setxy random-xcor random-ycor 
    set Public_ID 1000 + random 1000 
    set HH_Water_Use 100 + random 50 
    ] 

    ask households [ 
    set Social_Network sort [Public_ID] of n-of 4 other households 
    ] 
    reset-ticks 
end 

to sum-social-network 

    ask one-of households [ 
    show (word "My social network comprises: " Social_Network) 
    ask households with [ member? Public_ID [Social_Network] of myself ] [ 
     print (word Public_ID " has a water use of " HH_Water_Use) 
    ] 
    let social_sum sum [HH_Water_Use] of households with [ member? Public_ID [Social_Network] of myself ] 
    print (word "My social network has a sum water use of " social_sum) 
    ] 

end 

Edit:

Juste une remarque que je suis d'accord avec Nicolas et Jen ci c'est certainement pas la meilleure approche. Utilisez leurs suggestions de lien ou d'agent à la place si possible.

0

Cela a fonctionné, la suggestion de Luke C d'utiliser l'extrait member? a fait l'affaire. J'ai pu additionner, tout à la fois, la valeur de la liste des agents.

let social_sum sum [HH_Water_Use] of households with [ member? Public_ID [Social_Network] of myself ]