NetLogo: І дорослим, і дітям

    
 
Багато складні системи вдається досліджувати тільки моделюванням. Для систем, що складаються з великої кількості незалежних об'єктів, такі як поведінка натовпу, розвиток багатоклітинних організмів або військові операції, найбільш адекватним виявляється Агентне моделювання. Є багато призначених для цього систем, наприклад російська пропріетарна AnyLogic .
Я ж хочу розповісти про мову NetLogo , добре зарекомендували себе в освіті, але придатний і для дорослих завдань.
 
 Синтаксис
Синтаксис Logo мінімалістичний — розділена пробілами послідовність імен і констант з рідкісною угрупованням за допомогою [] або (). [] Служать для створення списків і угруповання команд в блок в більшості конструкцій, () — звичайні дужки для подвираженій. Імена посилаються на вбудовані або певні програмістом сутності — функції, змінні
Команди (процедури) оголошуються
to имя [список имен аргументов]
  тело
end

 
Функції в NetLogo називаються «репортери» і оголошуються трохи по іншому:
 
 
to-reporter имя [список имен аргументов]
 тело
 report возвращаемая величина
end

 
Про кожну процедуру або функцію компілятор знає «арность» («валентність») і не вимагає зайвий раз використовувати угруповання. Правда з функціями вищих порядків може помилятися — тоді йому потрібна підказка у вигляді круглих дужок.
 
Нехай у нас визначені функції:
 
 
to-report inc [x]
 report x + 1
end

to-report add [x y]
  report x + y
end

 
Тоді можна написати
add add inc 1 inc 2 inc 3
і отримати заслужену дев'ятку.
Правильно працює так само
map inc [1 2 3]
який повертає список [2 3 4]. А для add вже доведеться написати дужки
(map add [1 2 3] [4 5 6])

 
 Агенти
Агенти бувають трьох видів — черепашки (turtle — як же без них), зв'язку (link) і плями (patch — вони ж місця в просторі). Для черепашок і зв'язків можна задати обумовлену користувачем породу (breed). Агенти одного типу об'єднані в набір відповідний (agentset) — turtles, links і pathes. Представники однієї породи так само об'єднані в набір. Нова порода створюється командою
breed [ninjas ninja]
де ninja — назва породи, а ninjas — назва набору, об'єднуючого всіх агентів цієї породи.
Є так само особливий агент — спостерігач.
 
Черепашки створюються командою create-turtles (з аргументом — кількість створюваних черепах), і далі перебувають за індексом функцією turtle. Агент — «first class value», при бажанні його можна зберегти у змінній, але потрібно це рідко.
 
Агент або набір агентів можуть бути контекстом для команди. Виконання команд в контексті агентів — основний механізм роботи з ними.
 
ask turtles [fd 1]
Цей код попросить всіх черепашок зробити крок вперед.
ask patch 17 13 [set pcolor pink]
А цей покрасит поле з координатами (17,13) в ніжно рожевий колір.
 
Породу можна встановити динамічно
ask turtle 1 [set bread ninjas]
ask ninja 1 [set pcolor black]

 
 Змінні
У вихідному Logo була реалізована динамічна область видимості, що створює незручності і суперечить сучасним тенденціями в області мов програмування. Розробники NetLogo надійшли суворо — заборонили створення однойменних змінних, область видимості яких можуть перетнутися. Розробникам бібліотек це зручності не додає, але в навчанні школярів швидше корисно. Та й соціологам і військових у розробці моделей дозволить робити менше помилок :-).
Область видимості статична, що спрощує використання функцій вищих порядків.
Змінні можуть бути глобальні, власні для типи агентів або породи, формальними аргументами і локальні в блоці коду. Одне і те ж ім'я змінної не може посилатися на різні класи змінних, але локальні змінні в різних блоках, в тому числі і в одній функції, можуть називатися однаково. Ім'я локальної змінної не може збігатися з ім'ям аргументу функції, де вона визначена або з ім'ям глобальної або агентной змінної.
 
Глобальні змінні описуються
global [имя1 имя2 ...]
власні
turtles-own [имя3 имя4 ...]
ninjas-own [имя5 имя6 ...]
Локальні змінні створюються командою
let имя7 начальное_значение

 
 Функції вищих порядків
Деякі стандартні функції, такі як map, в якості одного з аргументів отримують іншу функцію. Їм можна просто вказати ім'я переданої функції або написати замикання. Замикання представляє з себе код, укладені в []. Те, що це замикання, а не список, компілятор вгадує по контексту. Як формальні параметри використовуються змінні '?', '? 1', '? 2' і тд.
Використання своїх функцій вищих порядків складніше. Присвоїти змінної або передати іншій функції функцію-значення можна за допомогою спеціальної функції task, а викликати функцію з змінної — за допомогою runresult (або run для команд).
to test1 [f]
  show (runresult f 1)
  show (map f [2 3 4])
end

test1 (task [? + 2])

Особисто я такий підхід з поділом функцій і змінних, що посилаються на функції, вважаю вдалим, але він реалізований, наприклад, в Common Lisp, і має своїх прихильників.
 
 Інтерфейс і графіка
 
У програмі присутні три вкладки (таба): «інтерфейс», документація, і редактор коду. У табе «інтерфейс» присутні поле графічних об'єктів (у тому числі і зображення світу), поле текстового виводу і REPL. У REPL можна перемикати режими, що задають у якому контексті виконуються хто водиться команди — «спостерігач», «черепахи», «плями» і «зв'язку». REPL обмежений — описувати змінні, породи, процедури і функції в ньому не можна (вони створюються поза контекстом), доведеться переходити в редактор коду.
 
У зоні, де намальовано поле з миром, можна «мишкою» (натиснувши праву кнопку на вільному місці) створювати інші графічні об'єкти і елементи інтерфейсу. При створенні їм треба задати імена, по яких до них можна звертатися з програми. Способу породжувати графічні об'єкти програмно я не знайшов. У файлі ці об'єкти зберігаються в текстовому вигляді після коду, але в малопридатною для ручного редагування формі.
Наприклад, якщо ми створимо «графік» з ім'ям «plot1», то команда
set-current-plot "Class Histogram"
 histogram map [position ? [red green blue]] ([color] of turtles)
намалює графік розподілу черепах по червоному, зеленому і синьому кольорам (припускаючи, що інші не зустрічаються).
 
 Бібліотека моделей
До NetLogo додається обширна бібліотека моделей , від навчальних і розважальних, до дослідницьких. Деякі моделі вміють спілкуватися зі спеціалізованим залізом, таким як GoGo board .
Доступ до моделі до моделі здійснюється через меню File. Як правило, в інтерфейсі моделей є кнопки Setup і Go і для запуску їх треба натиснути в цьому порядку. Setup инициализирует модель, після чого її налаштування можна змінити через інтерфейс.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.