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
结束