netlogo:向除一个代理

时间:2016-08-02 04:27:00

标签: netlogo

我是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或其他地方。

感谢您的建议。

1 个答案:

答案 0 :(得分:2)

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

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