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()



이상.

좋은 웹페이지 즐겨찾기