Sự tiến hóa của code [P1]

"... hãy nhớ rằng sau dòng chảy tiến hóa hơn 5 triệu năm đó, từ vượn người phương Nam tới loài người hiện đại, đã tạo ra một sinh vật với 98,4% gen giống loài tinh tinh. Thậm chí sự khác biệt về gen giữa loài ngựa và ngựa vằn, loài cá heo và cá heo mỏ còn nhiều hơn giữa chúng ta và các sinh vật lông lá mà tổ tiên xa xôi của chúng ta đã bỏ lại phía sau khi lên đường thống trị thế giới."

(Bill Bryson. Lược sử vạn vật. Alphabooks 2016)

Đây là bài lược dịch của mình về giải thuật di truyền. Bài viết được lấy cảm hứng và dịch từ chương 9 trong cuốn sách The Nature of Code của tác giả Daniel Shiffman. Tác giả sử dụng ngôn ngữ lập trình Java và phần mềm Processing cho cuốn sách của mình. Các bạn có thể tìm hiểu thêm về Processing tại đây.

Sự tiến hóa của code

Hãy dành một khoảnh khắc để nghĩ về một giai đoạn đơn giản hơn, khi bạn bắt đầu viết chương trình Processing đầu tiên và cuộc sống lúc đó thật đơn giản và dễ chịu. Một trong những khái niệm căn bản của lập trình mà bạn đã áp dụng cho các chương trình đầu tiên đó là gì? Đó chính là variables (biến). Variables cho phép bạn lưu dữ liệu và tái sử dụng dữ liệu đó trong suốt chương trình. Điều này dĩ nhiên là không có gì mới với chúng ta. Thực tế, chúng ta đã đi rất xa từ lúc chỉ sử dụng một hoặc hai variables cho đến tiến tới các cấu trúc dữ liệu phức tạp hơn rất nhiều – các variables là các đối tượng tùy chỉnh thứ mà bao gồm cả dữ liệu và chức năng (data & functionality).

Ở mỗi chương và mỗi ví dụ trong cuốn sách, các variables của các đối tượng tùy chỉnh này phải được khởi tạo. Có lẽ bạn đã từng tạo ra một loạt các particles với màu sắc và kích thước ngẫu nhiên hoặc một danh sách các đối tượng vehicles mà tất cả đều có chung một vị trí x, y trên màn hình. Nhưng thay vì hành động như là một “nhà thiết kế thông minh” (intelligent designers) và tự mình gán tính năng cho các đối tượng thông qua sự xem xét ngẫu nhiên hay thận trọng, chúng ta có thể để cho một tiến trình được tìm thấy trong tự nhiên – sự tiến hóa – quyết định giúp chúng ta.

Liệu chúng ta có thể xem rằng variables của một đối tượng như là DNA (Deoxyribonucleic acid) của đối tượng đó được không? Liệu chúng ta có thể mô phỏng được sự tiến hóa?

Câu trả lời cho tất cả các câu hỏi ở trên là có. Sau tất cả, chúng ta sẽ không thể tự xem mình là một nature – of – coder khi mà không thể mô phỏng được một trong những giải thuật quyền năng nhất được tìm thấy trong tự nhiên. Chương này sẽ thử nghiệm các nguyên lý đứng đằng sau sự tiến hóa sinh học và tìm cách để ứng dụng các nguyên lý đó vào lập trình.

Giải thuật di truyền: lấy cảm hứng từ những Sự kiện Thực tế

Một điều quan trọng cho chúng ta là làm rõ những mục tiêu của chương này. Chúng ta sẽ không đi sâu vào khoa học di truyền và tiến hóa như nó đang xảy ra trong thế giới thật. Chúng ta sẽ không tạo ra bảng Punnet (Punnett squares) và sẽ không có sự thảo luận nào tới nucleotides, tổng hợp protein (protein synthesis), RNA, và những chủ đề khác có liên quan tới tiến trình sinh học thực tế của sự tiến hóa. Thay vào đó, chúng ta sẽ nhìn vào những nguyên tắc căn bản (core principles) đứng đằng sau lý thuyết tiến hóa của Darwin (Darwinian evolutionary theory) và phát triển các mô hình giải thuật được lấy cảm hứng từ các nguyên tắc cơ bản này. Chúng ta không quan tâm tới một sự mô phỏng chính xác cho sự tiến hóa; thay vào đó; chúng ta quan tâm đến các phương pháp để áp dụng các chiến lược mang tính tiến hóa (evolutionary strategies) trong phần mềm.

