-
Notifications
You must be signed in to change notification settings - Fork 1
/
tic_tac_toe_value.py
92 lines (82 loc) · 2.77 KB
/
tic_tac_toe_value.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#encoding: utf-8
'''
tic tac toeの行動価値クラス
'''
from collections import defaultdict
from tic_tac_toe_state import State
from mark import Mark
from maru_mark import Maru
from batsu_mark import Batsu
from empty_mark import Empty
class Value:
step_size = 0.1
def __init__(self):
'''
状態ごとに価値を保存
'''
self.value = defaultdict(lambda: 0.0)
# valueを確認したいときのdebug用
self.verbose = False
def get_value(self, state):
'''
状態に対する価値
arguments:
状態
return:
価値
'''
return self.value[state]
def get_max_action(self, state, mark):
'''
状態において最も価値の高い行動を取得する
arguments:
状態
マーク
return:
行動
'''
# 選択可能な行動
actions = state.get_valid_actions()
# 選択可能な行動をとった後の状態価値を取得
map = {}
for action in actions:
after_state = state.set(action, mark)
map[action] = self.value[after_state]
if self.verbose:
print("action: %d, value: %f" % (action, map[action]))
# 選択可能な行動をとった後の最大の状態価値を取得
max_action = max(map.items(), key=lambda x:x[1])[0]
#print map
return max_action
def update(self, state, reward, next_state):
'''
状態の価値の更新
(状態s, 報酬a)と事後状態s'から選択した行動をとった後の状態s''に対する報酬r''を利用して価値
arguments:
状態
報酬
事後状態から行動を行った後の状態
'''
if next_state is None:
next_state_value = 0.0
else:
#状態価値テーブルから価値を取得
next_state_value = self.value[next_state]
# 行動価値の更新式
self.value[state] += self.step_size * (reward + next_state_value - self.value[state])
#print("value[state] %f", self.value[state])
if __name__ == '__main__':
value = Value()
state = State()
#print value.get_value(state)
#print value.get_max_action(state, Mark(Maru()))
new_state = state.set(3, Mark(Maru()))
new_state1 = state.set(4, Mark(Maru()))
new_state2 = new_state.set(2, Mark(Batsu()))
value.update(state, 10, new_state)
value.update(new_state, 10, new_state2)
value.update(new_state, 10, new_state2)
value.update(new_state1, 10, new_state2)
value.update(new_state1, 100, new_state2)
#value.update(state, -3, new_state2)
print value.get_max_action(state, Mark(Maru()))