1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/daochenzha-rlcard

Клонировать/Скачать
toy-examples.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 18:31 21f438a

Примеры для начала работы

В этом документе приведены некоторые примеры для начала работы. Все примеры доступны в examples/.

  • Игра со случайными агентами (Toy Examples.md#playing-with-random-agents)
  • Глубокое Q-обучение в блэкджеке (Toy Examples.md#deep-q-learning-on-blackjack)
  • Обучение CFR (вероятностная выборка) на Leduc Hold'em (Toy Examples.md#training-cfr-on-leduc-holdem)
  • Развлечение с предварительно обученной моделью Leduc (Toy Examples.md#having-fun-with-pretrained-leduc-model)
  • Тренировка DMC на Dou Dizhu (Toy Examples.md#training-dmc-on-dou-dizhu)
  • Оценка агентов (Toy Examples.md#evaluating-agents)

Игра со случайными агентами

Мы предоставляем случайного агента, который может случайным образом играть в каждой среде. Пример кода выглядит следующим образом. Вы также можете найти код в examples/run_random.py.

import argparse
import pprint

import rlcard
from rlcard.agents import RandomAgent
from rlcard.utils import set_seed

def run(args):
    # Создаём окружение
    env = rlcard.make(
        args.env,
        config={
            'seed': 42,
        }
    )

    # Устанавливаем начальное значение для numpy, torch, random
    set_seed(42)

    # Определяем агентов
    agent = RandomAgent(num_actions=env.num_actions)
    env.set_agents([agent for _ in range(env.num_players)])

    # Генерируем данные из окружения
    trajectories, player_wins = env.run(is_training=False)
    # Выводим траектории
    print('\nTrajectories:')
    print(trajectories)
    print('\nПример необработанного наблюдения:')
    pprint.pprint(trajectories[0][0]['raw_obs'])
    print('\nПример необработанных легальных действий:')
    pprint.pprint(trajectories[0][0]['raw_legal_actions'])

if __name__ == '__main__':
    parser = argparse.ArgumentParser("Случайный пример в RLCard")
    parser.add_argument(
        '--env',
        type=str,
        default='leduc-holdem',
        choices=[
            'blackjack',
            'leduc-holdem',
            'limit-holdem',
            'doudizhu',
            'mahjong',
            'no-limit-holdem',
            'uno',
            'gin-rummy',
            'bridge',
        ],
    )

    args = parser.parse_args()

    run(args)

Запустите код, чтобы случайным образом сгенерировать данные из Leduc Hold’em с помощью команды:

python3 examples/run_random.py --env leduc-holdem

Ожидаемый результат должен выглядеть примерно так:

Trajectories:
[[{'legal_actions': OrderedDict([(1, None), (2, None), (3, None)]), 'obs': array([0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0.]), 'raw_obs': {'hand': 'HQ', 'public_card': None, 'all_chips': [2, 1], 'my_chips': 2, 'legal_actions': ['raise', 'fold', 'check'], 'current_player': 0}, 'raw_legal_actions': ['raise', 'fold', 'check'], 'action_record': [(1, 'fold')]}], [{'legal_actions': OrderedDict([(0, None), (1, None), (2, None)]), 'obs': array([1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0.]), 'raw_obs': {'hand': 'HJ', 'public_card': None, 'all_chips': [2, 1], 'my_chips': 1, 'legal_actions': ['call', 'raise', 'fold'], 'current_player': 1}, 'raw_legal_actions': ['call', 'raise', 'fold'], 'action_record': [(1, 'fold')]}, 2, {'legal_actions': OrderedDict([(1, None), (2, None), (3, None)]), 'obs': array([1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0.]), 'raw_obs': {'hand': 'HJ', 'public_card': None, 'all_chips': [2, 1], 'my_chips': 1, 'legal_actions': ['raise', 'fold', 'check'], 'current_player': 0}, 'raw_legal_actions': ['raise', 'fold', 'check'], 'action_record': [(1, 'fold')]}]

Пример необработанного наблюдения:
{'all_chips': [2, 1],
 'current_player': 0,
 'hand': 'HQ',
 'legal_actions': ['raise', 'fold', 'check'],
 'my_chips': 2,
 'public_card': None}

Пример необработанных легальных действий:
['raise', 'fold', 'check']
``` ```
parser.add_argument(
        '--log_dir',
        type=str,
        default='experiments/leduc_holdem_dqn_result/',
    )

    args = parser.parse_args()

    os.environ["CUDA_VISIBLE_DEVICES"] = args.cuda
    train(args)

Train DQN on Blackjack с помощью команды:


Ожидаемый результат может выглядеть следующим образом:

--> Запуск на CPU

----------------------------------------
  episode      |  0
  reward       |  -0.1985
----------------------------------------
INFO - Шаг 100, rl-loss: 1.3018044233322144
INFO - Копирование параметров модели в целевую сеть.
INFO - Шаг 141, rl-loss: 0.6624548435211182
----------------------------------------
  episode      |  100
  reward       |  -0.4365
----------------------------------------
INFO - Шаг 281, rl-loss: 0.53533869981765755
----------------------------------------
  episode      |  200
  reward       |  -0.103
----------------------------------------
INFO - Шаг 418, rl-loss: 0.70432752370834356
----------------------------------------
  episode      |  300
  reward       |  -0.1175
----------------------------------------
INFO - Шаг 552, rl-loss: 0.40242588520050056
----------------------------------------
  episode      |  400
  reward       |  -0.101
----------------------------------------
INFO - Шаг 693, rl-loss: 0.62362509965896616
----------------------------------------
  episode      |  500
  reward       |  -0.0835
----------------------------------------

В Blackjack игрок получает выигрыш в конце игры: 1, если игрок выигрывает, -1, если игрок проигрывает, и 0, если это ничья. Производительность измеряется средним выигрышем игрока после 10 000 эпизодов. Приведённый пример показывает, что агент достигает всё лучшей производительности во время обучения. Журналы и кривые обучения сохраняются в `experiments/blackjack_dqn_result/`

Вы также можете свободно попробовать алгоритм nfsp или другие среды, просто изменив аргументы.

## Обучение CFR (выбор шанса) на Leduc Hold'em
Чтобы показать, как мы можем использовать `step` и `step_back` для обхода дерева игр, мы предоставляем пример решения Leduc Hold’em с помощью CFR (выбора шанса). Вы также можете найти код в [examples/run_cfr.py](../examples/run_cfr.py).
```python
import os
import argparse

import rlcard
from rlcard.agents import (
    CFRAgent,
    RandomAgent,
)
from rlcard.utils import (
    set_seed,
    tournament,
    Logger,
    plot_curve,
)

def train(args):
    # Создаём окружение, CFR поддерживает только Leduc Holdem
    env = rlcard.make(
        'leduc-holdem',
        config={
            'seed': 0,
            'allow_step_back': True,
        }
    )
    eval_env = rlcard.make(
        'leduc-holdem',
        config={
            'seed': 0,
        }
    )

    # Задаём начальное значение для numpy, torch, random
    set_seed(args.seed)

    # Инициализируем агента CFR
    agent = CFRAgent(
        env,
        os.path.join(
            args.log_dir,
            'cfr_model',
        ),
    )
    agent.load()  # Если у нас есть сохранённая модель, сначала загружаем её

    # Оцениваем CFR против случайного
    eval_env.set_agents([
        agent,
        RandomAgent(num_actions=env.num_actions),
    ])

    # Начинаем обучение
    with Logger(args.log_dir) as logger:
        for episode in range(args.num_episodes):
            agent.train()
            print('\rIteration {}'.format(episode), end='')
            # Оцениваем производительность. Играем со случайными агентами.
            if episode % args.evaluate_every == 0:
                agent.save() # Сохраняем модель
                logger.log_performance(
                    episode,
                    tournament(
                        eval_env,
                        args.num_eval_games
                    )[0]
                )

        # Получаем пути
        csv_path, fig_path = logger.csv_path, logger.fig_path
    # Строим кривую обучения
    plot_curve(csv_path, fig_path, 'cfr')

if __name__ == '__main__':
    parser = argparse.ArgumentParser("Пример CFR в RLCard")
``` **Перевод текста на русский язык:**

parser.add_argument(
    '--seed',
    type=int,
    default=42,
)
parser.add_argument(
    '--num_episodes',
    type=int,
    default=5000,
)
parser.add_argument(
    '--num_eval_games',
    type=int,
    default=2000,
)
parser.add_argument(
    '--evaluate_every',
    type=int,
    default=100,
)
parser.add_argument(
    '--log_dir',
    type=str,
    default='experiments/leduc_holdem_cfr_result/',
)

args = parser.parse_args()

train(args)

**Запустите код с помощью команды:**
python3 examples/run_cfr.py

**Ожидаемый результат:**
Iteration 0
----------------------------------------
  episode      |  0
  reward       |  0.648
----------------------------------------
Iteration 100
----------------------------------------
  episode      |  100
  reward       |  0.73575
----------------------------------------
Iteration 200
----------------------------------------
  episode      |  200
  reward       |  0.64825
----------------------------------------
Iteration 300
----------------------------------------
  episode      |  300
  reward       |  0.75925
----------------------------------------

## Играем с предварительно обученной моделью Leduc
Мы разработали простые пользовательские интерфейсы для игры против предварительно обученной модели. Leduc Hold'em — это упрощённая версия Texas Hold'em. Правила можно найти [здесь](games.md#leduc-holdem). Пример игры против модели Leduc Hold'em CFR (случайная выборка) приведён ниже. Код можно найти в [examples/human/leducholdem_human.py](../examples/human/leducholdem_human.py).
```python
import rlcard
from rlcard import models
from rlcard.agents import LeducholdemHumanAgent as HumanAgent
from rlcard.utils import print_card

# Создаём окружение
env = rlcard.make('leduc-holdem')
human_agent = HumanAgent(env.num_actions)
cfr_agent = models.load('leduc-holdem-cfr').agents[0]
env.set_agents([
    human_agent,
    cfr_agent,
])

print(">> Leduc Hold'em предварительно обученная модель")

while (True):
    print(">> Начать новую игру")

    trajectories, payoffs = env.run(is_training=False)
    # Если человек не выполняет последнее действие, нам нужно
    # вывести действие других игроков
    final_state = trajectories[0][-1]
    action_record = final_state['action_record']
    state = final_state['raw_obs']
    _action_list = []
    for i in range(1, len(action_record)+1):
        if action_record[-i][0] == state['current_player']:
            break
        _action_list.insert(0, action_record[-i])
    для пары в _action_list:
        print('>> Игрок', пара[0], 'выбирает', пара[1])

    # Давайте посмотрим, какая карта у агента
    print('===============     Агент CFR    ===============')
    print_card(env.get_perfect_information()['hand_cards'][1])

    print('===============     Результат     ===============')
    если payoffs[0] > 0:
        print("Вы выиграли {} фишек!".format(payoffs[0]))
    elif payoffs[0] == 0:
        print("Ничья.")
    else:
        print("Вы проиграли {} фишек!".format(-payoffs[0]))
    print('')

    input("Нажмите любую клавишу, чтобы продолжить...")

Пример вывода:

>> Leduc Hold'em предварительно обученная модель

>> Начать новую игру!
>> Агент 1 выбирает рейз

=============== Общая карта ===============
┌─────────┐
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
│░░░░░░░░░│
└─────────┘
===============   Рука    ===============
┌─────────┐
│J        │
│         │
│         │
│    ♥    │
│         │
│         │
│        J│
└─────────┘
===============     Фишки      ===============
Yours:   +
Агент 1: +++
=========== Действия, которые вы можете выбрать ===========
0: колл, 1: рейз, 2: фолд

>> Вы выбираете действие (целое число):

Обучение DMC на Dou Dizhu

Наконец, мы предоставляем пример обучения Deep Monte-Carlo (DMC) на крупномасштабной игре Dou Dizhu. Вы также можете найти код в examples/run_dmc.py.

import os
import argparse

import torch

import rlcard
из rlcard.agents.dmc_agent импортировать DMCTrainer

def train(args):

    # Создайте окружение...

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/daochenzha-rlcard.git
git@api.gitlife.ru:oschina-mirror/daochenzha-rlcard.git
oschina-mirror
daochenzha-rlcard
daochenzha-rlcard
master