読者です 読者をやめる 読者になる 読者になる

思い出は銀の弾

ひよっこエンジニアが調べたことや経験したことをまとめます!

角度や方向に対する評価関数

角度や方向に対する評価関数について考えました。

使用例

サッカーを例に考えます。

f:id:masayuki610930:20150629222057p:plain

今ボールを持ったプレイヤーに対して、近くにいる仲間A,Bがいるとき、どちらにボールをパスしたらいいでしょうか?

ゴール近くにいる仲間Aにパスする!と皆さん考えるでしょうが、例えば仲間Aと仲間Bに能力差があり、

能力差:仲間A<仲間B

という場合では答えは難しいです。また、仲間までの距離も考慮に入れたくなります。

いろいろな要素が考えられますが、今回はこのうち「角度」に注目して角度のみに関する評価関数を考えてみました。

普通の考え方

プレイヤーを中心にゴール方向を0度とし、仲間が360度中のどこにいるかを元に考えます。

単純に考えると、0度に近いほど良い評価値を与えればよく、

{ \displaystyle
evaluation = cos(\theta)
}

となり、負数を無視しゼロと置換えて次のようになります。

f:id:masayuki610930:20150630083751p:plain

提案

考え方

先の例で充分な例もあるでしょうが、

  • もっとシビアな評価
  • もっとメリハリのある評価

を求めるケースもあるでしょう。そこでシグモイド関数を使いこれを解決します。

評価関数

{ \displaystyle
evaluation = \frac{1}{1+\exp(-\alpha(\frac{|\theta_x-180|-180+\theta_h}{\theta_h}))}
}

{ \displaystyle
\theta_x
} は仲間の角度、

{ \displaystyle
\theta_h
} は評価値半減点、

{ \displaystyle
\alpha
}シグモイド関数のゲインを示します。

評価値半減点とゲインはパラメータ(設定値)であり、評価値半減点に評価値0.5を取る角度の値を、ゲインにはとりあえず5~10の値入れておけばいいです(後述)。

関数をプロットすると、次のようになります。

f:id:masayuki610930:20150630083810p:plainf:id:masayuki610930:20150630083814p:plain

図の通り、パラメータ評価値半減点により高い評価を与える角度の範囲設定を、ゲインにより評価値のメリハリの変化をつけることが出来ました。ゲインについては実際に試してチューニングすることをオススメします。

注意点

この手法は評価値が極めて低い値を取ることが理論上仕方ありません。プログラムに起こす際は、評価値半減点を閾値として、今回の関数に掛けるかどうかを判断するとよいでしょう。

この点だけを気をつけて頂いて、今回の提案手法をぜひ利用してみてください。