【问题标题】:getting "ASK expected input to be an agent or agentset but got the list [green-players" error in netlogo得到“询问预期输入是代理或代理集,但在 netlogo 中得到列表 [green-players”错误
【发布时间】:2022-01-10 12:35:09
【问题描述】:

这是我操作的 2 人游戏的代码

o play-the-game
  if (any-friends-nearby?) [gain-energy]
  if (any-opponents-nearby?) [fight-opponent]
end

to-report any-friends-nearby?
  report (any? (turtles-on neighbors4) with [breed = [breed] of myself])
end

to-report any-opponents-nearby?
  report (any? (turtles-on neighbors4) with [breed != [breed] of myself])
end


to gain-energy
  set similar-nearby count ( turtles-on neighbors4 )
 with
  [color = [color] of myself]
  set total-nearby count (turtles-on neighbors)
  ;
  ;
  if (similar-nearby >= total-nearby - similar-nearby)
  [set energy energy + 5]
end

to fight-opponent
  let my-breed [breed] of green-players
  let my-color [color] of green-players
  let opponent-breed [breed] of red-players
  ;
  ;;
  ask my-breed
  [check-random-winner]

end

to check-random-winner
  let pick random-float 2
  let winner nobody
  ask turtles
  [if winner = nobody
    [ ifelse size > pick
      [set winner self ]
      [set pick pick - size] ] ]
end

to change-opponent
  ask red-players
  [ set breed green-players
      set color green ]
end

对不起,如果它有点长,但是当我设置然后按 go "ASK 预期输入是代理或代理集但得到列表 [green-players...]"

我该如何解决这个问题? 此外,我对 Netlogo 和 StackOverflow 还很陌生,如果我没有正确提出我的问题,我深表歉意。

【问题讨论】:

  • 我发布了一个答案,但知道在代码问题中您应该提供minimal reproducible example:阅读您的问题的人应该能够复制您的代码,将其粘贴到他们的软件上,而无需进行更改或添加,并且能够重现您描述的问题。在这种情况下,我必须添加turtles-own 变量、setup 过程和go 过程才能使其工作。在任何情况下,这并不意味着您应该发布整个代码:您需要的目标是缩小代码版本,使其重现问题所需的最小尺寸。

标签: netlogo agent


【解决方案1】:

错误消息告诉您,当涉及到ask my-breed 时,您正在将一个列表(更具体地说,一个品种列表)传递给ask

这是因为my-breed局部变量是由

let my-breed [breed] of green-players

让我们看看我们有什么:

  1. breedis a turtles-own variable:它保存着海龟的品种,并且作为代理变量可以用作of 构造中的报告(见下文)。

  2. of is a reporter:它的左侧有一个报告者(通常是代理变量)(在您的情况下:breed),在其右侧有一个代理或代理集(在您的情况下:@987654333 @)。 of 报告的内容(即它输出的内容)是...

    • ...如果右侧有代理,则为单个值。
    • ...如果右侧有代理集,则为值列表*。

    *想一想:如果我问你眼睛的颜色(你是一个人,也就是一个代理),你会告诉我一个颜色。但是如果我问你朋友眼睛的颜色(你的朋友是一群人,即一个代理集),你回答我问题的唯一方法就是告诉我一个颜色列表。

  3. green-playersis an agentset:所有品种为green-players的代理(注意对于NetLogo,green-players是一个代理集,即使它包含1个或0个代理)。

由此,我们可以看到,在这种情况下,of 报告了品种列表,因为它报告了属于green-players 的每个代理的品种,因此它将报告[green-players green-players green-players green-players ... ] 的列表,即只要模型中green-players的数量。您可以通过单击setup 然后在命令中心运行[breed] of green-players 来验证这一点。

这是一个品种列表(也可以看作是代理集列表),它不是代理或代理集(它们是ask 唯一可能的目标)。

((请注意let my-color [color] of green-playerslet opponent-breed [breed] of red-players会发生完全相同的事情))

那么,如何基于变量构建代理集?最常见的方法是使用with (read here why)。

但是如何修复您的代码?我不知道,因为我不明白你想要达到什么目的。

我不确定您希望如何在您发布的代码中使用它,因为我什至不确定您是否需要在fight-opponent 中使用ask(更不用说ask 代理集)。 您的fight-opponent 程序是这样的,除了我们刚刚讨论的问题之外,“我的”事物(即my-breedmy-color)总是指绿色玩家,而opponent-breed 总是指红色玩家 -即使fight-opponent 是由红色玩家经营的!而且,还不清楚你想用check-random-winner 程序实现什么,以及你是否希望这个程序由整个品种运行。这些事情让您很难理解如何修复fight-opponent 过程。

例如:你想让谁运行check-random-winner 命令?

将两件事结合起来将是有益的:一次一步地开发您的模型,并确保每一段新的小代码都能完全按照您的预期进行;此外,当您询问如何修复某些问题时,说明您希望代码执行的操作很有用。通过做这两件事我相信回答你的问题会容易很多

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多