Nell
Nell

Reputation: 559

Running a model several times with BehaviorSpace

From BehaviorSpace, I would like to run a model 100 times by varying two variables as follows:

["x-area" 1 ] and ["y-area" [1 1 100]]. 

A model is built as follows:

By using the two variables, I would like that my 100 models run as follows:

;;; 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

To do this, I built 100 experiments and this method worked. Is there a faster way to run automatically 100 models without doing 100 experiments ? I tried to build 1 experiment like this

enter image description here

But I have this error message:

OF expected input to be a turtle agentset or patch agentset or turtle or patch but got NOBODY instead.

 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)

The problem is that my models continue to run with this error. So it is difficult to see where is the problem. Given the following message:

"at org.nlogo.prim._asm_proceduremovewithinpolygon_ifelse_86.perform(:4)" in the error message, 

maybe that the problem is in the procedure "move-within-polygon".

Here is my procedure "move-within-polygon" for a given color of polygons:

 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 ] ] ] ] ]

Thanks for your help.

Upvotes: 2

Views: 813

Answers (2)

Mars
Mars

Reputation: 8854

If a turtle ends up on the edge of the world, then patch-right-and-ahead angle-in-green 1 might point outside the world (depending on what angle-in-green is), so [pxcor] of in [pxcor] of (patch-right-and-ahead angle-in-green 1) = max-pxcor would ask for the coordinate of nobody. The same thing could happen for pycor later in the same line.

Question: Can a turtle ever get to the edge of the world in your model? It looks to me like the code that you displayed could lead to that result.

If so, then one way to prevent the error would be to replace

[pxcor] of (patch-right-and-ahead angle-in-green 1) = max-pxcor 

with

xcor = max-pxcor

That's true when a turtle reaches the last column of patches. If you also want turtles to die when they're close to the edge, you could use both of these expressions in the if-else:

(xcor = max-pxcor) or ([pxcor] of (patch-right-and-ahead angle-in-green 1) = max-pxcor)

(I added parentheses simply for clarity.)

However, I wonder whether this would serve the same purpose:

xcor = max-pxcor or xcor = max-pxcor - 1

If any of these methods are right for your application, then you can obviously do the same thing for the y coordinates.

Upvotes: 4

Seth Tisue
Seth Tisue

Reputation: 30453

Your experiment setup appears correct to me, except that you should remove the "Stop condition" of TRUE, because if the stop condition is always true, your runs will never run the go commands even once.

The error you're getting is coming from code that you haven't shown us, so I can't help you there. You'll need to show us the code in which the error is occurring.

Also, at the time the error occurs, what are the values of x-area and y-area? And does the same error occur if you set x-area and y-area to the same values outside BehaviorSpace? If so, then the error doesn't really have anything to do with BehaviorSpace.

Finally, a note on terminology: there is only one model here, not 100, and only one experiment here, not 100. You're attempting to run one experiment on your model, and that experiment consists of 100 model runs. Using the standard terminology will help you communicate your issue clearly.

Upvotes: 3

Related Questions