mata utama
Retak Maklumat Tidak Diketahui
Masa adalah 2369 tahun, dan manusia telah tersebar di seluruh Laut Bintang. Anda seorang doktor muda dan pintar yang ditempatkan di pangkalan bintang yang sibuk, sibuk dengan pelancong, pedagang, dan pelanggar sekali-sekala. Tidak lama selepas anda tiba, penjaga kedai di pangkalan menjadi berminat dengan anda. Dia mendakwa dia hanya tukang jahit yang mudah, tetapi khabar angin mengatakan bahawa dia adalah ejen rahsia yang bekerja untuk rejim yang sangat jahat.Anda mula makan tengah hari bersama -sama setiap minggu, membincangkan topik dari politik ke puisi. Walaupun selepas beberapa bulan, anda masih tidak pasti sama ada dia menyatakan perasaan romantis atau mengambil rahsia (anda pasti tidak mempunyai rahsia). Mungkin kedua -duanya.
suatu hari semasa makan tengah hari, dia mencabar anda: "Saya mempunyai mesej untuk memberitahu anda, Doktor yang dikasihi! Saya pasti tidak dapat memberitahu anda apa itu. Tetapi saya memberitahu anda, itu 12 watak panjang. Watak -watak ini boleh menjadi apa -apa Surat, ruang tulis
Anda kembali ke pejabat di kabin perubatan, masih memikirkan apa yang baru saja dia katakan. Tiba -tiba, eksperimen simulasi penjujukan gen yang pernah anda jalankan di komputer berdekatan memberi anda idea. Anda bukan pakar penyahsulitan kata laluan, tetapi mungkin anda boleh menggunakan kepakaran anda dalam genetik untuk menguraikan maklumatnya!
Beberapa teori
Seperti yang saya nyatakan pada mulanya, algoritma genetik adalah program yang menggunakan operasi yang mendorong evolusi untuk mencari penyelesaian. Selepas banyak lelaran, algoritma memilih calon terbaik (meneka) dari satu set penyelesaian yang mungkin, rekombinasi mereka, dan cek yang kombinasi menjadikannya lebih dekat dengan penyelesaiannya. Calon yang lemah akan dibuang. Di tempat kejadian di atas, mana-mana watak dalam mesej rahsia boleh menjadi A-Z, ruang atau tanda baca asas. Katakan ini memberi kita 32 aksara "abjad" berikut: abcdefghijklmnopqrstuvwxyz -.,!? mereka betul. Ia mengambil masa terlalu lama untuk memeriksa setiap kemungkinan. Sebaliknya, algoritma genetik akan secara rawak memilih 12 aksara dan meminta tukang jahit/mata -mata untuk menilai sejauh mana hasilnya adalah maklumatnya. Ini lebih berkesan daripada carian kekerasan, kerana skor membolehkan kita menyempurnakan calon masa depan. Maklum balas membolehkan kita mengukur kecergasan setiap tekaan dan diharapkan mengelakkan masa membuang -buang waktu mati.
Katakan kami membuat tiga teka -teki: HOMLK? WSRZDJ, BGK KA! QTPXC dan XELPOCV.XLF!. Calon pertama menjaringkan 248.2, yang kedua ialah 632.5, dan yang ketiga ialah 219.5. Skor cara dikira bergantung kepada keadaan, yang akan kita bincangkan kemudian, tetapi sekarang mari kita anggap ia berdasarkan sisihan antara calon dan maklumat sasaran: skor sempurna adalah 0 (iaitu tidak ada sisihan; calon dan sasarannya adalah sama), skor yang lebih tinggi bermakna sisihan yang lebih besar. Teka -teki dengan skor 248.2 dan 219.5 lebih dekat dengan kandungan maklumat rahsia daripada tekaan dengan skor 635.5.
Tebakan masa depan dibuat melalui gabungan percubaan terbaik. Terdapat banyak cara untuk menggabungkan calon, tetapi sekarang kita menganggap pendekatan crossover mudah: setiap watak dalam tekaan baru mempunyai kebarangkalian 50-50 yang disalin dari calon induk pertama atau kedua. Sekiranya kita mengambil dua teka -teki HOMLK? WSRZDJ dan XELPOCV.XLF!, Maka watak pertama calon keturunan kita mempunyai kebarangkalian 50% H, kebarangkalian 50% X, dan watak kedua akan O atau E, dan, dan E, Jadi pada. Anak mungkin hello? W.RLD!. Menjana calon baru dengan crossover
Tunjukkan beberapa kod! Saya mengesyaki bahawa diberikan gambaran keseluruhan dan senarai istilah, anda mungkin tergoda untuk melihat beberapa kod sekarang. Oleh itu, mari kita lihat beberapa kod JavaScript yang menyelesaikan masalah maklumat rahsia kami. Semasa proses bacaan, saya menjemput anda untuk memikirkan kaedah mana yang boleh dianggap sebagai "kod boilerplate" dan pelaksanaan mana yang lebih dekat dengan masalah yang kita cuba selesaikan: Kami mula -mula menentukan objek data calon, hanya untuk memasangkan kromosom dengan skor kecergasan mereka. Untuk kemudahan, kaedah penyortiran statik juga dilampirkan; Seterusnya, kami mempunyai kelas genetikalgoritma yang melaksanakan algoritma genetik itu sendiri. Pembina menggunakan objek yang menyelesaikan pelbagai parameter yang diperlukan untuk simulasi. Ia menyediakan cara untuk menentukan abjad genetik, mesej sasaran, dan parameter lain yang menentukan kekangan di mana simulasi akan dijalankan. Dalam contoh di atas, kami menjangkakan populasi 100 calon setiap generasi. Dari ini, hanya 40 kromosom yang akan dipilih untuk pembiakan. Kami mempunyai peluang 3% untuk memperkenalkan mutasi, dan apabila ia berlaku, kami akan menukar sehingga dua gen. Nilai maxgenerations digunakan sebagai langkah perlindungan; Perlu dinyatakan bahawa populasi, saiz pemilihan dan jumlah maksimum umur yang disediakan semasa menjalankan algoritma agak kecil. Masalah yang lebih kompleks mungkin memerlukan ruang carian yang lebih besar, yang seterusnya meningkatkan penggunaan memori algoritma dan masa yang diperlukan untuk dijalankan. Walau bagaimanapun, sangat disyorkan untuk menggunakan parameter varian yang lebih kecil. Sekiranya mereka terlalu besar, kami kehilangan apa -apa manfaat calon pembiakan berdasarkan kecergasan, dan simulasi mula menjadi carian rawak. Kaedah seperti rawak (), init (), dan run () boleh dianggap boilerplate. Tetapi hanya kerana terdapat boilerplate tidak bermakna ia tidak akan memberi kesan praktikal terhadap simulasi. Sebagai contoh, algoritma genetik menggunakan rawak berat. Walaupun fungsi matematik terbina dalam () sesuai untuk tujuan kami, untuk isu-isu lain, anda memerlukan penjana rawak yang lebih tepat. Crypto.GetRandomValues () menyediakan nilai rawak kriptografi yang lebih kuat. Prestasi juga merupakan pertimbangan. Saya berusaha untuk menjadi jelas dan mudah difahami dalam artikel ini, tetapi ingat bahawa operasi akan diulang. Anda mungkin mendapati diri anda perlu mengoptimumkan kod mikro dalam gelung, menggunakan struktur data memori yang lebih efisien, dan menyamakan kod dan bukannya memisahkannya ke dalam fungsi/kaedah, semuanya tanpa mengambil kira bahasa pelaksanaan anda. pelaksanaan calcfitness (), pilih (), menghasilkan semula () dan juga berhenti () adalah khusus untuk masalah yang kita cuba selesaikan. calcfitness () mengembalikan nilai yang mengukur kecergasan kromosom berdasarkan kriteria yang diharapkan -dalam kes kami, seberapa baik ia sepadan dengan mesej rahsia. Pengiraan kecergasan hampir selalu menjadi spesifik keadaan; Sebagai contoh, saya boleh mengira jarak Hamming atau jarak levinstein antara dua nilai, dan juga menggabungkan pelbagai ukuran. Akhirnya, adalah penting bahawa fungsi kecergasan mengembalikan pengukuran yang berguna berdasarkan masalah di tangan, bukan hanya boolean "sesuai"/"tidak sesuai". Pilih () Kaedah Menunjukkan strategi pemilihan elit -hanya calon yang paling sesuai di seluruh penduduk dipilih untuk pembiakan. Seperti yang saya nyatakan sebelum ini, terdapat strategi lain, seperti pemilihan kejohanan, yang memilih calon yang paling sesuai dari set calon individu dalam populasi, dan pemilihan Boltzmann, yang mengenakan calon yang semakin besar dan lebih besar mengenai pemilihan tekanan calon. Tujuan kaedah yang berbeza ini adalah untuk memastikan bahawa kromosom mempunyai peluang untuk menyampaikan gen yang boleh membuktikan bermanfaat kemudian, walaupun ia tidak dapat dilihat dengan segera. Penerangan mendalam tentang strategi pemilihan ini dan lain-lain, serta pelaksanaan contoh, mudah dijumpai dalam talian.
Aplikasi praktikal algoritma genetik
Setakat ini, anda harus mempunyai pemahaman asas tentang apa algoritma genetik dan cukup akrab dengan perbendaharaan kata mereka untuk mentafsir apa -apa sumber yang mungkin anda hadapi dalam penyelidikan anda sendiri. Walau bagaimanapun, memahami teori dan istilah hanya separuh kerja. Jika anda merancang untuk menulis algoritma genetik anda sendiri, anda juga mesti memahami masalah khusus anda. Sebelum anda memulakan, berikut adalah beberapa soalan penting untuk bertanya kepada diri sendiri: Saya harap saya juga membantu anda memahami bagaimana program menarik inspirasi dari alam semula jadi -bukan hanya dalam bentuk, tetapi juga dalam proses dan fungsi. Jangan ragu untuk berkongsi pemikiran anda sendiri di forum. soalan yang sering ditanya mengenai algoritma genetik Untuk mengurangkan risiko ini dan mengekalkan kepelbagaian sementara masih menyempitkan skop penyelesaian, kita dapat memperkenalkan sedikit perubahan. Daripada melakukan segmentasi 50-50 secara langsung, kami membenarkan kebarangkalian kecil untuk menggantikan sebarang nilai dalam abjad. Melalui mutasi ini, keturunan mungkin menjadi Hello World!.
// ... (Candidate class and GeneticAlgorithm class code as provided in the original text) ...
Keterangan Strategi Crossing K-Point
Atas ialah kandungan terperinci Pengenalan kepada algoritma genetik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!