Algorithmically 0.1.7 → 0.1.8

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 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