JavaScript- ի գենետիկական էվոլյուցիայի արագ օրինակ. Եկեք երեխա ստեղծենք:

«Մուտացիայի գործընթացը գենետիկ փոփոխականության և, հետևաբար, էվոլյուցիայի նոր նյութերի միակ հայտնի աղբյուրն է»: - Դոբժանսկի, 1957:

Genetic Evolution ալգորիթմներն ինձ համար իսկապես հետաքրքրաշարժ են: Վիրտուալ ԴՆԹ ծրագրավորելու ունակությունը պարզապես համակարգչային գիտության ֆենոմենալ սխրանք է: Դարվինի էվոլյուցիայի էվոլյուցիայի տեսության և իրականում Fittest- ի մոդելի գոյատևումը տեսնելու կարողությունը, կոդով, պարզապես ապշեցուցիչ է:

Ես նախկինում իսկապես չեմ անդրադարձել գենետիկական ալգորիթմներին և որոշել եմ, որ սկսվել է ժամանակը: Եվ ինչն է ավելի լավ տեղ սկսել, քան իրականը, սկսեք, այնպես չէ: Այս ձեռնարկում ես կստեղծեմ «փայտիկ», և այդ փայտիկը ցանկանում է հասնել «շրջան»: Դրանից վերցրեք այն, ինչ դուք կցանկանաք, բայց ես գրում եմ ընտանեկան բարեկամական դասընթացներ, և այդպես կմնա:

Ես աներևակայելի ծանր ազդեցություն եմ ունենում The Coding Train: Coding Challenge # 29- ից ՝ որպես դրա ոգեշնչում: Հղում դրան այստեղ: Նա ոգեշնչվել է Smart Rockets- ից, այնպես որ, մինչդեռ ես ոչ մի նոր կամ ինքնատիպ բան չեմ պատրաստում, ես հույս ունեմ, որ այն կարող է ծառայել որպես գենետիկական էվոլյուցիայի ալգորիթմի օրինակ: Ես օգտագործում եմ P5.JS գրադարանը, որը կամփոփեի որպես տեսողական JavaScript գրադարան:

Նախքան որևէ տեսակի գենետիկ ալգորիթմի ստեղծումը, ես նախ պետք է ստեղծեմ իրական կարգավորումը: Սկզբում ես ստեղծում եմ շատ պարզ HTML էջ:

P5- ի համար երկու գրադարան ունեմ: Հիմնական բռնակները նկարում են էկրանին, փոփոխականների ակնթարթորեն և այլն: Ձողն այն գիծն է, որը կզարգանա, բնակչությունը ձողերի հավաքածու է, և dna- ն այն է, ինչ ես կդիտեի գենետիկական ալգորիթմի հիմքը: Եկեք դիտարկենք Stick- ի կոդը.

Այսպիսով, փայտիկը ունի մի քանի հիմնական հատկանիշ: Այն պետք է կարողանա շարժվել, այնպես որ այն ունի շարժիչ «շարժիչ» (ավելի լավ տերմինի ցանկություն ունենալու համար) արագության, արագացման և դիրքի փոփոխականություններում: Այս պահին ամբողջ շարժումը վերահսկվում է առեղծվածային ԴՆԹ ֆունկցիայի միջոցով: ԴՆԹ-ին հասնելուց առաջ եկեք դիտարկենք բնակչությանը.

Բնակչությունն իսկապես այնքան էլ հետաքրքիր չէ: Այն ստեղծում է 25 ձող, ինչը, կարծում եմ, բավարար է բնակչության համար, իսկ հետո դրանք տեղափոխում է էկրան: Այս գործառույթով որևէ խոչընդոտ չխախտելը: ԴՆԹ.

Այս պահին ԴՆԹ-ն հիմնականում ոչինչ չի անում: Մեկ փայտիկը ստանում է մեկ ԴՆԹ, իսկ մեկ ԴՆԹ-ն ունի 200 գեների հավաքածու, ինչը իմ փոքրիկ փայտիկի համար կազմում է կյանքի տևողությունը: Մի անհանգստացեք, ժամանակին ավելին կավելացվի: Հիմնական ֆայլը

