gga4r 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
 - data/{CHANGELOG.txt → .gemtest} +0 -0
 - data/Manifest.txt +2 -7
 - data/README.md +87 -0
 - data/Rakefile +11 -21
 - data/lib/gga4r.rb +142 -1
 - data/test/gga4r_test.rb +52 -16
 - metadata +79 -49
 - data/README.txt +0 -73
 - data/lib/gga4r/array_helper.rb +0 -35
 - data/lib/gga4r/gga4r_main.rb +0 -176
 - data/lib/gga4r/version.rb +0 -9
 - data/setup.rb +0 -1585
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            !binary "U0hBMQ==":
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: !binary |-
         
     | 
| 
      
 4 
     | 
    
         
            +
                ODA5YjdmOWY1ZWJjZWFmZWJiYTcwOGM1NjE4NjhmZjRkMzRmMTVlYw==
         
     | 
| 
      
 5 
     | 
    
         
            +
              data.tar.gz: !binary |-
         
     | 
| 
      
 6 
     | 
    
         
            +
                Njg3OTBlNTk4NTIwNjY0NmEyNDg0M2NmYzdhN2JhMDA1NmRhZTkxMw==
         
     | 
| 
      
 7 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 8 
     | 
    
         
            +
              metadata.gz: !binary |-
         
     | 
| 
      
 9 
     | 
    
         
            +
                Yzc5NTg5ZjQ0MmI3OWQ2NjFkN2MzNDhkMDZiODg0NTE1OTgzMDUzMWE3ODY3
         
     | 
| 
      
 10 
     | 
    
         
            +
                MTEyZDJlYThmYzdmZDAwNDAwNWFmNzQ4MjI5Y2JiNWE2MjI5MmU3YmFkMTEx
         
     | 
| 
      
 11 
     | 
    
         
            +
                OWUzMDViYjQ0ZWVlNWU3NDg4MjRhNjIxZmFlMGNiYTEyZDdmMjQ=
         
     | 
| 
      
 12 
     | 
    
         
            +
              data.tar.gz: !binary |-
         
     | 
| 
      
 13 
     | 
    
         
            +
                MjlmN2RjODNiYWI3YzIzMjRjMmNiMWU5NWNlODVlMjI3OWM4ZWRmMzdlOGYz
         
     | 
| 
      
 14 
     | 
    
         
            +
                Mjc2MDZkZTJjMTA2MWVkMGVlYTY1ZWI5M2M3Yzc2ZDgwNTMxZGI3OGJiODgy
         
     | 
| 
      
 15 
     | 
    
         
            +
                OTczYTU1ZWMwNzNlNjBkNTFlNTBkOWMwY2RhYWY0MDJjOWM3MTE=
         
     | 
    
        data/{CHANGELOG.txt → .gemtest}
    RENAMED
    
    | 
         
            File without changes
         
     | 
    
        data/Manifest.txt
    CHANGED
    
    | 
         @@ -1,12 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Rakefile
         
     | 
| 
       2 
     | 
    
         
            -
            README. 
     | 
| 
       3 
     | 
    
         
            -
            CHANGELOG.txt
         
     | 
| 
      
 2 
     | 
    
         
            +
            README.md
         
     | 
| 
       4 
3 
     | 
    
         
             
            Manifest.txt
         
     | 
| 
       5 
     | 
    
         
            -
            setup.rb
         
     | 
| 
       6 
     | 
    
         
            -
            lib/gga4r/version.rb
         
     | 
| 
       7 
     | 
    
         
            -
            lib/gga4r/array_helper.rb
         
     | 
| 
       8 
     | 
    
         
            -
            lib/gga4r/gga4r_main.rb
         
     | 
| 
       9 
4 
     | 
    
         
             
            lib/gga4r.rb
         
     | 
| 
       10 
5 
     | 
    
         
             
            test/test_helper.rb
         
     | 
| 
       11 
6 
     | 
    
         
             
            test/gga4r_test.rb
         
     | 
| 
       12 
     | 
    
         
            -
            examples/ga_fitness_all_1s.rb
         
     | 
| 
      
 7 
     | 
    
         
            +
            examples/ga_fitness_all_1s.rb
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,87 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # gga4r - General Genetic Algorithm for Ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            ##Introduction
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            General Genetic Algorithm for Ruby is a Ruby Genetic Algorithm that is very simple to use:
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            1) Take a class to evolve it and define fitness, recombine and mutate methods.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 10 
     | 
    
         
            +
            class StringPopulation < Array
         
     | 
| 
      
 11 
     | 
    
         
            +
              def fitness
         
     | 
| 
      
 12 
     | 
    
         
            +
                self.select { |pos| pos == 1 }.size.to_f / self.size.to_f
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              def recombine(c2)
         
     | 
