У меня есть модель в 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
Спасибо в ожидании!