アマガミの季節になりましたね。
この時期になると、ときめきなメモリアルを作りたいなぁと考える方がいるかも知れません。
そこで、今回は恋愛シミュレーションゲームを人工知能(AI)の力でヒロインを攻略して、ひとりぼっちを回避したいと思います。
……ただ、ヒロインを1人攻略するだけでは面白くありません。複数のヒロインを同時に攻略していきたいと思います。
ソースコードはGithubで公開しておりますので、詳細はそちらをご確認ください。
https://github.com/Adacchi3/MultiObjectiveGA
多目的遺伝的アルゴリズム
今回は多目的遺伝的アルゴリズムを使用します。
多目的遺伝的アルゴリズムは、遺伝的アルゴリズムを多目的最適化に適用したものであり、近似解を探索するメタヒューリスティックアルゴリズムです。
基本的なプロセスは遺伝的アルゴリズムと同様で以下の通りです。
- 初期集団の生成
- 遺伝子の評価
- 交叉
- 突然変異
- 終了条件になるまで2.-4.を繰り返す
多目的遺伝的アルゴリズムの特徴は、遺伝子の評価に複数の評価関数を使うことです。
複数の評価関数を用いることにより、しばしばトレードオフの関係が生じる場合があります。
ここでは、遺伝子同士を比較し、支配関係である遺伝子を淘汰することによって、パレートの近似解を求めていきます。
恋愛シミュレーションゲーム
今回シミュレーションするゲームはリアルのゲーム……ではなく、多目的遺伝的アルゴリズムに適用できるシミュレーションを作成しました。
プレイヤーは、文系、理系、芸術、スポーツ、休みの5つの行動のいずれかを1日で1回行動することができます。行動したものに応じて、プレイヤーのパラメータが上昇します。
ヒロインは、プレイヤーのパラメータを参照して、好感度を評価します。ヒロインは複数人おり、それぞれ異なる評価関数で好感度を計算します。
プレイヤーが行動することができる期間は30日(1ヶ月)であり、プレイヤーはヒロインの好感度をできる限り上げるように行動を決定していきます。ただし、実際にあるゲームでは、特別なイベント(デート・病気・修学旅行等)があるかもしれませんが、今回のシミュレーションでは想定しておりません。
実行結果
上記の内容を踏まえ、今回の多目的遺伝的アルゴリズムを実行する上での条件を以下のようにしました。
※ ハイパーパラメータのチューニング等は行っておりません。ご了承ください。。。
- 個体数:100
- 遺伝子の長さ:30
- 世代数:40
- 交叉:二点交叉
- 突然変異:10%
- 評価関数(ヒロインの数):3
- Aさん:理系パラメータを評価
- Rさん:芸術パラメータを評価
- Yさん:各パラメータを評価
世代数における評価値の推移は以下の通りになります。
ここでの評価値は各ヒロインの好感度の平均を算出しています。
横ばいか少しの下降傾向にあるように見受けられます。評価値の平均は0.5で収束しているのでしょうか。評価関数の計算式を見直す必要があるかもしれません。
続いて、各個体の評価値を一部抜粋して確認していきます。
name | Aさん | Rさん | Yさん |
---|---|---|---|
NQESC | 0.508 | 0.508 | 0.234 |
RQEEZ | 0.516 | 0.508 | 0.235 |
TSTWL | 0.508 | 0.508 | 0.264 |
AさんとRさんはほぼ同じ好感度になっています。YさんはAさんとRさんの半分くらいになっていますね(生徒会長を攻略することは難しいのでしょうか。。。)
これらの結果から、各評価関数がパレート最適になっているだろう近似解を取得できているように見受けられます。つまり、クリスマスパーティーが開催されるのであれば、声がかかる可能性があるわけですね!
まとめ
今回は多目的遺伝的アルゴリズムで恋愛シミュレーションゲームのヒロインを同時攻略してみました。多目的最適化によって、複数のヒロインの好感度をパレート解に近い形で得られる可能性があることを確認することができました。
評価関数やハイパーパラメータのチューニングを改良していくことによって、プレイヤーがひとりぼっちになることを回避していけたらな、と思います。
P.S.
私事ではありますが、有志で技術書典8にサークル参加することになりました。
マイナーなプログラミング言語を中心に解説する本を頒布する予定です。
よろしくお願いいたしますm(_ _)m