#!/usr/bin/env ruby require 'learning' class Playback def initialize(limit = nil, outfile = 'playback.dat') learning_unit = 0 bayes = Evaluator::Bayes::new(outfile) begin while (limit and learning_unit < limit) logs = [] open("#{Learning::RAW_DATA_PREFIX}_#{sprintf('%03d', learning_unit)}.dat", 'r'){|file| logs = Marshal::load(file.read) } logs.each{|item| log, result = item rewards = [1] for j in 0...log.size next_reward = rewards[-1] * Learning::DISCOUNT_ALPHA if next_reward < 0.1 then next_reward = 0.1 end rewards << next_reward end rewards.reverse! if result[0] > result[1] then #黒が勝ち log.each_with_index{|state, j| bayes.train_black_win(state, rewards[j]) } elsif result[0] < result[1] then #白が勝ち log.each_with_index{|state, j| bayes.train_white_win(state, rewards[j]) } else #引き分け log.each_with_index{|state, j| bayes.train_black_win(state, rewards[j] * 0.3) bayes.train_white_win(state, rewards[j] * 0.3) } end } learning_unit += 1 end rescue p $! p $@ end puts "Playbacked #{learning_unit} units" end end if $0 == __FILE__ then case ARGV.size when 1; Playback::new(ARGV[0].to_i); return when 2; Playback::new(ARGV[0].to_i, ARGV[1]); return else; Playback::new; return end end