这个示例使用Parallel Computing Toolbox™来玩blackjack(也称为21)的纸牌游戏。我们模拟了一群玩家,他们一次独立地玩了数千手牌,并显示收益统计数据。此示例在一个并行工作程序池上异步运行模拟,使用parfeval
。通过这种方式,我们可以在结果可用时更新结果的显示。
相关例子:
你可以在函数中找到这个例子中的代码:
函数paralleldemo_blackjack_parfeval
因为21点的玩家是相互独立的,所以我们可以并行地模拟他们。我们通过将问题分解为若干函数计算来实现这一点。我们运行的最大值numPlayers
模拟游戏,每个玩家玩numHands
21点。一旦结果可用,我们就绘制结果,如果经过的时间超过了,我们就终止模拟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次
结束