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
我是 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