Лекція 3. Основи NetLogo

Олексій Ігнатенко

September 15, 2017

Вступ

По-перше, NetLogo має мануал і хелпери, які описують всі деталі мови програмування. Принцип RTFM буде застосовуватися протягом цього курсу.

The Observer

Обзервер спостерігає світ і агентів. Є можливість виконувати команди через командний центр. Наприклад:

 observer> create-turtles 1

кожна клітинка має цілочислені координати (центру), які відповідають декартовим координатам відносно центральної клітинки

створює агента в клітинці (0,0).

Команда

observer> ask turtle 0 [fd 12]

наказує агенту 0 рухатись вперед на 12 одиниць.

Властивості

Правий клік у світі дає можливість інспектувати черепашку або клітинку. Занотуйте властивості.

шаблон команди для зміни властивостей і значень: set thing to value

Спрообуємо змінити властивості:

observer> ask patch 2 2 [set pcolor red]
observer> ask turtle 0 [set label "My first turtle!"]

Очистимо світ:

observer> clear-all

Редагування світу

Керувати можна розміром: кількість клітинок, розмір клітинки. Керування топологією: квадрат, циліндр, тор.

Типи віджетів

читати мануал

  1. button
  2. slider
  3. switch
  4. chooser
  5. input
  6. monitor
  7. plot
  8. output
  9. note

Вкладка кодування

Існує два типи процедур: команди (commands - процедури, що не вертають значень) та репортери (reporters - функції, які повертають значення).

Commands and reporters

Визначимо репортер sum-of-two-nums-squared, який обчислює квадрат суми двох аргументів:

to-report sum-of-two-nums-squared [first-number second-number]
  report (first-number + second-number) * (first-number + second-number)
end

Команди визнчаються ще простіше

to my-command
print "Hello from MyFirstCommand."
print word "The square of 3 + 2 is " sum-of-two-nums-squared 2 3
end

Nota bene

  1. NetLogo використовує квадратні дужки [. . . ] для визначення списків. Елементи списку відокремлюються пробілом.

  2. NetLogo підтримує різні арифметичні і математичні оператори, зокрема +, -, *, ^. Вимагається, щоб ці оператори були відділені пробілами.

Глобальні і локальні змінні

Змінні нетипизовані але мають декларуватись. NetLogo підтримує глобальні і локальні змінні. Глобальні оголошуються одним з двох способів. Перший - при визначення слайдера або свіча в інтерфейсі змінна вважається глобальною. Другий - на початку області коду:

globals [ variable1 variable2 variable3]

Також можна оголошувати та призначати значення локальним змінним можна в будь-якій точці коду:

let local-variable1 0
let local-variable2 ""
let local-variable3 one-of patches

Set використовується для призначення значень змінним.

Властивості агентів

Черепашки і патчи є агентами, тобто об’єктами з властивостями. За замовчуванням кожен патч має наступні властивості:

pxcor, pycor (x - y координати у світі), pcolor (колір), plabel, plabel-color.

У черепашок таких властивостей більше. Крім цього, ви можете визначити скільки завгодно своїх властивостей за допомогою оголошення на початку програми

patches-own [ playerType ]
turtles-own [ energy ]

Для зміни або призначення властивості використовується команда ask

ask turtle 0 [set shape "airplane"]

Зауваження: кожна черепашка має унікальний числовий ID. Це цілі числа, що призначаються при створенні починаючи з 0.

Множини агентів

Множина агентів це множина клітинок або черепашок. Множини агентів неупорядковані, являються фундаментальною і найважливішою ідеєю NetLogo. Наприклад, \(turtles\) або \(patches\) є вбудованими примітивами, які повертають множину всіх черепащок та клітинок відповідно, та можуть бути агрументами і основами для циклів.

Приклади.

count patches
print count turtles with [color = green]

Корисні вбудовні способи створення множин агентів:

і корисні репортери, які приймають множини агентів у якості аргументів:

Сімейства агентів

Черепашки (але не клітинки) можуть бути організовані у сімейства. Зробити це можна на початку програми:

breed [ optimists optimist]
breed [ pessimists pessimist]

Тепер ви можете створювати та програмувати оптимістів та песимістів.

create-turtles 17
create-optimists 23

Списки

Списки - це один з небагатьох інструментів, які дозволяють будувати на NetLogo складні конструкції. Списки - це упорядковані колекції будь-яких штук.

print (list "Bob" 5 [2 "Carol"] turtle 0)

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

let my-list [1 2 3 4]
set my-list replace-item 3 my-list (list 1 2 3)

Зауважте, що заміна списку працює як створення нового з іншим елементом. Додавання елементу: - fput - додає новий перший елемент; - lput - додає новий останній елемент.

В Netlogo списки використовуються для запуску циклів. Наприклад:

foreach [1 2 3]
[[a] -> crt a]

те саме, що на інших мовах програмування виглядає так

for i=1 to 3
crt(i)
next i

або так

for (int i=1; i < 4; i++) {
crt(i)
}

Символ \(?\) означає підстановку змінної у циклі. Починаючи з версії 6.0 замінено на оголошення анонімної змінної

show n-values 10 [[a] -> a]

Вбудовані можливості роботи зі списками

Робота з строками

Строки визначаються подвійними лапками: “Bob”. Взагалі кажучи, якщо репортер працює з списками, то він спрацює і з строками. Приклад:

print length (list 2 4 6 8)
print length "Now is the time"
}

I/O

У NetLogo реалізовано простий функціонал читання/запису файлів, також можна створити QuickTime фільми виконання програм.

Керуючі конструкції

Виділимо головні конструкції (решта - RTFM):

  1. foreach:
foreach [1.1 2.2 2.6] [ [a] -> show (word a " -> " round a) ]
=> 1.1 -> 1
=> 2.2 -> 2
=> 2.6 -> 3

Нагадування. Використання анонімних процедур:

show n-values 5 [1]
=> [1 1 1 1 1]
show n-values 5 [[x] - > x]
=> [0 1 2 3 4]
  1. if та ifelse
ifelse reporter [ commands1 ] [ commands2 ]
  1. while
while [reporter] [ commands ]

Типова структура програми

Як правило визначають дві процедури: Setup і Go, та відповідні їм кнопки на панелі інтерфейсу.