文档

Parfeval 21点

这个示例使用Parallel Computing Toolbox™来玩blackjack(也称为21)的纸牌游戏。我们模拟了一群玩家,他们一次独立地玩了数千手牌,并显示收益统计数据。此示例在一个并行工作程序池上异步运行模拟,使用parfeval。通过这种方式,我们可以在结果可用时更新结果的显示。

相关例子:

你可以在函数中找到这个例子中的代码:

函数paralleldemo_blackjack_parfeval

分析顺序问题

因为21点的玩家是相互独立的,所以我们可以并行地模拟他们。我们通过将问题分解为若干函数计算来实现这一点。我们运行的最大值numPlayers模拟游戏,每个玩家玩numHands21点。一旦结果可用,我们就绘制结果,如果经过的时间超过了,我们就终止模拟maxSimulationTime秒,或者如果用户取消执行。

numPlayers = 100;numHands = 5000;maxSimulationTime = 20;

将工作划分为单独的功能评估

我们所说的parfeval函数请求对并行池工作人员进行仿真评估。如果需要,将自动创建并行池。的parfeval函数返回一个parallel.Future对象,当结果可用时,我们使用它来访问结果。你可以查看pctdemo_task_blackjack的代码全部细节。

idx = numPlayers:-1:1期货(idx) = parfeval(@pctdemo_task_blackjack, 1, numHands, 1);结束%创建一个onCleanup,以确保退出时不会让任何期货运行%这个例子。cancelFutures = onCleanup(@) cancel(futures));

为收集结果和监控进展而设立

并行池工作人员立即开始运行pctdemo_task_blackjack,一旦结果可用,我们就可以通过使用fetchNext方法。我们使用resultsSoFar积累的结果。我们更新数组完成表示的哪些元素期货已完成,并增加计数器numCompleted。我们提供了可选参数超时fetchNext方法,以便在没有新结果时快速返回。

resultsSoFar = 0 (numHands, numplayer);%为所有结果分配空间= false(1, numPlayers);某一特定的未来尚未完成超时= 2;% fetchNext超时(秒)numCompleted = 0;完成了多少次模拟无花果= pctdemo_setup_blackjack (1);%创建一个图形来显示结果%创建一个带取消按钮的waitbar,使用appdata进行跟踪%取消按钮是否已被按下。hWaitBar = waitbar (0,“21点进步”,“CreateCancelBtn”,@ (src、事件)setappdata (gcbf (),“取消”,真的));setappdata (hWaitBar“取消”、假);

收集和显示可用的结果

我们通过调用来收集和显示结果fetchNext循环,直到我们看到numPlayers结果。当fetchNext返回新的结果,我们将结果分配到resultsSoFar,更新完成数组和numCompleted计数器,并更新绘图。如果用户按下waitbar上的cancel按钮或maxSimulationTime到期。

开始时间=时钟();numCompleted < numPlayersfetchNext块执行,直到一个期货元素完成。它%然后返回已完成元素的期货指数,%和执行的结果。[completedIdx, resultThisTime] = fetchNext(期货,超时);如果fetchNext超时返回一个空的completedIdx,不要尝试%的过程的结果。如果~isempty(completedIdx) numCompleted = numCompleted + 1;%更新已完成期货清单。完成(completedIdx) = true;填写结果的一部分。resultsSoFar(:, completedIdx) = resultThisTime;%更新图。pctdemo_plot_blackjack(fig, resultsSoFar(:, completed), false);结束检查一下我们是否没时间了。timeElapsed = etime(clock(), startTime);如果maxSimulationTime fprintf('模拟终止:超过maxSimulationTime .\n');打破;结束检查取消按钮是否被按下。如果getappdata (hWaitBar“取消”)流(“模拟取消。\ n”);打破;结束%更新waitbar。fractionTimeElapsed = timeElapsed / maxSimulationTime;fractionPlayersCompleted = numCompleted / numPlayers;max(fractionTimeElapsed, fractionPlayersCompleted);waitbar (fractionComplete hWaitBar);结束流('完成的模拟次数:%d\n', numCompleted);%现在模拟完成,我们可以取消期货和删除% waitbar。取消(期货);删除(hWaitBar);
模拟终止:超过maxSimulationTime。完成模拟次数:74次

结束
这个话题有用吗?