見出し画像

数値調整をする過程。

最近はすっかり画像を生成するだけのnoteでしたが、今日は元の路線に戻るための助走として、「数値(に限らない時があるけれど)調整」や「最適化アルゴリズム」について、まとめをしておこうと思います。


数値調整を行うためのステップ

数値を調整するためには、一般的に、以下のようなステップで実施すると、よいです。

  1. 目的関数の定義

  2. 最適化アルゴリズムの選択

  3. 初期値の設定

  4. 反復プロセス

  5. 終了条件の設定

  6. 結果の評価

それぞれのステップについて、おさらいしておきましょう。
具体例は、「バラバラと、向き合う」の中で書いていますので、理論より実践派の方はそちらも参照してみてください。

1.目的関数の定義

私は◯◯度(例えばでいうと、バラバラ度)という風に定義することが多いのですが、目指したい事象に対して、どういう数式、方式で評価することにするか、の定義をしなければ、最適化は始められません。
GPTさんにも説明してもらいましょう。

目的関数の定義は、最適化の対象となるゲームの要素やパラメータに関連する数学的な式です。この関数は最大化または最小化されるべき目的を表し、ゲームのバランスを数値的に表現します。目的関数の適切な設計が、最適化アルゴリズムの成功に重要です。

以下は、目的関数を定義する際の一般的なアプローチと考慮すべき要素です。

ゲームの目標:
ゲームにおいて何を達成したいのかを明確にします。例えば、プレイヤー間のバランス、カードの利用頻度の均等化、戦略の多様性の促進などが考えられます。
重要な要素の選択:
目的関数に含めるべき要素を選択します。これはゲームデザインの観点から重要な要素であり、例えば各カードの強さ、プレイヤーのリソース管理の難易度、戦略の幅などが挙げられます。
数学的な表現:
選択した要素を数学的に表現します。これには、各要素に対する重み付けや影響度合いを示す係数なども含まれます。例えば、各カードの強さを合計して全体のゲームバランスを表す指標を作成することが考えられます。
制約条件の導入:
目的関数には、達成したい目標に対する制約条件を導入することも考慮します。これによって、調整されたゲームが特定の条件を満たすことが保証されます。
プレイヤーのフィードバックの組み込み:
プレイヤーのフィードバックを数値化して目的関数に組み込むことも重要です。例えば、プレイヤーの評価や勝率の期待値などを考慮してゲームの楽しさやバランスを表現することができます。
最終的な数学的な形:
これらのステップを経て、目的関数は数学的な形になります。最終的な数式は、調整したいゲームの特性や目標に応じて異なります。
例えば、簡単なケースとして、各カードの強さを表す指標の合計を最小化する目的関数を考えることができます。しかし、具体的なゲームの特性に基づいてより複雑な目的関数を検討することが一般的です。

ChatGPTの出力

初期値の決定及び反復プロセスの中で、ここで導入した制約条件が重要になってきます。新規データ生成や、掛け合わせの時に、制約条件を守らないデータが出ないような工夫が必要ですね。

2.最適化アルゴリズムの選択

本稿で何度も触れている通り、私は遺伝的アルゴリズムのバランス感覚が、ゲームバランス調整には向いていると信じ切っています。

もっと単純なバランス調整であれば、勾配降下法などの単純なアルゴリズムで問題ないと思います。(勾配降下法については、以下の2記事で触れています)

単純な勾配法でうまくいかないときには、「焼きなまし法」「粒子群最適化」なども使ってみるとうまくいくかもしれません。
※どのくらいの種類の方法があるか興味がある人は、「最適化問題」で検索してみてください。めちゃくちゃあります。

また、遺伝的アルゴリズムの発展形として、評価関数から呼び出されるプログラム(関数の時もある)を遺伝させ、変異、交配させていく、そんなやり方も、あります。突き詰めていくとこれだけでしばらくお腹いっぱいになると思います。

3.初期値の設定

初期値は、通常、ランダムな値(もう一度書きますが、制約の範囲内で値が収まるようにするんですよ?)から始めます。凄く単純な探索空間(解の可能性がある範囲のことをこう呼びます)であれば、初期値は1つだけで充分ですが、私は、遺伝的アルゴリズムの初期遺伝子数を100、そしてその全てをランダム生成、とすることが多いです。一度次のステップに進んで、探索がうまくいきそうなリスポーン地点(セーブ地点)を見つけたら、そこからランダムにずれた場所(2次元、3次元をイメージして言っていますが、多次元のこともあります)から再スタートするのもいいでしょう。

4.反復プロセス

ここは、できれば自分で、何かしらのプログラム実装ができるのが望ましいとは思いますが、

でも触れた通り、ある程度ChatGPTのようなサービスも助けてくれますし、他にもいろんなプラットフォームがあって、中には、プログラミングがわからなくても、GUIをちょこっと触るだけで反復プロセスを提供してくれるものも、探せば、あります。(←でも、自分で作れる方が、細かい調整とかもできますし、良いと思います)あとは、

でも書きましたが、別に1人で作らなくたってよいと思うので、できる人とタッグを組めばいいと思うのです。ゲームのアイデアを考える人、バランスを調整する人、絵を描く人、3人でやりましょう!というチームもあっていいと思います。(実際、会社規模にもよりますが分業しているところかと思います)

5.終了条件の設定

で、無限の時間が与えれていれば、ただひたすらに反復していればいいのですけれども、たいていは、終わりの条件を設定しておくことに、なります。
・決められた回数が終わったらやめる
・決められた時間が終わったらやめる
・目的の値に達したらやめる
あたりでしょうか。1000回ずつループを回して、1000回前のデータと比較して値が1%以上動いていたら続行、1000回追加、とかいう具合に、複合したり、計算を交えたりしてもいいと思います。

6.結果の評価

もし、初期値を1つで始めたとかであれば、もう一度(10度くらい?)最初からやり直して、結果を比較してみる、ということをオススメします。「局所解」というのですが、本来は日本一の頂、富士山の頂上を目指していたはずが、たまたま大阪の山間部からスタートしたデータが、生駒山に登って、1番高い場所だと主張しているだけかもしれません。(大阪/生駒山は、みなさんの生まれ故郷の地名と、そのあたりで一番高い山に置き換えて理解してください)

そうでないならば、最適解(か、それに近しい値)が得られたはずです!実際のゲームとして遊んでみて、それが本当にバランスの取れたものか、思い描いていた◯◯度、が実現できているか、確認してください!

まとめ

今回は、久々の理論面でのお話ということで、最適化問題を取り上げた記事群は、こういう風に繋げて読んでもらえるといいなぁ、というまとめ記事のようなものになりました。たまにはこういう振り返りも、いいかな。というわけで今日はこのへんで。ほなね。

例のAI画像のコーナー

今日も今日とて「Stable Diffusion」です。プロンプトは「(4k, best quality, masterpiece, fantasy:1.2), very interesting and strategic tabletop-game like 'Terraforming Mars', 2 couples are coming together for an evening of board game, jolly, dices and coins, a big round table, darkness.」もうね、途中から何言ってるんだかわからなくなっています。ちなみに除外の方は「(worst quality, low quality:1.4),ugly,bad anatomy,badhandv4,bad-hands-5,(split view,grid view:1.3), (no helmet and hat:1.1)」です。以前のAI画像生成に比べて、指定が細かくなっているのがわかるかと思います。(その分、いろんなガチャが楽しめるようになっています)



いただいたサポートは、きっと、ドイツアマゾンからの送料に変わると思います。 温かいご支援、お待ちしております。