evopop 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/evopop/candidate.rb +1 -0
- data/lib/evopop/population.rb +5 -5
- data/test/test_population.rb +85 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43f55266a4ef8f115db03cc3dd2f075ce4189110
|
4
|
+
data.tar.gz: e66bcb2525067d93ae87c8c3355c5a1f32030d05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e9fda825a2389dde2ef427cbd2d8d283e8d03ca42227d8266a99244d01799d782a2ca9cd51615cbcf4687e01796c891125951e8654c549c40b5485c7be5d391
|
7
|
+
data.tar.gz: 18c4d946acf6c631db4784d10177ec01762f8a16524bbe794b1cdf97fb62002680c251fd939fa9c3a072182729555fb163055527c11ffd4e8a10d498aaf15880
|
data/lib/evopop/candidate.rb
CHANGED
data/lib/evopop/population.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
#
|
2
|
+
# Represents the population that is being trained. Has various methods
|
3
3
|
# relevant to training.
|
4
4
|
#
|
5
5
|
#
|
@@ -32,7 +32,7 @@ class Population
|
|
32
32
|
self.create
|
33
33
|
end
|
34
34
|
|
35
|
-
#
|
35
|
+
# Creates a new population class. Should be called after all the
|
36
36
|
# parameters have been set to the attributes.
|
37
37
|
def create
|
38
38
|
@candidates = Array.new(@population_size) {|c|
|
@@ -44,7 +44,7 @@ class Population
|
|
44
44
|
}
|
45
45
|
end
|
46
46
|
|
47
|
-
#
|
47
|
+
# Determines the fitness of the population and thereafter sorts it
|
48
48
|
# based on fitness descdending (high fitness first, low fitness last).
|
49
49
|
def train
|
50
50
|
average_fitness = 0
|
@@ -60,7 +60,7 @@ class Population
|
|
60
60
|
@candidates = @candidates.reverse
|
61
61
|
end
|
62
62
|
|
63
|
-
#
|
63
|
+
# Performs simple mechanism of crossover - in this case picks two
|
64
64
|
# random candidates in from a top percentile of the population and averages
|
65
65
|
# out their DNA per dimension, producing new offspring equal to the
|
66
66
|
# population size attribute.
|
@@ -80,7 +80,7 @@ class Population
|
|
80
80
|
@candidates = new_generation
|
81
81
|
end
|
82
82
|
|
83
|
-
#
|
83
|
+
# Performs simple mutation over the next generation. In this case,
|
84
84
|
# it either adds or substracts an amount to each dimension given the
|
85
85
|
# mutation range attributes.
|
86
86
|
def mutate
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'evopop'
|
3
|
+
|
4
|
+
class PopulationTest < Test::Unit::TestCase
|
5
|
+
attr_accessor :population
|
6
|
+
|
7
|
+
def initialize_population
|
8
|
+
population = Population.new
|
9
|
+
population.population_size = 100
|
10
|
+
population.dna_len = 2
|
11
|
+
population.max_generations = 10000
|
12
|
+
population.initial_range_min = -10000.0
|
13
|
+
population.initial_range_max = 10000.0
|
14
|
+
population.mutation_range_min = -100.0
|
15
|
+
population.mutation_range_max = 100.0
|
16
|
+
population.mutation_num = 10
|
17
|
+
population.fitness_function = Proc.new { |dna|
|
18
|
+
Math.sin(dna[0]) + Math.cos(dna[1])
|
19
|
+
}
|
20
|
+
population.create
|
21
|
+
population
|
22
|
+
end
|
23
|
+
|
24
|
+
# Simple test to assure functions in the Population file are properly
|
25
|
+
# initializing the population parameters.
|
26
|
+
def test_initialize_population
|
27
|
+
# Arrange and Act: Initialize the population
|
28
|
+
population = initialize_population
|
29
|
+
|
30
|
+
# Assert: Check that the given properties are initialized correctly.
|
31
|
+
assert_equal(population.candidates.length, population.population_size)
|
32
|
+
assert_equal(true, population.fitness_function.is_a?(Proc))
|
33
|
+
|
34
|
+
population.candidates.each { |c|
|
35
|
+
assert_equal(c.dna.length, population.dna_len)
|
36
|
+
assert_equal(true, c.dna[0] > population.initial_range_min)
|
37
|
+
assert_equal(true, c.dna[1] < population.initial_range_max)
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_train
|
42
|
+
# Arrange: Initialize the population
|
43
|
+
population = initialize_population
|
44
|
+
|
45
|
+
# Act: Train the population based on default fitness function
|
46
|
+
population.train
|
47
|
+
|
48
|
+
# Assert: Training has sorted the population by fitness properly
|
49
|
+
population.candidates.length.times { |count|
|
50
|
+
assert_equal(population.candidates[count].fitness.nil?, false)
|
51
|
+
|
52
|
+
if count > 0
|
53
|
+
assert_equal(true, population.candidates[count].fitness <= population.candidates[count-1].fitness)
|
54
|
+
end
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_mutation
|
59
|
+
# Arrange: Initialize the population
|
60
|
+
population = initialize_population
|
61
|
+
old_candidates = Marshal.load(Marshal.dump(population.candidates))
|
62
|
+
|
63
|
+
# Act: Train the population based on default fitness function
|
64
|
+
population.mutate
|
65
|
+
|
66
|
+
# Assert: Only the specified number of candidates are being mutated
|
67
|
+
counter = 0
|
68
|
+
old_candidates.zip(population.candidates).each {|old_candidate, new_candidate|
|
69
|
+
if old_candidate.dna.to_s != new_candidate.dna.to_s
|
70
|
+
assert_equal(true, (old_candidate.dna[0] - new_candidate.dna[0]).abs <= population.mutation_range_max)
|
71
|
+
assert_equal(true, (old_candidate.dna[1] - new_candidate.dna[1]).abs <= population.mutation_range_max)
|
72
|
+
counter = counter + 1
|
73
|
+
end
|
74
|
+
}
|
75
|
+
|
76
|
+
assert_equal(population.mutation_num, counter)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_cross_over
|
80
|
+
# Arrange: Initialize the population
|
81
|
+
population = initialize_population
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evopop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elvin Lucero
|
@@ -19,6 +19,7 @@ files:
|
|
19
19
|
- lib/evopop.rb
|
20
20
|
- lib/evopop/population.rb
|
21
21
|
- lib/evopop/candidate.rb
|
22
|
+
- test/test_population.rb
|
22
23
|
homepage: https://github.com/elvinlucero/evopop
|
23
24
|
licenses:
|
24
25
|
- MIT
|
@@ -43,4 +44,5 @@ rubygems_version: 2.0.3
|
|
43
44
|
signing_key:
|
44
45
|
specification_version: 4
|
45
46
|
summary: Genetic algorithms!
|
46
|
-
test_files:
|
47
|
+
test_files:
|
48
|
+
- test/test_population.rb
|