Dans le monde, les deux types d'agents, les individus et les messages, sont placés aléatoirement dans l'espace attitudinal bidimensionnel.

Si un individu croit les messages, il ou elle crée des liens avec les messages.

Ensuite, un individu ajuste sa position attitudinale en fonction du calcul des distances de soi aux messages.

Ici, j'ai un problème.

Je voudrais faire bouger un individu deux fois plus lorsqu'il est exposé à un message avec une valeur élevée que lorsqu'il est exposé à un message avec une valeur faible.

Mais ce que je peux faire maintenant, c'est simplement calculer la moyenne de la distance entre les messages.

Voici ce que j'ai fait jusqu'à présent

breed [individuals individual]
breed [messages message]
messages-own [value]
undirected-link-breed [messagelinks messagelink]

to setup
  ca
  create-individuals 100 [initiate-individuals]
  reset-ticks
end


to go
  new-messages
end


to initiate-messages
  ifelse random-float 1 < value-p [ set value "H" ] [set value "L"]
end

to initiate-individuals
  setxy random-xcor random-ycor
end

to new-messages
  create-messages 30 [
  initiate-messages
  ask individuals [
    integrate-messages myself
]
]
end

to integrate-messages [newmessages]
  if random-float 1 < 0.3
    [create-messagelink-with newmessages
    setxy mean [xcor] of messagelink-neighbors mean [ycor] of messagelink-neighbors]
end
0
nicetomeetu 18 févr. 2021 à 15:15

1 réponse

Meilleure réponse

Je suppose que integrate-messages est destiné à gérer un ensemble de messages, même si lorsqu'un récepteur l'exécute dans votre code, ce n'est que le message nouvellement créé lui-même, pas tous les messages nouvellement créés. Il y a probablement plusieurs façons de gérer le problème de donner aux messages "H" plus d'influence que les messages "L", mais la plus simple est peut-être d'utiliser simplement une moyenne pondérée des xcors et ycors des messages. J'ai écrit un court modèle qui fait cela dans integrate-messages.

breed [messages message]
breed [receivers receiver]
undirected-link-breed [messagelinks messagelink]

messages-own [value]

to setup
  clear-all
  create-receivers 1 [
    setxy random-xcor random-ycor
    set color green
  ]
  create-messages 5 [
    setxy random-xcor random-ycor
    set value ifelse-value (random-float 1 < 0.5) ["H"] ["L"]
    set color blue
    set label value
  ]
  reset-ticks
end

to go
  ask one-of receivers [
    integrate-messages n-of 3 messages
  ]
end

to integrate-messages [newmessages]
  ;to indicate which messages are being received.
  ask newmessages [set color red ]
  create-messagelinks-with newmessages [set color red]

  ;now calculate the weighted position relative to ALL linked messages.
  let mssgs [other-end] of my-messagelinks
  let wghts map [x -> ifelse-value ([value] of x = "H") [2] [1]] mssgs
  let xc sum (map [[m w] -> w * [xcor] of m ] mssgs wghts)
  let yc sum (map [[m w] -> w * [ycor] of m ] mssgs wghts)
  set xcor xc / sum wghts
  set ycor yc / sum wghts

  ;to show where the receiver ends up.
  set color red
end
1
Charles 19 févr. 2021 à 21:53