Ένα γρήγορο παράδειγμα γενετικής εξέλιξης σε JavaScript: Ας κάνουμε ένα μωρό.

«Η διαδικασία της μετάλλαξης είναι η μόνη γνωστή πηγή των νέων υλικών της γενετικής μεταβλητότητας, και επομένως της εξέλιξης». - Ντόμπζανσκι, 1957.

Οι αλγόριθμοι Genetic Evolution είναι πραγματικά συναρπαστικοί για μένα. Η ικανότητα προγραμματισμού εικονικού DNA είναι απλώς ένα εκπληκτικό επίτευγμα της επιστήμης των υπολογιστών. Η ικανότητα να γράφεις, σε κώδικα, τη θεωρία της εξέλιξης του Δαρβίνου και να βλέπεις πραγματικά ένα μοντέλο Survival of the Fittest σε δράση είναι απίστευτη.

Ποτέ δεν άγγιξα τους γενετικούς αλγόριθμους και αποφάσισα ότι ήρθε η ώρα να ξεκινήσω. Και ποιο καλύτερο μέρος για να ξεκινήσετε από το πραγματικό, ξεκινήστε, σωστά; Σε αυτό το σεμινάριο θα δημιουργήσω ένα "stick" και αυτό το stick θέλει να φτάσει σε έναν "κύκλο". Συνάγετε από αυτό που θα θέλατε, αλλά γράφω σεμινάρια φιλικά προς την οικογένεια και θα παραμείνει έτσι.

Παίρνω απίστευτα μεγάλη επιρροή από το The Coding Train: Coding Challenge # 29 ως έμπνευση για αυτό. Συνδεθείτε εδώ. Εμπνεύστηκε από τα Smart Rockets, οπότε ενώ δεν κάνω κάτι νέο ή πρωτότυπο, ελπίζω να χρησιμεύσει ως παράδειγμα ενός αλγορίθμου γενετικής εξέλιξης. Χρησιμοποιώ τη βιβλιοθήκη P5.JS, που θα συνοψίσω ως οπτική βιβλιοθήκη JavaScript.

Προτού μπορώ να δημιουργήσω οποιοδήποτε είδος γενετικού αλγορίθμου, πρέπει πρώτα να ρυθμίσω την πραγματική ρύθμιση. Πρώτα δημιουργώ μια πολύ απλή σελίδα HTML.

Έχω δύο βιβλιοθήκες για το P5. Ο κύριος χειρίζεται το σχέδιο στην οθόνη, την παρουσίαση των μεταβλητών κ.λπ. Ένα ραβδί είναι η γραμμή που θα εξελίσσεται, ένας πληθυσμός είναι μια συλλογή ραβδιών και το dna είναι αυτό που θα θεωρούσα τον πυρήνα του γενετικού αλγορίθμου. Ας ρίξουμε μια ματιά στον κώδικα για το Stick:

Έτσι, ένα ραβδί έχει μερικά βασικά χαρακτηριστικά. Πρέπει να είναι σε θέση να κινηθεί, οπότε έχει μια κίνηση «κινητήρα» (που θέλει έναν καλύτερο όρο) στις μεταβλητές ταχύτητας, επιτάχυνσης και θέσης. Προς το παρόν, όλη η κίνηση ελέγχεται από τη μυστηριώδη λειτουργία του DNA. Πριν φτάσουμε στο DNA, ας ρίξουμε μια ματιά στον πληθυσμό:

Ο πληθυσμός δεν είναι πραγματικά τόσο ενδιαφέρον. Δημιουργεί 25 ραβδιά, τα οποία πιστεύω ότι είναι επαρκή για έναν πληθυσμό και στη συνέχεια τα μετακινεί στην οθόνη. Χωρίς εμπόδια με αυτήν τη λειτουργία! DNA:

Σε αυτό το σημείο, το DNA ουσιαστικά δεν κάνει τίποτα. Ένα ραβδί παίρνει ένα DNA και ένα DNA έχει ένα σύνολο 200 γονιδίων, το οποίο είναι η διάρκεια ζωής για το μικρό μου ραβδί. Μην ανησυχείτε, θα προστεθούν περισσότερα σε εύθετο χρόνο. Το κύριο αρχείο:

Έτσι ο Μάιν κάνει αρκετά πράγματα εδώ. Πρώτον, πρέπει να δημιουργήσουμε μια νέα γενιά ραβδιών, η οποία αποτελεί ένα παράδειγμα πληθυσμού και, στη συνέχεια, δημιουργούμε τον κύκλο μας, τον οποίο τα ραβδιά θα στοχεύουν αργότερα. Στη συνέχεια, πλησιάζουμε τα πάντα στην οθόνη, με την πρόσθετη ικανότητα να σκοτώνουμε και να δημιουργούμε μια νέα γενιά, κάθε φορά που τελειώνει ο κύκλος ζωής τους.

Αν λοιπόν το τρέξουμε όπως είναι σήμερα, το παίρνουμε:

Τα μπερδεμένα μικρά μπαστούνια

Τώρα σε αυτό το σημείο, δεν είναι καθόλου γενετικός αλγόριθμος. Αντ 'αυτού, είναι ένα σύνολο ραβδιών που κινούνται σε τυχαία επιλεγμένα διανύσματα, με μια κουκκίδα στην οθόνη. Ας προσθέσουμε λοιπόν το γενετικό μέρος.

