Ниже приведен код для открытия файла, его чтения и записи в список (вдохновленный другим обсуждением):
to setup
reset-timer
; first, we load the database file
; We check to make sure the file exists first
ifelse ( file-exists? "AT_data.txt" )
[
; We are saving the data into a list, so it only needs to be loaded once.
set AT-data []
file-open "AT_data.txt"
while [ not file-at-end? ]
[
; file-read gives variables stored in a double list
; Each iteration we append the next three-tuple to the current list: ID AT1 AT2
set AT-data sentence AT-data (list (list file-read file-read file-read))
]
user-message "File loading complete!"
file-close
;; when adding this, the procedure is running endlessly, to be checked
;; ask patches [ assign-data ]
]
[ user-message "There is no AT_data.txt file in current directory!" ]
file-close-all
print timer
end
Как я писал в комментарии, когда я вызываю следующую процедуру [assign-data], процедура [assign-data] выполняется бесконечно. Я устанавливаю таймер в процедуре [assign-data] и вижу, что она работает снова и снова. Когда я запускаю [assign-data] сам по себе, он работает правильно, только один раз.
Я пробовал с stop после [assign-data], но это не работает.
Должно быть что-то, чего я еще не понял об использовании Netlogo, знаете ли вы, что это такое?
Вот код процедуры assign-data(есть 2 варианта, второй работает быстрее)
to assign-farmers1
reset-timer
ask patches with [seed = 1] [
set death last (first (filter [current-inner-list -> (item 0 current-inner-list = ID_farm)] AT-data))
set age item 1 (first (filter [current-inner-list -> (item 0 current-inner-list = ID_farm)] AT-data))
]
print timer
end
to assign-data2
reset-timer
ask patches with [seed = 1] [
let i 1
while [i < length AT-data] [
let current-inner-list item i AT-data
ifelse (ID_farm = item 0 current-inner-list)
[ set age item 1 current-inner-list set death item 2 current-inner-list
stop]
[ set i i + 1 ]
]
]
print timer
end
->, что привело меня к другому вопросу: как остановить бесконечную симуляцию? Я пытался использовать stop в командном центре, но это не работает.
Спасибо за ваше время.
ВОТ ВОСПРОИЗВОДИМЫЙ ПРИМЕР (не уверен, что я должен оставить начало вопроса) AT_data.txt — это файл, состоящий из 3 столбцов, где первый идет от 1 до 100, второй и третий — просто случайные числа.
globals [
AT-data
]
patches-own [
ID
AT1
AT2
seed
]
to setup
;; here I just create patches with different values that also appear in the list
ca
ask patches [ set seed random 10 set ID random 100
ifelse (seed = 4)
[ set pcolor orange] [set pcolor white]
]
end
to load
reset-timer
; first, we load the database file
; We check to make sure the file exists first
ifelse ( file-exists? "AT_data.txt" )
[
; We are saving the data into a list, so it only needs to be loaded once.
set AT-data []
file-open "AT_data.txt"
while [ not file-at-end? ]
[
; file-read gives variables stored in a double list
; Each iteration we append the next three-tuple to the current list: ID AT1 AT2
set AT-data sentence AT-data (list (list file-read file-read file-read))
]
user-message "File loading complete!"
file-close
;; when adding this, the procedure is running endlessly, to be checked
ask patches [ assign-data ]
stop
]
[ user-message "There is no AT_data.txt file in current directory!" ]
file-close-all
print timer
end
to assign-data
reset-timer
ask patches with [seed = 4] [
let i 1
while [i < length AT-data] [
let current-inner-list item i AT-data
ifelse (ID = item 0 current-inner-list)
[ set AT1 item 1 current-inner-list set AT2 item 2 current-inner-list
stop]
[ set i i + 1 ]
]
]
print timer
end
Я работаю над воспроизводимым примером. В любом случае, спасибо за ваш комментарий, Маттео.
Я добавил воспроизводимый пример, который также работает бесконечно, когда assign-data процедура вызывается из load процедуры.





Вы уверены, что пробег бесконечен, а не экспоненциален? Вы ask patches к assign-data и в assign-data снова используете ask patches. Это означает, что каждое отдельное исправление проверяет каждое отдельное исправление и пропускает квалифицированное исправление по циклу, что может занять некоторое время.
Действительно... Сначала я попытался вызвать assign-data, просто написав его, но он не вызывал его (и не просил патчи вызывать его), но теперь он работает с подготовленным мной примером. Спасибо LeirsW за указание на это
Пожалуйста. О, и я не думаю, что у Netlogo есть способ вручную принудительно завершить цикл. Обычно я просто сохраняю программу заранее и принудительно закрываю Netlogo, когда она зависает.
Только что еще раз проверил, иногда достаточно просто зайти на вкладку кода и внести там одно изменение. Обычно это также прерывает выполнение.
Нам нужно посмотреть, какой код внутри
assign-data. Кроме того, если это возможно, потребуется минимальный воспроизводимый пример. Но на самом деле, поскольку вопрос вassign-data, это важная часть.