/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠSh ub ham ĠP anch al Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠYou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ ĊĊ Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ Ċ // ĠClass Ġwhich Ġuses Ġthe ĠGen etic Ġalgorithm Ġfor Ġoptimization . Ċ class ĠOptim izer ( ĊĠĠĠ Ġprivate Ġvar Ġparam Choices Ġ: ĠHashMap < String , Float Array > Ġ, ĊĠĠĠ Ġprivate Ġvar Ġmutate Prob Ġ: ĠFloat Ġ= Ġ 0 . 2 f Ġ, ĊĠĠĠ Ġprivate Ġvar Ġrandom Select Ġ: ĠFloat Ġ= Ġ 0 . 3 f Ġ, ĊĠĠĠ Ġprivate Ġvar Ġretain Ġ: ĠFloat Ġ= Ġ 0 . 3 f Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġa ĠNetwork Ġobject , Ġreturn Ġthe Ġfitness Ġscore ĊĠĠĠĠĠĠĠ Ġfun Ġget Fitness Score ( Ġnetwork : ĠNetwork Ġ) Ġ: ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnetwork . score ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCreate Ġan Ġinitial Ġpopulation Ġfrom Ġwhere Ġthe Ġoptimization Ġcan Ġstart , Ġgiven Ġthe Ġno . Ġof ĊĠĠĠ Ġ// Ġmembers / individual s Ġrequired . ĊĠĠĠ Ġfun Ġcreate Population ( Ġnum Individual s Ġ: ĠInt Ġ) Ġ: ĠArrayList < Network > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpopulation Ġ= ĠArrayList < Network >() ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġeach Ġmember ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Individual s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindividual Ġ= ĠNetwork () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEach Ġmember Ġwill Ġhave Ġthe Ġsame Ġset Ġof Ġchoices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual . param Choices Ġ= Ġparam Choices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġthis Ġmember Ġwith Ġrandom Ġpicked Ġchoices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindividual . initialize NN With Random Params () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopulation . add ( Ġindividual Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpopulation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠPro duce Ġtwo Ġchildren Ġfrom Ġtheir Ġparents ĊĠĠĠ Ġprivate Ġfun Ġb reed ( Ġmother Ġ: ĠNetwork Ġ, Ġfather Ġ: ĠNetwork Ġ) Ġ: ĠArrayList < Network > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠArrayList < Network >() ĊĠĠĠĠĠĠĠ Ġfor ( Ġi Ġin Ġ 0 Ġuntil Ġ 2 Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġparameters Ġfor Ġthe Ġchild ĠNN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Params Ġ= ĠHashMap < String , Float >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( Ġparam Ġin Ġparam Choices . keys Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Params [ Ġparam Ġ] Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmother . network Params [ Ġparam Ġ] Ġ, Ġfather . network Params [ Ġparam Ġ] Ġ). random () Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchild Ġ= ĠNetwork () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . network Params Ġ= Ġchild Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPerform Ġmutation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġmutate Prob Ġ> ĠRandom (). next Float () Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Ġ= Ġmutate ( Ġchild Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . add ( Ġchild Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġchildren ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠMut ate Ġthe Ġparameters Ġof Ġthe Ġchild ĠNN ĊĠĠĠ Ġprivate Ġfun Ġmutate ( Ġchild Ġ: ĠNetwork Ġ) Ġ: ĠNetwork Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠChoose Ġany Ġrandom Ġparameter Ġwhich Ġwill Ġbe Ġmut ated ĊĠĠĠĠĠĠĠ Ġval Ġrandom Param Ġ= Ġparam Choices . keys . random () ĊĠĠĠĠĠĠĠ Ġ// ĠChoose Ġany Ġrandom Ġvalue Ġfor Ġthat Ġparameter Ġ( Ġchosen Ġabove Ġ) ĊĠĠĠĠĠĠĠ Ġchild . network Params [ Ġrandom Param Ġ] Ġ= Ġparam Choices [ Ġrandom Param Ġ] !!. random () ĊĠĠĠĠĠĠĠ Ġreturn Ġchild ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGet Ġthe Ġaverage Ġfitness Ġscore Ġof Ġall Ġmembers Ġin Ġthe Ġgiven Ġpopulation . ĊĠĠĠ Ġfun Ġget Avg Score ( population Ġ: ĠArrayList < Network > Ġ) Ġ: ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsum m ation Ġ= Ġpopulation . map Ġ{ Ġnetwork Ġ-> Ġnetwork . score Ġ}. toFloat Array (). sum () ĊĠĠĠĠĠĠĠ Ġreturn Ġsum m ation Ġ/ Ġpopulation . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġev olve ( Ġcurrent Population Ġ: ĠArrayList < Network > Ġ) Ġ: ĠArrayList < Network > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġfitness Ġscores Ġof Ġall Ġindividuals Ġin Ġthis Ġpopulation Ġand Ġsort Ġthem . ĊĠĠĠĠĠĠĠ Ġval Ġpopulation Sorted Ġ= Ġcurrent Population . sorted With ( Ġkotlin . Comparator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo 1 , Ġo 2 Ġ-> Ġo 2 . score . compareTo ( Ġo 1 . score Ġ) Ġ Ġ}) ĊĠĠĠĠĠĠĠ Ġprintln ( Ġ" Initial Ġpopulation Ġsize Ġ${ population Sorted . size }") ĊĠĠĠĠĠĠĠ Ġ// ĠSelect Ġtop ĠK Ġindividuals Ġ( Ġwhich Ġhave Ġthe Ġhighest Ġfitness Ġscore Ġ) Ġfrom Ġthis Ġpopulation ĊĠĠĠĠĠĠĠ Ġval Ġretain Length Ġ= Ġ( Ġcurrent Population . size Ġ* Ġretain Ġ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġparents Ġ= ĠArrayList ( Ġpopulation Sorted . slice ( Ġ 0 .. retain Length Ġ) Ġ) ĊĠĠĠĠĠĠĠ Ġprintln ( Ġ" Population Ġsize Ġafter Ġselecting ĠK Ġindividuals Ġ${ parents . size }") ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġsome Ġmore Ġindividuals Ġ( Ġthe Ġones Ġfiltered Ġabove Ġ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( Ġun wanted Parent Ġin Ġcurrent Population . sub List ( Ġretain Length Ġ, Ġcurrent Population . size Ġ) Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġrandom Select Ġ> ĠRandom (). next Float () Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparents . add ( Ġun wanted Parent Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln ( Ġ" Population Ġsize Ġafter Ġadding Ġsome Ġmore Ġparents Ġ${ parents . size }") ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġarray Ġ( Ġof Ġlength Ġ( total _ individual s Ġ- Ġselected _ parents ) Ġ) Ġto Ġstore Ġchildren . ĊĠĠĠĠĠĠĠ Ġval Ġparents Length Ġ= Ġparents . size ĊĠĠĠĠĠĠĠ Ġval Ġdesired Length Ġ= Ġcurrent Population . size Ġ- Ġparents Length ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠArrayList < Network >() ĊĊĠĠĠĠĠĠĠ Ġprintln ( Ġ" Desired Ġlength Ġ${ desired Length }") ĊĊĠĠĠĠĠĠĠ Ġwhile ( Ġchildren . size Ġ< Ġdesired Length Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSelect Ġany Ġtwo Ġparents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmale Ġ= ĠRandom (). nextInt ( Ġparents . size Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfemale Ġ= ĠRandom (). nextInt ( Ġparents . size Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthey Ġare Ġdifferent Ġfrom Ġeach Ġother ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġmale Ġ!= Ġfemale Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmale Parent Ġ= Ġparents [ Ġmale Ġ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfemale Parent Ġ= Ġparents [ Ġfemale Ġ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġb reed ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb ab ies Ġ= Ġb reed ( Ġmale Parent Ġ, Ġfemale Parent Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAppend Ġthe Ġb ab ies Ġto Ġthe Ġarray list ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . addAll ( Ġb ab ies Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln ( Ġ" children ĠSize Ġ${ children . size } Ġ" Ġ) ĊĊĠ Ġ/* ĠĠĠĠĠ Ġprintln ( Ġ" retain Length ĠSize Ġ${ desired Length }} Ġ" Ġ) ĊĠĠĠĠĠĠĠ Ġprintln ( Ġ" children Ġ${ children . size }") */ ĊĊĠĠĠĠĠĠĠ Ġparents . addAll ( Ġchildren Ġ) ĊĊĠĠĠĠĠĠĠ Ġprintln ( Ġ" new Ġgeneration Ġ${ parents . size Ġ} Ġ" Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġparents ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