Chúng ta đã biết một chút về cách thức hoạt động
của NetLogo, hãy xây dựng
một mô hình đơn giản của chúng ta. Mô hình này sẽ bao gồm
một chú kiến di chuyển ngẫu nhiên
và ... chỉ thế thôi.
Vậy, hãy khởi động chương trình NetLogo.
Tôi sẽ sử dụng NetLogo 5.3.1,
bạn có thể dùng bất cứ
phiên bản nào bạn có.
Việc đầu tiên tôi sẽ làm là tạo ra
các nút bấm "Setup" và "Go".
Tôi vào "Interface Builder Menu",
Khi tôi click vào đó, bạn sẽ thấy tất cả
các đối tượng khác nhau mà tôi có thể đưa vào
giao diện. Bây giờ chúng ta sẽ
thêm vào một nút bấm. Tôi click vào giao diện,
tôi có thể điền tên của nút bấm này là "Setup",
và tôi có thể tạo một nút bấm khác,
Tôi tạo nút bấm khác có tên là "Go"
Tôi có thể chọn nó bằng cách nhấn chuột phải,
chọn "Select", và tôi có thể di chuyển nó, có thể thay đổi
kích thước của nó. Nếu tôi thả nó ở đây, tôi có thể điều chỉnh
những nút bấm này tùy ý. Vậy là, bây giờ chúng ta
đã có hai nút bấm "Setup" và "Go".
Chúng màu đỏ vì không có
đoạn code nào gắn với chúng.
Hiện giờ, sẽ không có gì xảy ra
khi ta click vào chúng, nên tôi sẽ
phải viết code. Bây giờ, hãy
viết code cho
các nút bấm "Setup" và "Go".
Để làm việc đó, chúng ta sẽ chuyển qua tab "Code" và
bắt đầu lập trình. Việc đầu tiên chúng ta cần làm
là viết code cho "Setup".
Mục tiêu của chúng ta khi viết code cho nút "Setup"
là khi nút này được click,
ta sẽ xóa tất cả (clear all), ở đây "clear all" được hiểu là một câu lệnh
sẽ xóa sạch toàn bộ thế giới hoạt động
của loài kiến mà chúng ta đang quan sát, nó sẽ
xóa toàn bộ những gì còn sót lại
từ lần chạy trước. Chúng ta sẽ khởi động lại
bộ đếm thời gian, tức là ta sẽ đặt đồng hồ (tick)
hay nói cách khác là đặt mốc thời gian về 0.
Bây giờ chúng ta sẽ tạo ra một chú kiến.
Tất cả các tác nhân trong NetLogo đều được gọi là turtle (rùa).
Nó bắt nguồn từ một nguyên do lịch sử,
trong ngôn ngữ đầu tiên - Logo - là nền tảng
để phát triển NetLogo sau này, tất cả tác nhân đều
là rùa. Trong Logo bạn chỉ có một con rùa.
Bây giờ thì bạn có thể có
rất nhiều rùa. Bây giờ ta sẽ gọi lệnh
"tạo rùa"(create turtle). Ta sẽ chỉ ra ta cần
bao nhiêu rùa. Cho bài thực hành, ta chỉ
cần một chú rùa là đủ.
Vậy là, ta đã tạo ra một chú rùa và
sau đó ta sẽ yêu cầu chú
làm vài việc.
Gõ "ask turtle" và đưa danh sách công việc. Chúng ta sẽ
đặt hình dáng của chú rùa thành "bug"; đó là
hình dạng của kiến trong NetLogo. Ta sẽ
đặt kích thước là 3. Kích cỡ đó là đủ
trong NetLogo để ta có thể nhìn được. Chúng ta
cũng quy định màu của chú rùa là màu đỏ.
Ok, tôi nghĩ thế là đủ
do đó tôi gõ "End" để kết thúc đoạn code.
Nút "check" (kiểm tra) ở đây sẽ kiểm tra
đoạn code để tìm lỗi. Click vào đó, và
nó cho ta biết là có một lỗi, và nó cũng cho ta biết
lỗi nằm ở đâu, và tôi nhận ra rằng
tôi nên gõ "ask turtles".
Tôi đã gõ thiếu ký tự "s". Lý do là vì
NetLogo giả định rằng có một quần thể
rùa hay tác nhân và
bất cứ khi nào bạn yêu cầu việc gì đó, yêu cầu đó dành cho
toàn bộ quần thể. Chúng ta chỉ có một
chú rùa, nhưng sau này chúng ta sẽ
yêu cầu toàn bộ rùa ta có. Kiểm tra đoạn code lần nữa.
Chương trình đưa ta quay về giao diện thông báo
tất cả đều ổn, và bây giờ hãy
click vào "Setup", và chúng ta sẽ thấy chú kiến, ngay chính giữa
màn hình. Nút "Go" vẫn màu đỏ
bởi vì ta chưa viết code.
Giờ hãy viết code cho nút Go.
Quay trở lại code "Tab".
Chúng ta gõ "to go" và "ask turtles"
để làm một số việc. Đầu tiên, chúng ta yêu cầu chúng
xoay thân thể sang phải 30 độ,
sau đó chúng ta yêu cầu chúng tiến
về phía trước 4 bước bằng dòng lệnh "forward 4", sau đó
chúng ta tăng bộ đếm thời gian thêm 1,
đó là tác dụng của câu lệnh "tick",
vậy là chúng ta đã reset thời gian về 0, và rồi
dùng "tick" để tăng thời gian
lên 1 mỗi lần chúng ta thực hiện
đoạn code và cuối cùng chúng ta kết thúc bằng câu lệnh "end".
Hãy quay trở lại giao diện, và click "Go".
Chúng ta có thể thấy chú rùa quay phải
30 độ và sau đó đi về phía trước
4 bước. Ta tiếp tục nhấn nút "Go"
thêm nhiều lần nữa, và chú rùa
sẽ đi thành vòng tròn. Tôi muốn chú rùa
di chuyển mãi mãi mà không cần
phải nhấn "Go" liên tục
và tôi có thể làm việc đó bằng cách click chuột phải lên
"Go", chọn "Edit", và chúng ta sẽ thấy lựa chọn
"forever" (vĩnh viễn), mà tôi có thể chọn,
có nghĩa là nút "Go" sẽ được nhấn tự động
mãi mãi, vậy làm thôi.
Nếu tôi làm chương trình chậm lại một chút, bạn có thể
thấy chú kiến tự động đi
thành vòng tròn, và tôi click "Go" để
dừng lại. Tôi có thể click "Go" để
chạy lại. Nếu tôi muốn chạy từ đầu, tôi
click "Setup". Chú kiến sẽ bắt đầu ở vị trí cũ,
ở giữa cửa sổ, nhưng định hướng khác nhau
ở các lần chạy khác nhau. Lý do là vì
chú kiến được đặt ở chính giữa, nhưng chú
hướng ngẫu nhiên mỗi lần chạy chương trình
Chúng ta có thể lưu chương trình lại, bằng cách
chọn File -> Save As. Tôi sẽ lưu
với tên Ant1.
Bạn có thể thấy nó ở trên desktop, Ant1.logo.
Bây giờ chúng ta có thể vào menu của Netlogo
và chọn thoát chương trình.
Nếu tôi muốn khởi động lại, tôi chỉ cần
click đúp vào nó. NetLogo sẽ được bật lên
và load mô hình của chúng ta.
Chỉ có một điều không ổn:
chương trình của ta thật chán.
Chú kiến chỉ làm một việc là đi vòng
tròn, nên hãy làm gì đó thú vị hơn.
Tôi có thể vào phần code,
và bổ sung một câu lệnh đơn giản,
Thay vì xoay phải 30 độ, ta sẽ
thêm vào từ khóa "random", và bây giờ chú kiến
sẽ chọn một số ngẫu nhiên giữa 0 và
30 - 1, và xoay phải theo góc
ngẫu nhiên đó. Chúng ta có thể làm tương tự
ở đây, ta có thể làm chú kiến di chuyển về phía trước
một số bước ngẫu nhiên.
Hãy quay lại giao diện, ta click
vào "Setup" và "Go", và bây giờ ta có thể thấy
hoạt động của chú kiến thú vị hơn một chút.
Bạn có thể nhận ra rằng chú kiến có thể
đi xuyên tường ở đây và xuất hiện trở lại
ở phía đối diện. Trong khi bức tường thì
vây bọc. Trông có vẻ hơi
lạ nhỉ. Tôi có thể click chuột phải vào vùng màu đen,
chọn "Edit". Có rất nhiều
thông tin ở đây về kiến tạo
thế giới của chú kiến. Số lượng "patch" (miếng vá), là hệ thống lưới
để chia thế giới.
Bỏ chọn chúng, click "Apply", "OK"
Hãy xem điều gì sẽ xảy ra. Bây giờ, khi
chú kiến húc vào tường, chú sẽ tắc
ở đó, cho tới khi chú quay sang hướng khác
Chú kiến của chúng ta vẫn chỉ biết quay sang phải.
Hãy viết code để cho chú kiến chọn một
hướng bất kỳ quay phải hoặc
quay trái. Bản chất là tung đồng xu
để quyết định xem chú kiến sẽ quay
phải hay trái. Tôi sẽ lập trình
đoạn code "tung đồng xu" bây giờ.
Tôi gõ "to-report" "coin-flip",
"to-report" không giống với chỉ thị (procedure) "to",
"to-report" trả về 1 giá trị, ở đây nó sẽ
trả về true (đúng) hay false (sai). Ta viết
"report random 2 = 0"
"end"
Câu lệnh "random 2" có nghĩa gì?
"random" trả về 1 số ngẫu nhiên nằm giữa
0 và ( 2 - 1),
nên một nửa số lần nó sẽ trả về 0
và nửa còn lại sẽ trả về 1, ngẫu nhiên.
Nếu nó ngẫu nhiên trả về 0, câu lệnh sẽ trả về giá trị true
ngược lại thì sẽ trả về giá trị
false. Chúng ta có thể dùng giá trị này,
bằng câu lệnh "if else" coin-flip,
có nghĩa là nếu "coin-flip" trả về true
thực hiện điều đầu tiên tôi đặt trong
dấu ngoặc, ngược lại nếu là false,
thực hiện điều thứ hai
trong dấu ngoặc, "left random 30". (quay trái ngẫu nhiên từ 0 tới 29 độ).
Mỗi lần chúng ta chạy chỉ thị Go, nó sẽ
ngẫu nhiên chọn quay
phải hay trái. Bây giờ hãy xem nó
hoạt động. Click "Setup" rồi "Go".
Bạn có thể thấy chú kiến quay
các hướng khác nhau,
Vấn đề duy nhất là
nó thường xuyên đụng tường.
Ta có thể cải tiến bằng cách đổi giá trị 30 thành 60
Ta sẽ có một góc quay lớn hơn, có nghĩa mỗi lần quay chú kiến có thể quay rộng hơn
Trông có vẻ tốt hơn. Bất cứ khi nào bạn
viết một chương trình, luôn là việc tốt khi viết
comment (chú thích). Comments bị máy tính
bỏ qua,
nhưng chúng rất tốt để giúp người khác
đọc hiểu code. Trong NetLogo, comment là
đoạn ký tự phía sau dấu chấm phẩy(;). Tôi có thể viết
bất cứ thứ gì tôi muốn và máy tính sẽ
bỏ qua. Giờ hãy viết "trả về ngẫu nhiên giá trị
true hoặc false", chính là nhiệm vụ của đoạn code,
Ở đây chúng ta có thể viết
"nếu coin-flip trả về true, quay phải,
nếu không quay trái"
Thế là bạn đã có một ghi chú, có thể
cho chính bạn, hoặc cho những người khác đọc
code của bạn. Cực kỳ hữu ích nếu bạn có
một chương trình phức tạp. Đặc biệt, nếu
bạn trở lại với đoạn code sau vài ngày.
Comments là một điều hết sức cốt lõi, cho dù
không ai đọc code của bạn.
Bây giờ chúng ta sẽ lưu mô hình.
Đầu tiên, tôi gán nhãn cho nó.
Nó chỉ mang tính thẩm mỹ, tôi vào menu
Interface và chọn Node, tôi sẽ viết
ở đây một đoạn ký tự ngắn
nói rằng tên của mô hình là Ant1.
Hãy làm cho các ký tự to hơn, 18,
và sau đó tôi có thể chọn và di chuyển chúng
xuống một chút, căn giữa, làm mọi điều
tôi thích để khiến chúng đẹp hơn,
click "Save", và mô hình đã được lưu.
Tôi chỉ muốn nhắc lại là mục đích của việc
dạy NetLogo là cho bạn một khái niệm
mọi thứ hoạt động thế nào. Chúng ta sẽ
dùng nhiều mô hình NetLogo trong
khóa học. Ta sẽ không phải lập trình
quá nhiều. Tôi chỉ muốn cho các bạn hình dung
cách thức hoạt động. Bạn có thể chỉnh sửa
một chút chương trình chúng ta đã viết. Nếu bạn
có khả năng, bạn có thể thử viết một
chương trình của bạn. Như là một bài tập, tôi
mong bạn hãy lập trình lại mô hình Ant1
chính xác như tôi đã làm, sử dụng
cùng tập lệnh, và làm nó chạy.
Sẽ không chấm điểm đâu, nhưng nó sẽ giúp
ích cho bạn. Đừng ngại đặt câu hỏi
trên diễn đàn của sinh viên khi
bạn có thắc mắc. Đó là mục tiêu của diễn đàn mà.