WedX - журнал о программировании и компьютерных науках

Netlogo & Levelspace: как передавать строки между двумя дочерними моделями?

У меня есть три модели: Parent, Child1, Child2.

Child1 генерирует строки, которые затем должны быть переданы Child2 для дальнейшей обработки. Строки генерируются на лету, когда выполняется Child1. Всякий раз, когда генерируется новая строка, она должна быть немедленно отправлена ​​в Child2. Иногда 2 или более строк генерируются одновременно (разными агентами), и тогда эти 2 или более строк должны быть отправлены одновременно (т.е. в пределах одного тика).

Одно из решений состоит в том, чтобы пропустить родительскую модель и позволить Child1 стать Parent-моделью, которая затем имеет доступ к Child 2. Однако это усложнит Child1, поскольку тогда он будет включать весь необходимый код LevelSpace. Кроме того, две дочерние модели должны использоваться сами по себе. Две модели используются в образовательных целях, и учащиеся не должны видеть код LevelSpace. Отсюда и Родительская модель.

Другое решение — позволить родительской модели постоянно опрашивать дочернюю модель 1, чтобы запрашивать новые строки. Не очень красиво. Не очень эффективно.

Так что в основном я ищу какую-то общую память и/или функциональность событий в LevelSpace :-)

Кстати, строки представляют собой ДНК, РНК и т. д., а мы иллюстрируем транскрипцию и трансляцию строк и т. д.

Любые идеи?

Спасибо, Палле.

23.01.2019

  • Привет Палле! Хороший вопрос. По сути, то, что вы предлагаете и опрашиваете дочернюю модель, это способ сделать это. Язык LevelSpace был разработан для имитации обычного NetLogo в том смысле, что вам нужно спросить модель, находится ли она в определенном состоянии, а затем отреагировать на это. Альтернативой может быть какая-то функция обратного вызова, которую дочерний элемент может вызвать для своего родителя, но это нарушит существующие соглашения для NetLogo. Тем не менее, в этом есть определенная степень привлекательности/эффективности. Если вам нужна конкретная обратная связь, не могли бы вы опубликовать соответствующий код? 25.01.2019
  • Спасибо, Артур :-) Нет, все в порядке. Я просто хотел убедиться. Линия имеет код, если вы хотите пик. Хороших выходных, Палле. 25.01.2019

Ответы:


1

Это определенно не обычный код NetLogo, но метод обратного вызова работает нормально, по крайней мере, для этого простого примера. Вам нужно немного усложнить дочерние модели, чтобы добавить оператор run callback, но это может привести к более чистому коду в целом, чем метод опроса, в зависимости от варианта использования.

Родительская модель:

extensions [ ls ]

globals [ child1 child2 ]

to setup
  ls:reset
  (ls:create-models 1 "LS callback child.nlogo" [ [id] -> set child1 id ])
  (ls:create-models 1 "LS callback child.nlogo" [ [id] -> set child2 id ])
  ls:ask ls:models [
    child-setup
  ]
  ; here we set the callback for the child models
  ; we could set the callback for just `child1` instead of all `ls:models`
  ls:assign ls:models callback [ [id message] -> alert id message ]
  ls:assign child1 id child1
  ls:assign child2 id child2
end

to go
  ls:ask ls:models [
    child-go
  ]
end

; In this case our callback is simple, just taking the caller id
; and a message.  We could add more parameters for it if we want to
to alert [id message]
  show (word id ": " message)
  ; this is just to show that we can use the callback to update
  ; the state of one of the other models
  if id = 0 [
    ls:ask child2 [ set some-val (some-val + 1) ]
  ]
end

Детская модель:

globals [ id callback some-val ]

to child-setup
  set some-val 0
  ; set the callback to an "empty" procedure so we don't have to check
  ; if it is set while we run the go method.
  set callback [ [model-id message] -> ]
end

to child-go
  if random 10 < 3 [
    (run callback id (word "child alert: " some-val))
  ]
end

Пример вывода:

observer: "1: child alert: 0"
observer: "1: child alert: 0"
observer: "1: child alert: 0"
observer: "0: child alert: 0"
observer: "1: child alert: 1"
observer: "0: child alert: 0"
observer: "1: child alert: 2"
observer: "1: child alert: 2"
observer: "0: child alert: 0"
observer: "1: child alert: 3"
observer: "1: child alert: 3"
observer: "1: child alert: 3"
observer: "0: child alert: 0"
observer: "1: child alert: 4"
observer: "0: child alert: 0"
observer: "1: child alert: 5"
observer: "1: child alert: 5"
observer: "0: child alert: 0"
observer: "1: child alert: 6"

Каждый раз, когда модель child1 запускает обратный вызов, процедура alert увеличивает глобальное значение some-val в child2.

25.01.2019
  • Спасибо, Джаспер. Я обязательно попробую. Хотя я вижу, что мне действительно нужно освежить анонимные процедуры :-) Но это выглядит очень структурировано и красиво. Спасибо! 25.01.2019
  • Один из создателей LS здесь: это довольно круто, но на самом деле не должно работать. Дочерние модели по умолчанию выполняются параллельно, а это означает, что невозможно контролировать, в каком порядке они будут запускать код (даже с random-seed). Обычно это нормально, так как дочерние модели не могут напрямую влиять друг на друга. Но передача процедур в среднем порядке имеет большое значение, поэтому результаты приведенного выше кода будут непредсказуемыми. Я создал задачу для обсуждения github.com/NetLogo/LevelSpace/issues/133 26.01.2019
  • Привет, ты пробовал это решение. Выглядит красиво, но у меня не работает (Netlogo 6.1.1) 26.12.2019

  • 2

    Джаспер написал действительно хорошее решение, хотя оно основано на поведении, которое не должно работать. Другой способ сделать это — заставить child1 собирать строки по мере их выполнения в глобальной переменной. например

    Код ребенка 1:

    globals [ strings ]
    
    to go
      set strings []
      ask turtles [
        set strings lput (word "hello from turtle " who) strings
      ]
      tick
    end
    

    Затем пусть child2 примет список строк в своем методе go

    Детский код 2:

    to go [ strings ]
      ; do stuff with the strings
    end
    

    Затем родитель передает список между ними:

    Родительский код:

    to go
      ls:ask child1 [ go ]
      ls:let child1-strings [ strings ] ls:of child1
      ls:ask child2 [ go child1-strings ]
      tick
    end
    
    26.01.2019
    Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]