スタートページJavaScriptライブラリ目次

ゲームの理論 JavaScript関数ライブラリ(game.js)の利用解説書

ご利用にあたって

劣等戦略の削除
    gameCompactTrace(表示場所, 利失表, 行名, 列名);
    rtn = gameCompact(利失表, 行名, 列名);
      var 新利失表 = rtn["matrix"];
      var 新行名 = rtn["rowname"];
      var 新列名 = rtn["colname"];
未知環境での意思決定
    gameDecisionTrace(表示場所, 利失表, 行名, 列名);
    rtn = gameDecision(利失表, 行名);
      var ラプラス = rtn["Laplace"];
      var マクシマックス = rtn["MaxiMax"];
      var ミニマックス = rtn["MiniMax"];
      var リグレットミニマックス = rtn["RegretMiniMax"];
      var ハーヴィッツ20 = rtn["Hurvicz20"];  // α=0.2としたとき
      var ハーヴィッツ50 = rtn["Hurvicz50"];
      var ハーヴィッツ80 = rtn["Hurvicz80"];
期待値による意思決定
    gameEvalueTrace(表示場所, 利失表, 期待値, 行名, 列名)
    選択戦略 = gameEvalue(利失表, 期待値, 行名)
二人零和ゲーム
    game2ZeroSumTrace(表示場所, 利失表, 行名, 列名)
    rtn = game2ZeroSum(利失表, 行名, 列名)
        rtn["model"] 戦略のパターン = 純粋戦略。混合戦略、混合戦略LP
         2×2のときは混合戦略で選択確率を計算。それ以外では混合戦略LPとして確率計算のための線形計画法への定式化
        rtn["saddle"] 純粋戦略での鞍点
        rtn["mixed"]  混合戦略で選択確率
        rtn["lpA"] rtn["lpA"] 混合戦略LPの定式化
ナッシュ均衡(二人非零和ゲーム)
    gameNashTrace(表示場所, matrix, rowname, colname);
    rtn = gameNash(matrix, rowname, colname);
        rtn["minmax"]       [A,B] A・Bの最低保証利益(単独利失表にミニマックスを適用)
        rtn["pureNush"]     [[A,B],[A,B],…,[A,B]]  純粋戦略でのナッシュ均衡 存在しないことがある 
        rtn["mixedNush"]    [A,B] 純粋戦略でのナッシュ均衡(第一戦略の選択確率) 存在しないことがある
                                     2×2のときだけ計算

上の表で関数名をクリックすると、該当関数の個所に移動します。大体、次のような構成になっています。
  ・[コード表示]をクリックすると該当関数のコードが別ウインドウにポップアップします。
  ・主要な戻り値の意味と簡単な算出根拠を掲げています。


劣等戦略の削除
  gameCompactTrace(表示場所, 利失表, 行名, 列名);
  rtn = gameCompact(利失表, 行名, 列名);

戻り値は連想配列になります。
  var 新利失表 = rtn["matrix"];
  var 新行名 = rtn["rowname"];
  var 新列名 = rtn["colname"];

    戻り値を行名や列名ではなく、元の行番号や列番号にするなら、0, 1, 2, … で与えてください。
参照(Webテキスト):2人零和ゲーム

優越戦略と劣等戦略

ケース1 Bの戦略
B1B2B3B4
Aの戦略 A1-2-1
A2-2
A3-3-1
 → 
ケース2 Bの戦略
B1B2B3B4
Aの戦略 A1-2-1
A2-2
 → 
ケース3 Bの戦略
B1B2
Aの戦略A1-3
A2-2

ケース1のペイオフ・マトリクスがあるとします。A3の各要素はA2の各要素よりも劣っています。このような関係があるとき,A2はA3に対して優越戦略であり,A3はA2に対して劣等戦略であるといいます。Aは絶対にA3を選択することはありませんから,A3の行は削除しますと,ケース2になります。

すると,Bから見たときには,B3はB2に対して劣等戦略でありB4はB1に対して劣等戦略です。BがB3やB4を選択するはずがありません。それでこれらを削除します。その結果,ケース3になりますが,これらには優越・劣等の関係はないので,これ以上削除する行や列はありません。

最初に、この処理を行うことにより、処理効率が向上しますし、理解しやすくなります。それで以降の関数では、優越・劣等の関係はないものとします。

例示

    var matrix = [[ 1, -2, -1,  2],
                  [-2,  4,  5,  0],
                  [-3,  2,  2, -1]];
    var rowname = ["A1", "A2", "A3"];
    var colname = ["B1", "B2", "B3", "B4"];
    var rtn = gameCompactTrace("gameCompact表示場所", matrix, rowname, colname);
    

