diff --git a/src/tools/snakenet/snakenet.rb b/src/tools/snakenet/snakenet.rb index 8bcdf75..95c00b3 100644 --- a/src/tools/snakenet/snakenet.rb +++ b/src/tools/snakenet/snakenet.rb @@ -244,31 +244,45 @@ class AI def evolve w = @weights.dup - action = rand(5) - if action==0 #swap - i1 = rand(network_size()) - i2 = rand(network_size()) - temp = w[i1] - w[i1] = w[i2] - w[i2] = temp - elsif action==1 #change single value + action = rand(4) + #if action==0 #swap + # i1 = rand(network_size()) + # i2 = rand(network_size()) + # temp = w[i1] + # w[i1] = w[i2] + # w[i2] = temp + if action==0 #change single value i = rand(network_size()) - w[i] = rand() * 2 - 1.0 - elsif action==2 #invert single value + diff = rand() * 0.2 - 0.1 + w2 = w.dup + w[i] += diff + w[i] = 1.0 if w[i]>1.0 + w[i] = -1.0 if w[i]<-1.0 + w2[i] -= diff + w2[i] = 1.0 if w2[i]>1.0 + w2[i] = -1.0 if w2[i]<-1.0 + return [AI.new(w), AI.new(w2)] + elsif action==1 #invert single value i = rand(network_size()) w[i] *= -1.0 - elsif action==3 + elsif action==2 (0...network_size()).each do |i| w[i] = rand() * 2 - 1.0 if rand(5)==0 end else #change multiple values + w2 = w.dup (0...network_size()).each do |i| if (rand(5)==0) - w[i] += rand() / 5.0 - 0.1 + diff = rand() * 0.2 - 0.1 + w[i] += diff w[i] = 1.0 if w[i]>1.0 w[i] = -1.0 if w[i]<-1.0 + w2[i] -= diff + w2[i] = 1.0 if w2[i]>1.0 + w2[i] = -1.0 if w2[i]<-1.0 end end + return [AI.new(w), AI.new(w2)] end return AI.new(w) @@ -389,6 +403,7 @@ loop do 10.times do ais << AI.new end + ais = ais.flatten round+=1 end rescue SystemExit, Interrupt