Այսպիսով, Մեյնը այստեղ բավականին քիչ բաներ է անում: Նախ `մենք պետք է ստեղծենք ձողերի նոր սերունդ, որը բնակչության ակնթարթ է, և այնուհետև մենք ստեղծում ենք մեր շրջանակը, որի ձողերը նպատակ կունենան հետագայում գծի տակ ընկնել: Այնուհետև մենք ամեն ինչ նկարում ենք էկրանին ՝ սպանելու և նոր սերունդ ստեղծելու լրացուցիչ հնարավորությամբ ՝ ամեն անգամ, երբ նրանց կյանքի ցիկլն ավարտվում է:

Այսպիսով, եթե մենք վարում ենք սա, ինչպես ներկայումս կանգնած է, մենք ստանում ենք հետևյալը.

Շփոթված փոքրիկ փայտերը

Այժմ այս պահին այն իրականում գենետիկ ալգորիթմ չէ: Փոխարենը, դա մի շարք ձողիկներ են, որոնք շարժվում են պատահականորեն ընտրված վեկտորներով, էկրանին գծված կետով: Այսպիսով, եկեք ավելացնենք գենետիկական մասը:

Այսպիսով, մենք ուզում ենք, որ այն փայտը, որն այն դարձնում է ամենամոտ, շրջապատին ամենամոտը, լինի այն գավաթը, որն իր գեներն է փոխանցում իր երեխաներին: Սա, ըստ էության, ամենալավ գոյատևելն է. Ով ամենաերկարը գոյատևի, նրանց գեներն անցնողն է:

Այսպիսով, մենք կարող ենք սկսել դա իրականացնել ՝ յուրաքանչյուր փայտ տալով նոր փոփոխական ՝ ֆիթնես:

var ֆիթնես = 0

Ֆիթնեսը կհաշվարկվի փայտիկի ներկայիս դիրքի համեմատ ՝ շրջանակի դիրքի (նպատակային) համեմատ: Մենք դա կարող ենք իրականացնել որպես գործառույթ, յուրաքանչյուր փայտիկի վրա հաշվարկել Ֆիթնեսը:

this.calculateFitness = գործառույթ ()
var հեռավորություն = հեռավորություն (this.pos.x, this.pos.y, target.x, target.y)
this.fitness = 1 / հեռավորություն
}

Հիմա մենք ունենք ձողեր, որոնք ունեն ֆիթնես վարկանիշ, այսինքն ՝ նրանք ավելի լավ գեներ ունեն, քանի որ նրանք ավելի երկար են գոյատևել: Այսպիսով, այժմ մենք պետք է միջոց, որպեսզի կարողանանք վերարտադրել այդ ձողերը վերին աստիճանի գեներով: Մտնեք, լողավազան.

Այսպիսով, այս լողավազանն ըստ էության համեմատաբար ուղիղ առաջ է: Մենք վերևում արդեն հասկացանք, որ ամենահաջողված գեներն են, որոնք շրջանին ամենամոտ են: Որքան մոտ է փայտիկը, այդքան ավելի շատ գենոմ է մուտքագրվելու լողավազան, և ավելի հավանական է, որ այն վերարտադրվի: Մի փայտ, որը դա դարձրեց ճանապարհի 5% -ը, հնարավորություն կտա վերարտադրվելու 5%, մինչդեռ այն փայտը, որը այն կազմել է ճանապարհի 70% -ը, վերարտադրման հնարավորություն ունի: Հուսով եմ, որ դա լավ բացատրեցի: Ավելի հաջող փայտ = նոր փայտի վերածնվելու ավելի լավ հնարավորություն:

Վերոնշյալը երկու նոր գործառույթ է: Ընտրությունը, ինչպես կնշանակեր անունը, նշանակում է, որ գեների լողավազանից ընտրում են ծնողական գեները: Այս գեներն այնուհետև համատեղվում են նոր ԴՆԹ-ի ձևավորման համար, որը իր հերթին այնուհետև նշանակվում է նոր փայտիկի վրա: Դա գրեթե այն է, քանի որ մենք ուզում ենք պահպանել այս համեմատաբար պարզ և խոհեմությունը:

Շատ ցնցող, մեր ձողերն այժմ կարող են օգտվել նախորդների կարողություններից ամենալավը և օգտագործել դրանք շրջանը գտնելու համար: Եթե ​​այժմ մենք գործով նայենք դրան.

Դեռևս շփոթված, բայց մի փոքր ավելի խելացի ձողիկներ:

Մի քանի տասնյակ կրկնությունից հետո, այն սկսում է թվալ, թե ինչպես են նրանք մահացել, քանի որ տեսանելի են ընդամենը մի քանի տող: Բայց դա այդպես չէ. Ավելի թեթև փայտիկը նշանակում է, որ մի քանի ձողեր ուղիղ նույն ուղին են գնում: Դա ակնկալվում է, քանի որ մենք ունենք գեների համեմատաբար սահմանափակ լողավազան:

Շատ խելացի, ալֆա ձողիկներ:

Որքան երկար է այն մնացել վազելուց, այնքան ավելի շատ էկրանին կհայտնվի միայն մեկ փայտ: Այս փայտիկը ներկայացնում է օպտիմալ փայտիկը: Ընտրված փայտիկը: Ահա դրանք են, մեր գենետիկական ալգորիթմի գագաթնակետը.

Genius փայտ (ներ):

Այսպիսով, դա գենետիկական էվոլյուցիայի ալգորիթմ է, որը ամբողջությամբ գրված է զննարկիչում: Դա, իհարկե, գենետիկական էվոլյուցիայի հիանալի օրինակ չէ, բայց դա աշխատանքի հիանալի օրինակ է: Մեր փոքրիկ փայտիկը այժմ կարող է շարունակել շրջանակը ձեռք բերելու համար, և ինչ կլինի հաջորդը, այսօր թեման չէ:

Ինչպես նշվեց սկզբում, դա մեծապես ազդում է The Coding Train- ի վրա: Հղում դեպի իրենց ռեպո:

Իմ ամբողջական ծածկագիրը: