Algorithmically 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c3ff69c1deb1ef40a3b013235db5301c5fabe69
4
- data.tar.gz: 079f3e9fa0f0855bbdff52e73d6047e5a1c8e56d
3
+ metadata.gz: 834e24f733f439348830da9a6eedcc2ace840fe4
4
+ data.tar.gz: 36df1221be7719139bdf5f39e0fa5cf799ada70d
5
5
  SHA512:
6
- metadata.gz: 39a4454297e4961ba194fecad4c33c03447b00e702e5411251ccc43dd966fee3d0159af90ad6b9f3887a19788b702427d9239f8ba44b615be9b2e96f35f3cdd1
7
- data.tar.gz: 3bf6a86a8e384a28438e38ab15cf3d00626fcd38c3cc7b91326b079ee6bb3812eee3f741cffa8e0b3b694f16c97ec0923ed58a1fb046640e59eae3c034a30195
6
+ metadata.gz: 81628e3e9a0881dcc61c025c0febfe61e0265e4a7841f878e5fe790f8e9c6214bebf8eb92e6aab04ca578e1755d0aecd28c1230e6aa1bb88533979089d635cfc
7
+ data.tar.gz: b0cc0c5471c98c879ad3b08ce912cb0b483ac581b5f00534ec93764807c9553f2a6b8f71298d4b3bb0a8e6a1c8d8d205b2476978a061f5ea4f8ae15427d4fa82
@@ -0,0 +1 @@
1
+ 2.4.0
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- Algorithmically (0.1.2)
4
+ Algorithmically (0.1.7)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -25,4 +25,4 @@ DEPENDENCIES
25
25
  rake (~> 11.3)
26
26
 
27
27
  BUNDLED WITH
28
- 1.13.1
28
+ 1.14.5
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Algorithmically
2
2
 
