package Ġk gp . e volution Ċ Ċ import Ġk gp . fitness . Cases Ċ import Ġk gp . fitness . Feature Ċ import Ġk gp . fitness . Metric Ċ import Ġk gp . tree . Function Ċ import Ġk gp . tree . Tree Ċ import Ġk gp . tree . Tree Generator Ċ import Ġk gp . tree . Tree Generator Options Ċ import Ġjava . util .* Ċ import Ġjava . util . stream . Collectors Ċ Ċ /** Ċ Ġ* ĠA Ġmodel Ġthat Ġtr ains Ġa Ġpopulation Ġof Ġsolutions . Ċ Ġ* Ċ Ġ* Ġ@ property Ġpopulation ĠA Ġset Ġof Ġsolutions Ġto Ġa Ġproblem . Ċ Ġ*/ Ċ interface ĠModel Ġ{ ĊĠĠĠ Ġvar Ġpopulation : ĠMutable List < Tree > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTr ains Ġthe Ġmodel Ġon Ġthe Ġcases Ġgiven . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcases ĠA Ġset Ġof Ġinput - output Ġcases . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtrain ( cases : ĠC ases ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġthe Ġmodel Ġon Ġa Ġset Ġof Ġfeatures . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfeatures ĠA Ġset Ġof Ġinput Ġfeatures . ĊĠĠĠĠ Ġ* Ġ@ returns ĠA Ġmapping Ġof Ġthe Ġinput Ġfeatures Ġto Ġan Ġoutput . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtest ( features : ĠList < Feature >): ĠDouble Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġcollection Ġof Ġoptions Ġavailable Ġto Ġconfigure Ġevolution Ġby Ġthe Ġ[ BaseModel ]. Ċ Ġ*/ Ċ data Ġclass ĠE volution Options ( ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġsolutions Ġthe Ġmodel Ġcan Ġhave Ġat Ġany Ġtime Ġduring Ġevolution . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġpopulation Size : ĠInt , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġgener ations Ġto Ġperform Ġevolution Ġfor . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġgener ations : ĠInt , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġthe Ġtournament s Ġperformed Ġby Ġthe Ġ[ Tournament Selection ] Ġoperator .. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġtournament Size : ĠInt , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġprobability Ġthat Ġcross over Ġwill Ġoccur Ġbetween Ġtwo Ġindividuals Ġin Ġthe Ġpopulation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcross over Rate : ĠDouble , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġprobability Ġthat Ġan Ġindividual Ġwill Ġunder go Ġa Ġsubtree Ġmutation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġsubtree Mutation Rate : ĠDouble , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġprobability Ġthat Ġan Ġindividual Ġwill Ġunder go Ġa Ġho ist Ġmutation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġho ist Mutation Rate : ĠDouble , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġprobability Ġthat Ġan Ġindividual Ġwill Ġunder go Ġa Ġpoint Ġmutation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġpoint Mutation Rate : ĠDouble , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġfrequency Ġwith Ġwhich Ġpoints Ġshould Ġbe Ġchosen Ġfor Ġpoint Ġmutation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġpoint Replacement Rate : ĠDouble , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNumber Ġof Ġindividuals Ġtaken Ġat Ġeach Ġgeneration Ġto Ġhave Ġgen etic Ġoperators Ġapplied Ġto Ġthem . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġnum Off spring : ĠInt , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġfunctions Ġthat Ġare Ġavailable Ġto Ġprograms . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġfunction Set : ĠList < Function >, ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOptions Ġthat Ġconfigure Ġtree Ġgeneration . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġtree Generator Options : ĠTree Generator Options , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġmeasure Ġthat Ġcan Ġbe Ġused Ġto Ġevaluate Ġindividuals Ġin Ġthe Ġpopulation . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġmetric : ĠMetric , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA Ġthreshold Ġthat Ġconfig ures Ġhow Ġgood Ġsolutions Ġshould Ġbe Ġbefore Ġstopping . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthe Ġthreshold Ġis Ġnever Ġmet Ġthen Ġthe Ġevolution Ġprocess Ġwill Ġstop Ġwhen Ġthe Ġnumber ĊĠĠĠĠĠĠĠĠ Ġ* Ġof Ġgener ations Ġgiven Ġhas Ġbeen Ġreached . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġstopping Threshold : ĠDouble Ċ ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġbuffer . append (" Population ĠSize : Ġ${ this . population Size }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Gener ations : Ġ${ this . gener ations }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Tournament ĠSize : Ġ${ this . tournament Size }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Stopping ĠThreshold : Ġ${ this . stopping Threshold }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Cross over ĠRate : Ġ${ this . cross over Rate }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Sub tree ĠMutation ĠRate : Ġ${ this . sub tree Mutation Rate }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Ho ist ĠMutation ĠRate : Ġ${ this . ho ist Mutation Rate }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Point ĠMutation ĠRate : Ġ${ this . point Mutation Rate }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Point ĠRe placement ĠRate : Ġ${ this . point Replacement Rate }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Number Ġof ĠOff spring : Ġ${ this . num Off spring }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Function ĠSet : Ġ[ ") ĊĊĠĠĠĠĠĠĠ Ġthis . function Set . map Indexed Ġ{ Ġidx , Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . append ( function . representation ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ!= Ġthis . function Set . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . append (", Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuffer . append (" ]\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Tree ĠInitial ist ation ĠMethod : Ġ${ this . tree Generator Options . mode }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Max ĠDepth : Ġ${ this . tree Generator Options . max Depth }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Number Ġof ĠFeatures : Ġ${ this . tree Generator Options . num Features }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Constants : Ġ${ this . tree Generator Options . constants }\ n ") ĊĠĠĠĠĠĠĠ Ġbuffer . append (" Fitness ĠFunction : Ġ${ this . metric . name }\ n ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuffer . toString () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġbase Ġmodel Ġfor Ġe vol ving Ġtrees . Ċ Ġ* Ċ Ġ* ĠThe Ġbest Ġsolution Ġwill Ġbe Ġmaintained Ġby Ġthe Ġmodel Ġand Ġwill Ġbe Ġmade Ġavailable Ċ Ġ* Ġwhen Ġtesting Ġ( i . e . Ġmaking Ġa Ġprediction ) Ġusing Ġthe Ġmodel . Ċ Ġ* Ċ Ġ* Ġ@ property Ġoptions ĠA Ġset Ġof Ġoptions Ġfor Ġconfiguring Ġthe Ġmodel . Ċ Ġ*/ Ċ class ĠBase Model ( val Ġoptions : ĠE volution Options ) Ġ: ĠModel Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcollection Ġof Ġsolutions Ġthis Ġmodel Ġhas Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġpopulation Ġ= Ġmutable ListOf < Tree >() ĊĠĠĠ Ġprivate Ġval Ġgenerator Ġ= ĠTree Generator ( this . options . function Set , Ġthis . options . tree Generator Options ) ĊĠĠĠ Ġprivate Ġval Ġselector Ġ= ĠTo urnament Selection ( this . options . tournament Size ) ĊĠĠĠ Ġprivate Ġval Ġrandom Ġ= ĠRandom () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbest Ġsolution Ġthis Ġmodel Ġhas Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġbest : ĠTree ĊĊĠĠĠ Ġprivate Ġfun Ġinitialise () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( 0 .. this . options . population Size ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . population . add ( this . generator . generate Tree ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTr ains Ġthe Ġmodel Ġon Ġa Ġset Ġof Ġinput - output Ġcases . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġbest Ġsolution Ġfound Ġwill Ġbe Ġkept Ġand Ġdefines Ġthe Ġmodel Ġfound Ġfor Ġthe Ġprogram Ġbeing Ġsearched Ġfor . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcases ĠA Ġset Ġof Ġinput - output Ġcases . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġtrain ( cases : ĠC ases ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( this . options ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġwe 've Ġgot Ġan Ġinitial Ġpopulation . ĊĠĠĠĠĠĠĠ Ġthis . initial ise () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġinitial Ġfitness Ġvalues Ġfor Ġpopulation . ĊĠĠĠĠĠĠĠ Ġ// ĠAss umes Ġthat Ġthe Ġpopulation Ġhas Ġalready Ġbeen Ġinitial ised . ĊĠĠĠĠĠĠĠ Ġthis . population . parallel Stream (). forEach Ġ{ Ġtree Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġcases . map Ġ{ Ġ( features ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree . execute ( features . map ( Feature :: value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtree . fitness Ġ= Ġthis . options . metric . fitness ( cases , Ġoutputs , Ġtree . nodes . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSort Ġpopulation Ġso Ġthat Ġthe Ġfit test Ġindividual Ġis Ġfirst . ĊĠĠĠĠĠĠĠ Ġthis . population Ġ= Ġthis . population . sorted By ( Tree :: fitness ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġthis . best Ġ= Ġthis . population . first () ĊĊĠĠĠĠĠĠĠ Ġ( 0 .. this . options . gener ations ). forEach Ġ{ Ġgen Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . best . fitness Ġ< Ġthis . options . stopping Threshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChoose Ġsome Ġindividuals Ġfor Ġthe Ġnext Ġpopulation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. this . options . num Off spring ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindividual Ġ= Ġthis . selector . tournament ( this . population ). copy () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDispatch Ġmutation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . random . next Double () Ġ< Ġthis . options . cross over Rate Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Ġ= Ġthis . selector . tournament ( this . population ). copy () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindividual . cross over ( other ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . random . next Double () Ġ< Ġthis . options . sub tree Mutation Rate Ġ-> Ġindividual . sub tree Mutation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . random . next Double () Ġ< Ġthis . options . ho ist Mutation Rate ĠĠ Ġ-> Ġindividual . ho ist Mutation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . random . next Double () Ġ< Ġthis . options . point Mutation Rate ĠĠ Ġ-> Ġindividual . point Mutation ( this . options . point Replacement Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEvaluate Ġthis Ġindividual ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġcases . parallel Stream (). map Ġ{ Ġ( features ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindividual . execute ( features . map ( Feature :: value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. collect ( Collectors . toList ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindividual . fitness Ġ= Ġthis . options . metric . fitness ( cases , Ġoutputs , Ġindividual . nodes . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChoose Ġa Ġmember Ġof Ġthe Ġexisting Ġpopulation Ġto Ġreplace Ġwith Ġthis Ġnew Ġindividual . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠMake Ġselector Ġreturn Ġindex Ġof Ġtournament Ġwinner / lo ser . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlo ser Ġ= Ġthis . selector . tournament ( this . population , Ġnegative Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlo ser Idx Ġ= Ġthis . population . indexOf ( lo ser ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . population [ lo ser Idx ] Ġ= Ġindividual ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . population Ġ= Ġthis . population . sorted By ( Tree :: fitness ). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . best Ġ= Ġthis . population . first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Generation Ġ#$ gen \ t ĠBest ĠF itness : Ġ${ this . best . fitness }\ t ĠBest ĠLength : Ġ${ this . best . nodes . size }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . population Ġ= Ġthis . population . sorted By ( Tree :: fitness ). to Mutable List () ĊĠĠĠĠĠĠĠ Ġthis . best Ġ= Ġthis . population . first () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTests Ġthe Ġmodel Ġby Ġevaluating Ġthe Ġmodel Ġon Ġa Ġset Ġof Ġfeatures . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIntern ally , Ġthe Ġbest Ġprogram Ġfound Ġduring Ġtraining Ġwill Ġbe Ġused Ġto Ġsatisfy Ġthe Ġevaluation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfeatures ĠA Ġset Ġof Ġfeatures Ġthat Ġthe Ġoutput Ġis Ġs ought Ġfor . ĊĠĠĠĠ Ġ* Ġ@ returns ĠThe Ġoutput Ġof Ġevaluating Ġthe Ġmodel Ġusing Ġthe Ġgiven Ġfeature Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġtest ( features : ĠList < Feature >): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . best . execute ( features . map ( Feature :: value )) ĊĠĠĠ Ġ} Ċ }