| 
      
 16 
     | 
    
         
            +
                cross_point = (rand * c2.size).to_i
         
     | 
| 
      
 17 
     | 
    
         
            +
                c1_a, c1_b = self.separate(cross_point)
         
     | 
| 
      
 18 
     | 
    
         
            +
                c2_a, c2_b = c2.separate(cross_point)
         
     | 
| 
      
 19 
     | 
    
         
            +
                StringPopulation.new(c1_a + c2_b)
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              def mutate
         
     | 
| 
      
 23 
     | 
    
         
            +
                mutate_point = (rand * self.size).to_i
         
     | 
| 
      
 24 
     | 
    
         
            +
                self[mutate_point] = 1
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
      
 27 
     | 
    
         
            +
            ```
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            2) Create a GeneticAlgorithm object with the population.
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 32 
     | 
    
         
            +
            def create_population_with_fit_all_1s(s_long = 10, num = 10)
         
     | 
| 
      
 33 
     | 
    
         
            +
                population = []
         
     | 
| 
      
 34 
     | 
    
         
            +
                num.times  do
         
     | 
| 
      
 35 
     | 
    
         
            +
                  chromosome = StringPopulation.new(Array.new(s_long).collect { (rand > 0.2) ? 0:1 })
         
     | 
| 
      
 36 
     | 
    
         
            +
                  population << chromosome
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
                population
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            ga = GeneticAlgorithm.new(create_population_with_fit_all_1s)
         
     | 
| 
      
 42 
     | 
    
         
            +
            ```
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            3) Call the evolve method as many times as you want and see the best evolution.
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 47 
     | 
    
         
            +
            100.times { |i|  ga.evolve }
         
     | 
| 
      
 48 
     | 
    
         
            +
            p ga.best_fit[0]
         
     | 
| 
      
 49 
     | 
    
         
            +
            ```
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            ##Install
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            1. Execute:
         
     | 
| 
      
 54 
     | 
    
         
            +
            ```
         
     | 
| 
      
 55 
     | 
    
         
            +
            gem install gga4r
         
     | 
| 
      
 56 
     | 
    
         
            +
            ```
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            2. Add require in your code headers:
         
     | 
| 
      
 59 
     | 
    
         
            +
            ```
         
     | 
| 
      
 60 
     | 
    
         
            +
            require "rubygems"
         
     | 
| 
      
 61 
     | 
    
         
            +
            require "gga4r"
         
     | 
| 
      
 62 
     | 
    
         
            +
            ```
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            ##Documentation
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            Documentation can be generated using rdoc tool under the source code with:
         
     | 
| 
      
 67 
     | 
    
         
            +
            ```
         
     | 
| 
      
 68 
     | 
    
         
            +
            rdoc README lib
         
     | 
