Εισαγωγή στην πολυπλοκότητα, εργασία 1η, επιλογή για προχωρημένους
Αυτό είναι είναι ένα φροντιστηριακό βίντεο που θα σας εξηγήσει τις απαντήσεις της εργασίας για προχωρημένους
Παρακαλώ ανοίξτε το μοντέλο της NetLogo με το όνομα "MultipleAnts.nlogo"
Που είναι στο τμήμα "Course Material" της ιστοσελίδας.
Όταν ανοίγει, η διεπαφή (interface) πρέπει να φαίνεται κάπως έτσι...
Έχουμε κάνει ήδη κάποιες αλλαγές στα πρώτα δύο τμήματα της εργασίας
και δεν τις έχουμε σβήσει.
Το πρώτο πράγμα που θα κάνω είναι να ξαναχρωματίσω τα μυρμήγκια έτσι ώστε να μένουν πάντα κόκκινα.
Έτσι θα σβήσω αυτές τις δύο γραμμές του κώδικα και θα το κάνω λιγότερο μπερδεμένο
Πάμε πίσω στην διεπαφή
Η εργασία μας ζητά να φτιάξουμε ένα ίχνος φερομόνης που αφήνουν πίσω τα μυρμήγκια,
το οποίο (ίχνος) μπορούν ν' ακολουθήσουν άλλα μυρμήγκια, μόλις βρουν τροφή.
και να δούμε αν μπορούμε να κάνουμε κάτι πιο γρήγορο από την τρέχουσα μεθοδο
Ας το κάνουμε λοιπόν. Πηγαίνω στον κωδικό.
Πρώτα ας κάνουμε μία μεταβλητή "patch" και ας την ονομάσουμε "pheromone",
Κάντε το εδώ...
Μετά πηγαίνετε κάτω στο τμήμα "setup"
και πρέπει να στήσουμε τα patches, ώστε να περιλαμβάνουν και τις φερομόνες, εκτός από την φωλιά.
Έτσι θ' αλλάξω το set-up-nest σε set-up-patches.
Θα ζητήσουμε από τα patches να ξεκινήσουν τις "pheronome" (φερομόνες) από το 0 (μηδέν).
Γράφουμε: set pheromone 0,
ας το τσεκάρουμε αυτό....
Μετά θέλουμε τα μυρμήγκια ν' αφήνουν ένα ίχνος φερομόνης πίσω τους, αφού έχουν φάει την τροφή τους και επιστρέφουν στη φωλιά τους
και θέλουμε άλλα μυρμήγκια ν' ακολουθήσουν αυτό το ίχνος της φερομόνης
Για να το κάνουμε αυτό, θα πάω παρακάτω στην διαδικασία "return-to-nest",
την οποία γράψαμε νωρίτερα
και θα προσθέσουμε μία γραμμή που θα συνδέσει το ύψος της φερομόνης με το κομμάτι (patch).
Γράφουμε set pheronome + 1 (δηλαδή το τρέχων επίπεδο της φερομόνης +1)
και για να βλέπουμε πόσο επίπεδο φερομόνης έχει κάθε κομμάτι
θα γράψω μία ταμπέλα/ετικέτα για κάθε κομμάτι: set plabel pheromone,
η οποία θα είναι απλά η αριθμητική τιμή της φερομόνης που έχει το κάθε κομμάτι.
Μπορείτε επίσης να χρησιμοποιήσετε διαφορετικό χρώμα αν θέλετε αλλά νομίζω είναι πιο ενδιαφέρον να χρησιμοποιήσετε την ταμπέλα.
Ας το ελέγξουμε αυτο να δούμε αν δουλεύει (πατάμε check)
Μοιάζει να είναι,
μοιάζει τα μυρμήγκια να μαζεύουν τροφή και να επιστρέφουν στη φωλιά
και αφήνουν ένα ίχνος φερομόνης
και όπως το κάνουν αυξάνει η τιμή της φερομόνης.
Τώρα θέλουμε η φερομόνη να εξατμίζεται όταν περνά ο χρόνος.
Ας πάμε πίσω στον κώδικα για να δοκιμάσουμε να το κάνουμε
Ας κάνουμε μία νέα γραμμή στην διαδικασία "go",
θα την ονομάσουμε "evaporate-pheromone"
Ας γράψουμε τώρα αυτή την διαδικάσία
"to evaporate-pheromone"
Θα θέλαμε η φερομόνη να έχει μία πιθανότητα εξάτμισης,
το οποίο σημαίνει έναν αριθμό μεταξύ 0 και 1.
Ας φτιάξουμε μία προσωρινή μεταβλητή και ας την ονομάσουμε x,
η οποία θα είναι ένα τυχαίο δεκαδικό μεταξύ 0 και 1.
"let x random-float 1"
και μετά "ask patches with [pheromone > 0]" ,
δηλαδή όποιο patch έχει φερομόνη
αν η μεταβλητή x
είναι μικρότερη
από την πιθανότητα που επιλέξαμε, η οποία θα είναι μια τιμή που θα έχουμε επιλέξει με την μπάρα (slider) που θα φτιάξουμε αργότερα στην διεπαφή
και θα ονομάσουμε αυτήν την μπάρα "probability to evaporate" (πιθανότητα να εξατμιστεί).
Γράφουμε [if x < probability-to-evaporate
και μετά θα θέσουμε την φερομόνη να είναι η τρέχουσα τιμή της
μείον 1 (-1), [set pheromone pheromone - 1]
έτσι η φερομόνη σταδιακά θα εξατμίζεται.
Επίσης θα θέλαμε να το βλέπουμε αυτό, έτσι θα ξαναρυθμίσουμε το plabel,
set plabel pheromone] (είναι η καινούρια τιμή της φερομόνης)
και θα πρέπει να προσθέσουμε αυτή την μπάρα που ανέφερα.
Για να το κάνουμε αυτό, πάμε στην διεπαφή, σ' αυτό το κουμπί,
επιλέγουμε "slider" και θα την τοποθετήσουμε εδώ προσωρινά
και θα την ονομάσουμε probability-to-evaporate
και θα είναι ένας αριθμός μεταξύ 0 και 1,
θ' αυξάνεται κατά .01
και ας θέσουμε την αρχική τιμή να είναι .1
ξέχασα ένα e εδώ... πατάμε οκ...
Και θα ήθελα να μετακινήσω αυτήν την μπάρα να είναι κάτω από τις άλλες μπάρες.
Έτσι θα μετακινήσω το σχεδιάγραμμα προς τα κάτω
και θα το ευθυγραμμίσω με την κάτω άκρη του "Κόσμου", για να φαίνεται όμορφο
και μετά θα μετακινήσω την μπάρα
και ας τον κάνουμε το ίδιο μήκος με τις άλλες μπάρες
λοιπόν... ίσως να είμαστε σωστοί
πατάω check, πίσω στην διεπαφή, το τρέχουμε
και τα επίπεδα της φερομόνης θα πρέπει να μειώνονται και φαίνεται να συμβαίνει αυτό.
Άρα αυτό είναι καλό.
Το τελευταίο πρόβλημα είναι ν' ακολουθήσουν τ' άλλα μυρμήγκια το ίχνος της φερομόνης.
Ας κάνουμε αυτό τώρα αυτό.
Μιας και το έφερε η κουβέντα, το να διαλέγουμε διαφορετικά αντικείμενα στην διεπαφή, γίνεται με το να κάνουμε αριστερό κλικ, να το κρατάμε και να τραβάμε τον κέρσορα
πάνω στο κουμπί, στην μπάρα ή οτιδήποτε
και μπορείτε επίσης να κάνετε δεξί κλικ,
αφού έχετε ήδη επιλέξει το κουμπί και να το ρυθμίσετε με διάφορους τρόπους.
Πάμε στον κώδικα κια θ' αλλάξουμε τον τρόπο που κινούνται τα μυρμήγκια μέσα στον "κόσμο".
Θα πάμε στο τμήμα look-for-food
και θα προσθέσουμε λίγο κώδικα
Θα στήσουμε κάποιες νέες μεταβλητές,
ας πούμε
let pheromone-ahead? scent-at-angle 0,
και θα εξηγήσω τί σημαίνει αυτό σε λίγο,
let pheromone-right? scent-at-angle 45
και... let pheromone-left? scent-at-angle -45.
Αυτός ο κώδικας είναι παρόμοιος με το μοντέλο των μυρμηγκιών που υπάρχει στη βιβλιοθήκη της NetLogo
και βασικά ζητά από κάθε μυρμήγκι να κοιτάξει μπροστά
και μετά λίγο προς τα δεξία και λίγο προς τ' αριστερά ,
για να διαπιστώσει αν υπάρχει φερομόνη εκεί γύρω και αν υπάρχει ν' ακολουθήσει τη φερομόνη
κι αν δεν υπάρχει, να κινηθεί τυχαία και να κρατήσουμε τον ίδιο κώδικα όπως παρακάτω.
Έπειτα θα γράψουμε μία σειρά από ifelse προτάσεις,
ifelse (pheromone-right? > pheromone-ahead? (αν η φερομόνη δεξία είναι περισσότερη από την φερομόνη εμπρός)
or pheromone-left? > pheromone-ahead?) (ή αν η φερομόνη αριστερά είναι περισσότερη από την φερομόνη εμπρός)
[ifelse pheromone-right? > pheromone-left? (αν το ίχνος της φερομόνης είναι περισσότερο στα δεξία από τ' αριστερά)
[rt 45] (θα στρίψουμε δεξία 45 μοιρές)
[lt 45] (αν όχι θα στρίψουμε αριστερά 45 μοίρες)
και αν κανένα από αυτό δεν είναι αληθές, δηλαδή είτε η περισσότερη φερεμόνη βρίσκεται μπροστά
ή δεν υπάρχει καθόλου φερεμόνη
αν γράψουμε... if pheromone-ahead? = 0
τότε θα συνεχίσουμε με το αμέσως από κάτω κομμάτι του κώδικα. Βάζουμε μία αγκύλη εκεί
και χρειάζομαι και μία αγκύλη για κλείσιμο στο τέλος
Ας το ελέγξουμε αυτό (πατάμε check)... και μας λέει ότι δεν υπάρχει κάτι που να ονομάζεται scent-at-angle
και είναι αλήθεια δεν έχουμε γράψει το scent-at-angle ακόμα.
Ας πάμε προς τα κάτω στο τέλος του κώδικα και θα γράψουμε ένα αναφορέα (reporter).
to-report scent-at-angle
[angle]
let p patch-right-and-ahead
και αυτά είναι αρχέτυπα που είναι ενσωματωμένα στην NetLogo.
Για όποιον θέλει να τσεκάρει τί σημαίνει primitives (αρχέτυπα), μπορείτε να το υπογραμμίσετε
και μετά να κάνετε δεξί κλικ και να πάτε στο "quick help"
και εκεί θα δείτε μία μικρή σύνοψη του τι σημαίνει αυτό το αρχέτυπο
Θα χρησιμοποιήσουμε τις γωνίες που ήδη έχουμε εισάγει
και μετά την απόσταση εμπρός, που θα είναι 1
if p = nobody [report 0] (αν δεν υπάρχει φερομόνη, δήλωσε τιμή μηδέν)
report [pheromone] of p (αν υπάρχει φερεμόνη, δήλωσε την τιμή)
και αυτό πρέπει να είναι σωστό...
Ας ελέγξουμε τώρα τον κώδικα....
Δεν έχουμε βάλει κλειστή αγκύλη γι' αυτήν την ανοιχτή αγκύλη και έχουμε ένα μύνημα λάθους
και φαίνεται να έχω ξεχάσει να κλείσω την αγκύλη εδώ.
Βλέπω επίσης ότι λείπουν κάποιες καμπύλες από αυτές τις γραμμές
και θα τις προσθέσω και θα τσεκάρω (πατάμε check).... φαίνεται όλα να είναι σωστά.
Πάμε πίσω στη διεπαφή...
και βλέπουμε ότι η συμπεριφορά είναι αρκετά καλή.
Θα μπορούσαμε ν' αναλύσουμε το μοντέλο αυτό λίγο παραπάνω και να κάνουμε κάποιες βελτιωτικές προτάσεις
για το πως λειτουργεί, αλλά θα το αφήσω αυτό για εσάς.
Παρατηρώ όμως ότι πολλά μυρμήγκια μαζεύονται στις γωνίες του "κόσμου"
και μπορούμε να το φτιάξουμε αυτό πηγαίνοντας στο settings
και να κάνουμε κλικ στα "World wraps horizontally" και "World wraps vertically" και μετά πατάμε "οκ"
και τώρα βλέπουμε ότι τα μυρμήγκια είναι πολύ γρήγορα και τρώνε όλη την τροφή μέσα σε 73 ticks
και στο προηγούμενο μοντέλο, πριν εισάγουμε τη φερομόνη, είχαμε περίπου 128 ticks
Λοιπόν αυτό ήταν για την πρώτη εργασία, ελπίζω να χαρήκατε αυτό το φροντιστηριακό βίντεο και ανυπομονώ να τα πούμε την επόμενη φορά.