Điều này không có ý rằng một project với một chiều sâu khoa học hơn thì không có giá trị, và tác giả khuyến khích những người đọc quan tâm cụ thể tới chủ đề này (thuyết tiến hóa) khám phá các khả năng để mở rộng thêm những ví dụ của cuốn sách với những tính năng tiến hóa khác. Tuy nhiên, để cho mọi thứ được quản lý tốt, chúng ta sẽ vẫn chỉ tập trung vào những cái cơ bản, những cái cơ bản này thực ra cũng đã khá là phức tạp và thú vị.

Thuật ngữ “giải thuật di truyền” là nói tới một giải thuật riêng biệt được thực thi theo một cách riêng biệt để giải quyết những vấn đề mang tính chất riêng biệt. Mặc dù giải thuật di truyền chính thống sẽ phục vụ như là nền tảng cho các ví dụ mà chúng ta tạo ra trong chương này, chúng ta không lo lắng về việc thực thi giải thuật với một sự chính xác hoàn hảo, mà chúng ta chỉ tìm kiếm những cách sử dụng sáng tạo cho lý thuyết tiến hóa trong chương trình của chúng ta. Chương này sẽ chia thành 3 phần (phần lớn thời gian sẽ tập trung ở phần đầu tiên).

 

Giải thuật di truyền truyền thống

Chúng ta sẽ bắt đầu với giải thuật di truyền truyền thống trong khoa học máy tính. Giải thuật này được phát triển để giải quyết các vấn đề trong đó không gian giải pháp rộng lớn đến mức một giải thuật "bạo lực" sẽ mất rất nhiều thời gian. Đây là một ví dụ như vậy: Tôi đang nghĩ về một số tự nhiên. Số này nằm từ 1 cho tới 1,000,000,000. Cần phải mất bao lâu để bạn đoán được số mà tôi đang nghĩ. Giải quyết vấn đề với một giải pháp “bạo lực” có nghĩa là sử dụng phương pháp kiểm tra mọi phương án. Một phải không? Hai phải không? Ba phải không? Và cứ tiếp tục như thế. Mặc dù may mắn cũng là một yếu tố ở đây, nhưng với phương pháp bạo lực - chúng ta phải kiên nhẫn chờ nhiều năm để bạn có thể đếm tới một tỉ. Tuy nhiên, sẽ như thế nào nếu tôi có thể nói với bạn rằng câu trả lời đó là tốt hay xấu. Gần đúng hay rất sai? Rất rất gần đáp án? Rất rất không chính xác? Nếu bạn có thể định tính được câu trả lời của mình “phù hợp” ở mức nào, bạn có thể chọn những con số khác gần hơn với đáp án và có thể đi đến câu trả lời nhanh hơn. Câu trả lời của bạn có thể cải thiện.

Lựa chọn tương tác (Interactive Selection)

Một khi chúng ta thiết lập được giải thuật truyền thống, chúng ta sẽ nhìn vào các ứng dụng của giải thuật di truyền sử dụng nghệ thuật trực quan. Lựa chọn tương tác đề cập đến việc phát triển một cái gì đó (thường là một hình ảnh được tạo ra bởi máy tính) thông qua tương tác người dùng. Giả sử bạn bước vào một bảo tàng tranh và nhìn thấy 10 bức tranh. Với lựa chọn tương tác, bạn sẽ chọn những bức họa mà mình yêu thích và cho phép giải thuật xử lý để tạo ra (hoặc phát triển) các bức tranh mới dựa trên sở thích của bạn.

Mô phỏng hệ sinh thái

Giải thuật di truyền khoa học máy tính truyền thống và kĩ thuật lựa chọn tương tác là những gì bạn sẽ tìm thấy nếu bạn tìm kiếm online hoặc đọc sách giáo khoa về trí thông minh nhân tạo. Nhưng như chúng ta sẽ sớm thấy, chúng không thực sự mô phỏng được tiến trình của sự tiến hóa trong một hệ sinh thái của các sinh vật giả lập. Làm thế nào để các đối tượng của chúng ta có thể di chuyển trên màn hình, gặp nhau, giao phối và truyền lại gen của chúng tới một thế hệ mới? Điều này sẽ ứng dụng một cách trực tiếp tới project Ecosystem ở cuối chương.

About Author

Chia sẻ bài viết

Leave a Comment

Your email address will not be published. Required fields are marked *