| 
      
 69 
     | 
    
         
            +
            ```
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            ##Contributors
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            - Ben Prew https://github.com/benprew
         
     | 
| 
      
 74 
     | 
    
         
            +
            - Rory O'Kane
         
     | 
| 
      
 75 
     | 
    
         
            +
            - Sergio Espeja https://github.com/spejman
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            ##Copying
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            This work is developed by Sergio Espeja ( www.upf.edu/pdi/iula/sergio.espeja, sergio.espeja at gmail.com )
         
     | 
| 
      
 81 
     | 
    
         
            +
            mainly in Institut Universitari de Lingüística Aplicada of Universitat Pompeu Fabra ( www.iula.upf.es ),
         
     | 
| 
      
 82 
     | 
    
         
            +
            and also in bee.com.es ( bee.com.es ).
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            It is free software, and may be redistributed under GPL license.
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -1,19 +1,11 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'rubygems'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'rake'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'rake/clean'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'rake/testtask'
         
     | 
| 
       5 
     | 
    
         
            -
            require 'rake/packagetask'
         
     | 
| 
       6 
     | 
    
         
            -
            require 'rake/gempackagetask'
         
     | 
| 
       7 
     | 
    
         
            -
            require 'rake/rdoctask'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'rake/contrib/rubyforgepublisher'
         
     | 
| 
       9 
     | 
    
         
            -
            require 'fileutils'
         
     | 
| 
       10 
2 
     | 
    
         
             
            require 'hoe'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
       11 
4 
     | 
    
         
             
            include FileUtils
         
     | 
| 
       12 
     | 
    
         
            -
            require File.join(File.dirname(__FILE__), 'lib', 'gga4r', 'version')
         
     | 
| 
       13 
5 
     | 
    
         | 
| 
       14 
6 
     | 
    
         
             
            AUTHOR = "Sergio Espeja"
         
     | 
| 
       15 
7 
     | 
    
         
             
            EMAIL = "sergio.espeja@gmail.com"
         
     | 
| 
       16 
     | 
    
         
            -
            DESCRIPTION = "A Ruby Genetic Algorithm.  
     | 
| 
      
 8 
     | 
    
         
            +
            DESCRIPTION = "A Ruby Genetic Algorithm. Very simple to use: 1, take a class to evolve it and define fitness, recombine and mutate methods. 2, create a GeneticAlgorithm object with the population. 3, call the evolve method as many times as you want.description of gem"
         
     | 
| 
       17 
9 
     | 
    
         
             
            GEM_NAME = "gga4r" # what ppl will type to install your gem
         
     | 
| 
       18 
10 
     | 
    
         
             
            RUBYFORGE_PROJECT = "gga4r" # The unix name for your project
         
     | 
| 
       19 
11 
     | 
    
         
             
            HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
         
     | 
| 
         @@ -21,32 +13,30 @@ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org" 
     | 
|
| 
       21 
13 
     | 
    
         | 
| 
       22 
14 
     | 
    
         
             
            NAME = "gga4r"
         
     | 
| 
       23 
15 
     | 
    
         
             
            REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
         
     | 
| 
       24 
     | 
    
         
            -
            VERS = ENV['VERSION'] || (Gga4r::VERSION::STRING + (REV ? ".#{REV}" : ""))
         
     | 
| 
       25 
     | 
    
         
            -
                                      CLEAN.include ['**/.*.sw?', '*.gem', '.config']
         
     | 
| 
       26 
16 
     | 
    
         
             
            RDOC_OPTS = ['--quiet', '--title', "gga4r documentation",
         
     | 
| 
       27 
17 
     | 
    
         
             
                "--opname", "index.html",
         
     | 
| 
       28 
     | 
    
         
            -
                "--line-numbers", 
     | 
| 
      
 18 
     | 
    
         
            +
                "--line-numbers",
         
     | 
| 
       29 
19 
     | 
    
         
             
                "--main", "README",
         
     | 
| 
       30 
20 
     | 
    
         
             
                "--inline-source"]
         
     | 
| 
       31 
21 
     | 
    
         | 
| 
       32 
22 
     | 
    
         
             
            class Hoe
         
     | 
| 
       33 
     | 
    
         
            -
              def extra_deps 
     | 
| 
       34 
     | 
    
         
            -
                @extra_deps.reject { |x| Array(x).first == 'hoe' } 
     | 
| 
       35 
     | 
    
         
            -
              end 
     | 
| 
      
 23 
     | 
    
         
            +
              def extra_deps
         
     | 
| 
      
 24 
     | 
    
         
            +
                @extra_deps.reject { |x| Array(x).first == 'hoe' }
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
       36 
26 
     | 
    
         
             
            end
         
     | 
| 
       37 
27 
     | 
    
         | 
| 
       38 
28 
     | 
    
         
             
            # Generate all the Rake tasks
         
     | 
| 
       39 
29 
     | 
    
         
             
            # Run 'rake -T' to see list of generated tasks (from gem root directory)
         
     | 
| 
       40 
     | 
    
         
            -
            hoe = Hoe. 
     | 
| 
       41 
     | 
    
         
            -
              p.author = AUTHOR 
     | 
| 
      
 30 
     | 
    
         
            +
            hoe = Hoe.spec GEM_NAME do |p|
         
     | 
| 
      
 31 
     | 
    
         
            +
              p.author = AUTHOR
         
     | 
| 
       42 
32 
     | 
    
         
             
              p.description = DESCRIPTION
         
     | 
| 
       43 
33 
     | 
    
         
             
              p.email = EMAIL
         
     | 
| 
       44 
34 
     | 
    
         
             
              p.summary = DESCRIPTION
         
     | 
| 
       45 
     | 
    
         
            -
              p. 
     | 
| 
      
 35 
     | 
    
         
            +
              p.urls = [HOMEPATH]
         
     | 
| 
       46 
36 
     | 
    
         
             
              p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
         
     | 
| 
       47 
37 
     | 
    
         
             
              p.test_globs = ["test/**/*_test.rb"]
         
     | 
| 
       48 
     | 
    
         
            -
              p. 
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 38 
     | 
    
         
            +
              p.readme_file = 'README.md'
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
       50 
40 
     | 
    
         
             
              # == Optional
         
     | 
| 
       51 
41 
     | 
    
         
             
              #p.changes        - A description of the release's latest changes.
         
     | 
| 
       52 
42 
     | 
    
         
             
              #p.extra_deps     - An array of rubygem dependencies.
         
     | 
    
        data/lib/gga4r.rb
    CHANGED
    
    | 
         @@ -1 +1,142 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            require 'logger'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class GeneticAlgorithm
         
     | 
| 
      
 4 
     | 
    
         
            +
              VERSION = '0.9.3'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              # Must be initialized with a Array of chromosomes
         
     | 
| 
      
 7 
     | 
    
         
            +
              # To be a chomosome the object must implement the next methods:
         
     | 
| 
      
 8 
     | 
    
         
            +
              #  - fitness
         
     | 
| 
      
 9 
     | 
    
         
            +
              #  - recombine
         
     | 
| 
      
 10 
     | 
    
         
            +
              #  - mutate
         
     | 
| 
      
 11 
     | 
    
         
            +
              #  - distance (only for multi-modal optimization)
         
     | 
| 
      
 12 
     | 
    
         
            +
              #  Accepts the next properties:
         
     | 
| 
      
 13 
     | 
    
         
            +
              #   - max_population: maximum number of individuals that are allowed to form a generation.
         
     | 
| 
      
 14 
     | 
    
         
            +
              #   - logger: logger to write messages if given.
         
     | 
| 
      
 15 
     | 
    
         
            +
              #   - multi_recombination: set to true if the result of a chromosome's #recombination method
         
     | 
| 
      
 16 
     | 
    
         
            +
              #     returns an array. Default to false
         
     | 
| 
      
 17 
     | 
    
         
            +
              #   - multi_modal: set to true to use a multi-modal algorithm using deterministic crowding and a distance-derated fitness.
         
     | 
| 
      
 18 
     | 
    
         
            +
              #   - share_radius: in multi-modal optimization, determines the niche radius for derated fitness calculation. 
         
     | 
| 
      
 19 
     | 
    
         
            +
              def initialize(in_pop, prop = {})
         
     | 
| 
      
 20 
     | 
    
         
            +
                @max_population =  prop[:max_population]
         
     | 
| 
      
 21 
     | 
    
         
            +
                @logger = prop[:logger] || Logger.new('/dev/null')
         
     | 
| 
      
 22 
     | 
    
         
            +
                @population = in_pop
         
     | 
| 
      
 23 
     | 
    
         
            +
                @multi_recombination = prop[:multi_recombination] || false
         
     | 
| 
      
 24 
     | 
    
         
            +
                @generations = []
         
     | 
| 
      
 25 
     | 
    
         
            +
                @multi_modal = prop[:multi_modal] || false
         
     | 
| 
      
 26 
     | 
    
         
            +
                @share_radius = prop[:share_radius] or 3
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              # Returns an array with the best fitted individuals for last generation
         
     | 
| 
      
 30 
     | 
    
         
            +
              def best_fit
         
     | 
| 
      
 31 
     | 
    
         
            +
                @population.max_by(&:fitness)
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              # Returns an array with the best fitted n individuals from the population (might include local optima)
         
     | 
| 
      
 35 
     | 
    
         
            +
              def best_fitted(n)
         
     | 
| 
      
 36 
     | 
    
         
            +
                @population.uniq.sort_by{|c| -c.fitness}.first(n)
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
               # Returns an array with the best fitted n individuals from the population (might include local optima)
         
     | 
| 
      
 40 
     | 
    
         
            +
               # Uses a distance-derated fitness metric
         
     | 
| 
      
 41 
     | 
    
         
            +
              def best_fitted_derated(n)
         
     | 
| 
      
 42 
     | 
    
         
            +
                @population.uniq.sort_by{|c| -(derated_fitness(c,@population))}.first(n)
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
              # Returns a GeneticAlgorithm object with the generations
         
     | 
| 
      
 46 
     | 
    
         
            +
              # loaded from given files and with properties prop.
         
     | 
| 
      
 47 
     | 
    
         
            +
              # Files must contain the chromosomes in YAML format.
         
     | 
| 
      
 48 
     | 
    
         
            +
              def self.populate_from_file(filename, prop = {})
         
     | 
| 
      
 49 
     | 
    
         
            +
                GeneticAlgorithm.new(YAML.load(File.open(filename, 'r')), prop)
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
              # Saves into filename and in yaml format the generation that matchs with given
         
     | 
| 
      
 53 
     | 
    
         
            +
              # generation number ( by default from last generation ).
         
     | 
| 
      
 54 
     | 
    
         
            +
              def save_population(filename)
         
     | 
| 
      
 55 
     | 
    
         
            +
                f = File.new(filename, "w")
         
     | 
| 
      
 56 
     | 
    
         
            +
                f.write(@population.to_yaml)
         
     | 
| 
      
 57 
     | 
    
         
            +
                f.close
         
     | 
| 
      
 58 
     | 
    
         
            +
              end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            # EVOLUTION METHODS
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
              # Evolves the actual generation num_steps steps (1 by default).
         
     | 
| 
      
 63 
     | 
    
         
            +
              def evolve(num_steps = 1)
         
     | 
| 
      
 64 
     | 
    
         
            +
                num_steps.times do |t|
         
     | 
| 
      
 65 
     | 
    
         
            +
                  @population = selection(@population)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  new_gen = @population.map { |chromosome| chromosome.dup }
         
     | 
| 
      
 67 
     | 
    
         
            +
                  if !@multi_modal
         
     | 
| 
      
 68 
     | 
    
         
            +
                    @population += recombination(new_gen) + mutation(new_gen)
         
     | 
| 
      
 69 
     | 
    
         
            +
                  else
         
     | 
| 
      
 70 
     | 
    
         
            +
                    @population = deterministic_crowding(@population)
         
     | 
| 
      
 71 
     | 
    
         
            +
                    @population = mutation(@population)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
              end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
              private
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
              # Selects population to survive and recombine
         
     | 
| 
      
 79 
     | 
    
         
            +
              def selection(g)
         
     | 
| 
      
 80 
     | 
    
         
            +
                  @max_population && g.length > @max_population ? g.sort_by{|c| -c.fitness}.first(@max_population) : g
         
     | 
| 
      
 81 
     | 
    
         
            +
              end
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
              # Recombines population
         
     | 
| 
      
 84 
     | 
    
         
            +
              def recombination(g)
         
     | 
| 
      
 85 
     | 
    
         
            +
                @logger.debug "Recombination " + g.size.to_s + " chromosomes." if @logger
         
     | 
| 
      
 86 
     | 
    
         
            +
                new_generation = g.dup.shuffle!
         
     | 
| 
      
 87 
     | 
    
         
            +
                @logger.debug "Shuffled!" if @logger
         
     | 
| 
      
 88 
     | 
    
         
            +
                new_children = []
         
     | 
| 
      
 89 
     | 
    
         
            +
                new_generation.each_slice(2) do |chromosome1, chromosome2|
         
     | 
| 
      
 90 
     | 
    
         
            +
                  next if chromosome2.nil?
         
     | 
| 
      
 91 
     | 
    
         
            +
                  @logger.debug "Recombining" if @logger
         
     | 
| 
      
 92 
     | 
    
         
            +
                  new_children << chromosome1.recombine(chromosome2)
         
     | 
| 
      
 93 
     | 
    
         
            +
                end
         
     | 
| 
      
 94 
     | 
    
         
            +
                new_children.flatten!(1) if @multi_recombination
         
     | 
| 
      
 95 
     | 
    
         
            +
                new_generation + new_children
         
     | 
| 
      
 96 
     | 
    
         
            +
              end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
              def deterministic_crowding(g)
         
     | 
| 
      
 99 
     | 
    
         
            +
                groups = g.shuffle
         
     | 
| 
      
 100 
     | 
    
         
            +
                group1 = groups.first(g.length/2)
         
     | 
| 
      
 101 
     | 
    
         
            +
                group2 = groups[g.length/2..-1]
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
                new_gen = []
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                group1.each_with_index do |p1,i|
         
     | 
| 
      
 106 
     | 
    
         
            +
                  p2 = group2[i]
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                  if p2
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                    c1, c2 = p1.recombine(p2)
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                    if p1.distance(c1) + p2.distance(c2) <= p1.distance(c2) + p2.distance(c1)
         
     | 
| 
      
 113 
     | 
    
         
            +
                      new_gen << [p1,c1].max_by{|c| derated_fitness(c,g)}
         
     | 
| 
      
 114 
     | 
    
         
            +
                      new_gen << [p2,c2].max_by{|c| derated_fitness(c,g)}
         
     | 
| 
      
 115 
     | 
    
         
            +
                    else 
         
     | 
| 
      
 116 
     | 
    
         
            +
                      new_gen << [p1,c2].max_by{|c| derated_fitness(c,g)}
         
     | 
| 
      
 117 
     | 
    
         
            +
                      new_gen << [p2,c1].max_by{|c| derated_fitness(c,g)}
         
     | 
| 
      
 118 
     | 
    
         
            +
                    end
         
     | 
| 
      
 119 
     | 
    
         
            +
                  else
         
     | 
| 
      
 120 
     | 
    
         
            +
                    new_gen << p1
         
     | 
| 
      
 121 
     | 
    
         
            +
                  end
         
     | 
| 
      
 122 
     | 
    
         
            +
                end
         
     | 
| 
      
 123 
     | 
    
         
            +
                new_gen
         
     | 
| 
      
 124 
     | 
    
         
            +
              end
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
              def derated_fitness(c,g)
         
     | 
| 
      
 127 
     | 
    
         
            +
                share_count = g.map{|c2| [(1-c.distance(c2)/@share_radius),0].max }.sum
         
     | 
| 
      
 128 
     | 
    
         
            +
                share_count = Float::EPSILON if share_count==0
         
     | 
| 
      
 129 
     | 
    
         
            +
                c.fitness/share_count
         
     | 
| 
      
 130 
     | 
    
         
            +
              end
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
              # Mutates population
         
     | 
| 
      
 133 
     | 
    
         
            +
              def mutation(g)
         
     | 
| 
      
 134 
     | 
    
         
            +
                @logger.debug "Mutation " + g.size.to_s + " chromosomes." if @logger
         
     | 
| 
      
 135 
     | 
    
         
            +
                new_generation = g.dup
         
     | 
| 
      
 136 
     | 
    
         
            +
                new_generation.each do |chromosome|
         
     | 
| 
      
 137 
     | 
    
         
            +
                  @logger.debug "Mutate" if @logger
         
     | 
| 
      
 138 
     | 
    
         
            +
                  chromosome.mutate
         
     | 
| 
      
 139 
     | 
    
         
            +
                end
         
     | 
| 
      
 140 
     | 
    
         
            +
                new_generation
         
     | 
| 
      
 141 
     | 
    
         
            +
              end
         
     | 
| 
      
 142 
     | 
    
         
            +
            end
         
     | 
    
        data/test/gga4r_test.rb
    CHANGED
    
    | 
         @@ -1,37 +1,73 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require File.dirname(__FILE__) + '/test_helper.rb'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class IndividualStub < Array
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              def mutate
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              def fitness
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       4 
11 
     | 
    
         
             
              def recombine(a)
         
     | 
| 
       5 
12 
     | 
    
         
             
                self * 2
         
     | 
| 
       6 
13 
     | 
    
         
             
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
       7 
15 
     | 
    
         
             
              def self.create_random_population(num_population = 30)
         
     | 
| 
       8 
16 
     | 
    
         
             
                population = []
         
     | 
| 
       9 
17 
     | 
    
         
             
                num_population.times do
         
     | 
| 
       10 
     | 
    
         
            -
                  population << IndividualStub.new
         
     | 
| 
      
 18 
     | 
    
         
            +
                  population << IndividualStub.new([1,2,3])
         
     | 
| 
       11 
19 
     | 
    
         
             
                end
         
     | 
| 
       12 
20 
     | 
    
         
             
                return population
         
     | 
| 
       13 
21 
     | 
    
         
             
              end
         
     | 
| 
       14 
22 
     | 
    
         
             
            end
         
     | 
| 
       15 
23 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
            class  
     | 
| 
      
 24 
     | 
    
         
            +
            class StringPopulation < Array
         
     | 
| 
      
 25 
     | 
    
         
            +
              def fitness
         
     | 
| 
      
 26 
     | 
    
         
            +
                fitness = self.select { |pos| pos == 1 }.size.to_f / self.size.to_f
         
     | 
| 
      
 27 
     | 
    
         
            +
                fitness
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              def recombine(c2)
         
     | 
| 
      
 31 
     | 
    
         
            +
                cross_point = rand([self.size, c2.size].min) + 1
         
     | 
| 
      
 32 
     | 
    
         
            +
                c1_a, c1_b = self.slice(0,cross_point), self.slice(cross_point, 0)
         
     | 
| 
      
 33 
     | 
    
         
            +
                c2_a, c2_b = c2.slice(0,cross_point), c2.slice(cross_point, 0)
         
     | 
| 
      
 34 
     | 
    
         
            +
                [StringPopulation.new(c1_a + c2_b), StringPopulation.new(c2_a + c1_b)]
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
       17 
36 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
              def  
     | 
| 
      
 37 
     | 
    
         
            +
              def mutate
         
     | 
| 
      
 38 
     | 
    
         
            +
                mutate_point = (rand * self.size).to_i
         
     | 
| 
      
 39 
     | 
    
         
            +
                self[mutate_point] = 1
         
     | 
| 
       19 
40 
     | 
    
         
             
              end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
              def  
     | 
| 
       22 
     | 
    
         
            -
                 
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              def self.create_population(s_long = 10, num = 10)
         
     | 
| 
      
 43 
     | 
    
         
            +
                population = []
         
     | 
| 
      
 44 
     | 
    
         
            +
                num.times  do
         
     | 
| 
      
 45 
     | 
    
         
            +
                  chromosome = self.new(Array.new(s_long).collect { (rand > 0.2) ? 0:1 })
         
     | 
| 
      
 46 
     | 
    
         
            +
                  population << chromosome
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
                population
         
     | 
| 
       23 
49 
     | 
    
         
             
              end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
      
 50 
     | 
    
         
            +
            end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            class Gga4rTest < Test::Unit::TestCase
         
     | 
| 
      
 53 
     | 
    
         
            +
              def test_single_recombination_result
         
     | 
| 
       26 
54 
     | 
    
         
             
                first_pop_even = IndividualStub.create_random_population(30)
         
     | 
| 
       27 
55 
     | 
    
         
             
                ga = GeneticAlgorithm.new(first_pop_even)
         
     | 
| 
       28 
     | 
    
         
            -
                 
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                 
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
                5.times do |i|
         
     | 
| 
      
 57 
     | 
    
         
            +
                  ga.evolve
         
     | 
| 
      
 58 
     | 
    
         
            +
                  new_pop = ga.instance_variable_get(:@population)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  assert first_pop_even.size < new_pop.size
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
              def test_multiple_recombination
         
     | 
| 
      
 64 
     | 
    
         
            +
                opts = {multi_recombination: true}
         
     | 
| 
      
 65 
     | 
    
         
            +
                ga = GeneticAlgorithm.new(StringPopulation.create_population, opts)
         
     | 
| 
      
 66 
     | 
    
         
            +
                assert ga.instance_variable_get(:@multi_recombination)
         
     | 
| 
      
 67 
     | 
    
         
            +
                4.times do |i|
         
     | 
| 
      
 68 
     | 
    
         
            +
                  assert_nothing_raised do
         
     | 
| 
      
 69 
     | 
    
         
            +
                    ga.evolve
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
       36 
72 
     | 
    
         
             
              end
         
     | 
| 
       37 
73 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,60 +1,90 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            --- !ruby/object:Gem::Specification 
     | 
| 
       2 
     | 
    
         
            -
            rubygems_version: 0.9.4
         
     | 
| 
       3 
     | 
    
         
            -
            specification_version: 1
         
     | 
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
       4 
2 
     | 
    
         
             
            name: gga4r
         
     | 
| 
       5 
     | 
    
         
            -
            version: !ruby/object:Gem::Version 
     | 
| 
       6 
     | 
    
         
            -
              version: 0.9. 
     | 
| 
       7 
     | 
    
         
            -
            date: 2007-11-30 00:00:00 +01:00
         
     | 
| 
       8 
     | 
    
         
            -
            summary: "A Ruby Genetic Algorithm. So simple to use: 1, take a class to evolve it and define fitness, recombine and mutate methods. 2, create a GeneticAlgorithm object with the population. 3, call evolve method as many times as you want.description of gem"
         
     | 
| 
       9 
     | 
    
         
            -
            require_paths: 
         
     | 
| 
       10 
     | 
    
         
            -
            - lib
         
     | 
| 
       11 
     | 
    
         
            -
            email: sergio.espeja@gmail.com
         
     | 
| 
       12 
     | 
    
         
            -
            homepage: http://gga4r.rubyforge.org
         
     | 
| 
       13 
     | 
    
         
            -
            rubyforge_project: gga4r
         
     | 
| 
       14 
     | 
    
         
            -
            description: "A Ruby Genetic Algorithm. So simple to use: 1, take a class to evolve it and define fitness, recombine and mutate methods. 2, create a GeneticAlgorithm object with the population. 3, call evolve method as many times as you want.description of gem"
         
     | 
| 
       15 
     | 
    
         
            -
            autorequire: 
         
     | 
| 
       16 
     | 
    
         
            -
            default_executable: 
         
     | 
| 
       17 
     | 
    
         
            -
            bindir: bin
         
     | 
| 
       18 
     | 
    
         
            -
            has_rdoc: true
         
     | 
| 
       19 
     | 
    
         
            -
            required_ruby_version: !ruby/object:Gem::Version::Requirement 
         
     | 
| 
       20 
     | 
    
         
            -
              requirements: 
         
     | 
| 
       21 
     | 
    
         
            -
              - - ">"
         
     | 
| 
       22 
     | 
    
         
            -
                - !ruby/object:Gem::Version 
         
     | 
| 
       23 
     | 
    
         
            -
                  version: 0.0.0
         
     | 
| 
       24 
     | 
    
         
            -
              version: 
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.9.3
         
     | 
| 
       25 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
            cert_chain: 
         
     | 
| 
       28 
     | 
    
         
            -
            post_install_message: 
         
     | 
| 
       29 
     | 
    
         
            -
            authors: 
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
       30 
7 
     | 
    
         
             
            - Sergio Espeja
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire: 
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: bin
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2013-12-16 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies:
         
     | 
| 
      
 13 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 14 
     | 
    
         
            +
              name: rdoc
         
     | 
| 
      
 15 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 16 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 17 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 18 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '4.0'
         
     | 
| 
      
 20 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 21 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 22 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 23 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 24 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 25 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 26 
     | 
    
         
            +
                    version: '4.0'
         
     | 
| 
      
 27 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 28 
     | 
    
         
            +
              name: hoe
         
     | 
| 
      
 29 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: '3.7'
         
     | 
| 
      
 34 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 35 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 37 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 38 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 39 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 40 
     | 
    
         
            +
                    version: '3.7'
         
     | 
| 
      
 41 
     | 
    
         
            +
            description: ! 'A Ruby Genetic Algorithm. Very simple to use: 1, take a class to evolve
         
     | 
| 
      
 42 
     | 
    
         
            +
              it and define fitness, recombine and mutate methods. 2, create a GeneticAlgorithm
         
     | 
| 
      
 43 
     | 
    
         
            +
              object with the population. 3, call the evolve method as many times as you want.description
         
     | 
| 
      
 44 
     | 
    
         
            +
              of gem'
         
     | 
| 
      
 45 
     | 
    
         
            +
            email: sergio.espeja@gmail.com
         
     | 
| 
      
 46 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 47 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 48 
     | 
    
         
            +
            extra_rdoc_files:
         
     | 
| 
      
 49 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 50 
     | 
    
         
            +
            - Manifest.txt
         
     | 
| 
      
 51 
     | 
    
         
            +
            files:
         
     | 
| 
       32 
52 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       33 
     | 
    
         
            -
            - README. 
     | 
| 
       34 
     | 
    
         
            -
            - CHANGELOG.txt
         
     | 
| 
      
 53 
     | 
    
         
            +
            - README.md
         
     | 
| 
       35 
54 
     | 
    
         
             
            - Manifest.txt
         
     | 
| 
       36 
     | 
    
         
            -
            - setup.rb
         
     | 
| 
       37 
     | 
    
         
            -
            - lib/gga4r/version.rb
         
     | 
| 
       38 
     | 
    
         
            -
            - lib/gga4r/array_helper.rb
         
     | 
| 
       39 
     | 
    
         
            -
            - lib/gga4r/gga4r_main.rb
         
     | 
| 
       40 
55 
     | 
    
         
             
            - lib/gga4r.rb
         
     | 
| 
       41 
56 
     | 
    
         
             
            - test/test_helper.rb
         
     | 
| 
       42 
57 
     | 
    
         
             
            - test/gga4r_test.rb
         
     | 
| 
       43 
58 
     | 
    
         
             
            - examples/ga_fitness_all_1s.rb
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
      
 59 
     | 
    
         
            +
            - .gemtest
         
     | 
| 
      
 60 
     | 
    
         
            +
            homepage: http://gga4r.rubyforge.org
         
     | 
| 
      
 61 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 62 
     | 
    
         
            +
            - MIT
         
     | 
| 
      
 63 
     | 
    
         
            +
            metadata: {}
         
     | 
| 
      
 64 
     | 
    
         
            +
            post_install_message: 
         
     | 
| 
      
 65 
     | 
    
         
            +
            rdoc_options:
         
     | 
| 
       47 
66 
     | 
    
         
             
            - --main
         
     | 
| 
       48 
     | 
    
         
            -
            - README. 
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       50 
     | 
    
         
            -
            -  
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
      
 67 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 68 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 69 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 70 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 71 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 72 
     | 
    
         
            +
              - - ! '>='
         
     | 
| 
      
 73 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 74 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 75 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 76 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 77 
     | 
    
         
            +
              - - ! '>='
         
     | 
| 
      
 78 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 79 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
       57 
80 
     | 
    
         
             
            requirements: []
         
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
      
 81 
     | 
    
         
            +
            rubyforge_project: gga4r
         
     | 
| 
      
 82 
     | 
    
         
            +
            rubygems_version: 2.1.10
         
     | 
| 
      
 83 
     | 
    
         
            +
            signing_key: 
         
     | 
| 
      
 84 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 85 
     | 
    
         
            +
            summary: ! 'A Ruby Genetic Algorithm. Very simple to use: 1, take a class to evolve
         
     | 
| 
      
 86 
     | 
    
         
            +
              it and define fitness, recombine and mutate methods. 2, create a GeneticAlgorithm
         
     | 
| 
      
 87 
     | 
    
         
            +
              object with the population. 3, call the evolve method as many times as you want.description
         
     | 
| 
      
 88 
     | 
    
         
            +
              of gem'
         
     | 
| 
      
 89 
     | 
    
         
            +
            test_files:
         
     | 
| 
      
 90 
     | 
    
         
            +
            - test/gga4r_test.rb
         
     |