3
- Nature-Inspired Programming Recipes
3
+ Nature-Inspired Programming Recipes [![Gem Version](https://badge.fury.io/rb/Algorithmically.svg)](https://badge.fury.io/rb/Algorithmically)
4
4
 
5
5
  ## Installation
6
6
 
@@ -30,13 +30,22 @@ Or install it yourself as:
30
30
 
31
31
  ### Stochastic Algorithms
32
32
 
33
- Algorithmically::Neural::RandomSearch.new(2, 50)
33
+ Algorithmically::Stochastic::RandomSearch.new(2, 50)
34
34
 
35
- Algorithmically::Neural::AdaptiveRandomSearch.new(1000, 2, 0.05, 1.3, 3.0, 10, 30)
35
+ Algorithmically::Stochastic::AdaptiveRandomSearch.new(1000, 2, 0.05, 1.3, 3.0, 10, 30)
36
36
 
37
- Algorithmically::Neural::HillClimbing.new(2, 1000)
37
+ Algorithmically::Stochastic::HillClimbing.new(2, 1000)
38
38
 
39
- Algorithmically::Neural::GuidedLocalSearch.new(150, [[565,575],[25,185],[345,750],[945,685]], 20, 0.3)
39
+ Algorithmically::Stochastic::GuidedLocalSearch.new(150, [[565,575],[25,185],[345,750],[945,685]], 20, 0.3)
40
+
41
+ b52 = [[595,360],[1340,725],[1740,245]]
42
+ max_iterations = 150
43
+ max_no_improv = 20
44
+ alpha = 0.3
45
+ local_search_optima = 12000.0
46
+ lambda = alpha * (local_search_optima/b52.size.to_f)
47
+
48
+ Algorithmically::Stochastic::Iterated_Local_Search.search(max_iterations, b52, max_no_improv, lambda)
40
49
 
41
50
  ### Swarm Algorithms
42
51
 
@@ -0,0 +1,84 @@
1
+ module Algorithmically
2
+ module Stochastic
3
+
4
+ class Iterated_Local_Search
5
+
6
+ def euc_2d(c1, c2)
7
+ Math.sqrt((c1[0] - c2[0]) ** 2.0 + (c1[1] - c2[1]) ** 2.0).round
8
+ end
9
+
10
+ def cost(permutation, cities)
11
+ distance = 0
12
+ permutation.each_with_index do |c1, i|
13
+ c2 = (i == permutation.size - 1) ? permutation[0] : permutation[i + 1]
14
+ distance += euc_2d(cities[c1], cities[c2])
15
+ end
16
+ distance
17
+ end
18
+
19
+ def random_permutation(cities)
20
+ perm = Array.new(cities.size) { |i| i }
21
+ perm.each_index do |i|
22
+ r = rand(perm.size - i) + i
23
+ perm[r], perm[i] = perm[i], perm[r]
24
+ end
25
+ perm
26
+ end
27
+
28
+ def stochastic_two_opt(permutation)
29
+ perm = Array.new(permutation)
30
+ c1, c2 = rand(perm.size), rand(perm.size)
31
+ exclude = [c1]
32
+ exclude << ((c1 == 0) ? perm.size - 1 : c1 - 1)
33
+ exclude << ((c1 == perm.size - 1) ? 0 : c1 + 1)
34
+ c2 = rand(perm.size) while exclude.include?(c2)
35
+ c1, c2 = c2, c1 if c2 < c1
36
+ perm[c1...c2] = perm[c1...c2].reverse
37
+ perm
38
+ end
39
+
40
+ def local_search(best, cities, max_no_improv)
41
+ count = 0
42
+ begin
43
+ candidate = {:vector => stochastic_two_opt(best[:vector])}
44
+ candidate[:cost] = cost(candidate[:vector], cities)
45
+ count = (candidate[:cost] < best[:cost]) ? 0 : count + 1
46
+ best = candidate if candidate[:cost] < best[:cost]
47
+ end until count >= max_no_improv
48
+ best
49
+ end
50
+
51
+ def double_bridge_move(perm)
52
+ pos1 = 1 + rand(perm.size / 4)
53
+ pos2 = pos1 + 1 + rand(perm.size / 4)
54
+ pos3 = pos2 + 1 + rand(perm.size / 4)
55
+ p1 = perm[0...pos1] + perm[pos3..perm.size]
56
+ p2 = perm[pos2...pos3] + perm[pos1...pos2]
57
+ p1 + p2
58
+ end
59
+
60
+ def perturbation(cities, best)
61
+ candidate = {}
62
+ candidate[:vector] = double_bridge_move(best[:vector])
63
+ candidate[:cost] = cost(candidate[:vector], cities)
64
+ candidate
65
+ end
66
+
67
+ def search(cities, max_iterations, max_no_improv)
68
+ best = {}
69
+ best[:vector] = random_permutation(cities)
70
+ best[:cost] = cost(best[:vector], cities)
71
+ best = local_search(best, cities, max_no_improv)
72
+ max_iterations.times do |iter|
73
+ candidate = perturbation(cities, best)
74
+ candidate = local_search(candidate, cities, max_no_improv)
75
+ best = candidate if candidate[:cost] < best[:cost]
76
+ puts " > iteration #{(iter+1)}, best=#{best[:cost]}"
77
+ end
78
+ best
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+ end
@@ -1,3 +1,3 @@
1
1
  module Algorithmically
2
- VERSION = '0.1.7'
2
+ VERSION = '0.1.8'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Algorithmically
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - popac
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-26 00:00:00.000000000 Z
11
+ date: 2017-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,7 @@ extensions: []
66
66
  extra_rdoc_files: []
67
67
  files:
68
68
  - ".gitignore"
69
+ - ".ruby-version"
69
70
  - Algorithmically.gemspec
70
71
  - CODE_OF_CONDUCT.md
71
72
  - Gemfile
@@ -81,6 +82,7 @@ files:
81
82
  - lib/Algorithmically/Stochastic/adaptive_random_search.rb
82
83
  - lib/Algorithmically/Stochastic/guided_local_search.rb
83
84
  - lib/Algorithmically/Stochastic/hill_climbing.rb
85
+ - lib/Algorithmically/Stochastic/iterated_local_search.rb
84
86
  - lib/Algorithmically/Stochastic/random_search.rb
85
87
  - lib/Algorithmically/Swarm/particle_swarm.rb
86
88
  - lib/Algorithmically/version.rb
@@ -105,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
107
  version: '0'
106
108
  requirements: []
107
109
  rubyforge_project:
108
- rubygems_version: 2.5.1
110
+ rubygems_version: 2.6.8
109
111
  signing_key:
110
112
  specification_version: 4
111
113
  summary: Algorithmically