#!/usr/bin/ruby -w require 'src/play' require 'src/selection' # require 'systemu' pop = Population.new(5, 20) generation_count = 1 max_generations = 3 if File.file? 'player.log' File.delete 'player.log' end puts "Generation number #{generation_count}" pop.individuals.sort {|x, y| x.genome <=> y.genome}.each {|i| puts "#{i.genome}"} while generation_count <= max_generations start = Time.now puts "Started at #{start}" new_population = [] threads = [] 1.upto(pop.individuals.length) do |i| threads << Thread.new do puts "Starting thread #{i}" sleep 2 player_count = rand(5) + 2 pool_size = pop.individuals.length players = [] 1.upto(player_count) { players << pop.individuals[rand(pool_size)] } IO.popen('ruby play-one-game.rb', 'r+') do |pipe| players.each {|p| pipe << "#{p.genome}\n" ; puts "Game #{i}: putting player #{p.genome}"} # players.each {|p| pipe << "#{p.genome}\n"} pipe.close_write new_population << Genome.new(pipe.readline.chomp.split(//).collect {|x| x.to_i}) puts "Got result #{new_population[-1].genome}" end # game_input = (players.collect {|p| p.genome.to_s}).join("\n") # game_result = '' # puts "Calling game #{i} with input #{game_input}" # status, game_result, stderr = systemu 'ruby play-one-game.rb', 'stdin' => game_input # puts "Game #{i} returned #{game_result}" # new_population << Genome.new(game_result.chomp.split(//).collect {|x| x.to_i}) end threads.each {|t| t.join} end pop.individuals = new_population finish = Time.now puts "Took #{finish - start} seconds" pop1 = pop.crossover(0.7) pop = pop1.mutation(0.05) generation_count += 1 puts "Generation number #{generation_count}" pop.individuals.sort {|x, y| x.genome <=> y.genome}.each {|i| puts "#{i.genome}"} $stdout.flush end