keras의 blackjack
개요
keras에서 blackjack 해 보았습니다.
gym의 blackjack-v0을 시도했습니다.
keras에서 강화 학습 해 보았다.
사진
200회에 -27. 지고 있지만, 승진했을 때도 있다.
설명
블랙잭 규칙
카드를 세는 방법
「2~10」은 그대로 카운트.
「J, Q, K」의 도안 카드는 모두 「10」이라고 카운트.
"Joker"는, 없다.
"A""에이스"는 "1"또는 "11"로 임의로 카운트.
블랙잭 용어
Hit(히트)
카드를 1장 당긴다.
尹棟棟 (스탠드 스테이, 스테이 익)
카드를 당기지 않는다.
Bust, Busted (버스트)
카드의 합계가 「22」이상. 통칭 돼지.
BlackJack(블랙잭)
최초로 배부된 2장의 카드가 「A」+「10, J, Q, K」의 조합.
최고의 손 (핸드)이며, "내츄럴 21"이라고 불린다.
Up Card(업카드)
딜러 자신에게 처음으로 나눠지는 2장의 카드 중 1장을 플레이어 전원에게 보이도록 표로 해 둔 카드.
승패
BlackJack의 경우
블랙잭에서 이기면 배당금은 1.5배가 됩니다.
딜러보다 '21'에 가까운 경우
1배의 배당이 됩니다.
3장 이상의 카드로의 「21」은 BlackJack(내츄럴 21)에 대해서는 「패」입니다.
무승부(푸시)
당신과 딜러가 모두 BlackJack, 게다가 "21"이하의 범위에서 동점인 경우는 "무승부".
딜러와 너 둘 다 가슴이라면
딜러와 플레이어가 모두 흉상을 받으면 딜러가 승리합니다.
게임 진행
플레이어 전원이 베팅을 마치면 딜러는 플레이어 전원과 딜러 자신에게 카드를 2장씩 배부합니다.
이때 딜러의 2장의 카드 중 1장은 표로 해 둡니다.
플레이어는 딜러의 업카드에서 딜러의 최종 핸드를 예상하고 히트, 스테이를 선택하여 최종 자신의 손 (핸드)을 만듭니다.
플레이어는 버스트하지 않는 한 여러 번 히트할 수 있습니다.
모든 플레이어가 차례로 핸드를 만들고 나면 딜러는 홀 카드를 열어 최종 핸드를 만들고 각 플레이어의 핸드와 비교하여 정산합니다.
gym의 Blackjack-v0의 경우
액션
히트 1
스테이 0
observation
손의 합
딜러 업카드
손에 에이스가 있는지
reward
승리 1
승리(blackjack) 1.5
무승부 0
패배-1
샘플 코드
import random
import gym
import numpy as np
from collections import deque
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Dense
from tensorflow.contrib.keras.python.keras.optimizers import Adam, SGD, RMSprop
import matplotlib.pyplot as plt
class Agent:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.memory = deque(maxlen = 1000)
self.gamma = 0.9
self.epsilon = 1.
self.epsilon_min = 0.01
self.epsilon_decay = 0.9
self.learning_rate = 0.1
self.model = self._build_model()
def _build_model(self):
model = Sequential()
model.add(Dense(24, input_dim = self.state_size, activation = 'relu'))
model.add(Dense(24, activation = 'relu'))
model.add(Dense(self.action_size, activation = 'relu'))
model.compile(loss = 'mse', optimizer = RMSprop(lr = self.learning_rate))
return model
def remember(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def act(self, state):
if np.random.rand() <= self.epsilon:
return random.randrange(self.action_size)
act_values = self.model.predict(state)
return np.argmax(act_values[0])
def replay(self, batch_size):
minibatch = random.sample(self.memory, batch_size)
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = (reward + self.gamma * np.amax(self.model.predict(next_state)[0]))
target_f = self.model.predict(state)
target_f[0][action] = target
self.model.fit(state, target_f, epochs = 1, verbose = 0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
if __name__ == "__main__":
EPISODES = 200
env = gym.make('Blackjack-v0')
state_size = 3
action_size = env.action_space.n
agent = Agent(state_size, action_size)
done = False
batch_size = 32
score = 0
timestep = []
for e in range(EPISODES):
state = env.reset()
state = np.reshape(state, [1, state_size])
for time in range(200):
action = agent.act(state)
next_state, reward, done, _ = env.step(action)
score += reward
reward = reward if not done else -1
next_state = np.reshape(next_state, [1, state_size])
agent.remember(state, action, reward, next_state, done)
state = next_state
if done:
print ("episode: {} score: {} epsilon: {:.2}".format(e, score, agent.epsilon))
timestep.append(score)
break
if len(agent.memory) > batch_size:
agent.replay(batch_size)
plt.plot(timestep)
plt.savefig("black7.png")
plt.show()
이상.
Reference
이 문제에 관하여(keras의 blackjack), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ohisama@github/items/b9c1ef9e4fc6947d5d18
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
200회에 -27. 지고 있지만, 승진했을 때도 있다.
설명
블랙잭 규칙
카드를 세는 방법
「2~10」은 그대로 카운트.
「J, Q, K」의 도안 카드는 모두 「10」이라고 카운트.
"Joker"는, 없다.
"A""에이스"는 "1"또는 "11"로 임의로 카운트.
블랙잭 용어
Hit(히트)
카드를 1장 당긴다.
尹棟棟 (스탠드 스테이, 스테이 익)
카드를 당기지 않는다.
Bust, Busted (버스트)
카드의 합계가 「22」이상. 통칭 돼지.
BlackJack(블랙잭)
최초로 배부된 2장의 카드가 「A」+「10, J, Q, K」의 조합.
최고의 손 (핸드)이며, "내츄럴 21"이라고 불린다.
Up Card(업카드)
딜러 자신에게 처음으로 나눠지는 2장의 카드 중 1장을 플레이어 전원에게 보이도록 표로 해 둔 카드.
승패
BlackJack의 경우
블랙잭에서 이기면 배당금은 1.5배가 됩니다.
딜러보다 '21'에 가까운 경우
1배의 배당이 됩니다.
3장 이상의 카드로의 「21」은 BlackJack(내츄럴 21)에 대해서는 「패」입니다.
무승부(푸시)
당신과 딜러가 모두 BlackJack, 게다가 "21"이하의 범위에서 동점인 경우는 "무승부".
딜러와 너 둘 다 가슴이라면
딜러와 플레이어가 모두 흉상을 받으면 딜러가 승리합니다.
게임 진행
플레이어 전원이 베팅을 마치면 딜러는 플레이어 전원과 딜러 자신에게 카드를 2장씩 배부합니다.
이때 딜러의 2장의 카드 중 1장은 표로 해 둡니다.
플레이어는 딜러의 업카드에서 딜러의 최종 핸드를 예상하고 히트, 스테이를 선택하여 최종 자신의 손 (핸드)을 만듭니다.
플레이어는 버스트하지 않는 한 여러 번 히트할 수 있습니다.
모든 플레이어가 차례로 핸드를 만들고 나면 딜러는 홀 카드를 열어 최종 핸드를 만들고 각 플레이어의 핸드와 비교하여 정산합니다.
gym의 Blackjack-v0의 경우
액션
히트 1
스테이 0
observation
손의 합
딜러 업카드
손에 에이스가 있는지
reward
승리 1
승리(blackjack) 1.5
무승부 0
패배-1
샘플 코드
import random
import gym
import numpy as np
from collections import deque
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Dense
from tensorflow.contrib.keras.python.keras.optimizers import Adam, SGD, RMSprop
import matplotlib.pyplot as plt
class Agent:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.memory = deque(maxlen = 1000)
self.gamma = 0.9
self.epsilon = 1.
self.epsilon_min = 0.01
self.epsilon_decay = 0.9
self.learning_rate = 0.1
self.model = self._build_model()
def _build_model(self):
model = Sequential()
model.add(Dense(24, input_dim = self.state_size, activation = 'relu'))
model.add(Dense(24, activation = 'relu'))
model.add(Dense(self.action_size, activation = 'relu'))
model.compile(loss = 'mse', optimizer = RMSprop(lr = self.learning_rate))
return model
def remember(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def act(self, state):
if np.random.rand() <= self.epsilon:
return random.randrange(self.action_size)
act_values = self.model.predict(state)
return np.argmax(act_values[0])
def replay(self, batch_size):
minibatch = random.sample(self.memory, batch_size)
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = (reward + self.gamma * np.amax(self.model.predict(next_state)[0]))
target_f = self.model.predict(state)
target_f[0][action] = target
self.model.fit(state, target_f, epochs = 1, verbose = 0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
if __name__ == "__main__":
EPISODES = 200
env = gym.make('Blackjack-v0')
state_size = 3
action_size = env.action_space.n
agent = Agent(state_size, action_size)
done = False
batch_size = 32
score = 0
timestep = []
for e in range(EPISODES):
state = env.reset()
state = np.reshape(state, [1, state_size])
for time in range(200):
action = agent.act(state)
next_state, reward, done, _ = env.step(action)
score += reward
reward = reward if not done else -1
next_state = np.reshape(next_state, [1, state_size])
agent.remember(state, action, reward, next_state, done)
state = next_state
if done:
print ("episode: {} score: {} epsilon: {:.2}".format(e, score, agent.epsilon))
timestep.append(score)
break
if len(agent.memory) > batch_size:
agent.replay(batch_size)
plt.plot(timestep)
plt.savefig("black7.png")
plt.show()
이상.
Reference
이 문제에 관하여(keras의 blackjack), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ohisama@github/items/b9c1ef9e4fc6947d5d18
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import random
import gym
import numpy as np
from collections import deque
from tensorflow.contrib.keras.python.keras.models import Sequential
from tensorflow.contrib.keras.python.keras.layers import Dense
from tensorflow.contrib.keras.python.keras.optimizers import Adam, SGD, RMSprop
import matplotlib.pyplot as plt
class Agent:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.memory = deque(maxlen = 1000)
self.gamma = 0.9
self.epsilon = 1.
self.epsilon_min = 0.01
self.epsilon_decay = 0.9
self.learning_rate = 0.1
self.model = self._build_model()
def _build_model(self):
model = Sequential()
model.add(Dense(24, input_dim = self.state_size, activation = 'relu'))
model.add(Dense(24, activation = 'relu'))
model.add(Dense(self.action_size, activation = 'relu'))
model.compile(loss = 'mse', optimizer = RMSprop(lr = self.learning_rate))
return model
def remember(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def act(self, state):
if np.random.rand() <= self.epsilon:
return random.randrange(self.action_size)
act_values = self.model.predict(state)
return np.argmax(act_values[0])
def replay(self, batch_size):
minibatch = random.sample(self.memory, batch_size)
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = (reward + self.gamma * np.amax(self.model.predict(next_state)[0]))
target_f = self.model.predict(state)
target_f[0][action] = target
self.model.fit(state, target_f, epochs = 1, verbose = 0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
if __name__ == "__main__":
EPISODES = 200
env = gym.make('Blackjack-v0')
state_size = 3
action_size = env.action_space.n
agent = Agent(state_size, action_size)
done = False
batch_size = 32
score = 0
timestep = []
for e in range(EPISODES):
state = env.reset()
state = np.reshape(state, [1, state_size])
for time in range(200):
action = agent.act(state)
next_state, reward, done, _ = env.step(action)
score += reward
reward = reward if not done else -1
next_state = np.reshape(next_state, [1, state_size])
agent.remember(state, action, reward, next_state, done)
state = next_state
if done:
print ("episode: {} score: {} epsilon: {:.2}".format(e, score, agent.epsilon))
timestep.append(score)
break
if len(agent.memory) > batch_size:
agent.replay(batch_size)
plt.plot(timestep)
plt.savefig("black7.png")
plt.show()
이상.
Reference
이 문제에 관하여(keras의 blackjack), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ohisama@github/items/b9c1ef9e4fc6947d5d18텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)