Một ví dụ nhanh về tiến hóa di truyền trong JavaScript: Hãy tạo ra em bé.

Quá trình đột biến là nguồn duy nhất được biết đến của các vật liệu mới về sự biến đổi di truyền, và do đó tiến hóa. - Dobzhansky, 1957.

Các thuật toán tiến hóa di truyền thực sự hấp dẫn đối với tôi. Khả năng lập trình DNA ảo chỉ là một kỳ tích phi thường của khoa học máy tính. Khả năng viết, theo mã, lý thuyết tiến hóa của Darwin và thực sự thấy một mô hình Survival of the Fittest đang hoạt động chỉ là đáng kinh ngạc.

Tôi chưa bao giờ thực sự chạm vào các thuật toán di truyền trước đây và quyết định đã đến lúc tôi bắt đầu. Và nơi nào tốt hơn để bắt đầu hơn thực tế, bắt đầu, phải không? Trong hướng dẫn này, tôi sẽ tạo ra một 'cây gậy' và cây gậy đó muốn đạt đến một 'vòng tròn'. Suy ra từ những gì bạn sẽ, nhưng tôi viết hướng dẫn thân thiện với gia đình và nó sẽ giữ nguyên như vậy.

Tôi đang chịu ảnh hưởng vô cùng nặng nề từ The Coding Train: Coding Challenge # 29 làm nguồn cảm hứng cho việc này. Liên kết với nó ở đây. Anh ấy được truyền cảm hứng bởi Smart Rockets, vì vậy trong khi tôi không tạo ra bất cứ điều gì mới hay nguyên bản, tôi hy vọng nó sẽ là một ví dụ về thuật toán tiến hóa di truyền. Tôi đang sử dụng thư viện P5.JS, mà tôi sẽ tóm tắt là thư viện JavaScript trực quan.

Trước khi tôi có thể tạo bất kỳ loại thuật toán di truyền nào, trước tiên tôi cần thiết lập cài đặt thực tế. Đầu tiên tôi tạo một trang HTML rất đơn giản.

Tôi có hai thư viện cho P5. Main xử lý bản vẽ ra màn hình, khởi tạo các biến, v.v. Một cây gậy là dòng sẽ phát triển, dân số là một tập hợp các que và dna là những gì tôi sẽ xem xét cốt lõi của thuật toán di truyền. Chúng ta hãy xem mã cho Stick:

Vì vậy, một cây gậy có một số tính năng cơ bản. Nó phải có khả năng di chuyển, do đó, nó có một chuyển động 'động cơ' (vì muốn có một thuật ngữ tốt hơn) trong các biến số vận tốc, gia tốc và vị trí. Hiện tại tất cả các chuyển động được kiểm soát bởi chức năng DNA bí ẩn. Trước khi chúng ta đến DNA, chúng ta hãy xem dân số:

Dân số thực sự không thú vị. Nó tạo ra 25 cây gậy, mà tôi tin là đủ cho một dân số, và sau đó di chuyển chúng trên màn hình. Phá vỡ mọi rào cản với chức năng này! DNA:

Tại thời điểm này, DNA về cơ bản không có gì. Một cây gậy có được một DNA và một DNA có bộ 200 gen, đó là chiều dài tuổi thọ cho cây gậy nhỏ của tôi. Đừng lo lắng, nhiều hơn sẽ được thêm vào trong khóa học do. Tệp chính:

Vì vậy, Main đang làm một vài điều công bằng ở đây. Đầu tiên, chúng ta cần tạo ra một thế hệ gậy mới, đó là sự khởi tạo dân số, và sau đó chúng ta tạo ra vòng tròn của mình, mà gậy sẽ nhắm đến sau này. Sau đó, chúng tôi đang vẽ mọi thứ lên màn hình, với khả năng giết thêm và tạo ra một thế hệ mới, mỗi khi vòng đời của chúng kết thúc.

Vì vậy, nếu chúng ta chạy nó như hiện tại, chúng ta sẽ nhận được điều này:

Những cây gậy nhỏ bối rối

Bây giờ, tại thời điểm này, nó thực sự không phải là một thuật toán di truyền. Thay vào đó, nó là một bộ gậy di chuyển tại các vectơ được chọn ngẫu nhiên, với một dấu chấm được vẽ trên màn hình. Vì vậy, hãy thêm phần di truyền.

