Распределенный блэк джек

Этот пример использует Parallel Computing Toolbox™, чтобы проигрывать карточную игру блэк джека, также известного 21. Мы моделируем много проигрывателей, которые независимо проигрывают тысячи рук за один раз и статистики выплаты отображения. Симуляция проигрывания блэк джека является представительной для анализа Монте-Карло финансовых инструментов. Симуляция может быть сделана полностью параллельно, за исключением сбора данных в конце.

Для получения дополнительной информации о вычислениях, просмотрите код для pctdemo_setup_blackjack

Связанные примеры:

Анализируйте последовательную проблему

Поскольку проигрыватели блэк джека являются независимым другого, мы можем моделировать их параллельно. Мы делаем это путем деления проблемы на многие меньшие задачи.

Загрузите настройки в качестве примера и данные

Пример использует профиль по умолчанию при идентификации кластера, чтобы использовать. Документация профилей объясняет, как создать новые профили и как изменить профиль по умолчанию. Если вы хотите использовать различный уровень трудности в качестве примера или количество задач, используйте paralleldemoconfig и затем запустите этот пример снова.

[difficulty, myCluster, numTasks] = pctdemo_helper_getDefaults();

Мы получаем число игроков и количество рук каждый проигрыватель игры от pctdemo_setup_blackjack. Параметр difficulty управляет числом игроков, которое мы моделируем. Можно просмотреть код для pctdemo_setup_blackjack для полного изложения.

[fig, numHands, numPlayers] = pctdemo_setup_blackjack(difficulty);

Разделите работу на меньшие задачи

Мы делим симуляцию проигрывателей numPlayers среди задач numTasks. Таким образом задача i моделирует проигрыватели splitPlayers{i}.

[splitPlayers, numTasks] = pctdemo_helper_split_scalar(numPlayers, ...
                                                  numTasks);
fprintf(['This example will submit a job with %d task(s) ' ...
         'to the cluster.\n'], numTasks);
This example will submit a job with 4 task(s) to the cluster.

Создайте и представьте задание

Мы создаем задание и одну задачу в задании для каждого разделения. Заметьте, что функция задачи является той же функцией, которая использовалась в последовательном примере. Можно просмотреть код для pctdemo_task_blackjack для полного изложения.

startTime = clock;
job = createJob(myCluster);
for i = 1:numTasks
    createTask(job, @pctdemo_task_blackjack, 1, ...
               {numHands, splitPlayers(i)});
end

Мы можем теперь представить задание и ожидать его, чтобы закончиться.

submit(job);
wait(job);

Получите результаты

Давайте проверим, что мы получили все результаты, которые мы ожидали. fetchOutputs выдаст ошибку, если бы задачи не завершались успешно, в этом случае мы должны удалить задание прежде, чем выдать ошибку.

try
    jobResults = fetchOutputs(job);
catch err
    delete(job);
    rethrow(err);
end

Соберите результаты задачи в numHands-by-numPlayers матрицу.

S = cell2mat(jobResults');

Мы теперь закончили все верификации, таким образом, мы можем удалить задание.

delete(job);

Измерьте прошедшее время

Время, используемое для распределенных симуляций, должно быть сравнено со временем, которое требуется, чтобы выполнить тот же набор вычислений в Последовательном примере Блэк джека. Прошедшее время меняется в зависимости от используемого оборудования и сетевой инфраструктуры.

elapsedTime = etime(clock, startTime);
fprintf('Elapsed time is %2.1f seconds\n', elapsedTime);
Elapsed time is 27.5 seconds

Постройте график результатов

Мы отображаем ожидаемую часть пари, которое выиграно или потеряно в каждой руке, наряду с доверительным интервалом. Мы также показываем эволюцию выигрыша и потери каждого из проигрывателей, которые мы моделируем. Можно просмотреть код для pctdemo_plot_blackjack для полного изложения.

pctdemo_plot_blackjack(fig, S);