数学への挑戦 第二弾〜実装編:数理モデルxプログラミング〜

今回は「傘を持っていくか?いかないか?」の選択を行う時の損失(気持ちを基準に)をみてどうするべきか?の判定を下す処理を実装してみようと思います。
元元の話はこちらです。

傘を持ってくか?の数理モデル

以下のような条件がありますので注意です。

<前提>
行動の選択肢は「傘を持ってくる」 or 「持ってこない」の2つ
<嫌度>
雨に濡れることの嫌度 = -10(濡れないとき = 0)
傘を持ってくることの嫌度 = -2
<確率>
雨の確率: 60% = 0.6
晴れの確率: 40% = 0.4

数理モデルの作成をするのには以下のような手順がありました。

  1. 前提になる条件を整理する(書き出す)
  2. 判定する基準を作る(今回の場合は「嫌度」です)
  3. 全部のパターンから平均の損失を求める
  4. 求めた結果、変数(確率変数)になる部分を一般化(文字に置き換える)してやる
  5. 上記の結果、不等式(-ac > -pc)ができるのでそれが数理モデルになる。

数理モデルを作る

プログラムでも、数学でもこの部分は同じようで、まずは頭の中でロジックを作成します。→「理論的に、こーなる!」を作成する

「傘を持ってくるか?」の話では、上の条件より上の条件より以下のような式になります。

<実際の値を計算する>
この記事の「2.平均的な損失を求める」より

「確率」と「その確率で実現する値」の積の合計を平均的な損失と定義する

このような記述がこの本にはありました。

そして、上の部分がわかりづらいので「早い話が。。。」の形にすると下のようになります。

雨が降ったが傘を持っているときは「確率」x「嫌度」=-0.8 ...になる

というわけで式にすると。。。傘を持ってきた場合は
(0.4 x -2) + (0.6 x -2) = -2
となるので「傘を持ってきた時の平均的な損失は−2」

対して、傘を持ってこなかった場合は。。。
(0.4 x 0) + (0.6 x -10) = -6
となるので「傘を持ってこなかった時の平均的な損失は-10」となる。。。

なるほど、しかし上の式で平均になるのか?
平均は「全部の値を大してその個数でわる」ものなので。。。

傘を持ってくる 持ってこない
Ⅰ 晴れ(0.4 : -2) Ⅲ 晴れ(0.4 : 0)
Ⅱ 雨(0.6 : -2) Ⅳ 晴れ(0.6 : -10)

上の表からして、上の全パターンを計算してその合計を出してそのパターン数(4)で割ってやれば良いことになる。。。がしかし、上の記述ではそんなことをしていないのがきになる。。。が比較するから割らなくても問題ないのか?

そんなわけで、次のステップ

変数になるものを指定する

上の表からして、変わる値はほぼ全部かな?

  • 「降水確率」は日によって変わる = p
  • 「嫌度」もその日の気分で変わる = c

これらを変数として「p」「c」とする、そしてこのケースでは必ず「0 < p < 1」(パーセントなので)、「マイナスの値」(嫌度なので)となるから

降水確率60% = 0.6 = p : 晴れの確率40% = 1 - p
雨に濡れる嫌度 = -10 = -c : 傘を持ってくる嫌度 = -c/5

今までのをまとめると。。。

雨の場合
(0.4 x -2) + (0.6 x -2) = -2 => ((1-p) x -2) + (p x -2) = (-2 + 2p) + (-2p) => 平均は「-2」
晴れの場合
(0.4 x 0) + (0.6 x -10) = -6 => ((1-p) x 0) + (p x -10) = 0 + -10p = 平均は「-10p」

ここで「雨に濡れる嫌度が1/5」になっているのでこれも変数化します。変数名は「a」にします、そして割合なので0 < a < 1」になります。まとめると以下のようになります。

雨の確率 = p : 晴れの確率 = 1 - p
雨に濡れる嫌度 = -c : 傘を持ってくる嫌度 = -ac

これを式にすると。。。

傘を持って来た時
((1-p) x -ac) + (p x -ac) = (-ac + pac) + (-pac) = -ac
傘を持ってこなかった時
((1-p) x 0) + (p x -c) = (0 - pc) = -pc

なので傘を持ってくる条件は「-ac < -pc」 => 「a < p」
つまりは、「雨の確率がa(傘を持ってくる嫌度の割合)より大きい時」ということになります。

プログラムにしてみる

つまるところは「数式」の意味がわかっていれば良いので、数理モデル=数式の計算結果を返してやれば良いことになりますので。。。

   /**
     * 傘を持ってくる、持ってこない時の行動を判断する時の数理モデル実装
     * 
     * @param rainy 降水確率
     * @param bring 傘を持ってくる嫌度
     * @return true=傘を持ってくる : false=持ってこない
     */
    public boolean bringKasa(double rainy, double bring) {
        return bring < rainy;
    }

となります。

でわでわ。。。