Vì vậy, chúng tôi muốn cây gậy làm cho nó xa nhất, gần nhất với vòng tròn, là cây gậy truyền gen của nó cho con của nó. Đây là cơ bản sống sót của kẻ mạnh nhất: bất cứ ai sống sót lâu nhất, là người truyền gen của họ.

Vì vậy, chúng ta có thể bắt đầu thực hiện điều này bằng cách cung cấp cho mỗi thanh một biến mới: thể dục.

thể lực var = 0

Thể lực sẽ được tính theo vị trí hiện tại của cây gậy, liên quan đến vị trí của vòng tròn (mục tiêu). Chúng ta có thể thực hiện điều này như là một hàm, để tính toán Nhân chứng trên mỗi thanh.

this.calculateFitness = function () {
var distance = dist (this.pose.x, this.pose.y, target.x, target.y)
this .fitness = 1 / khoảng cách
}

Bây giờ, chúng ta có những cây gậy có xếp hạng thể lực - tức là chúng có gen tốt hơn, vì chúng sống sót lâu hơn. Vì vậy, bây giờ chúng ta cần một cách để có thể tái tạo những cây gậy đó với các gen hàng đầu. Vào, hồ bơi:

Vì vậy, nhóm này là tương đối thẳng về phía trước trong khái niệm. Chúng tôi đã tìm ra ở trên rằng các gen thành công nhất là những gen gần nhất với vòng tròn. Cây gậy càng ở gần thì bộ gen của nó sẽ được đưa vào bể bơi càng nhiều lần và càng có khả năng sinh sản. Một cây gậy làm cho nó 5% theo cách sẽ có 5% cơ hội để sinh sản, trong khi một cây gậy làm cho nó 70% theo cách đó, có 70% cơ hội để sinh sản. Tôi hy vọng tôi đã giải thích điều đó đủ tốt. Cây gậy thành công hơn = cơ hội tốt hơn để được tái sinh như một phần của cây gậy mới.

Trên đây là hai chức năng mới. Chọn lọc, đúng như tên gọi, chọn các gen bố mẹ từ nhóm gen. Những gen này sau đó được kết hợp để tạo thành một DNA mới trong chéo, sau đó lần lượt được gán cho cây gậy mới! Đó là khá nhiều, vì chúng tôi muốn giữ điều này tương đối đơn giản và thô sơ.

Khá tuyệt, gậy của chúng tôi giờ đây có thể tận dụng tốt nhất các khả năng của người tiền nhiệm và sử dụng chúng để tìm vòng tròn! Nếu bây giờ chúng ta nhìn vào nó trong hành động:

Các gậy vẫn còn nhầm lẫn nhưng thông minh hơn một chút.

Sau vài chục lần lặp lại, nó bắt đầu trông giống như chúng đã chết dần, vì chỉ có một vài dòng được nhìn thấy. Nhưng đó không phải là trường hợp: cây gậy càng nhẹ, có nghĩa là nhiều cây gậy đang đi theo cùng một con đường. Điều này được mong đợi, vì chúng ta có một nhóm gen tương đối hạn chế.

Rất thông minh, gậy alpha.

Thời gian chạy càng lâu, sẽ càng xuất hiện chỉ một thanh trên màn hình. Cây gậy này đại diện cho cây gậy tối ưu! Cây gậy được chọn. Họ đang ở đây, đỉnh cao của thuật toán di truyền của chúng tôi:

Cây gậy thiên tài!

Vì vậy, đó là một thuật toán tiến hóa di truyền, được viết hoàn toàn trong trình duyệt! Đó không phải là một ví dụ hoàn hảo về tiến hóa di truyền, chắc chắn, nhưng nó là một ví dụ tốt về nó trong công việc. Cây gậy nhỏ của chúng ta bây giờ có thể đi vào vòng tròn và những gì tiếp theo, không phải là một chủ đề cho ngày hôm nay.

Như đã đề cập ở phần đầu, điều này chịu ảnh hưởng rất nhiều từ The Coding Train. Liên kết với repo của họ.

Mã đầy đủ của tôi.