mhl 0.2.0 → 0.3.0
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 +5 -5
- data/.projections.json +12 -0
- data/.travis.yml +6 -0
- data/README.md +58 -38
- data/Rakefile +3 -0
- data/TODO +24 -0
- data/extra/process_ga_solver_output.awk +2 -0
- data/extra/process_pso_solver_output.awk +2 -0
- data/lib/mhl/charged_swarm.rb +17 -14
- data/lib/mhl/genetic_algorithm_solver.rb +78 -54
- data/lib/mhl/hm_plus_rechenberg_controller.rb +44 -0
- data/lib/mhl/{integer_genotype_space.rb → integer_vector_genotype_space.rb} +14 -8
- data/lib/mhl/multiswarm_qpso_solver.rb +31 -19
- data/lib/mhl/particle_swarm_optimization_solver.rb +25 -16
- data/lib/mhl/pso_swarm.rb +12 -10
- data/lib/mhl/qpso_swarm.rb +10 -9
- data/lib/mhl/quantum_particle_swarm_optimization_solver.rb +24 -16
- data/lib/mhl/real_vector_genotype_space.rb +142 -0
- data/lib/mhl/rechenberg_controller.rb +49 -0
- data/lib/mhl/version.rb +1 -1
- data/mhl.gemspec +4 -1
- data/test/mhl/genetic_algorithm_solver_test.rb +69 -31
- data/test/mhl/{integer_genotype_space_test.rb → integer_vector_genotype_space_test.rb} +34 -26
- data/test/mhl/multiswarm_qpso_solver_test.rb +48 -10
- data/test/mhl/particle_swarm_optimization_solver_test.rb +47 -9
- data/test/mhl/quantum_particle_swarm_optimization_solver_test.rb +47 -9
- data/test/mhl/real_vector_genotype_space_test.rb +85 -0
- data/test/test_helper.rb +1 -0
- metadata +72 -20
@@ -2,17 +2,55 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
describe MHL::ParticleSwarmOptimizationSolver do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
let :logger do
|
6
|
+
:stderr
|
7
|
+
end
|
8
|
+
|
9
|
+
let :log_level do
|
10
|
+
ENV['DEBUG'] ? :debug : :warn
|
11
|
+
end
|
12
|
+
|
13
|
+
let :solver do
|
14
|
+
MHL::ParticleSwarmOptimizationSolver.new(
|
15
|
+
constraints: {
|
16
|
+
min: [ -100, -100, -100, -100, -100 ],
|
17
|
+
max: [ 100, 100, 100, 100, 100 ],
|
10
18
|
},
|
11
|
-
:
|
12
|
-
:logger
|
13
|
-
|
19
|
+
exit_condition: lambda {|iteration,best| best[:height].abs < 0.001 },
|
20
|
+
logger: logger,
|
21
|
+
log_level: log_level,
|
14
22
|
)
|
15
|
-
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'concurrent' do
|
26
|
+
|
27
|
+
it 'should solve a thread-safe function concurrently' do
|
28
|
+
func = -> position do
|
29
|
+
-(position.inject(0.0) {|s,x| s += x**2 })
|
30
|
+
end
|
31
|
+
|
32
|
+
solver.solve(func, concurrent: true)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'sequential' do
|
38
|
+
|
39
|
+
it 'should solve a non-thread safe function sequentially' do
|
40
|
+
# here we create a specially modified version of the function to optimize
|
41
|
+
# that raises an error if called concurrently
|
42
|
+
mx = Mutex.new
|
43
|
+
func = -> position do
|
44
|
+
raise "Sequential call check failed" if mx.locked?
|
45
|
+
mx.synchronize do
|
46
|
+
sleep 0.005
|
47
|
+
-(position.inject(0.0) {|s,x| s += x**2 })
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
solver.solve(func)
|
52
|
+
end
|
53
|
+
|
16
54
|
end
|
17
55
|
|
18
56
|
end
|
@@ -2,17 +2,55 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
describe MHL::QuantumPSOSolver do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
let :logger do
|
6
|
+
:stderr
|
7
|
+
end
|
8
|
+
|
9
|
+
let :log_level do
|
10
|
+
ENV['DEBUG'] ? :debug : :warn
|
11
|
+
end
|
12
|
+
|
13
|
+
let :solver do
|
14
|
+
MHL::QuantumPSOSolver.new(
|
15
|
+
constraints: {
|
16
|
+
min: [ -100, -100, -100, -100, -100 ],
|
17
|
+
max: [ 100, 100, 100, 100, 100 ],
|
10
18
|
},
|
11
|
-
:
|
12
|
-
:logger
|
13
|
-
|
19
|
+
exit_condition: lambda {|iteration,best| best[:height].abs < 0.001 },
|
20
|
+
logger: logger,
|
21
|
+
log_level: log_level,
|
14
22
|
)
|
15
|
-
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'concurrent' do
|
26
|
+
|
27
|
+
it 'should solve a thread-safe function concurrently' do
|
28
|
+
func = -> position do
|
29
|
+
-(position.inject(0.0) {|s,x| s += x**2 })
|
30
|
+
end
|
31
|
+
|
32
|
+
solver.solve(func, concurrent: true)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'sequential' do
|
38
|
+
|
39
|
+
it 'should solve a non-thread safe function sequentially' do
|
40
|
+
# here we create a specially modified version of the function to optimize
|
41
|
+
# that raises an error if called concurrently
|
42
|
+
mx = Mutex.new
|
43
|
+
func = -> position do
|
44
|
+
raise "Sequential call check failed" if mx.locked?
|
45
|
+
mx.synchronize do
|
46
|
+
sleep 0.005
|
47
|
+
-(position.inject(0.0) {|s,x| s += x**2 })
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
solver.solve(func)
|
52
|
+
end
|
53
|
+
|
16
54
|
end
|
17
55
|
|
18
56
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe MHL::RealVectorGenotypeSpace do
|
4
|
+
|
5
|
+
let :logger do
|
6
|
+
l = Logger.new(STDERR)
|
7
|
+
l.level = ENV['DEBUG'] ? :debug : :warn
|
8
|
+
l
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should refuse to work with non-positive dimensions' do
|
12
|
+
assert_raises(ArgumentError) do
|
13
|
+
MHL::RealVectorGenotypeSpace.new(
|
14
|
+
{
|
15
|
+
dimensions: -rand(100),
|
16
|
+
recombination_type: :intermediate,
|
17
|
+
# random_func: lambda { Array.new(2) { rand(20) } }
|
18
|
+
},
|
19
|
+
logger
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should refuse to work with non- line or intermediate recombination' do
|
25
|
+
assert_raises(ArgumentError) do
|
26
|
+
MHL::RealVectorGenotypeSpace.new(
|
27
|
+
{
|
28
|
+
dimensions: 2,
|
29
|
+
recombination_type: :something,
|
30
|
+
},
|
31
|
+
logger
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'with constraints' do
|
37
|
+
it 'should enforce constraints on generation' do
|
38
|
+
x1 = rand(100); x2 = x1 + rand(200)
|
39
|
+
y1 = -rand(100); y2 = y1 + rand(200)
|
40
|
+
is = MHL::RealVectorGenotypeSpace.new(
|
41
|
+
{
|
42
|
+
dimensions: 2,
|
43
|
+
recombination_type: :intermediate,
|
44
|
+
constraints: [ { from: x1, to: x2 },
|
45
|
+
{ from: y1, to: y2 } ],
|
46
|
+
},
|
47
|
+
logger
|
48
|
+
)
|
49
|
+
genotype = is.get_random
|
50
|
+
genotype.size.must_equal 2
|
51
|
+
genotype[0].must_be :>=, x1
|
52
|
+
genotype[0].must_be :<=, x2
|
53
|
+
genotype[1].must_be :>=, y1
|
54
|
+
genotype[1].must_be :<=, y2
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should enforce constraints on reproduction' do
|
58
|
+
x1 = rand(100); x2 = x1 + rand(200)
|
59
|
+
y1 = -rand(100); y2 = y1 + rand(200)
|
60
|
+
is = MHL::RealVectorGenotypeSpace.new(
|
61
|
+
{
|
62
|
+
dimensions: 2,
|
63
|
+
recombination_type: :intermediate,
|
64
|
+
constraints: [ { from: x1, to: x2 },
|
65
|
+
{ from: y1, to: y2 } ],
|
66
|
+
},
|
67
|
+
logger
|
68
|
+
)
|
69
|
+
g1 = { genotype: [ x1, y1 ] }
|
70
|
+
g2 = { genotype: [ x2, y2 ] }
|
71
|
+
a, b = is.reproduce_from(
|
72
|
+
g1, g2,
|
73
|
+
ERV::RandomVariable.new(distribution: :geometric,
|
74
|
+
args: { probability_of_success: 0.05 }),
|
75
|
+
ERV::RandomVariable.new(distribution: :uniform,
|
76
|
+
args: { min_value: -0.25, max_value: 1.25 })
|
77
|
+
)
|
78
|
+
a[:genotype][0].must_be :>=, x1
|
79
|
+
a[:genotype][0].must_be :<=, x2
|
80
|
+
b[:genotype][1].must_be :>=, y1
|
81
|
+
b[:genotype][1].must_be :<=, y2
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,85 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mhl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mauro Tortonesi
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: bitstring
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
17
|
- - ">="
|
17
18
|
- !ruby/object:Gem::Version
|
18
19
|
version: '0'
|
19
|
-
name: bitstring
|
20
|
-
prerelease: false
|
21
20
|
type: :runtime
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
+
name: concurrent-ruby
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
31
|
- - "~>"
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '1.0'
|
33
|
-
name: concurrent-ruby
|
34
|
-
prerelease: false
|
35
34
|
type: :runtime
|
35
|
+
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
+
name: erv
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.3.4
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.3.4
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
42
57
|
requirement: !ruby/object:Gem::Requirement
|
43
58
|
requirements:
|
44
59
|
- - ">="
|
45
60
|
- !ruby/object:Gem::Version
|
46
61
|
version: '0'
|
47
|
-
|
62
|
+
type: :development
|
48
63
|
prerelease: false
|
49
|
-
type: :runtime
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
70
|
+
name: dotenv
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.5.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.5.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
56
85
|
requirement: !ruby/object:Gem::Requirement
|
57
86
|
requirements:
|
58
87
|
- - ">="
|
59
88
|
- !ruby/object:Gem::Version
|
60
89
|
version: '0'
|
61
|
-
name: bundler
|
62
|
-
prerelease: false
|
63
90
|
type: :development
|
91
|
+
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - ">="
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
98
|
+
name: minitest
|
70
99
|
requirement: !ruby/object:Gem::Requirement
|
71
100
|
requirements:
|
72
101
|
- - ">="
|
73
102
|
- !ruby/object:Gem::Version
|
74
103
|
version: '0'
|
75
|
-
name: rake
|
76
|
-
prerelease: false
|
77
104
|
type: :development
|
105
|
+
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
108
|
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: minitest-spec-context
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.0.3
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.0.3
|
83
125
|
description: A Ruby Metaheuristics library
|
84
126
|
email:
|
85
127
|
- mauro.tortonesi@unife.it
|
@@ -87,17 +129,23 @@ executables: []
|
|
87
129
|
extensions: []
|
88
130
|
extra_rdoc_files: []
|
89
131
|
files:
|
132
|
+
- ".projections.json"
|
133
|
+
- ".travis.yml"
|
90
134
|
- Gemfile
|
91
135
|
- LICENSE
|
92
136
|
- README.md
|
93
137
|
- Rakefile
|
138
|
+
- TODO
|
139
|
+
- extra/process_ga_solver_output.awk
|
140
|
+
- extra/process_pso_solver_output.awk
|
94
141
|
- lib/mhl.rb
|
95
142
|
- lib/mhl/bitstring_genotype_space.rb
|
96
143
|
- lib/mhl/charged_swarm.rb
|
97
144
|
- lib/mhl/generic_particle.rb
|
98
145
|
- lib/mhl/generic_swarm.rb
|
99
146
|
- lib/mhl/genetic_algorithm_solver.rb
|
100
|
-
- lib/mhl/
|
147
|
+
- lib/mhl/hm_plus_rechenberg_controller.rb
|
148
|
+
- lib/mhl/integer_vector_genotype_space.rb
|
101
149
|
- lib/mhl/multiswarm_qpso_solver.rb
|
102
150
|
- lib/mhl/particle.rb
|
103
151
|
- lib/mhl/particle_swarm_optimization_solver.rb
|
@@ -105,19 +153,22 @@ files:
|
|
105
153
|
- lib/mhl/qpso_swarm.rb
|
106
154
|
- lib/mhl/quantum_particle.rb
|
107
155
|
- lib/mhl/quantum_particle_swarm_optimization_solver.rb
|
156
|
+
- lib/mhl/real_vector_genotype_space.rb
|
157
|
+
- lib/mhl/rechenberg_controller.rb
|
108
158
|
- lib/mhl/version.rb
|
109
159
|
- mhl.gemspec
|
110
160
|
- test/mhl/genetic_algorithm_solver_test.rb
|
111
|
-
- test/mhl/
|
161
|
+
- test/mhl/integer_vector_genotype_space_test.rb
|
112
162
|
- test/mhl/multiswarm_qpso_solver_test.rb
|
113
163
|
- test/mhl/particle_swarm_optimization_solver_test.rb
|
114
164
|
- test/mhl/quantum_particle_swarm_optimization_solver_test.rb
|
165
|
+
- test/mhl/real_vector_genotype_space_test.rb
|
115
166
|
- test/test_helper.rb
|
116
167
|
homepage: https://github.com/mtortonesi/ruby-mhl
|
117
168
|
licenses:
|
118
169
|
- MIT
|
119
170
|
metadata: {}
|
120
|
-
post_install_message:
|
171
|
+
post_install_message:
|
121
172
|
rdoc_options: []
|
122
173
|
require_paths:
|
123
174
|
- lib
|
@@ -132,15 +183,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
183
|
- !ruby/object:Gem::Version
|
133
184
|
version: '0'
|
134
185
|
requirements: []
|
135
|
-
rubyforge_project:
|
136
|
-
rubygems_version: 2.6
|
137
|
-
signing_key:
|
186
|
+
rubyforge_project:
|
187
|
+
rubygems_version: 2.7.6
|
188
|
+
signing_key:
|
138
189
|
specification_version: 4
|
139
190
|
summary: A scientific library for Ruby that provides several metaheuristics
|
140
191
|
test_files:
|
141
192
|
- test/mhl/genetic_algorithm_solver_test.rb
|
142
|
-
- test/mhl/
|
193
|
+
- test/mhl/integer_vector_genotype_space_test.rb
|
143
194
|
- test/mhl/multiswarm_qpso_solver_test.rb
|
144
195
|
- test/mhl/particle_swarm_optimization_solver_test.rb
|
145
196
|
- test/mhl/quantum_particle_swarm_optimization_solver_test.rb
|
197
|
+
- test/mhl/real_vector_genotype_space_test.rb
|
146
198
|
- test/test_helper.rb
|