Θέλουμε λοιπόν το ραβδί που το καθιστά το πιο μακρινό, πιο κοντά στον κύκλο, να είναι το ραβδί που μεταδίδει τα γονίδια του στα παιδιά του. Αυτή είναι βασικά η επιβίωση του πιο κατάλληλου: όποιος επιβιώνει το μεγαλύτερο, είναι αυτός που μεταδίδει τα γονίδιά του.

Έτσι μπορούμε να αρχίσουμε να το εφαρμόζουμε δίνοντας σε κάθε ραβδί μια νέα μεταβλητή: fitness.

var fitness = 0

Η φυσική κατάσταση υπολογίζεται από την τρέχουσα θέση του ραβδιού, σε σχέση με τη θέση του κύκλου (στόχος). Μπορούμε να το εφαρμόσουμε ως συνάρτηση, για να υπολογίσουμεFitness σε κάθε ραβδί.

this.calculateFitness = συνάρτηση () {
var απόσταση = dist (this.pos.x, this.pos.y, target.x, target.y)
αυτό. μαρτυρία = 1 / απόσταση
}

Τώρα, έχουμε μπαστούνια που έχουν βαθμολογία φυσικής κατάστασης - δηλαδή έχουν καλύτερα γονίδια, επειδή επέζησαν περισσότερο. Τώρα λοιπόν χρειαζόμαστε έναν τρόπο να μπορούμε να αναπαράγουμε αυτά τα ραβδιά με γονίδια ανώτερης βαθμίδας. Μπείτε στην πισίνα:

Έτσι, αυτή η ομάδα είναι σχετικά απλή ιδέα. Έχουμε ήδη καταλάβει ότι τα πιο επιτυχημένα γονίδια είναι αυτά που είναι πιο κοντά στον κύκλο. Όσο πιο κοντά είναι το ραβδί, τόσο περισσότερες φορές θα εισαχθεί το γονιδίωμα στην πισίνα και τόσο πιο πιθανό είναι να αναπαραχθεί. Ένα ραβδί που το έκανε 5% του τρόπου θα έχει 5% πιθανότητα αναπαραγωγής, ενώ ένα ραβδί που το έκανε 70% του τρόπου, έχει 70% πιθανότητα αναπαραγωγής. Ελπίζω να το εξήγησα αρκετά καλά. Πιο επιτυχημένο stick = καλύτερη πιθανότητα να αναγεννηθεί ως μέρος ενός νέου stick.

Τα παραπάνω είναι δύο νέες λειτουργίες. Η επιλογή είναι, όπως θα υπονοούσε το όνομα, η επιλογή των γονικών γονιδίων από την ομάδα γονιδίων. Αυτά τα γονίδια στη συνέχεια συνδυάζονται για να σχηματίσουν ένα νέο DNA σε διασταύρωση, το οποίο με τη σειρά του αποδίδεται στη νέα ράβδο! Αυτό είναι λίγο πολύ, καθώς θέλουμε να το διατηρήσουμε σχετικά απλό και στοιχειώδες.

Πολύ ωραίο, τα ραβδιά μας μπορούν πλέον να εκμεταλλευτούν τις δυνατότητες των προκατόχων τους και να τα χρησιμοποιήσουν για να βρουν τον κύκλο! Αν το δούμε τώρα σε δράση:

Τα ακόμα μπερδεμένα αλλά ελαφρώς πιο έξυπνα μπαστούνια.

Μετά από αρκετές δεκάδες επαναλήψεις, αρχίζει να μοιάζει να πεθαίνουν, καθώς μόνο μερικές γραμμές είναι ορατές. Αλλά αυτό δεν συμβαίνει: όσο πιο ελαφρύ είναι το ραβδί, σημαίνει ότι πολλά ραβδιά ακολουθούν την ίδια ακριβώς διαδρομή. Αυτό είναι αναμενόμενο, καθώς έχουμε μια σχετικά περιορισμένη ομάδα γονιδίων.

Το πολύ έξυπνο άλφα κολλά.

Όσο περισσότερο αφήνεται να τρέχει, τόσο περισσότερο θα εμφανίζεται μόνο ένα ραβδί στην οθόνη. Αυτό το ραβδί αντιπροσωπεύει το βέλτιστο ραβδί! Το επιλεγμένο ραβδί. Εδώ είναι, το αποκορύφωμα του γενετικού αλγορίθμου μας:

Genius stick (ες)!

Αυτός είναι λοιπόν ένας αλγόριθμος γενετικής εξέλιξης, γραμμένος εντελώς στο πρόγραμμα περιήγησης! Σίγουρα δεν είναι ένα τέλειο παράδειγμα γενετικής εξέλιξης, αλλά είναι ένα καλό παράδειγμα της εργασίας. Το μικρό μας ραβδί μπορεί τώρα να πάρει τον κύκλο και αυτό που ακολουθεί στη συνέχεια, δεν είναι θέμα για σήμερα.

Όπως αναφέρθηκε στην αρχή, αυτό επηρεάζεται σε μεγάλο βαθμό από το The Coding Train. Σύνδεσμος με το repo τους.

Ο πλήρης κωδικός μου.