Rafaela
Rafaela

Reputation: 449

How to extract the path taken by each turtle in the world and save it in a .csv file?

I'm still trying to extract the coordinates of the path taken by every turtle in the world. For example, I would like to know the path taken by turtle 0 was patch 00 patch 0 5 patch 0 2 and patch 1 4 and save this information in a .csv file. In this way, I would like to extract the coordinates of the path taken by all the turtles in the world. I'm thinking about creating a list that gives me this information and then saving it.

The problem is that I cannot create an empty list for each turtle created and then, before every move, add the current patch location to the lists. And finally, generate the file of this information in .csv

That is, when inspecting the turtle I don't see the list and when creating the file in .csv it is not generated. Can anyone help me with the code?

Thanks in advance

turtles-own [ mypathx mypathy mytimer]



to setup
      ca
      reset-ticks
      crt 5
      ask turtles [
        setxy random-xcor random-ycor
    let i [ ]
        pen-down
      ]                 
    end


    to go
      move
      let n count turtles
      if n = 0 and output? = true [output] ;; ouput? is an switch on interface
      if n = 0 [ stop ]
      tick
    end

    to move
      ask turtles [
        rt random 360
        fd 1
        if ticks >= 10
      [         
        die
    ]
    ]
    end



To output
       file-open "test.txt"

   ask turtles [
    set mypathx lput pxcor mypathx
     set mypathy lput pycor mypathy
              let  maxer length mypathx
              let i 0   
              repeat maxer
                    [
                         file-print (word  item i mypathx    " " item i mypathy " " item i mytimer)
                       let  x ( i + 1 )  
                     ]
      ]
  file-close
end

Upvotes: 2

Views: 308

Answers (1)

Matteo
Matteo

Reputation: 2926

There are a number of things to note here, so I hope I understood what you inteded to do.

  1. First of all, note that your code goes to output only after all the turtles died (that is infact one of the conditions to go to output: if n = 0). Therefore, it is normal that there is no data to be exported: in output you ask turtles, but when output is executed all turtles already left the simulation.

  2. However, there is also something that Filip rightly noticed in the comment to the question: it seems logical to ask turtles to save the coordinates of their journey as they move - as opposed to asking them to do so at the end of the simulation. Based on the current code, turtles simply move in the simulation, and only at the end (e.g. when output is called) they are are asked to save their current location. It would be ideal to include a piece of code where you ask turtles, after each move, to record their location in the list. To combine this point and the previous one, I would do something like:

to setup
  clear-all
  reset-ticks
  create-turtles 5 [
    ; I talk about this piece in point 3.
  ]
end

to go
  move
  tick
end

to move
  ask turtles [
    right random 360
    forward 1
    register-coordinates
  ]
end

to register-coordinates
  set mypathx lput pxcor mypathx
  set mypathy lput pycor mypathy
  set mytimer lput ticks mytimer      ; This is what I assumed you want mytimer to do.
end
  1. And here comes the other problem. You are not initiating the turtles-own variables as lists. If you run your piece of code now, nothing happens because all turtles are dead by the time you ask them to output. But if you just remove the die command, or if you ask turtles to output before they die, you would get an error - saying that lput expected a list but got something else instead. From the NetLogo Dictionary you can see that the list primitive is used to create a list with two values. If you want to create a list containing any other amount of values, you have to use (list ...). This includes the case in which you want to create an empty list. To do that, I would therefore do:
create-turtles 5 [
  setxy random-xcor random-ycor
  set mypathx (list)
  set mypathy (list)
  set mytimer (list)
  pen-down
]

Now, mypathx, mypathy and mytimer are legal inputs to the lput procedure.

  1. Finally, you can include the output at the end of your simulation (note how I changed go compared to the previous code example):
to go
  if ticks = 11 [
    ask turtles [output]
    stop
  ]
  move
  tick
end

...

to output
  file-open "test.csv"
  file-print (word who "," mypathx "," mypathy "," mytimer)
  file-close
end

So, overall, improtant adjustments are: initiate variables as lists if you want to treat them as such; ask your turtles to save their coordinates at every step in their turtles-own list variables; only at the end, ask them to write their list variables in the output file; do not kill your turtles before you ask them to output information. Integrating all of the above, the code would look like:

turtles-own [mypathx mypathy mytimer]

to setup
  clear-all
  reset-ticks
  create-turtles 5 [
   setxy random-xcor random-ycor
   set mypathx (list)
   set mypathy (list)
   set mytimer (list)
   pen-down 
  ]
end


to go
  if ticks = 11 [
    ask turtles [output]
    stop
  ]
  move
  tick
end


to move
  ask turtles [
   right random 360
   forward 1
   register-coordinates
  ]
end


to register-coordinates
  set mypathx lput pxcor mypathx
  set mypathy lput pycor mypathy
  set mytimer lput ticks mytimer
end


to output
  file-open "test.csv"
  file-print (word who "," mypathx "," mypathy "," mytimer)
  file-close
end

Final notes on the code above:

  1. I am not sure which exact format you want your output to be, but this example code works fine in saving the lists in the .csv file - so you can take it from there and play around to make it fit your needs.
  2. I removed the pcolor part because it seemed unnecessary for the purpose of the question.
  3. I am not sure what you wanted i to do in setup, but it seemed unnecessary for the purpose of the question so I removed that too from my exemplar code. Be careful at how you use item: I don't know what you wanted to do, but the way you included it in your question was often giving runtime errors.
  4. I created a .csv as per the title of the question, instead of a .txt as per the code you provided.

Upvotes: 5

Related Questions