未知環境での意思決定
  gameDecisionTrace(表示場所, 利失表, 行名, 列名);
  rtn = gameDecision(利失表, 行名);

  var ラプラス = rtn["Laplace"];
  var マクシマックス = rtn["MaxiMax"];
  var ミニマックス = rtn["MiniMax"];
  var リグレットミニマックス = rtn["RegretMiniMax"];
  var ハーヴィッツ20 = rtn["Hurvicz20"];  // α=0.2としたとき
  var ハーヴィッツ50 = rtn["Hurvicz50"];
  var ハーヴィッツ80 = rtn["Hurvicz80"];
        戻り値は連想配列形式になります。
    戻り値は選択した戦略(行名)がベクトル形式になります。
    戻り値を行名ではなく、行番号にしたいときは、行名を 0, 1, 2, … としてください
        gameDecisionTrace では、説明のために列名が必要です。
参照(Webテキスト):決定理論
下表のような利失表があります。
  将来環境には、晴/曇/雨、戦略には、傘を持って外出/持たないで外出/外出しない
  将来環境には、景気が上昇/横ばい/下降、戦略には、投資をする/しない
などがあります。
ここでは、天候や景気について、何らの情報がなく、その状況でどの戦略を選択するかを考えます。
「どの戦略を選択すべきか」ではなく、「どのような考え方によるならばどの戦略を選ぶのが合理的か」です。
将来環境計算値
 B1 B2 B3 B4 合計最大値最小値ハービッツの式
Aの戦略 A1 ⑥ 3 1 1 11  6● 1 6α+1(1-α) = 5α+1
A2 3 5 4 ② 14★ 5  2■5α+2(1-α) = 3α+2
A3 4 1 2 3 10  4  1 4α+1(1-α) = 3α+1
ラプラスの原理
    すべての事象が同一確率で発生すると考え、その期待値が大きい(すなわち、合計が大きい)戦略を選択するという考え方。
    上表では、A2が最大14★になるので、A2を選択します。
マクシマックス原理
    非常に楽観的な人は,天候や景気すら自分の都合の良いようになると考えます。
    各戦略について,各状況のうち最大のものを選び,その中でさらに最大になる(最大-最大)戦略を選びます。
    上表では最大値の中で最大なのは6●ですから、A1を選択することになります。
ミニマックス原理(マクシミン原理)
    非常に悲観的な人は,物事は自分の都合の悪いようになると考えます。
    各戦略について,各状況のうち最小のことが起こるとして、そのなかで最大になる(最小-最大)戦略を選びます。
    上表では最小値の中で最大なのは2■ですから、A2を選択することになります。
ハーヴィッツの原理
    通常の人は楽観と悲観の中間でしょう。「楽観度」をα(0<α<1)とすれば、その人にとっての効果は
        α*楽観的効果 + (1-α)*悲観的効果
  となり、上表のようになります。
  楽観的ではA1、悲観的ならA2なのですから、このどちらかになり、A3は対象外になります。  
  これから次の結果になります。
    α≧0.5  A1が最大 A1を選択
    α≦0.5  A2が最大 A2を選択

    例えば、A1での 5α+1 は、
    係数5=最大値6-最小値1
    係数1=最小値1
  で求められます。
  ここでの関数では、α=0.2、0.5、0.8の3ケースの結果を求めます。★が選択戦略になります。
       最大値 最小値  係数 切片 α=0.2 α=0.5 α=0.8
    A1  6   1   5  1  2.0   3.5★  5.0★   
    A2  5   2   3  2  2.6★  3.5★  4.4 
    A3  4   1   3  3  1.6   4.5   3.4

リグレットミニマックス原理
  後悔することを非常に避けたい人の考えです。
  例えば、A2を選択したらB1が起こってしまった。A1を選択しなかったために6-3の損をしてしまった。
  どのようなことが起こっても後悔を最小にしようという考えかたです。
  
  各列について、最大のものを0として、各行のその列を引きます。これにより後悔の利失表ができるので、
  この利失表に対してミニマックス原理を適用すればよいことになります。

          B1 B2 B3 B4 最小値 
     A1  0 -2 -3 -2  -3 ←最大
     A2 -3  0  0 -1  -3 ←最大
     A3 -2 -4 -2  0  -4

  これより、A1、A2のいずれか(同等)を選択することになります。 

