$bounds1=[-10,10] def genPoint x = rand() * 20 - 10 y = x.abs + Math.cos(x) return [x,y] end def genPopulation lis = [] for i in 0...8 lis[i] = genPoint() end lis end def pickTwoCrossovers #Picking 1 out of 4 values with weights .4,.3,.2,.1 #Choose a rand value and test for: # 0< x <= .4 <= .7 <= .9 < 1 val = rand() if val < 0.4 index1 = 0 elsif val < 0.7 index1 = 1 elsif val < 0.9 index1 = 2 else index1 = 3 end val = rand() if val < 0.4 index2 = 0 elsif val < 0.7 index2 = 1 elsif val < 0.9 index2 = 2 else index2 = 3 end while index2 == index1 val=rand() if val < 0.4 index2 = 0 elsif val < 0.7 index2 = 1 elsif val < 0.9 index2 = 2 else index2 = 3 end end return [index1,index2] end def crossover1(point1, point2) beta = rand() newX1 = beta*point1[0]+ (1-beta)*point2[0] newX2 = (1-beta)*point1[0] + beta*point2[0] newY1 = newX1.abs + Math.cos(newX1) newY2 = newX2.abs + Math.cos(newX2) return [[newX1,newY1],[newX2,newY2]] end def main population = [] population = genPopulation() puts "Population1: #{population.inspect}" puts population.sort! {|x,y| x[1] <=> y[1]} puts "Population1 sorted: #{population.inspect}" puts for i in 0...10 indexes = [] indexes = pickTwoCrossovers() puts "Indexes chosen: #{indexes.inspect}" puts "Crossover1 on points: #{population[indexes[0]].inspect} and #{population[indexes[1]].inspect}" newPoints=[] newPoints=crossover1(population[indexes[0]], population[indexes[1]]) puts "New points: #{newPoints[0].inspect}, #{newPoints[1].inspect}" puts population[4] = newPoints[0] population[5] = newPoints[1] indexes = pickTwoCrossovers() puts "Indexes chosen: #{indexes.inspect}" puts "Crossover1 on points: #{population[indexes[0]].inspect} and #{population[indexes[1]].inspect}" newPoints=crossover1(population[indexes[0]], population[indexes[1]]) puts "New points: #{newPoints[0].inspect}, #{newPoints[1].inspect}" puts population[6] = newPoints[0] population[7] = newPoints[1] population.sort! {|x,y| x[1] <=> y[1]} puts "New Population1 sorted: #{population.inspect}" puts end end main