Guest User

Untitled

a guest
Jun 22nd, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.18 KB | None | 0 0
  1. class GA
  2. def initialize(goal)
  3. @goal = goal.split(//)
  4. @len = goal.length
  5. @pop = Array.new(100).map { random_string }
  6. end
  7.  
  8. def fitness(string)
  9. count = 0
  10. @goal.zip(string.split('')) do |a, b|
  11. count += 1 if a == b
  12. end
  13. count / @len.to_f
  14. end
  15.  
  16. def random_string
  17. r = Array.new(@len).map { randchr }.join
  18. end
  19.  
  20. def randchr
  21. (rand(27) + ?A).chr.send(rand(2) == 0 ? :upcase : :downcase).gsub('[', ' ')
  22. end
  23.  
  24. def trim_bad
  25. @pop = @pop[0, 20]
  26. end
  27.  
  28. def breed(a, b)
  29. combine_point = rand(@len)
  30. ret = a[0, combine_point]
  31. ret += b[combine_point, @len]
  32. ret
  33. end
  34.  
  35. def mutate(a)
  36. a[rand(@len)] = randchr
  37. a
  38. end
  39.  
  40. def evolve
  41. if fitness(@pop.first) == 1
  42. puts "---------"
  43. puts "Goal reached!"
  44. puts "Output: #{@pop.first}"
  45. break
  46. end
  47.  
  48. puts "Best fit: #{@pop.first}"
  49. while @pop.size < 100
  50. a = rand(20)
  51. b = rand(20)
  52. @pop << mutate(breed(@pop[a], @pop[b]))
  53. @pop.uniq!
  54. end
  55. @pop.sort! do |a, b|
  56. fitness(b) <=> fitness(a)
  57. end
  58. trim_bad
  59. end
  60. end
  61.  
  62. ga = GA.new('Hello world')
  63. loop { ga.evolve }
Add Comment
Please, Sign In to add comment