package Ġnz . co . j ed sim son . lg p . core . e volution . operators . re combin ation . linear Cross over Ċ Ċ import Ġnz . co . j ed sim son . lg p . core . program . Program Ċ import Ġnz . co . j ed sim son . lg p . core . program . instructions . Instruction Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . min Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠResp ons ible Ġfor Ġproviding Ġcross over Ġpoints Ġwithin Ġtwo Ġindividuals Ġthat Ġare Ġbeing Ġcombined Ġusing Ġlinear Ġcross over . Ċ Ġ* Ċ Ġ* Ġ@ property Ġmaximum Cross over Distance ĠAn Ġupper Ġbound Ġon Ġthe Ġnumber Ġof Ġinstructions Ġbetween Ġthe Ġtwo Ġchosen Ġsegments . Ċ Ġ* Ġ@ property Ġrandom ĠA Ġrandom Ġnumber Ġgenerator . Ċ Ġ*/ Ċ internal Ġclass ĠCross over Point Provider < T Program >( ĊĠĠĠ Ġprivate Ġval Ġmaximum Cross over Distance : ĠInt , ĊĠĠĠ Ġprivate Ġval Ġrandom : ĠRandom Ċ ) Ġ{ ĊĊĠĠĠ Ġ@ Suppress (" Private PropertyName ") ĊĠĠĠ Ġprivate Ġval ĠMAX _ ITER ATIONS Ġ= Ġ 2 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġa Ġcross over Ġpoint Ġfor Ġeach Ġof Ġ[ first Individual ] Ġand Ġ[ second Individual ] Ġwith Ġa Ġdistance ĊĠĠĠĠ Ġ* Ġdifference Ġthat Ġsatisfies Ġthe Ġsupplied Ġ[ maximum Cross over Distance ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ* Note Ġthat Ġthe Ġsearch Ġfor Ġcross over Ġpoints Ġis Ġbounded Ġby Ġ[ MAX _ ITER ATIONS ]. ĠIf Ġ[ MAX _ ITER ATIONS ] Ġis Ġexceeded , ĊĠĠĠĠ Ġ* Ġno Ġsegments Ġwill Ġbe Ġreturned Ġ( indic ated Ġby Ġa Ġnull Ġreturn ). * ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfirst Individual ĠThe Ġfirst Ġindividual Ġto Ġdetermine Ġa Ġcross over Ġpoint Ġfor . ĊĠĠĠĠ Ġ* Ġ@ param Ġsecond Individual ĠThe Ġsecond Ġindividual Ġto Ġdetermine Ġa Ġcross over Ġpoint Ġfor . ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġpair Ġof Ġ[ Cross over Point ], Ġone Ġfor Ġ[ first Individual ] Ġand Ġone Ġfor Ġ[ second Individual ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdetermine Cross over Points ( ĊĠĠĠĠĠĠĠ Ġfirst Individual : ĠMutable List < Instruction < T Program >>, ĊĠĠĠĠĠĠĠ Ġsecond Individual : ĠMutable List < Instruction < T Program >> ĊĠĠĠ Ġ): ĠPair < Cross over Point , ĠCross over Point >? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . ĠRandom ly Ġselect Ġan Ġinstruction Ġposition Ġi [ k ] Ġ( cross over Ġpoint ) Ġin Ġprogram Ġgp [ k ] Ġ( k Ġin Ġ{ 1 , Ġ 2 }) ĊĠĠĠĠĠĠĠ Ġ// Ġwith Ġlen ( gp [ 1 ]) Ġ<= Ġlen ( gp [ 2 ]) Ġand Ġdistance Ġ| i [ 1 ] Ġ- Ġi [ 2 ]| Ġ<= Ġmin ( len ( gp [ 1 ]) Ġ- 1 , Ġdc _ max ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRandom ly Ġselect Ġsome Ġinitial Ġcross over Ġpoints Ġfor Ġeach Ġindividual . ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Cross over Point Ġ= Ġthis . random . nextInt ( first Individual . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġsecond Cross over Point Ġ= Ġthis . random . nextInt ( second Individual . size ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġrestrict Ġthe Ġloop Ġto Ġ 2 0 Ġiterations , Ġjust Ġin Ġcase Ġwe Ġget Ġa Ġreally Ġun luck y Ġcombination ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġrandom Ġinstructions Ġand Ġend Ġup Ġlooping Ġin def initely . ĊĠĠĠĠĠĠĠ Ġvar Ġiteration Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( iteration ++ Ġ< ĠMAX _ ITER ATIONS Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! this . cross over Points Are Valid ( first Cross over Point , Ġsecond Cross over Point , Ġfirst Individual . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Cross over Point Ġ= Ġthis . random . nextInt ( first Individual . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Cross over Point Ġ= Ġthis . random . nextInt ( second Individual . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiteration Ġ>= ĠMAX _ ITER ATIONS Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPair ( first Cross over Point , Ġsecond Cross over Point ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġif Ġthe Ġgiven Ġcross over Ġpoints Ġare Ġvalid . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġdistance Ġbetween Ġtwo Ġcross over Ġpoints Ġmust Ġnot Ġbe Ġgreater Ġthan Ġthe Ġ[ maximum Cross over Distance ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfirst Cross over Point ĠThe Ġfirst Ġcross over Ġpoint . ĊĠĠĠĠ Ġ* Ġ@ param Ġsecond Cross over Point ĠThe Ġsecond Ġcross over Ġpoint . ĊĠĠĠĠ Ġ* Ġ@ param Ġfirst Individual Size ĠThe Ġsize Ġof Ġthe Ġfirst Ġindividual Ġthat Ġcross over Ġis Ġbeing Ġperformed Ġon . ĊĠĠĠĠ Ġ* Ġ@ return ĠWhether Ġor Ġnot Ġthe Ġcross over Ġpoints Ġare Ġvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcross over Points Are Valid ( ĊĠĠĠĠĠĠĠ Ġfirst Cross over Point : ĠCross over Point , ĊĠĠĠĠĠĠĠ Ġsecond Cross over Point : ĠCross over Point , ĊĠĠĠĠĠĠĠ Ġfirst Individual Size : ĠInt ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġpoints Ġchosen Ġmust Ġbe Ġclose Ġenough Ġto Ġeach Ġother Ġto Ġsatisfy Ġthe Ġmaximum Ġcross over Ġdistance Ġconstraint . ĊĠĠĠĠĠĠĠ Ġreturn Ġabs ( first Cross over Point Ġ- Ġsecond Cross over Point ) Ġ<= Ġmin ( first Individual Size Ġ- Ġ 1 , Ġthis . maximum Cross over Distance ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġpoint Ġin Ġa Ġ[ Program ] Ġat Ġwhich Ġcross over Ġwill Ġoccur . Ċ Ġ*/ Ċ internal Ġtype alias ĠCross over Point Ġ= ĠInt Ċ