主要内容

Parfevalを用いたブラックジャック

この例では并行计算工具箱™を使用して,カードゲームのブラックジャック(“21”とも呼ばれる)をプレイします。別々に数千のゲム数をプレする多数のプレヤを同時にシミュレトし,利得の統計を表示します。この例では,parfevalを使用してワ,カ,の並列プ,ルで非同期的にシミュレ,ションを実行します。こうすることで,結果が使用可能になった時点で結果の表示を更新できます。

関連する例:

この例のコ,ドは以下の関数に含まれています。

函数paralleldemo_blackjack_parfeval

逐次的問題の解析

ブラックジャックのプレ,ヤ,は互いに独立しているため,並列でシミュレ,トできます。これを行うには,問題をいくかの小さな関数評価に分割します。最大でnumPlayers回のシミュレ,ションを実行し,各プレ,ヤ,はブラックジャックをnumHands回プレ@ @します。結果が使用可能になったらすぐにプロットし,経過時間がmaxSimulationTime秒を超えるか,ユ,ザ,が実行をキャンセルした場合はシミュレ,ションを終了します。

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

作業を個々の関数評価に分割

関数parfevalを呼び出して,並列プ,ルのワ,カ,におけるシミュレ,ションの評価を要求します。並列プ,ルは必要に応じて自動的に作成されます。関数parfeval平行的。未来オブジェクトを返します。このオブジェクトを使用して,結果が使用可能になった時点でこれらの結果にアクセスします。詳細にいては,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, numPlayers);为所有结果分配空间completed = false(1, numPlayers);一个给定的将来是否已经完成超时= 2;% fetchNext超时时间(秒)numCompleted = 0;已完成多少次模拟图= pctdemo_setup_blackjack(1);创建一个图形以显示结果使用appdata跟踪,创建一个带取消按钮的等待栏%是否已按下取消按钮。hWaitBar = waitbar(0,“21点进步”“CreateCancelBtn”...@(src, event) setappdata(gcbf()“取消”,真的));setappdata (hWaitBar“取消”、假);

使用可能になった結果の収集と表示

numPlayers件の結果が表示されるまで,fetchNextをル,プで呼び出して結果の収集と表示を行います。fetchNextが新たな結果を返したら,この結果をresultsSoFarに割り当て,配列完成numCompletedカウンタ,を更新し,プロットを更新します。ユザがウェトバのキャンセルボタンを押した場合,またはmaxSimulationTimeが経過した場合は,ル,プを早期に中止します。

startTime = clock();numCompleted < numPlayers% fetchNext将阻塞执行,直到期货的一个元素完成。它%然后将该指数返回到已完成的元素的期货中,%和执行结果。[completedIdx, resultThisTime] = fetchNext(期货,timeout);如果fetchNext超时返回一个空的completedIdx,不要尝试%处理结果。如果~isempty(completedIdx) numCompleted = numCompleted + 1;已完成期货的更新列表。complete (completedIdx) = true;填写部分结果。resultsSoFar(:, completedIdx) = resultThisTime;%更新绘图。pctdemo_plot_blackjack(fig, resultsSoFar(:, completed), false);结束看看我们是否已经超时了。。timeElapsed = etime(clock(), startTime);如果timeElapsed > maxSimulationTime'模拟终止:maxSimulationTime已超过。\n');打破结束检查是否按下了取消按钮。如果getappdata (hWaitBar“取消”)流(“模拟取消。\ n”);打破结束更新等待栏。fractionTimeElapsed = timeElapsed / maxSimulationTime;fractionPlayersCompleted = numCompleted / numPlayers;fractionComplete = max(fractionTimeElapsed, fractionPlayersCompleted);waitbar (fractionComplete hWaitBar);结束流('完成的模拟次数:%d\n', numCompleted);现在模拟完成,我们可以取消期货和删除服务员。取消(期货);删除(hWaitBar);
模拟终止:超过maxSimulationTime。完成的模拟次数:74

结束