Пример #1
0
def random_EV(sum, num_games, shuffles=5, num_random_games=10):
    logarrays = []
    expvals = []
    for i1 in range(num_games):
        board = game_sort(random_game_board(sum))
        for i2 in range(shuffles):
            b = copy.deepcopy(board)
            random.shuffle(b)
            game = Game(board=b)
            syms = game.symmetries()
            ev = 0.0
            for g in syms:
                ev += play_random_games(g, num_random_games)
                logarrays.append(g.to_logarray())
            expvals.append(ev / 8)
        game = Game(board=board)
        syms = game.symmetries()
        ev = 0.0
        for g in syms:
            ev += play_random_games(g, num_random_games)
            logarrays.append(g.to_logarray())
        expvals.append(ev / 8)
    minval = min(expvals)
    maxval = max(expvals)
    dif = maxval - minval
    if dif == 0.0:
        return [], []
    evs = []
    for ev in expvals:
        for i3 in range(8):
            evs.append((ev - minval) / dif)
    return logarrays, evs
Пример #2
0
 def train_on_played_games_lowest_2(self, histories, sums_back=10):
     histories = sorted(histories, key=lambda x: pow2_sum(x[-1]))
     num_hist = 10  #int(len(histories)*0.5)
     max_game = pow2_sum(histories[num_hist][-1])
     min_game = pow2_sum(histories[0][-1]) - sums_back
     act_arrays = {}
     for i in range(min_game, max_game, 2):
         act_arrays[i] = []
     for hist in histories:
         max_sum = pow2_sum(hist[-1])
         index = 0
         while 1:
             if index >= len(hist):
                 break
             vec = hist[index]
             sum = pow2_sum(vec)
             index += 1
             if sum < min_game:
                 continue
             if sum >= max_game:
                 break
             act_arrays[sum].append((vec, max_sum - sum))
     vecs, vals = [], []
     # normalize val
     for sum in sorted(act_arrays.keys()):
         if len(act_arrays[sum]) == 0:
             continue
         max_val = max(act_arrays[sum], key=lambda x: x[1])[1]
         if max_val == 0:
             continue
         for pair in act_arrays[sum]:
             game = Game(board=list(pair[0]))
             game_val = float(pair[1]) / max_val
             # apply some function:
             #cut_num = 100
             #if pair[1] > cut_num:
             #    game_val = 1.0
             #else:
             #    game_val = float(pair[1]) / cut_num
             #rangel = 0.9
             #game_val = (1-rangel)/2 + rangel * game_val
             for sym in game.symmetries():
                 vecs.append(sym.to_logarray())
                 vals.append(game_val)
     return vecs, vals
Пример #3
0
    def train_on_played_games_lowest(self, histories, min_game, params):
        sums_back = params["sums_back"]
        sums_back_from = params["sums_back_from"]
        ###
        min_game -= sums_back_from
        act_arrays = {}
        if min_game < 2 * sums_back:
            sums_back = min_game / 2
        for i in range(sums_back + 1):
            act_arrays[min_game - i * 2] = []
        for hist in histories:
            max_sum = pow2_sum(hist[-1])
            index = 0
            while 1:
                vec = hist[index]
                sum = pow2_sum(vec)
                index += 1
                if sum < min_game - 2 * sums_back:
                    continue
                if sum >= min_game:
                    break
                act_arrays[sum].append((vec, max_sum - sum))
        # normalize vals
        numrange = []
        vecs, vals = [], []
        for sum in sorted(act_arrays.keys()):
            if len(act_arrays[sum]) == 0:
                continue
            numrange.append(sum)
            self.vecs[sum] = []
            self.vals[sum] = []
            max_val = max(act_arrays[sum], key=lambda x: x[1])[1]
            for pair in act_arrays[sum]:
                game = Game(board=list(pair[0]))
                game_val = float(pair[1]) / max_val
                for sym in game.symmetries():
                    self.vecs[sum].append(sym.to_logarray())
                    vecs.append(sym.to_logarray())
                    self.vals[sum].append(game_val)
                    vals.append(game_val)

        # add symetries???
        self.train_on_data_lowest(params, numrange)
        return vecs, vals
Пример #4
0
 def train_on_played_games(self, histories, sums_back=100, num_hist=5):
     histories = sorted(histories, key=lambda x: pow2_sum(x[-1]))
     max_game = pow2_sum(histories[num_hist][-1])
     min_game = pow2_sum(histories[0][-1]) - sums_back
     act_arrays = {}
     for i in range(min_game, max_game, 2):
         act_arrays[i] = []
     for hist in histories:
         max_sum = pow2_sum(hist[-1])
         index = 0
         while 1:
             if index >= len(hist):
                 break
             vec = hist[index]
             sum = pow2_sum(vec)
             index += 1
             if sum < min_game:
                 continue
             if sum >= max_game:
                 break
             act_arrays[sum].append((vec, max_sum - sum))
     vecs, vals = [[]], [[]]
     current_index = 0
     for sum in sorted(act_arrays.keys()):
         while self.ranges[current_index] < sum:
             vecs.append([])
             vals.append([])
             current_index += 1
         if len(act_arrays[sum]) == 0:
             continue
         max_val = max(act_arrays[sum], key=lambda x: x[1])[1]
         if max_val == 0:
             continue
         for pair in act_arrays[sum]:
             game = Game(board=list(pair[0]))
             game_val = float(pair[1]) / max_val
             for sym in game.symmetries():
                 vecs[-1].append(sym.to_logarray())
                 vals[-1].append(game_val)
     return vecs, vals