Pemrograman genetika adalah cara agar komputer menulis program untuk Anda!
Jangan berpikir "program" seperti MS Word, pikirkan "program" sebagai berikut:
function(x){ return x*2; }
Fungsi (atau program) ini, dengan sendirinya, tidak memiliki alasan untuk ada. Kami mencari solusi untuk masalah. Jika Anda perlu mencari jumlah dua angka, Anda cukup membuka kalkulator dan melakukan perhitungan. Bagaimana jika seseorang memberi Anda tabel berikut dan meminta Anda untuk mencari tahu hubungan antara result
dan x
dan 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
Data ini adalah data "pelatihan" Anda. Komputer Anda akan menggunakan data ini untuk menghasilkan beberapa hipotesis, maka Anda akan mengujinya terhadap data aktual.
Katakanlah Anda tidak tahu statistik dan memutuskan masalah ini terlalu sulit untuk dipecahkan sendiri, sehingga Anda akan mendapatkan komputer untuk mengetahuinya untuk Anda.
Apakah komputer secara acak menghasilkan tebakan liar
Anda memiliki komputer yang menghasilkan jutaan jawaban, dan lihat apakah ada di antara mereka (coba tebak ... satu juta kali!). Berikut ini adalah contoh dari beberapa tebakan:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
Anda mungkin atau mungkin tidak tahu ini, tetapi fungsi atau program juga dapat direpresentasikan sebagai pohon, misalnya, fungsi kedua adalah:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
Anda dapat membuatnya lebih seperti pohon dengan membuat indentasi seperti itu (btw, cari notasi semir terbalik dan sintaksis lisp ... tetapi Anda akan mengerti mengapa kami mewakili program seperti ini segera):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
berada di atas dengan dua "daun" dari /
dan y
. /
sendiri memiliki beberapa anak, dll.)
Inilah sebabnya mengapa Anda banyak membaca tentang "pohon" dalam pemrograman genetika. Dalam kasus apa pun, kami memasukkan nilai-nilai x
dan y
ke dalam fungsi ini dan itu memberi kami jawaban yang SALAH. Tidak mengherankan karena kami membuat ini secara acak.
Anda sekarang memutuskan untuk menghasilkan sejuta solusi semacam itu. Semuanya salah. Namun, Anda memperhatikan bahwa beberapa jawaban lebih dekat dengan jawaban yang benar daripada yang lain. Dengan kata lain, beberapa solusi lebih "cocok" daripada yang lain. Perhatikan bahwa komputer tidak tahu apa yang "benar" dan "salah" sehingga Anda harus menyediakan "fungsi kebugaran" Anda sendiri. Fungsi ini diberikan solusi potensial, data pelatihan, dan bertanggung jawab untuk memberi tahu sistem GP seberapa "pas" solusi ini. Seperti yang dapat Anda bayangkan, fungsi ini dijalankan jutaan kali.
Apa yang membuat GP berbeda
Inilah yang membuat pemrograman genetika berbeda dari tebakan liar. Anda memutuskan untuk melakukan satu lagi putaran tebakan; Namun, Anda melakukannya dengan lebih cerdas. Anda mengambil 10% tebakan teratas (tebakan yang mendekati nilai sebenarnya) dan menjadikannya bagian dari generasi kedua. Anda juga mengambil banyak dari solusi ini (mungkin 10% sama ... saya tidak ingat) dan memutuskan untuk "mencampurnya."
Anda secara acak memilih dua solusi, secara acak memilih sub-pohon dan mulai menukarnya. Jadi bagian dari solusi A berakhir di bawah solusi B dan sebaliknya - Anda baru saja "melewati" mereka. Anda juga mengambil beberapa solusi dan hanya "memutasikan" mereka ... mengambil subtree dan 'mengacaukannya' sedikit (hei, jika solusinya mengerikan, 'mengacaukannya tanpa alasan' mungkin benar-benar memperbaikinya).
Cara berpikir yang baik untuk hal ini adalah sebagai berikut: ibu dan ayah Anda memiliki atribut tertentu - warna rambut, tinggi, kemungkinan penyakit, dll. Anda, sebagai seorang anak mewarisi atribut yang berbeda dari kedua orang tua Anda. Jika kedua orang tua Anda adalah atlet olimpiade, Anda juga akan menjadi atlet super, bukan? Nah, ahli biologi, sosiolog, dan bahkan sejarawan mungkin mempermasalahkan gagasan ini, tetapi ilmuwan komputer tidak peduli dengan moralitas eugenika di sini. Mereka hanya melihat "sistem" melakukan pekerjaan yang cukup baik memberikan solusi, jadi mereka memutuskan untuk memodelkannya dalam perangkat lunak.
Jika itu tidak benar-benar cocok dengan biologi, tetapi masih memberikan jawaban yang baik ... banyak ilmuwan komputer secara kolektif mengatakan "apa pun Bung, dan terima kasih untuk terminologinya." Juga perhatikan bahwa semua saudara dan saudari Anda dan TIDAK PERSIS sama ... bahkan melalui mereka memiliki orang tua yang sama. Setiap orang memiliki gen yang bermutasi karena alasan apa pun (tolong jangan perlihatkan ini kepada seorang ahli biologi, intinya adalah untuk memahami motivasi di balik banyak terminologi).
Jadi sekarang kita mendapatkan komputer untuk menghasilkan jutaan program dan mengukur kebugaran mereka. Solusi terbaik bertahan ke generasi berikutnya. Kami juga "bermutasi" dan melakukan cross-over pada "populasi" (perhatikan bagaimana bahasa genetika dan biologi digunakan). Setelah generasi kedua diciptakan, kebugaran diukur kembali. Karena generasi ini memiliki solusi terbaik dari generasi sebelumnya DAN kami menyeberang dan bermutasi solusi terbaik (bersama dengan populasi biasa-biasa saja - untuk menjaga keragaman), generasi ini harus setidaknya sedikit lebih baik daripada generasi sebelumnya.
Kami melanjutkan ini untuk sejumlah generasi yang sangat besar. Setiap generasi (semoga) memberikan solusi yang lebih baik dan lebih baik, sampai kami mendapatkan jawaban yang tepat. Sebagai contoh:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
Nah lihat ini, ini benar!
(Saya menyalin ini dari http://en.wikipedia.org/wiki/Genetic_programming , yang juga memiliki representasi grafis dari pohon ini)
Barang sisa
Ada beberapa masalah penting, seperti bagaimana Anda memutuskan "terminal" ( +, -, *, /, cos, sin, tan
) yang tersedia untuk sistem GP Anda, bagaimana Anda menulis fungsi kebugaran dan bagaimana sistem menangani program-program yang tidak masuk akal seperti (1 + cos)
atau (2 / "hello")
(di antara banyak lainnya).
Sangat membosankan untuk mengembangkan persamaan. Semakin menarik jika set terminal Anda terlihat seperti berikut: (api, akal sehat, bergerak, ...) dan fungsi kebugaran Anda mengukur kesehatan Anda dan jumlah mayat monster bela diri.
Saya menulis sebagian besar ini dari memori tetapi ini adalah ide dasar. Saya melakukan beberapa GP di masa kuliah saya. Anda harus bermain-main dengannya. Jangan khawatir tentang memahami semua terminologi, cukup unduh beberapa sistem GP gratis, jalankan melalui beberapa contoh untuk merasakan dan membuat contoh menarik Anda sendiri (menemukan hubungan antara set data yang berbeda, mencoba menghubungkannya ke permainan API, dll.)