netlogo:向除一个代理以外的所有代理发送消息

netlogo: send message to all but one agent

我是 NetLogo 的新人。我对基于代理的建模并不陌生。我时不时地看到人们说 NetLogo 是如此有趣和简单,以至于我要尝试一下。

我卡在方块 1 上了,无法弄清楚代理之间的消息传递代码、代理子集的调度操作以及其他基本的 ABM 事情。

我正在研究多数规则选举模型,其中海龟是具有随机放置的 x,y 坐标的选民。候选人(新品种)在 x,y 平面上做出承诺,获胜的候选人是(更接近)更多代理人喜欢的人。

补丁根本不起作用,除了空间图似乎需要使用网格

我在更新候选人职位时遇到问题。我的设想是这样的:从候选agentset中去掉一个'winner'的agent,告诉其他candidates去调整,然后把赢的放回agent列表,看下一次谁赢。

我相信以下是接近最小可重现示例。请查看 adjustOfferings。 (sorry, show statements我留了很多,不然分不清是怎么回事。)

; Paul Johnson
; 20160801
breed [candidates candidate]
globals[
  N 
  D
]
; turtles are voters, Euclidean-based preferences. Use
; built-in 2d coordinates for ideal points for now,
; need to learn how to create weighted multi-dimensional
; preferences later
turtles-own
[
    name
]

to setup
  ca   ; clear all
  reset-ticks  ; time start 0

  set N 100
  ; N voters with random x,y ideal points
  create-turtles N
  [
    setxy random-xcor random-ycor
  ]

  set D 2
  create-candidates D
  [
    setxy random-xcor random-ycor
    set shape "square"
    set size 2
  ]
end

; collect up the votes. Don't worry about invading agent
; privacy, just measure for them
to-report election2 [choices]
  let fave [min-one-of choices [distance myself]] of turtles
  report fave
end

; Ask all non winners to adjust their offering
to adjustOfferings [winner]
  show (word "in adjustOfferings, winner was: " winner)
  let losers candidates with [self != winner]
  show (word "adjustOfferings losers are: " losers)
  ask losers
  [
    setxy random-xcor random-ycor
  ]
end

; ask each voter for its favorite, 
; use modes to calculate the winner
to electionCycle
  let theVotes election2 candidates
  show (word "electionCycle: " theVotes)
  let winner modes theVotes
  show (word "electionCycle Winner: " winner)
  adjustOfferings winner
end

to go
  tick
  if ticks > 1000
  [
    stop
  ]
  electionCycle
end

设置工作正常,我看到代理和候选人。当我点击 "Step button" 时,我可以看到选举工作,选择了获胜者,但所有候选人都进行了调整(不仅仅是失败者)。这是控制台:

observer: "electionCycle: [(candidate 100) (candidate 101) 
(candidate 101) (candidate 101) (candidate 100) (candidate 101)
[snip] 
(candidate 100) (candidate 101)]"
observer: "electionCycle Winner: [(candidate 100)]"
observer: "in adjustOfferings, winner was: [(candidate 100)]"
observer: "adjustOfferings losers are: (agentset, 2 turtles)"

在我看来这是错误的来源:

let losers candidates with [self != winner]

此后胜者仍是败者

我现在意识到,如果没有 NetLogo 文件的其余部分,您实际上无法 运行 这一步。您在这里提供完全 运行able 示例的习惯是什么?我可以指点你网站上的文件吗? http://pj.freefaculty.org/scraps/majority.nlogo。如果你愿意,我可以把它放在 GitHub 或其他地方。

感谢您的建议。

确实是您建议的行有问题。两个代理都报告条件 [self != winner] 为真,但为什么会这样。查看如何创建 winner 变量并将其传递给函数。您可以使用 modes 原语创建它,这是个好主意。但是 modes 会向您报告一个包含一个元素的列表。问题是您将此列表直接传递给 adjustofferings 函数。这意味着,代理比较 [self != [(candidatexy)]] 而不是 [self != (candidatexy)](注意第一个示例中的附加括号,表示列表)。

要解决此问题,您必须使用 first 原语从列表中提取获胜者代理,它会向您报告列表的第一项。您只需将其添加到您定义 winner 变量的行:let winner first modes theVotes