主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

分布式 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);