Этот пример использует 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);