Повторно читать CSV-файл во время запуска модели в Netlogo - PullRequest
0 голосов
/ 22 октября 2018

У меня есть модель в NetLogo, где мои черепахи начинают двигаться только тогда, когда переменная (процедура mean-daily-temp) достигает 18. Значения для этой переменной берутся из файла csv, считанного при настройке (см. Код ниже)).

В нынешнем виде модель запускает то же количество тактов, что и точек данных (365 = # дней в году).Я написал модель для запуска только так долго, указав if file-at-end? [stop], так как я хотел проверить, работают ли процедуры go (и они работают).Теперь я хочу, чтобы модель вернулась к первому значению в файле данных и продолжила его чтение после достижения конца файла.Предыдущие вопросы о StackOverflow или группе Google для NetLogo, несмотря на интенсивное поиск ключевых слов, примитивов или процедур NetLogo, не дали удовлетворительных решений.Возможно, я, возможно, не понял их.

Что я могу заменить [stop], чтобы добиться этого?Или что-то еще нужно изменить?

Я могу увеличить длину файла данных, но я чувствую, что подход, который я хочу использовать, может быть проще или, возможно, более элегантным.

Мой код:

    `extensions
     [array
     csv]

     globals[
     river-patches ;;; water where the fish live
     bank-patches  ;;; patches were the fish cannot go
     initial-temp  ;;; temperature set at tick 0
     temp-list     ;;; variable containing temperature from .csv file
     mintemp       ;;; minimum temperature possible on any river-patch
     maxtemp]      ;;; maximum temperature possible on any river-patch

    patches-own
    [mean-daily-temp] ;;; variable for patch temperature

  to setup
     clear-all
     file-close-all               ;;; close any files
     file-open "temperature.csv"  ;;; contains the data for minimum and 
                                      maximum temperatures possible in each 
                                      tick
     setup-constants              ;;; set up constants
     setup-river-patches          ;;; set up river-patches
     setup-bank-patches           ;;; set up patches not in the river
     setup-turtles                ;;; set up turtles
     reset-ticks                  ;;; set ticks to 0
  end


   to setup-constants 
       set initial-temp (22.06)   ;;; initial temperature for each patch
   end


    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;; SETUP PATCHES ;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   ;;; creates patches that make up the river
   to setup-river-patches
     set river-patches patches with [pycor > -27 and pycor < 27]
     ask river-patches
       [set pcolor blue
        set mean-daily-temp (initial-temp)]

   ;;; creates bank patches that are green
     set bank-patches patches with [pycor <= -27 or pycor >= 27]
     ask bank-patches
       [set pcolor green]
   end

   ;;; creates the 'fish' turtles
   to setup-turtles
      create-turtles 20
      ask turtles [
        set color white
        set shape "fish"
        set size 1
        move-to one-of river-patches]
    end

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;; TO GO ;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    to go 
       update-daily-temp ;;; this reads data from csv and creates the 
                             'mintemp' and 'maxtemp' variables used in 
                             'daily-river-temp'
       daily-river-temp  ;;; in each tick, this procedures sets the 
                             individual patch temperature

       move-turtles      ;;; procedure asking turtles to move in response to 
                             temperature
       tick
    end

       ;;;;;; HOW DO I ASK THE PROCEDURE update-daily-temp TO RETURN TO 
       ;;;;;;  START OF FILE, AFTER REACHING FINAL DATA POINT  
       ;;;;;;  SO THE MODEL CAN RUN FOR MORE TICKS THAN THERE 
       ;;;;;;  ARE DATA POINTS IN THE FILE? (i.e. UNTIL I CLICK GO AGAIN)

    to update-daily-temp
       if  file-at-end? [stop] 
       set temp-list csv:from-row file-read-line
       set mintemp item 0 temp-list
       set maxtemp item 1 temp-list
    end

    to daily-river-temp ;;; in each tick, set the individual patch 
                        ;;; temperature
       ask patches[
       set mean-daily-temp random-float (maxtemp - mintemp) + mintemp
       ]
    end

    to move-turtles
       ask turtles 
        [ifelse [mean-daily-temp] of patch-here > 18 and [pcolor] of patch 
        ahead 1 = blue
          [forward 1 set heading random 360 ]
          [set heading random 180]
        if xcor > 119 and xcor < 119
          [set heading random 360] pen-down]
   end

Спасибо в ожидании!

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Мой инстинкт заключается в том, что вы должны установить счетчик, такой как:

ifelse tick <= 365[
  set InYearCounter tick
  set Year 1
]
[
  set InYearCounter (tick - (Year * 365))
  if InYearCounter = 365[
     set Year (Year + 1)
  ]
 ]

Затем получить строку в таблице CSV, используя "InYearCounter".

to setup
   set temp-table csv:from-file "temperature.csv"
end

to update-daily-temp

   set temp-list item InYearCounter temp-table
   set mintemp item 0 temp-list
   set maxtemp item 1 temp-list
end

В этомТаким образом, симуляция не закончится в конце года, но будет продолжена в новом году.

0 голосов
/ 22 октября 2018

Вы можете просто закрыть и снова открыть файл, не останавливаясь:

if file-at-end? [
  file-close
  file-open "temperature.csv"
]

Другой подход - загрузить весь файл в память, используя csv:from-file, а затем использоватьпо модулю арифметика, чтобы получить доступ к температуре в этот день.Предположим, что у вас есть все содержимое файла, хранящееся в переменной temperatures, ваша процедура update-daily-temp станет:

to update-daily-temp
   let temp-list item (ticks mod 365) temperatures
   set mintemp item 0 temp-list
   set maxtemp item 1 temp-list
end

Обратите внимание, что я использовал let вместо set для temp-list: вы, кажется, не используете эту переменную где-либо еще, кроме update-daily-temp, поэтому она должна быть действительно локальной, а не глобальной переменной.В общем, вам следует избегать глобалов, если вы можете .

...