例示

    var matrix = [[ 6, 3, 1, 1],
                  [ 3, 5, 4, 2],
                  [ 4, 1, 2, 3]];
    var rowname = ["A1", "A2", "A3"];
    var colname = ["B1", "B2", "B3", "B4"];
    var rtn = gameDecisionTrace("gameDecision表示場所", matrix, rowname, colname);
    
    

期待値による意思決定
  gameEvalueTrace(表示場所, 利失表, 期待値, 行名, 列名)
  var 選択戦略 = gameEvalue(利失表, 期待値, 行名)

参照(Webテキスト):期待値
天気や景気などの将来事象は確実ではないにせよ、多様な情報から主観的な確率を持つことができます。
このときには、下表のように、各戦略について期待値を求め、それが最大になる戦略を選択するのが妥当でしょう。

             将来事象
            B1 B2 B3 B4         期待値
  発生確率→    0.3   0.1  0.2  0.4
      A1  6  3  1  1  6*0.3 + 3*0.1 + 1*0.2 + 1*0.4 = 2.7
 Aの戦略 A2  3  5  4  2  3*0.3 + 5*0.1 + 4*0.2 + 2*0.4 = 3.0 ←最大
      A3  4  1  2  3  4*0.3 + 1*0.1 + 2*0.2 + 3*0.4 = 2.9

例示

    var matrix = [[ 6, 3, 1, 1],
                  [ 3, 5, 4, 2],
                  [ 4, 1, 2, 3]];
    var prob = [0.3, 0.1, 0.2, 0.4];
    var rowname = ["A1", "A2", "A3"];
    var colname = ["B1", "B2", "B3", "B4"];
    var rtn = gameDecisionTrace("gameDecision表示場所", matrix, rowname, colname);
    
    

二人零和ゲーム
  game2ZeroSumTrace(表示場所, 利失表, 行名, 列名)
  rtn = game2ZeroSum(利失表, 行名, 列名)

参照(Webテキスト)二人零和ゲーム

  次の結果を出力します。
    純粋戦略/混合戦略の判断
    純粋戦略のとき 鞍点とプレイヤーA・Bの戦略の選択
    混合戦略のとき 選択戦略ミックスを計算するための線形計画法の定式化
      一方の戦略数が2のとき 選択戦略ミックスの解
互いに利害の反するA・B二人のプレイヤーが、それぞれ、A1、A2、…、B1、B2、…、の戦略をもっています。
下表は、Aから見た利失表で、もしAがA1、BがB1の戦略を採択すろると、Aは3の利益、Bは-3の損失になります。
Aはできるだけ大きい利益が得られるよう行動し、BはAの利益をできるだけ小さくしようと行動します。

      B1 B2 B3
   A1  3 -1 -2
   A2 -1  0  4
   A3  2  1  2

純粋戦略

「相手は自分が選択した戦略が不利になるように行動する」ということは、ミニマックス原理に相当します。
Aは、各戦略(行)での利失が最小のもの(列)の表を作り、その表で最大となる戦略(行)を選択します。
Bの利得表は、全ての要素をマイナスにした表でにミニマックス原理を適用するのですから、Aの利得表に関して、
各戦略(列)での利失が最大のもの(行)の表を作り、その表で最小となる戦略(列)を選択します。

上の表に、ミニマックス原理を適用したものを加えると次のようになります。

      B1 B2 B3  最小
   A1  3 -1 -2  -2
   A2 -1  0  4  -1
   A3  2  1  2   1 ★
   最大  3  1  2  
          ●

Aは、★の戦略を選択すれば、Bの選択によらず1以上の利益が保証されますし、
Bは、●の戦略を選択すれば、Aに1以上の利益を与えないこと(Bの損失が-1以内であることが保証されます。
双方がミニマックス原理に従う限り、A3とB2の戦略が選択されます、

この(A3、B2)を鞍点(saddli Point)、1をゲームの値(game value)といいます。
そして、鞍点が存在する戦略ミックスを純粋戦略(pure strategy)といいます。

なお、最終の圧縮した結果が、利失表の値がすべて同一値になり、複数の★や●が残る場合があります。
この場合は、鞍点が複数存在することになります。

混合戦略

次の利失表では、鞍点が存在しません。純粋戦略ではなく混合戦略(mixed strategy))になります。
混合戦略とは、A1を0.6、A2を0.4というように確率で選択する戦略です。
何度も繰り返し行うのであれば、この割合で選択することが最適になります。

      B1 B2  最小
   A1  1 -3  -3
   A2 -2  4  -2
   最大  1  4  

線形計画法への帰着

