Lập trình di truyền là một cách để máy tính viết chương trình cho bạn!
Đừng nghĩ "chương trình" như MS Word, hãy nghĩ về "chương trình" như sau:
function(x){ return x*2; }
Hàm này (hoặc chương trình), tự nó, không có lý do để tồn tại. Chúng tôi đang tìm kiếm giải pháp cho các vấn đề. Nếu bạn cần tìm tổng của hai số, bạn chỉ cần mở máy tính và làm toán. Có gì nếu ai đó đưa cho bạn bảng sau và hỏi bạn để tìm ra mối quan hệ giữa result
và x
và y
:
x y result
99 1 (3.02)
79 88 2.01
21 62 5.01
84 52 (6.58)
12 70 5.54
67 18 0.73
Dữ liệu này là dữ liệu "đào tạo" của bạn. Máy tính của bạn sẽ sử dụng dữ liệu này để tạo ra một số giả thuyết, sau đó bạn sẽ kiểm tra nó dựa trên dữ liệu thực tế.
Giả sử bạn không biết số liệu thống kê và quyết định vấn đề này quá khó để tự mình tìm ra, vì vậy bạn sẽ có máy tính để tìm ra nó cho bạn.
Có máy tính ngẫu nhiên tạo ra các dự đoán hoang dã
Bạn có máy tính tạo ra một triệu câu trả lời và xem liệu có câu nào trong số chúng không (đoán ... một triệu lần!). Sau đây là một ví dụ về một vài dự đoán:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
Bạn có thể biết hoặc không biết điều này, nhưng các chức năng hoặc chương trình cũng có thể được biểu diễn dưới dạng cây, ví dụ, chức năng thứ hai sẽ là:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
Bạn có thể làm cho nó trông giống như một cái cây bằng cách thụt vào như vậy (btw, tra cứu ký hiệu đánh bóng ngược và cú pháp lisp ... nhưng bạn sẽ hiểu tại sao chúng tôi đại diện cho các chương trình như thế này trong thời gian ngắn):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
ở trên cùng với hai "lá" /
và y
. /
Bản thân nó có nhiều con, v.v.)
Đây là lý do tại sao bạn đọc rất nhiều về "cây" trong lập trình di truyền. Trong mọi trường hợp, chúng tôi cắm các giá trị của x
và y
vào hàm này và nó cho chúng ta câu trả lời SAU. Không có gì đáng ngạc nhiên vì chúng tôi ngẫu nhiên tạo ra điều này.
Bây giờ bạn quyết định tạo ra một triệu giải pháp như vậy. Tất cả đều sai. Tuy nhiên, bạn nhận thấy rằng một số câu trả lời gần với câu trả lời đúng hơn những câu trả lời khác. Nói cách khác, một số giải pháp "phù hợp" hơn những giải pháp khác. Lưu ý rằng máy tính không biết "đúng" và "sai" là gì, do đó bạn phải cung cấp "chức năng thể dục" của riêng mình. Chức năng này được trao một giải pháp tiềm năng, dữ liệu đào tạo và chịu trách nhiệm cho hệ thống GP biết mức độ "phù hợp" của giải pháp này. Như bạn có thể tưởng tượng, chức năng này được chạy hàng triệu lần.
Điều gì làm cho GP khác biệt
Đây là những gì làm cho lập trình di truyền khác với dự đoán hoang dã. Bạn quyết định thực hiện một vòng triệu lần đoán khác; tuy nhiên, bạn làm điều đó thông minh hơn một chút. Bạn lấy 10% dự đoán hàng đầu (những dự đoán gần với giá trị thực) và biến chúng thành một phần của thế hệ thứ hai. Bạn cũng thực hiện nhiều giải pháp này (có thể là 10% giống nhau ... tôi không nhớ) và quyết định "trộn chúng lại".
Bạn chọn ngẫu nhiên hai giải pháp, chọn ngẫu nhiên các cây con và bắt đầu hoán đổi chúng. Vì vậy, một phần của giải pháp A kết thúc theo giải pháp B và ngược lại - bạn chỉ cần "vượt qua" chúng. Bạn cũng thực hiện một số giải pháp và chỉ đơn giản là "biến đổi" chúng ... lấy một số cây con và 'vặn nó lên' một chút (hey, nếu giải pháp đó tồi tệ, 'vặn vẹo nó không vì lý do gì' thực sự có thể cải thiện nó).
Một cách nghĩ tốt về điều này là như sau: mẹ và bố bạn có những thuộc tính nhất định - màu tóc, chiều cao, khả năng mắc bệnh, v.v ... Bạn, khi còn nhỏ, thừa hưởng những thuộc tính khác nhau từ cả bố và mẹ. Nếu cả hai cha mẹ bạn đều là vận động viên olympic, bạn cũng sẽ là một vận động viên siêu hạng, phải không? Vâng, các nhà sinh học, nhà xã hội học và thậm chí các nhà sử học có thể có vấn đề với ý tưởng này, nhưng các nhà khoa học máy tính không quan tâm đến đạo đức của thuyết ưu sinh ở đây. Họ chỉ thấy một "hệ thống" làm một công việc khá tốt cung cấp giải pháp, vì vậy họ quyết định mô hình hóa nó trong phần mềm.
Nếu nó không thực sự phù hợp với sinh học, nhưng vẫn cung cấp câu trả lời tốt ... nhiều nhà khoa học máy tính nói chung "bất cứ điều gì anh chàng, và cảm ơn về thuật ngữ." Cũng lưu ý rằng tất cả các anh chị em của bạn và không hoàn toàn giống nhau ... thậm chí thông qua họ có cùng cha mẹ. Mỗi người có các gen đột biến vì bất kỳ lý do gì (xin đừng trình bày điều này với một nhà sinh vật học, vấn đề là phải hiểu động lực đằng sau phần lớn thuật ngữ).
Vì vậy, bây giờ chúng tôi đang có được máy tính để tạo ra hàng triệu chương trình và đo lường sức khỏe của họ. Các giải pháp tốt nhất tồn tại vào thế hệ tiếp theo. Chúng tôi cũng "đột biến" và thực hiện giao thoa với "dân số" (chú ý cách sử dụng ngôn ngữ di truyền và sinh học). Một khi thế hệ thứ hai được tạo ra, thể dục một lần nữa được đo. Vì thế hệ này có các giải pháp tốt nhất từ thế hệ trước VÀ chúng tôi đã vượt qua và biến đổi các giải pháp tốt nhất (cùng với dân số tầm thường - để theo kịp sự đa dạng), thế hệ này nên tốt hơn một chút so với thế hệ trước.
Chúng tôi tiếp tục điều này cho một số lượng lớn các thế hệ. Mỗi thế hệ (hy vọng) cung cấp các giải pháp tốt hơn và tốt hơn, cho đến khi chúng tôi có được câu trả lời đúng. Ví dụ:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
Vâng nhìn vào điều này, điều này là chính xác!
(Tôi đã sao chép từ http://en.wikipedia.org/wiki/Genetic_programming , cũng có một hình đại diện của cây này)
Vụn vặt
Có một số vấn đề quan trọng, như làm thế nào để bạn quyết định "thiết bị đầu cuối" ( +, -, *, /, cos, sin, tan
) nào có sẵn cho hệ thống GP của bạn, cách bạn viết chức năng tập thể dục và cách hệ thống xử lý các chương trình không nhạy cảm như (1 + cos)
hoặc (2 / "hello")
(trong số nhiều thiết bị khác).
Nó là khá nhàm chán để phát triển phương trình. Sẽ thú vị hơn nếu bộ thiết bị đầu cuối của bạn trông giống như sau: (lửa, cảm giác kẻ thù, di chuyển, ...) và chức năng thể dục của bạn đo lường sức khỏe của bạn và số xác chết của quái vật võ thuật.
Tôi đã viết hầu hết những điều này từ bộ nhớ nhưng đây là ý tưởng cơ bản. Tôi đã làm một số GP trong những năm đại học của tôi. Bạn chắc chắn nên chơi xung quanh với nó. Đừng lo lắng về việc hiểu tất cả các thuật ngữ, chỉ cần tải xuống một số hệ thống GP miễn phí, chạy qua một vài ví dụ để cảm nhận về nó và tạo ra các ví dụ thú vị của riêng bạn (tìm mối quan hệ giữa các bộ dữ liệu khác nhau, cố gắng nối nó với trò chơi API, v.v.)