Rafaela
Rafaela

Reputation: 449

How to loop in NetLogo?

I have the following problem. I need to loop through the code. However, it doesn't work.

Contextualizing the problem: I have 3 files (in .asc) that represent data referring to 3 ages of the turtles (age 2, age 4 and age 8). I would like if the user puts the value 1 in num-user, it would only do the simulation with only one file (L_2) that would represent [ "2" ] ; if the user puts the value 2 in num-user, he would do the simulation with the files (L_2 and L_4) that would represent [ "2" "4" ] and finally, if the user puts the value 3 in num-use, it would simulate the files (L_2 , L_4 and L_8) that would represent [ "2" "4" "8" ]. The problem is that the loop is not working and gives various errors. Like: Extension exception: ascii file ./L_8.asc not found or Can't find element 3 of the list [2 4 8], which is only of length 3 or go runs more than 3 simulations.

I was unable to attach the .ascii files here in the question. But if anyone can look at the code and identify the error I would be very grateful. I can't use BehaviouSpace to solve the situation, I need this loop in the code.

Thanks in advance!

extensions [ gis ]

globals [ num turtle-ages num-ages files random-seeds  num-user repetitions ]

to setup
  ca
  
  set random-seeds 1
  random-seed random-seeds
  set num 0
  set turtle-ages [ "2" "4" "8" ]
  set num-ages item num turtle-ages
  setup-asc
  setup-turtles
  reset-ticks
end

to setup-2
  clear
  random-seed random-seeds
  set num-ages item num turtle-ages
  setup-asc
  setup-turtles
  reset-ticks
end

to setup-turtles
ask n-of 5 patches [ sprout 1 ]
end

to clear
  set files 0
  clear-ticks
  clear-turtles
end

to setup-asc
  let number1 num-ages
  set files gis:load-dataset ( word "./L_" number1 ".asc" ) ;; this loads a one raster file. There are 3 files in the folder with the names: (L_2.asc ; L_4.asc and L_8.asc
end

to go
  move
  tick
  let n count turtles
  if n = 0 or ticks = 10
  [
    set random-seeds random-seeds + 1
    set repetitions 1
    if random-seeds = repetitions + 1
    [
      set random-seeds 1

      set num num + 1
      
      ;; if the user puts the value 1 in num-user, it would only do the simulation with only one file (L_2) that would represent [ "2" ] 
      ;;; if the user puts the value 2 in num-user, he would do the simulation with the files (L_2 and L_4) that would represent [ "2" "4" ] 
      ;;;; and finally, if the user puts the value 3 in num-use, it would simulate the files (L_2 , L_4 and L_8) that would represent [ "2" "4" "8" ]
      set num-user 1 ;;
      if num = num-user [ stop ]
    ]
    setup-2
  ]
end

to move
  ask turtles [ 
    right random 360
    fd 1
    if ticks = 5 [ die ]
  ]
end

Upvotes: 0

Views: 1926

Answers (1)

Luke C
Luke C

Reputation: 10291

Whenever possible, I'd suggest paring down your code to a MRE to a) make sure that users here can run your code (without your files, for example, this is not really viable) and b) to see if reframing your question / goals in simpler terms would help get things working- at least that's what works for me!

I think that you might find foreach useful here as a way to loop through your desired simulations instead of manually tracking the number of iterations. For this example, assuming num-user is a numeric input widget on the interface, the setup below will determine which of the ages to process:

globals [ ages-to-run ]
  
to base-setup
  ca
  ; Determine how many simulations to run, based on user input into
  ; 'num-user' numerical input widget on the interface
  ifelse num-user < 1 or num-user > 3 [
    print "Incorrect number of simulations indicated"
  ] [
    let possible-sims [ "2" "4" "8" ]
    set ages-to-run sublist possible-sims 0 num-user
  ]  
  reset-ticks
end

After running the above, the ages-to-run variable will contain ["2"], ["2" "4"], or ["2" "4" "8"]. Next, you can iterate over those desired ages to run your simulations (a little more detail in comments):

to run-simulations 
  if ages-to-run = 0 [
    print "Simulation setup not complete"
  ]
  
  foreach ages-to-run [
    ; This is the loop proper where each "age" is iterated.
    ; All of your simulation calls (manual variable resetting,
    ; etc) should all go within this loop.
    current-age ->
    print word "Running simulations for age: " current-age
    let file-to-load ( word "./L_" current-age ".asc" )
    print file-to-load
    clear-turtles
    ask n-of 5 patches [ 
      sprout 1 [ 
        pd 
        set color runresult current-age + 55
      ] 
    ]
    repeat 20 [
      ask turtles [
        rt random 60 - 30
        fd 1
      ]
      tick
    ]
    print ( word "Simulations complete for age: " current-age "\n" )  
  ]
end

Running that code above with 3 entered into num-user will run a simulation for each age (different colors indicate different runs):

enter image description here

So to run simulations proper, all your per-age code should go within that foreach loop indicated above- and be careful, as you were in your question, to not reset global variables.

Upvotes: 3

Related Questions