genetic_algorithm.sf 1022 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/ruby
  2. #
  3. ## A simple genetic algorithm in Sidef
  4. ## Inspired by Daniel Shiffman
  5. ## https://www.youtube.com/watch?v=DIXtg5VVz2E
  6. #
  7. var target = 'sidef lang'.chars
  8. var parts = [('a'..'z')..., ' '].shuffle
  9. var population_num = 150
  10. var mutation_rate = 0.01
  11. var population = population_num.of {
  12. target.len.of { parts.rand }
  13. }
  14. func fitness(item) {
  15. item ~Z== target -> count_by { _ }
  16. }
  17. func crossover(a, b) {
  18. a ~Z b -> map { |g|
  19. 1.rand < mutation_rate ? parts.rand : g.rand
  20. }
  21. }
  22. loop {
  23. var matingpool = population.map { |item|
  24. ([item] * fitness(item))...
  25. }
  26. var fitness_score = 0
  27. var target_found = false
  28. population.map! {
  29. var child = crossover(matingpool.pick(2)...)
  30. fitness_score += fitness(child)
  31. target_found = true if child==target
  32. child
  33. }
  34. printf("Average fitness score: %.2f%%\n",
  35. fitness_score/population_num / target.len * 100)
  36. if (target_found) {
  37. say "** Target found!"
  38. break
  39. }
  40. }