●Aの戦略
AがA1,A2を選択する確率を、p1, p2とします。
  確率条件:p1 + p2 = 1
Bが、B1を選択するときの期待値は 1*p1 -2*p2、B2を選択したときの期待値は -3*p1 + 4*p2 になります。
ゲームの値をVとすれば、Bはそれらの期待値をV以下にしたいのですから
  1*p1 -2*p2 ≦ V,  -3*p1 + 4*p2  ≦ V
になります。

一般化して、利得表を a[i][j] とすれば、
              p[0] +         p[1] + … + p[n]         = 1
   a[0][0]*p[0] + a[1][0]*p[1] + … + a[n][0]*p[n] ≦ V
   a[0][1]*p[0] + a[1][1]*p[2] + … + a[n][1]*p[n] ≦ V
               :
   a[0][m]*p[0] + a[1][m]*p[2] + … + a[n][m]*p[n] ≦ V
そしてAはVを最大にしたいのですから、
   目的関数 V→ 最大
となり、線形計画法に帰着します。

●Bの戦略
Bが、B1,B2を選択する確率を、q1, q2とします。
  確率条件:q1 + q2 = 1
Aが、A1を選択するときの期待値は 1q1 -3q2、A2を選択したときの期待値は -2q1 + 4q2 になります。
ゲームの値をVとすれば、Aはそれらの期待値をV以上にしたいのですから
  1q1 -3q2 ≧ V,  -2q1 + 4q2  ≧ V
になります。

一般化して、利得表を a[i][j] とすれば、
              q[0] +         q[1] + … + q[m]         = 1
   a[0][0]*q[0] + a[0][1]*q[1] + … + a[0][m]*q[m] ≧ V
   a[1][0]*q[0] + a[1][1]*q[1] + … + a[1][m]*q[m] ≧ V
               :
   a[n][0]*q[0] + a[n][1]*q[1] + … + a[n][m]*q[m] ≧ V
そしてBはVを最小にしたいのですから、
   目的関数 V→ 最小
となります。


線形計画法の解法は、それだけで大きなアルゴリズムになるので、ここではそのためのデータを配列データとして戻すだけにします。

線形計画法の解

上の利失表のように、A、Bの戦略が2個のときは、簡単に解が得られます。

●Aの戦略
A1の確率を p とすれば、A2の確率は 1-p です。
B1での期待値: a[0][0]*p + a[1][0]*(1-p) →  1p - 2(1-p) → 3p - 2 
B2での期待値: a[0][1]*p + a[1][1]*(1-p) → -3p + 4(1-p) → -7p + 4 
両式がともにゲームの値Vに等しいとすれば、3p - 2 = -7p + 4 → p=0.6
一般化すれば、
   p = (a[1][1]-a[1][0])/(a[0][0]-a[0][1]-a[1][0]+a[1][1])
となり、Vも計算できます。
混合戦略であることから、0<p<1 でなければならず、その候補は上の p だけなので、これが求める解になります。

上の利失表の値を代入すれば、
   p = (4 -(-2)) / (1 -(-3) -(-2) + 4) = 0.6
      V = 1*p -2*(1-p) = 1*0.6 -2*0.4 = -0.2
すなわち、A1を0.6、A2を0.4の割合で選択することになります。

●Bの戦略
B1の確率を q とすれば、B2の確率は 1-q です。
A1での期待値: a[0][0]*q + a[0][1]*(1-q)
A1での期待値: a[1][0]*q + a[1][1]*(1-q)
両式がともにゲームの値Vに等しいとすれば、
   q = (a[1][1]-a[0][1])/(a[0][0]-a[0][1]-a[1][0]+a[1][1])
となり、Vも計算できます。
混合戦略であることから、0<q<1 でなければならず、その候補は上の q だけなので、これが求める解になります。

上の利失表の値を代入すれば、
   q = (4-(-3)) / (1 -(-3) -(-2) + 4) = 0.7
      V = 1*q -3*(1-q) = 4*0.7 - 3 = -0.2   この値はAの戦略での値と一致します。
すなわち、B1を0.7、B2を0.3の割合で選択することになります。

二人零和ゲームの例

Trace:  処理経緯を表示します。
Return: 関数の戻り値を返すだけです。ここでは戻り値を簡単に表示します。

ケース1:純粋戦略の例

    var matrix = [[ 3, -1, -2],
                  [-1,  0,  4],
                  [ 2,  1,  2]];
    var rowname = ["A1", "A2", "A3"];
    var colname = ["B1", "B2", "B3"];
    

