Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

分散的方法によるブラックジャック

この例では 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.

ジョブの作成と投入

ジョブを作成し、分割ごとにジョブ内に 1 つのタスクを作成します。タスク関数は、逐次的方法の例で使用されたものと同じ関数であることに注意してください。詳細については、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);

経過時間の測定

分散シミュレーションの所要時間は、逐次的方法によるブラックジャックの例で同じ一連の計算を実行するために要する時間と比較する必要があります。経過時間は基礎となるハードウェアおよびネットワーク インフラストラクチャによって変わります。

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);