Netlogo: вызов процедуры после открытия файла

Ниже приведен код для открытия файла, его чтения и записи в список (вдохновленный другим обсуждением):

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. Кроме того, если это возможно, потребуется минимальный воспроизводимый пример. Но на самом деле, поскольку вопрос в assign-data, это важная часть.

Matteo 11.05.2022 12:51

Я работаю над воспроизводимым примером. В любом случае, спасибо за ваш комментарий, Маттео.

Sarahdata 11.05.2022 15:57

Я добавил воспроизводимый пример, который также работает бесконечно, когда assign-data процедура вызывается из load процедуры.

Sarahdata 11.05.2022 16:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы уверены, что пробег бесконечен, а не экспоненциален? Вы ask patches к assign-data и в assign-data снова используете ask patches. Это означает, что каждое отдельное исправление проверяет каждое отдельное исправление и пропускает квалифицированное исправление по циклу, что может занять некоторое время.

Действительно... Сначала я попытался вызвать assign-data, просто написав его, но он не вызывал его (и не просил патчи вызывать его), но теперь он работает с подготовленным мной примером. Спасибо LeirsW за указание на это

Sarahdata 11.05.2022 17:17

Пожалуйста. О, и я не думаю, что у Netlogo есть способ вручную принудительно завершить цикл. Обычно я просто сохраняю программу заранее и принудительно закрываю Netlogo, когда она зависает.

LeirsW 12.05.2022 12:12

Только что еще раз проверил, иногда достаточно просто зайти на вкладку кода и внести там одно изменение. Обычно это также прерывает выполнение.

LeirsW 12.05.2022 17:59

Другие вопросы по теме