Search code examples
netlogo

Netlogo - Iterating through patch list and writing each output to a row in a list


I have a list of cells destination_cells, and am trying to loop through each cell and count the number of turtles and the average weight of the turtles in each. For each cell, I want to write the cell's ID (which I am assuming is just destination_cells as coordinates) and the two variables to a list cell_list. I think my confusion stems from not understanding how to use anonymous reporters in foreach. If I replace 'next cell' with destination_cells in the foreach block, I get, for example, the same total_turtle_in_destination_cells value for every single cell in destination_cells. The same occurs with using next_cells in the block. Where am I making a mistake?

set destination_cells [self] of patches with [ any? turtles-here]

foreach destination_cells [next_cell -> ask next_cell 
[
  ; Counts number of turtles in each cell
  set total_turtle_in_destination count turtles-on destination_cells 
  
  ; Finds average weight of turtles in each cell
  set avg_weight_turtle_in_destination mean [mass] of turtles-on destination_cells
]

    set cell_list lput (csv:to-row (list
    destination_cells
    total_turtle_in_destination
    avg_weight_turtle_in_destination
    )) cell_events_list

]

Solution

  • Here is an alternative that:

    Makes a reporter to get the info desired (the patch info as patch x and y, the total turtles on a patch, the mean weight of present turtles) from whatever patch that calls the reporter

    Updates the info list directly by querying the destination_cells

    turtles-own [ weight ]
    globals [ destination_cells cell_info_list]
    
    to setup
      ca
      resize-world 0 5 0 5
      set-patch-size 30
      reset-ticks
      
      crt 20 [
        set weight random 10 + 1
        move-to one-of patches
      ]
    end
    
    to-report report-self-info
      let n_turtles_here count turtles-here
      let mean_weight mean [weight] of turtles-here
      report (list self n_turtles_here mean_weight)
    end
    
    to create-info-list 
      set destination_cells patches with [ any? turtles-here]
      set cell_info_list [report-self-info] of destination_cells
      print cell_info_list
    end
    

    In response to your question "how can the patch call the reporter? I tried ask destination_cell [report-self-info], but a command is expected":

    When you make a to-report procedure with the structure like the above that uses self, it's somewhat like a turtles-own or patches-own variable. In this case, you can call it just as you would have a turtle variable like color or xcor or a patch variable like pcolor or pxcor- if you run something like:

    ask one-of patches [ print report-self-info ]
    

    You should get something like

    [(patch 5 2) 2 7.5]
    

    This is why the set cell_info_list [report-self-info] of destination_cells above works- because you could do something like set cell_info_list [pcolor] of destination_cells in a similar way.