deepbeige 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -19,4 +19,3 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
- DeepBeige
data/Rakefile CHANGED
@@ -5,8 +5,8 @@ begin
5
5
  require 'jeweler'
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "deepbeige"
8
- gem.summary = "An AI learning program that plays board games"
9
- gem.description = "An AI learning program that plays board games"
8
+ gem.summary = "An AI learning algorithm for games"
9
+ gem.description = "An AI learning program that plays noughts and crosses"
10
10
  gem.email = "david@bochenski.co.uk"
11
11
  gem.homepage = "http://github.com/bochenski/deepbeige"
12
12
  gem.authors = ["David Bochenski"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.3
data/bin/deepbeige ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'deepbeige/main'
4
+ exit DeepBeige::Main.run!(*ARGV)
data/deepbeige.gemspec CHANGED
@@ -5,13 +5,15 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{deepbeige}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["David Bochenski"]
12
- s.date = %q{2010-09-05}
13
- s.description = %q{An AI learning program that plays board games}
12
+ s.date = %q{2010-09-09}
13
+ s.default_executable = %q{deepbeige}
14
+ s.description = %q{An AI learning program that plays noughts and crosses}
14
15
  s.email = %q{david@bochenski.co.uk}
16
+ s.executables = ["deepbeige"]
15
17
  s.extra_rdoc_files = [
16
18
  "LICENSE",
17
19
  "README.rdoc"
@@ -23,24 +25,24 @@ Gem::Specification.new do |s|
23
25
  "README.rdoc",
24
26
  "Rakefile",
25
27
  "VERSION",
26
- "arena.rb",
27
- "deep_beige.rb",
28
+ "bin/deepbeige",
28
29
  "deepbeige.gemspec",
29
- "game.rb",
30
- "human.rb",
30
+ "lib/arena.rb",
31
31
  "lib/deepbeige.rb",
32
- "main.rb",
33
- "match.rb",
34
- "neural_net.rb",
35
- "node.rb",
36
- "noughts_and_crosses.rb",
37
- "pick_a_number.rb",
38
- "player.rb",
39
- "population/best.txt",
40
- "table.rb",
32
+ "lib/deepbeige/main.rb",
33
+ "lib/game.rb",
34
+ "lib/human.rb",
35
+ "lib/match.rb",
36
+ "lib/neuralnet.rb",
37
+ "lib/node.rb",
38
+ "lib/noughts_and_crosses.rb",
39
+ "lib/pick_a_number.rb",
40
+ "lib/player.rb",
41
+ "lib/table.rb",
42
+ "lib/tier.rb",
43
+ "lib/tournament.rb",
41
44
  "test/helper.rb",
42
45
  "test/test_deepbeige.rb",
43
- "tournament.rb",
44
46
  "ui/Rakefile",
45
47
  "ui/config/build.yml",
46
48
  "ui/lib/application.rb",
@@ -51,7 +53,7 @@ Gem::Specification.new do |s|
51
53
  s.rdoc_options = ["--charset=UTF-8"]
52
54
  s.require_paths = ["lib"]
53
55
  s.rubygems_version = %q{1.3.7}
54
- s.summary = %q{An AI learning program that plays board games}
56
+ s.summary = %q{An AI learning algorithm for games}
55
57
  s.test_files = [
56
58
  "test/helper.rb",
57
59
  "test/test_deepbeige.rb"
File without changes
@@ -0,0 +1,123 @@
1
+ require 'rubygems'
2
+ require 'game'
3
+ require 'pick_a_number'
4
+ require 'noughts_and_crosses'
5
+ require 'human'
6
+ require 'deepbeige'
7
+ require 'table'
8
+
9
+ $application_name = "DeepBeige"
10
+
11
+ class DeepBeige
12
+ class Main
13
+ class << self
14
+ def play_game game, p1, p2, options
15
+ players = [p1,p2]
16
+ table = Table.new game, players
17
+
18
+ options.each do |option|
19
+ if option == "verbose"
20
+ game.verbose = true
21
+ elsif option == "quiet"
22
+ game.quiet = true
23
+ table.quiet = true
24
+ end
25
+ end
26
+
27
+ table.play_game
28
+ end
29
+
30
+ def player_vs_deepbeige db, game
31
+ #ok so now I'm interested in playing my best creation
32
+ db.start_game game.name
33
+ me = Human.new game
34
+ if which_player == "1"
35
+ play_game game, me, db, []
36
+ else
37
+ play_game game, db, me, []
38
+ end
39
+ end
40
+
41
+ def player_vs_player game
42
+ p1 = Human.new game
43
+ p2 = Human.new game
44
+ play_game game, p1,p2, []
45
+ end
46
+
47
+ def which_player
48
+ puts
49
+ puts "Would you like to be player 1 or 2?"
50
+ gets.chop
51
+ end
52
+
53
+ def options
54
+ puts
55
+ puts "What would you like to do?"
56
+ puts " 1. Player vs DeepBeige"
57
+ puts " 2. Train DeepBeige"
58
+ puts " 3. Reset DeepBeige"
59
+ puts " 4. Player vs Player"
60
+ puts " 5. Exit Application"
61
+ end
62
+
63
+ def game_choice
64
+ puts
65
+ puts "Which Game?"
66
+ puts " 1. Noughts and Crosses"
67
+ puts " 2. Pick A Number"
68
+ game = nil
69
+ case gets.chop
70
+ when "1"
71
+ game = NoughtsAndCrosses.new
72
+ when "2"
73
+ game = PickANumber.new
74
+ else
75
+ puts "Sorry, didn't understand you there."
76
+ end
77
+ game
78
+ end
79
+
80
+ def run!(*arguments)
81
+
82
+ # begin
83
+ db = DeepBeige.new
84
+
85
+ version = "0.2.2"
86
+ puts
87
+ puts "Welcome to DeepBeige v#{version}"
88
+
89
+ exit = false
90
+ until exit do
91
+ options
92
+ case input = gets.chop
93
+ when "1"
94
+ game = game_choice
95
+ player_vs_deepbeige db, game
96
+ when "2"
97
+ game = game_choice
98
+ puts "How Many Generations?"
99
+ generations = gets.chop.to_i
100
+ db.train generations, game
101
+ when "3"
102
+ game = game_choice
103
+ db.learn game
104
+ puts "DeepBeige Reset sucessfully"
105
+ when "4"
106
+ game = game_choice
107
+ player_vs_player game
108
+ when "5"
109
+ puts "Bye Bye"
110
+ exit = true
111
+ else
112
+ puts "Sorry I didn't understand you"
113
+ end
114
+ end
115
+ return 0
116
+ # rescue
117
+ # $stderr.puts "Something Went Wrong With Deep Beige - Sorry"
118
+ # return 1
119
+ # end
120
+ end
121
+ end
122
+ end
123
+ end
data/lib/deepbeige.rb CHANGED
@@ -0,0 +1,232 @@
1
+ require 'neuralnet'
2
+
3
+ class DeepBeige
4
+
5
+ def initialize
6
+ @neural_net = NeuralNet.new
7
+ @population =[]
8
+ end
9
+
10
+ def id
11
+ @neural_net.id
12
+ end
13
+
14
+ def start_game game_name
15
+ @game_name = game_name
16
+ case game_name
17
+ when "NoughtsAndCrosses"
18
+ @neural_net.generate :inputs => 9, :outputs => 1, :tiers => 3
19
+ @neural_net.load_from_file (ENV["HOME"] + "/." + $application_name + "/NoughtsAndCrosses/best.txt")
20
+ when "PickANumber"
21
+ @neural_net.generate :inputs => 3, :outputs => 1, :tiers => 2
22
+ @neural_net.load_from_file (ENV["HOME"] + "/." + $application_name + "/PickANumber/best.txt")
23
+ end
24
+ end
25
+
26
+ def get_move position, moves
27
+ game = game_from_name @game_name
28
+ game.quiet = true
29
+ game.reload_position moves
30
+
31
+ best_move = ""
32
+ best_score = -2
33
+ game.legal_moves.each do |move|
34
+ game2 = game_from_name @game_name
35
+ game2.quiet = true
36
+ game2.reload_position moves
37
+ game2.play_move game.next_player, move
38
+ input = game2.current_position.values
39
+
40
+ if game.next_player == 1
41
+ input = []
42
+ game2.current_position.values.each do |value|
43
+ input << -value
44
+ end
45
+ end
46
+
47
+ @neural_net.input = input
48
+ @neural_net.evaluate
49
+ score = @neural_net.output_value
50
+ #p "move #{move} evaluated as #{score}"
51
+ if score > best_score
52
+ best_score = score
53
+ best_move = move
54
+ end
55
+ end
56
+ best_move
57
+ end
58
+
59
+ def learn game
60
+ generate_population 30, game.name
61
+ end
62
+
63
+ def train generations, game
64
+ @game_name = game.name
65
+ @population = load_population game.name
66
+
67
+ #reset scores
68
+ scores = {}
69
+ @population.each do |neuralnet|
70
+ scores[neuralnet.id] = 0
71
+ end
72
+
73
+ generation_number = 1
74
+ generations.times do
75
+ puts "Evolving Generation #{generation_number}"
76
+ player_number = 0
77
+ @population.each do |neuralnet|
78
+ player = DeepBeige.new
79
+ player.neural_net = neuralnet
80
+ player.game_name = game.name
81
+
82
+ 5.times do
83
+ play_as_player game.name, player, 1, scores
84
+ end
85
+ 5.times do
86
+ play_as_player game.name, player, 2, scores
87
+ end
88
+ player_number += 1
89
+ end
90
+ leaderboard = scores.sort_by {|id, count| count}
91
+ position = 1
92
+ 5.times do
93
+ leader = leaderboard[leaderboard.count - position]
94
+ puts "#{position}. pts: #{leader[1]}, #{leader[0]}"
95
+ position +=1
96
+ end
97
+ @population.each do |neural_net|
98
+ if neural_net.id == leaderboard.last[0]
99
+ neural_net.save_to_file (ENV["HOME"] + "/." + $application_name + "/#{@game_name}/best.txt")
100
+ end
101
+ end
102
+ i = 0
103
+ while i < 15 do
104
+ @population.delete_if {|neural_net| neural_net.id == leaderboard[i][0]}
105
+ i +=1
106
+ end
107
+
108
+ new_nets = []
109
+ @population.each do |neural_net|
110
+ new_net = neural_net.clone
111
+ new_net.mutate
112
+ new_nets << new_net
113
+ end
114
+ @population.concat new_nets
115
+
116
+ scores = {}
117
+ @population.each do |neural_net|
118
+ scores[neural_net.id] = 0
119
+ end
120
+
121
+ generation_number +=1
122
+ end
123
+
124
+ save_population game.name
125
+ end
126
+
127
+ protected
128
+ def neural_net= value
129
+ @neural_net = value
130
+ end
131
+ def game_name= value
132
+ @game_name = value
133
+ end
134
+
135
+ private
136
+ def game_from_name name
137
+ game = nil
138
+ case name
139
+ when "NoughtsAndCrosses"
140
+ game = NoughtsAndCrosses.new
141
+ when "PickANumber"
142
+ game = PickANumber.new
143
+ end
144
+ game
145
+ end
146
+
147
+ def load_population name
148
+ @population = []
149
+ Dir[ENV["HOME"] + "/." + $application_name + "/#{name}/*[0-9].txt"].each do |filename|
150
+ candidate = NeuralNet.new
151
+ candidate.load_from_file filename
152
+ @population << candidate
153
+ end
154
+ @population
155
+ end
156
+
157
+ def save_population name
158
+ #and at the end of that, we ought to save our population
159
+ i = 0
160
+ @population.each do |neural_net|
161
+
162
+ neural_net.save_to_file (ENV["HOME"] + "/." + $application_name +"/#{name}/#{i}.txt")
163
+ i += 1
164
+ end
165
+ end
166
+
167
+ def generate_population size, name
168
+
169
+ #Check Directories Exist
170
+ home_dir = ENV["HOME"] + "/." + $application_name
171
+ unless FileTest::directory?(home_dir)
172
+ Dir::mkdir(home_dir)
173
+ end
174
+
175
+ dir_name = home_dir +"/#{name}"
176
+ unless FileTest::directory?(dir_name)
177
+ Dir::mkdir(dir_name)
178
+ end
179
+
180
+ #Generate Population
181
+ @population = []
182
+ scores = {}
183
+ size.times do
184
+ neural_net = NeuralNet.new
185
+ case name
186
+ when "NoughtsAndCrosses"
187
+ neural_net.generate :inputs => 9, :outputs => 1, :tiers => 3
188
+ when "PickANumber"
189
+ neural_net.generate :inputs => 3, :outputs => 1, :tiers => 2
190
+ end
191
+ @population << neural_net
192
+ end
193
+ save_population name
194
+ end
195
+
196
+ private
197
+ def play_as_player game_name, player, player_number, scores
198
+ game = game_from_name game_name
199
+ game.quiet = true
200
+ opponent_number = rand(@population.count)
201
+ #puts "#{player_number} versus opponent #{opponent_number}"
202
+ opponent_net = @population[opponent_number]
203
+ opponent = DeepBeige.new
204
+ opponent.neural_net = opponent_net
205
+ opponent.game_name = @game_name
206
+ players = [player, opponent]
207
+ if player_number == 2
208
+ player = [opponent,player]
209
+ end
210
+
211
+ table = Table.new game, players
212
+ table.quiet = true
213
+ table.play_game
214
+ if game.drawn?
215
+ players.each do |player|
216
+ scores[player.id] +=1
217
+ end
218
+
219
+ elsif game.won?
220
+ winner = players[game.winner]
221
+ players.each do |player|
222
+ if player.id == winner.id
223
+ scores[player.id] +=2
224
+ else
225
+ scores[player.id] -=2
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+
232
+
File without changes
File without changes
File without changes
@@ -43,7 +43,28 @@ class NeuralNet
43
43
  value
44
44
  end
45
45
 
46
- def generate inputs, outputs, tiers
46
+ def generate options
47
+ inputs = 1
48
+ if options[:inputs]
49
+ inputs = options[:inputs]
50
+ end
51
+ outputs = 1
52
+ if options[:outputs]
53
+ outputs = options[:outputs]
54
+ end
55
+ tiers = 2
56
+ if options[:tiers]
57
+ tiers = options[:tiers]
58
+ end
59
+ @width = 0
60
+ if options[:width]
61
+ @width = options[:width]
62
+ end
63
+ @height = 0
64
+ if options [:height]
65
+ @height = options[:height]
66
+ end
67
+
47
68
  @network = []
48
69
  input_nodes = []
49
70
  inputs.times do
@@ -52,6 +73,30 @@ class NeuralNet
52
73
  if input_nodes.count > 0
53
74
  @network << input_nodes
54
75
  end
76
+ if height > 1 && width > 1
77
+
78
+ if width == height
79
+ #ok, slightly impure but this is our clue
80
+ #that we're dealing with a 2D board and we're going
81
+ #to insert a special layer to reflect the board topology
82
+ tiers = tiers -1
83
+ tier = []
84
+ n = 2
85
+ i = 0
86
+ j = 0
87
+ (height - n).times do
88
+ (width - n).times do
89
+ node = Node.new(@sigma)
90
+ end
91
+ n = n + 1
92
+ i += 1
93
+ end
94
+ @network << tier
95
+ else
96
+ #for now we will not bother with rectangles
97
+ end
98
+
99
+ end
55
100
  (tiers - 2).times do
56
101
  tier = []
57
102
  10.times do
@@ -74,15 +119,13 @@ class NeuralNet
74
119
  def fingerprint
75
120
  topline = ""
76
121
  fingerprint = ""
77
- sigma = ""
78
- tau = ""
79
122
  @network.each do |tier|
80
123
  topline << "#{tier.count},"
81
124
  tier.each do |node|
82
125
  fingerprint << node.fingerprint
83
126
  end
84
127
  end
85
- topline.chop + "\n" + @sigma.to_s + "\n" + @tau.to_s + "\n" + fingerprint
128
+ topline.chop + "\n" + @sigma.to_s + "\n" + @tau.to_s + "\n" + @width.to_s + "\n" + @height.to_s + "\n"+ fingerprint
86
129
  end
87
130
 
88
131
  def reload fingerprint
@@ -94,6 +137,10 @@ class NeuralNet
94
137
  i += 1
95
138
  @tau = fingerprint[i].to_f
96
139
  i += 1
140
+ @width = fingerprint[i].to_i
141
+ i += 1
142
+ @height = fingerprint[i].to_i
143
+ i += 1
97
144
 
98
145
  @network = []
99
146
  tiers.each do |tier|
@@ -134,6 +181,9 @@ class NeuralNet
134
181
  clone = NeuralNet.new
135
182
  clone.sigma = self.sigma
136
183
  clone.tau = self.tau
184
+ clone.width = self.width
185
+ clone.height = self.height
186
+
137
187
  #iterate in through each tier
138
188
  @network.each do |tier|
139
189
  nodes = []
@@ -169,12 +219,15 @@ class NeuralNet
169
219
  end
170
220
 
171
221
  protected
172
- attr_accessor :sigma, :tau
222
+ attr_accessor :sigma, :tau, :width, :height
173
223
 
174
224
  def link_tiers
175
225
  #first cut lets link every node on a tier to each node on the subsequent tier
176
226
  i = 1
177
227
  @network.each do |tier|
228
+ if i == 1 && @width > 1 && @height > 1
229
+
230
+ end
178
231
  if i < @network.count
179
232
  tier.each do |node|
180
233
  j = 0
File without changes
File without changes
File without changes
File without changes
data/lib/tier.rb ADDED
File without changes
File without changes
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 1
9
- version: 0.2.1
8
+ - 3
9
+ version: 0.2.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - David Bochenski
@@ -14,8 +14,8 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-05 00:00:00 +01:00
18
- default_executable:
17
+ date: 2010-09-09 00:00:00 +01:00
18
+ default_executable: deepbeige
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: thoughtbot-shoulda
@@ -30,10 +30,10 @@ dependencies:
30
30
  version: "0"
31
31
  type: :development
32
32
  version_requirements: *id001
33
- description: An AI learning program that plays board games
33
+ description: An AI learning program that plays noughts and crosses
34
34
  email: david@bochenski.co.uk
35
- executables: []
36
-
35
+ executables:
36
+ - deepbeige
37
37
  extensions: []
38
38
 
39
39
  extra_rdoc_files:
@@ -46,24 +46,24 @@ files:
46
46
  - README.rdoc
47
47
  - Rakefile
48
48
  - VERSION
49
- - arena.rb
50
- - deep_beige.rb
49
+ - bin/deepbeige
51
50
  - deepbeige.gemspec
52
- - game.rb
53
- - human.rb
51
+ - lib/arena.rb
54
52
  - lib/deepbeige.rb
55
- - main.rb
56
- - match.rb
57
- - neural_net.rb
58
- - node.rb
59
- - noughts_and_crosses.rb
60
- - pick_a_number.rb
61
- - player.rb
62
- - population/best.txt
63
- - table.rb
53
+ - lib/deepbeige/main.rb
54
+ - lib/game.rb
55
+ - lib/human.rb
56
+ - lib/match.rb
57
+ - lib/neuralnet.rb
58
+ - lib/node.rb
59
+ - lib/noughts_and_crosses.rb
60
+ - lib/pick_a_number.rb
61
+ - lib/player.rb
62
+ - lib/table.rb
63
+ - lib/tier.rb
64
+ - lib/tournament.rb
64
65
  - test/helper.rb
65
66
  - test/test_deepbeige.rb
66
- - tournament.rb
67
67
  - ui/Rakefile
68
68
  - ui/config/build.yml
69
69
  - ui/lib/application.rb
@@ -100,7 +100,7 @@ rubyforge_project:
100
100
  rubygems_version: 1.3.7
101
101
  signing_key:
102
102
  specification_version: 3
103
- summary: An AI learning program that plays board games
103
+ summary: An AI learning algorithm for games
104
104
  test_files:
105
105
  - test/helper.rb
106
106
  - test/test_deepbeige.rb
data/deep_beige.rb DELETED
@@ -1,223 +0,0 @@
1
- require 'neural_net'
2
-
3
- class DeepBeige
4
-
5
- def initialize
6
- @neural_net = NeuralNet.new
7
- @population =[]
8
- end
9
-
10
- def id
11
- @neural_net.id
12
- end
13
-
14
- def start_game game_name
15
- @game_name = game_name
16
- case game_name
17
- when "NoughtsAndCrosses"
18
- @neural_net.generate 9, 1, 3
19
- @neural_net.load_from_file "DeepBeige/NoughtsAndCrosses/best.txt"
20
- when "PickANumber"
21
- @neural_net.generate 3,1,2
22
- @neural_net.load_from_file "DeepBeige/PickANumber/best.txt"
23
- end
24
- end
25
-
26
- def get_move position, moves
27
- game = game_from_name @game_name
28
- game.quiet = true
29
- game.reload_position moves
30
-
31
- best_move = ""
32
- best_score = -2
33
- game.legal_moves.each do |move|
34
- game2 = game_from_name @game_name
35
- game2.quiet = true
36
- game2.reload_position moves
37
- game2.play_move game.next_player, move
38
- input = game2.current_position.values
39
-
40
- if game.next_player == 1
41
- input = []
42
- game2.current_position.values.each do |value|
43
- input << -value
44
- end
45
- end
46
-
47
- @neural_net.input = input
48
- @neural_net.evaluate
49
- score = @neural_net.output_value
50
- #p "move #{move} evaluated as #{score}"
51
- if score > best_score
52
- best_score = score
53
- best_move = move
54
- end
55
- end
56
- best_move
57
- end
58
-
59
- def learn game
60
- generate_population 30, game.name
61
- end
62
-
63
- def train generations, game
64
- @game_name = game.name
65
- @population = load_population game.name
66
-
67
- #reset scores
68
- scores = {}
69
- @population.each do |neuralnet|
70
- scores[neuralnet.id] = 0
71
- end
72
-
73
- generation_number = 1
74
- generations.times do
75
- puts "Evolving Generation #{generation_number}"
76
- player_number = 0
77
- @population.each do |neuralnet|
78
- player = DeepBeige.new
79
- player.neural_net = neuralnet
80
- player.game_name = game.name
81
-
82
- 5.times do
83
- play_as_player game.name, player, 1, scores
84
- end
85
- 5.times do
86
- play_as_player game.name, player, 2, scores
87
- end
88
- player_number += 1
89
- end
90
- leaderboard = scores.sort_by {|id, count| count}
91
- position = 1
92
- 5.times do
93
- leader = leaderboard[leaderboard.count - position]
94
- puts "#{position}. pts: #{leader[1]}, #{leader[0]}"
95
- position +=1
96
- end
97
- @population.each do |neural_net|
98
- if neural_net.id == leaderboard.last[0]
99
- neural_net.save_to_file "DeepBeige/#{@game_name}/best.txt"
100
- end
101
- end
102
- i = 0
103
- while i < 15 do
104
- @population.delete_if {|neural_net| neural_net.id == leaderboard[i][0]}
105
- i +=1
106
- end
107
-
108
- new_nets = []
109
- @population.each do |neural_net|
110
- new_net = neural_net.clone
111
- new_net.mutate
112
- new_nets << new_net
113
- end
114
- @population.concat new_nets
115
-
116
- scores = {}
117
- @population.each do |neural_net|
118
- scores[neural_net.id] = 0
119
- end
120
-
121
- generation_number +=1
122
- end
123
-
124
- save_population game.name
125
- end
126
-
127
- protected
128
- def neural_net= value
129
- @neural_net = value
130
- end
131
- def game_name= value
132
- @game_name = value
133
- end
134
-
135
- private
136
- def game_from_name name
137
- game = nil
138
- case name
139
- when "NoughtsAndCrosses"
140
- game = NoughtsAndCrosses.new
141
- when "PickANumber"
142
- game = PickANumber.new
143
- end
144
- game
145
- end
146
-
147
- def load_population name
148
- @population = []
149
- Dir["deepbeige/#{name}/*[0-9].txt"].each do |filename|
150
- candidate = NeuralNet.new
151
- candidate.load_from_file filename
152
- @population << candidate
153
- end
154
- @population
155
- end
156
-
157
- def save_population name
158
- #and at the end of that, we ought to save our population
159
- i = 0
160
- @population.each do |neural_net|
161
- neural_net.save_to_file "DeepBeige/#{name}/#{i}.txt"
162
- i += 1
163
- end
164
- end
165
-
166
- def generate_population size, name
167
- #Generate Population
168
- dir_name = "DeepBeige/#{name}"
169
- unless FileTest::directory?(dir_name)
170
- Dir::mkdir(dir_name)
171
- end
172
- @population = []
173
- scores = {}
174
- size.times do
175
- neural_net = NeuralNet.new
176
- case name
177
- when "NoughtsAndCrosses"
178
- neural_net.generate 9,1,3
179
- when "PickANumber"
180
- neural_net.generate 3,1,2
181
- end
182
- @population << neural_net
183
- end
184
- save_population name
185
- end
186
-
187
- private
188
- def play_as_player game_name, player, player_number, scores
189
- game = game_from_name game_name
190
- game.quiet = true
191
- opponent_number = rand(@population.count)
192
- #puts "#{player_number} versus opponent #{opponent_number}"
193
- opponent_net = @population[opponent_number]
194
- opponent = DeepBeige.new
195
- opponent.neural_net = opponent_net
196
- opponent.game_name = @game_name
197
- players = [player, opponent]
198
- if player_number == 2
199
- player = [opponent,player]
200
- end
201
-
202
- table = Table.new game, players
203
- table.quiet = true
204
- table.play_game
205
- if game.drawn?
206
- players.each do |player|
207
- scores[player.id] +=1
208
- end
209
-
210
- elsif game.won?
211
- winner = players[game.winner]
212
- players.each do |player|
213
- if player.id == winner.id
214
- scores[player.id] +=2
215
- else
216
- scores[player.id] -=2
217
- end
218
- end
219
- end
220
- end
221
- end
222
-
223
-
data/main.rb DELETED
@@ -1,124 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'rubygems'
3
- require 'game'
4
- require 'pick_a_number'
5
- require 'noughts_and_crosses'
6
- require 'human'
7
- require 'deep_beige'
8
- require 'table'
9
-
10
- def play_game game, p1, p2, options
11
- players = [p1,p2]
12
- table = Table.new game, players
13
-
14
- options.each do |option|
15
- if option == "verbose"
16
- game.verbose = true
17
- elsif option == "quiet"
18
- game.quiet = true
19
- table.quiet = true
20
- end
21
- end
22
-
23
- table.play_game
24
- end
25
-
26
- def player_vs_deepbeige db, game
27
- #ok so now I'm interested in playing my best creation
28
- db.start_game game.name
29
- me = Human.new game
30
- if which_player == "1"
31
- play_game game, me, db, []
32
- else
33
- play_game game, db, me, []
34
- end
35
- end
36
-
37
- def player_vs_player game
38
- p1 = Human.new game
39
- p2 = Human.new game
40
- play_game game, p1,p2, []
41
- end
42
-
43
- def which_player
44
- puts
45
- puts "Would you like to be player 1 or 2?"
46
- gets.chop
47
- end
48
-
49
- def options
50
- puts
51
- puts "What would you like to do?"
52
- puts " 1. Player vs DeepBeige"
53
- puts " 2. Train DeepBeige"
54
- puts " 3. Reset DeepBeige"
55
- puts " 4. Player vs Player"
56
- puts " 5. Exit Application"
57
- end
58
-
59
- def game_choice
60
- puts
61
- puts "Which Game?"
62
- puts " 1. Noughts and Crosses"
63
- puts " 2. Pick A Number"
64
- game = nil
65
- case gets.chop
66
- when "1"
67
- game = NoughtsAndCrosses.new
68
- when "2"
69
- game = PickANumber.new
70
- else
71
- puts "Sorry, didn't understand you there."
72
- end
73
- game
74
- end
75
-
76
- #This is the main execution loop of our program
77
- def main
78
-
79
- db = DeepBeige.new
80
-
81
- version = "0.1.1"
82
- puts
83
- puts "Welcome to DeepBeige v#{version}"
84
-
85
- exit = false
86
- until exit do
87
- options
88
- case input = gets.chop
89
- when "1"
90
- game = game_choice
91
- player_vs_deepbeige db, game
92
- when "2"
93
- game = game_choice
94
- puts "How Many Generations?"
95
- generations = gets.chop.to_i
96
- db.train generations, game
97
- when "3"
98
- game = game_choice
99
- db.learn game
100
- puts "DeepBeige Reset sucessfully"
101
- when "4"
102
- game = game_choice
103
- player_vs_player game
104
- when "5"
105
- puts "Bye Bye"
106
- exit = true
107
- else
108
- puts "Sorry I didn't understand you"
109
- end
110
- end
111
- end
112
-
113
- main unless $Cocoa
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
data/population/best.txt DELETED
@@ -1,20 +0,0 @@
1
- 9,9,1
2
- 1.9888959877114751:1.1713694063264486,0.2131550943633837,-1.4389857774549193,-2.3761064404471623,1.4125388307828852,1.7962657856192086,3.98673652586089,-0.710563267563527,-4.693733927431782
3
- -0.5537104997469708:4.353881179541187,-3.7749306975412615,3.9092173844936307,-1.5574066495330294,-1.9867317023123854,2.4016056161982515,0.19093366894771083,2.583574894805702,-0.7814428807197851
4
- -3.718402720378594:0.21375589104869108,-0.5952570280952669,3.163222183572866,-2.0666315462205604,1.8466894347641758,2.5737190736563127,0.09083797921525782,-1.7152005515495705,-1.9147906116034963
5
- -1.1774113223565559:0.9684176432281265,1.2633322113651906,0.9105205858738161,0.9952880033669778,2.428832023642873,1.1378171183057832,1.2346794709653666,1.614577823722882,-0.5727461748243102
6
- -4.240095691598348:5.619686966308787,2.496099436318761,4.236594219999468,-4.089909848411157,-8.583782402447191,7.909784634413837,3.709149525845639,-0.1221209138110586,-1.7739191236891263
7
- -0.45644848049775455:0.7525477703501269,0.4416094908434702,0.5151634042799693,0.6494784464984971,-0.21066540646710413,0.9328293326003011,0.4934365894119864,-0.5075989699963754,0.2534248521563641
8
- 2.000438515839109:-0.18715599814429473,-4.079321241532847,3.0082374216290035,1.6554995963981736,1.2134208468740142,-0.7234607792621472,0.9168360804604427,-0.5284806911574953,3.6316017295618748
9
- 0.9920544697574241:-0.15133215482382756,0.9977877837645512,-0.06456539820799904,-1.0288035250624143,0.9008138652841244,0.6826185088601288,0.8553527568600676,0.21975379677495055,1.0495630337690707
10
- 3.8437737235828924:-2.429075885974877,3.0482320934712477,-9.512832982617503,-8.273686259303359,1.5413233764892178,-2.2156195050047747,-7.2849426757667315,5.202236097167509,-0.9365606034293558
11
- 2.4821899389695874:2.1743832447567346
12
- -2.9564446473766672:-3.2541845089551904
13
- 3.2605627963240384:-0.20795953070592393
14
- 2.605813320828736:3.154050922464929
15
- -0.4579599997104075:2.349414728456047
16
- 2.653465191369256:4.365018317781122
17
- 0.6373485836872791:1.7163198231060346
18
- 0.711515408592374:0.8702577537323323
19
- -1.7351499679943323:1.24799151515672
20
- 2.902919261517124