我是NetLogo的新手。我不是基于代理的建模新手。偶尔我会看到有人说NetLogo非常有趣和轻松,我试试看。
我被困在第1方,无法找出代理之间的消息传递代码,为代理子集调度操作,以及其他基本的ABM事情。
我正在研究多数规则选举模型,其中海龟是随机放置的x,y坐标的选民。候选人(新品种)在x,y平面上作出承诺,获胜候选人是更接近(更接近)更多代理商的候选人。
补丁根本不起作用,除了空间图似乎需要使用网格
我在更新候选职位方面遇到了麻烦。我构思如下:从候选代理集中删除“胜利者”代理,告诉其他候选人进行调整,然后将胜利者放回代理人列表中,看看下次有谁获胜。
我认为以下几乎是可重复的最小例子。请看adjustOfferings。 (对不起,我留下了许多节目陈述,否则无法分辨出发生了什么。)
; 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
设置工作正常,我看到代理商和候选人。当我点击“步骤按钮”时,我可以看到选举有效,选中了胜利者,但所有候选人都会调整(不仅仅是失败者)。这是控制台:
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文件,你实际上无法运行它。这里提供完全可运行的示例的定制是什么?我可以将您指向网站上的文件吗? http://pj.freefaculty.org/scraps/majority.nlogo。如果你愿意,我可以把它放在GitHub或其他地方。
感谢您的建议。
答案 0 :(得分:2)
问题确实出在你建议的那一行。两个代理都报告条件[self != winner]
为真,但为什么会这样。看看如何创建winner
变量并将其传递给函数。您可以使用modes
原语创建它,这是一个好主意。但是modes
会报告一个包含一个元素的列表。问题是您将此列表直接传递给adjustofferings
函数。这意味着,代理比而不是[self != [(candidatexy)]]
而不是[self != (candidatexy)]
(请注意第一个示例中的附加括号,表示列表)。
要解决此问题,您必须使用first
原语从列表中提取获胜者代理,该原语会报告列表的第一项。您只需将此添加到定义winner
变量的行:let winner first modes theVotes