分布式 21 点游戏
此示例使用 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×numPlayers 矩阵中。
S = cell2mat(jobResults');
现在我们已经完成了所有验证,因此我们可以删除该作业。
delete(job);
测量历时
应将分布式仿真所用的时间与 顺序 21 点游戏 示例中执行同一组计算所需的时间进行比较。经过的时间因底层硬件和网络基础设施而异。
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);