ケース2:混合戦略の例

    var matrix = [[ 1, -3],
                  [-2,  4]];
    var rowname = ["A1", "A2"];
    var colname = ["B1", "B2"];
    

ケース3:データの入力

行数 列数
↓行 列→

二人非零和ゲーム

参照(Webテキスト)二人非零和ゲーム
A・B二人のプレイヤーが、それぞれ、A1、A2、…、B1、B2、…、の戦略をもっています。
そして、A・Bが独自の利失表を持っており、必ずしもAの利益がBの損失にはならない(非零和)のですが、
相手の戦略選択が、自分の戦略選択に大きな影響を与えるというモデルです。

次のように表記するのが一般的です。(Aの利益, Bの利益)
       B1   B2   B3
   A1 (5, 2) (1, 3) (1, 1)
   A2 (2, 3) (2, 2) (4, 2)
   A3 (2, 1) (3, 2) (1, 4)
A1, B1が選択されれば、Aは5の利益、Bは2の利益を得ます。
Aとしては大満足ですが、BはB3を選択すれば4の利益が得られるかもしれず、B1を選択するとは思えません。
BとしてはB3にしたいのですが、AがA1を選択したら最悪の結果になるリスクを伴います。

二人非零和ゲームの考え方は、広い分野で活用されていますが、その基本になるのがナッシュ均衡です。

ナッシュ均衡(Nush equilibrium)
  gameNashTrace(表示場所, matrix, rowname, colname);
  rtn = gameNash(matrix, rowname, colname);

   戻り値
       rtn["minmax"]       [A,B] A・Bの最低保証利益(単独利失表にミニマックスを適用)
       rtn["pureNush"]     [[A,B],[A,B],…,[A,B]]  純粋戦略でのナッシュ均衡 存在しないことがある 
       rtn["mixedNush"]    [A,B] 純粋戦略でのナッシュ均衡(第一戦略の選択確率) 存在しないことがある

ナッシュ均衡とは、ある戦略(A,B)になったとき、AもBもそれ以外の戦略を選択しなくなるような戦略のことです。
純粋戦略でのナッシュ均衡と、混合戦略でのナッシュ均衡があります。
次の利失表があります。
                     Aの利失表         Bの利失表
        B1     B2        B1 B2 最小      B1 B2            
   A1 ( 3,  1) (-1, -3)   A1  3 -1 -1★  A1  1 -3
   A2 (-2, -2) ( 1,  2)   A2 -2  1 -2   A2 -2  2
                                    最小 -2 -3
                                        ★
   最低保証利益 A=-1、B=-2

純粋戦略でのナッシュ均衡
 Aの戦略
  BがB1を選択したとき、B1列のAが最大3の戦略A1を選択 →(A1, B1)
    (あえてA2を選択したら-1になってしまう)
  BがB2を選択したとき、B2列のAが最大の戦略A2を選択 →(A2, B2)
 Bの戦略
  AがA1を選択したとき、A1行のBが最大の戦略B1を選択 →(A1, B1)
  AがA2を選択したとき、A2行のBが最大の戦略B2を選択 →(A2, B2)
 すなわち、いったん(A1, B1)あるいは(A2, B2)が選択されたらAもBも他の戦略に変えようとせず安定する。
 (A1, B1)、(A2, B2)を純粋戦略でのナッシュ均衡点という。
 ナッシュ均衡点は1組の場合や存在しないこともある。

混合戦略でのナッシュ均衡
 Aの利失表に零和ゲームを適用すると、B1の確率をpとして、
  A1の期待値: 3p-1(1-p)= 4p-1
  A2の期待値:-2p+1(1-p)=-3p+1
     B1の確率=2/7、B2の確率=5/7,V= 1/7
 同様に A1の確率=1/2,A2の確率=1/2,V=-1/2
 ([1/2,1/2], [2/7.5/7]) が混合戦略でのナッシュ均衡点になる。

ナッシュ均衡の例

Trace:  処理経緯を表示します。
Return: 関数の戻り値を返すだけです。ここでは戻り値を簡単に表示します。

ケース1

    var matrix = [ [ [5,2], [1,3], [1,1] ],
                   [ [2,3], [2,2], [4,3] ],
                   [ [2,1], [3,2], [1,4] ] ];
    var rowname = ["A1", "A2", "A3"];
    var colname = ["B1", "B2", "B3"];
    

ケース2

    var matrix = [ [ [3,1], [-1,-3] ],
                   [ [-2,-2], [1,2] ] ];
    var rowname = ["A1", "A2"];
    var colname = ["B1", "B2"];
    

ケース3

行数 列数
↓行 列→