首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BehaviorSpace运行几次模型

使用BehaviorSpace运行几次模型
EN

Stack Overflow用户
提问于 2014-10-13 01:45:56
回答 2查看 628关注 0票数 2

在BehaviorSpace中,我希望通过更改两个变量来运行一个模型100次,如下所示:

代码语言:javascript
复制
["x-area" 1 ] and ["y-area" [1 1 100]]. 

建立了如下模型:

  • 创造景观
  • 加龟
  • 围棋模拟

通过使用这两个变量,我希望我的100个模型运行如下:

代码语言:javascript
复制
;;; Model 1 ;;
"x-area" = 1
"y-area" = 1
clear-all
create landscape
add-turtles
go-simulation

;;; Model 2 ;;
"x-area" = 1
"y-area" = 2
add-turtles
go-simulation

;;; Model 3 ;;
"x-area" = 1
"y-area" = 3
add-turtles
go-simulation

 ....

;;; Model 100 ;;
"x-area" = 1
"y-area" = 100
add-turtles
go-simulation

为了做到这一点,我做了100个实验,这个方法奏效了。有没有一种更快的方法来自动运行100种型号而不做100种实验?我试着做了一个这样的实验

但我有一条错误信息:

预期输入为海龟代理集或补丁代理集,或海龟或补丁,但没有得到任何人。

代码语言:javascript
复制
 org.nlogo.nvm.ArgumentTypeException: OF expected input to be a turtle agentset or patch agentset  or turtle or patch but got NOBODY instead.
 at org.nlogo.prim._asm_proceduremovewithinpolygon_ifelse_86.perform(:4)
 at org.nlogo.nvm.Context.runExclusive(Context.java:119)
 at org.nlogo.nvm.ExclusiveJob.run(ExclusiveJob.java:57)
at org.nlogo.nvm.Context.runExclusiveJob(Context.java:162)
at org.nlogo.prim._asm_procedurestartsimulation_ask_69.perform(:1)
at org.nlogo.nvm.Context.stepConcurrent(Context.java:91)
at org.nlogo.nvm.ConcurrentJob.step(ConcurrentJob.java:82)
at org.nlogo.job.JobThread.org$nlogo$job$JobThread$$runPrimaryJobs(JobThread.scala:143)
at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:78)
at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76)
at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76)
at scala.util.control.Exception$Catch.apply(Exception.scala:88)
at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
at org.nlogo.job.JobThread.run(JobThread.scala:75)

问题是,我的模型继续运行这个错误。因此,很难看出问题在哪里。鉴于以下信息:

代码语言:javascript
复制
"at org.nlogo.prim._asm_proceduremovewithinpolygon_ifelse_86.perform(:4)" in the error message, 

也许问题就在“多边形内移动”的过程中。

下面是我对给定颜色的多边形的“移动内多边形”的步骤:

代码语言:javascript
复制
 if [pcolor] of patch-here = green [

  set list-angles-in-green item 0 table-angles

loop [

  let angle-in-green one-of list-angles-in-green 

  ifelse [pxcor] of (patch-right-and-ahead angle-in-green 1) = max-pxcor or [pycor] of (patch-right-and-ahead angle-in-green 1) = max-pycor [
      print "die"
      die
      stop ]

  [ ifelse (patch-right-and-ahead angle-in-green 1) != nobody and [pcolor] of (patch-right-and-ahead angle-in-green 1) = green [
    print "move"
    move-to patch-right-and-ahead angle-in-green 1

  [ if not any? neighbors with [pcolor = green] [
      print "no neighbors"
      move-to patch-here
      stop ] ] ] ] ]

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-18 17:13:38

如果海龟最终到达了世界的边缘,那么patch-right-and-ahead angle-in-green 1可能会指向世界以外的地方(取决于angle-in-green是什么),因此[pxcor] of (patch-right-and-ahead angle-in-green 1) = max-pxcor中的[pxcor] of会请求nobody的坐标。同样的事情也可能发生在pycor后面的同一行中。

问:海龟能在你的模型中到达世界的边缘吗?在我看来,你显示的代码可能会导致这个结果。

如果是这样的话,那么防止错误的一个方法就是替换

代码语言:javascript
复制
[pxcor] of (patch-right-and-ahead angle-in-green 1) = max-pxcor 

使用

代码语言:javascript
复制
xcor = max-pxcor

当一只海龟到达最后一列补丁时,情况就是如此。如果您也希望海龟在接近边缘时死亡,您可以在if-else中使用这两个表达式

代码语言:javascript
复制
(xcor = max-pxcor) or ([pxcor] of (patch-right-and-ahead angle-in-green 1) = max-pxcor)

(为了清楚起见,我添加了括号。)

不过,我不知道这会否达到同样的目的:

代码语言:javascript
复制
xcor = max-pxcor or xcor = max-pxcor - 1

如果这些方法中的任何一个适合您的应用程序,那么您显然可以对y坐标执行相同的操作。

票数 4
EN

Stack Overflow用户

发布于 2014-10-13 11:48:04

在我看来,您的实验设置是正确的,只是您应该删除TRUE的“停止条件”,因为如果停止条件始终为真,则即使运行一次也不会运行go命令。

您所得到的错误来自您尚未向我们展示的代码,因此我无法帮助您。您需要向我们展示错误发生的代码。

而且,当错误发生时,x-areay-area的值是多少?如果将x-areay-area设置为BehaviorSpace之外的相同值,是否会发生相同的错误?如果是这样的话,那么这个错误实际上与BehaviorSpace没有任何关系。

最后,关于术语的说明:这里只有一个模型,没有100个,这里只有一个实验,没有100个。你试图在你的模型上运行一个实验,这个实验包括100次模型运行。使用标准术语将有助于您清楚地沟通您的问题。

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

https://stackoverflow.com/questions/26331857

复制
相关文章

相似问题

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