首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让海龟根据NetLogo中包含一个正态分布随机变量的计算来评估一种状态。

问让海龟根据NetLogo中包含一个正态分布随机变量的计算来评估一种状态。
EN

Stack Overflow用户
提问于 2021-07-10 08:08:20
回答 1查看 137关注 0票数 0

我是NetLogo的新手。我的问题很简单。我有一个变量,我们称之为c,我需要在海龟的条件下使用它。我希望这个变量c在一个值范围内随机地按照正态分布(在我的例子中是从0到+1 ),我希望能够通过我的接口中的两个单独的滑块来设置平均值和标准偏差。因此,实际上:通过滑块,我决定平均和s.d。netlogo根据这些特性计算随机值,然后将这些值用于数学条件,海龟评估条件,只有满足条件的海龟才会执行命令(在我的例子中,它们只是向前移动并改变颜色)。我已经设置了条件,感谢在我上一个问题中帮助我的人,现在我需要在条件中插入这个随机变量c。我在考虑使用随机-正常,但显然它只报告值,我不能使用他们在我的条件。希望一切都很清楚。

EN

回答 1

Stack Overflow用户

发布于 2021-07-10 09:25:47

更新后的评论

我在答案的第一个版本中提供的示例(见下文)实际上是您需要做的基础(您必须适应您的情况),以便让您的海龟使用正态分布计算值,并使用结果作为移动的条件。

首先,有两点是重要的:

  1. 你说“我不需要报告或打印任何东西”。请注意,当我在下面的示例中使用print时,NetLogo中的记者并不会将值输出到某个接口,这是一件完全不同的事情:只提供一个极小但完全工作的示例,该示例将积极显示计算出来的值如何在if-语句中正确使用(“我需要在数学条件下使用这些值”。事实上,您可以看到两个句子正在连续打印在指挥中心,这只是一个检查,显示一切顺利)。例如,报告者是计算值的指令,然后由代理“报告”给任何请求它的人。、random和ticks都是记者,因为它们为您(或海龟或其他人)提供了可用于您的目的的价值。虽然random和ticks是原始的记者,但您可以使用to-report创建自己的记者(正如forward是一个原始命令一样,您也可以使用to创建自己的命令)。
  2. 当您需要从发行版中提取数字时,NetLogo会执行而不是创建这样的发行版,该分发版存储在某个地方,每次需要时都从该发行版中抽取一个值。相反,每次根据某个分布需要随机值时,都必须使用随机记者之一生成值。

在您的情况下,您将把分布的均值和标准差作为全局变量(您将使用滑块来设置这些变量,但出于实际目的,我在这里以代码方式设置它们,因为在这里没有滑块)。此外,我知道你的海龟将有一些海龟自己的变量,他们将在计算中使用。

很好,您所需要做的就是使用to-report并在其中写入所需的计算(这将包括根据滑块使用random-normal生成的随机值,以及作为输入传递的海龟自己的变量),以获得the-value。您用to-report创建的过程必须使用report,才能使代理程序(to-report)实际使用该值。

然后,如果让海龟运行这个过程,它们将能够在一个条件下使用它们自己计算出来的the-value (每个海龟将自己执行to-report the-value,这意味着每个海龟将绘制一个单独的随机分布的值,并在执行计算时使用自己的my-variable值)。

如下所示

代码语言:javascript
复制
globals [
 mn             ; In the actual project, use a slider to set this.
 std            ; In the actual project, use a slider to set this.
]

turtles-own [
 my-variable    ; This represents the turtles-own variable that you want to use in the calculation.
]

to setup
  clear-all
  
  set mn 0.5
  set std 0.2
  
  create-turtles 10 [
    setxy random-xcor random-ycor
    set my-variable (random 100)
  ]
end

to go
  ask turtles [
    if  (the-value > 600) [ forward 10 ]
  ]
end

to-report the-value
  report (random-normal mn std + ln my-variable + my-variable + random-float 1000)
end

注意:我随意地在if-语句中放了600,因为在当前的例子中,它是一个值,有时允许满足条件,而另一些时候则不满足--这意味着您可以直观地检查有时海龟移动,而其他时候它们不移动。

答案的第一个版本

实际上,使用random-normal是正确的。正如您所说的,random-normal只报告一个值;所以您可以在您的条件下使用该值。

以下是两个如何做到这一点的例子。这两个例子在实践中是等价的(正如我从这里中了解到的那样),所以您应该采用您喜欢的风格。

代码语言:javascript
复制
globals [
  mn
  std
]

to setup
  set mn 0.5
  set std 0.2
end

to test
  ifelse (random-normal mn std < 0.5)
    [print "it's less than 0.5"]
    [print "it's at least 0.5"]
end

或

代码语言:javascript
复制
globals [
  mn
  std
]

to setup
  set mn 0.5
  set std 0.2
end

to test
  ifelse (the-value < 0.5)
    [print "it's less than 0.5"]
    [print "it's at least 0.5"]
end

to-report the-value
  report random-normal mn std
end

在任何情况下,只需将(random-normal mean standard-deviation)看作存储数字的任何其他变量即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68325935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档