Примеры для начала работы
В этом документе приведены некоторые примеры для начала работы. Все примеры доступны в examples/.
Игра со случайными агентами
Мы предоставляем случайного агента, который может случайным образом играть в каждой среде. Пример кода выглядит следующим образом. Вы также можете найти код в 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: фолд
>> Вы выбираете действие (целое число):
Наконец, мы предоставляем пример обучения 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 )