質問の性質上、多くの背景情報を含める必要があります(私の質問は:これをどのように絞り込むのですか?)とはいえ、要約すると(私の知る限り)次のようになります。
非常に大きな組み合わせ検索空間で局所最適を見つける方法は何ですか?
バックグラウンド
ツールを使用したスーパープレイコミュニティでは、コスト(通常は完了までの時間)を最小限に抑えるために、ビデオゲームコンソールまたはエミュレータに特別に細工された(リアルタイムでは生成されない)入力を提供することを目指しています。これが現在行われている方法は、例えば(何度もゲームフレーム・バイ・フレームを再生し、フレームごとに入力を指定して、多くの場合、実行の部分をやり直すことである最近発表されたため、実行ゼルダの伝説を:時間のオカリナを持っています合計198,590回の再試行)。
これらの実行を実行して目標を達成するには、通常、ルート計画とトラバーサルという2つの主な要因があります。前者は後者よりもはるかに「創造的」です。
ルート計画は、プレイヤーがゲームを完了するために全体的にナビゲートする方法を決定するものであり、多くの場合、ランの最も重要な部分です。これは、たとえば、使用するソート方法の選択に似ています。世界で最高のバブルソートは、100万要素のクイックソートよりも優れているわけではありません。
ただし、完璧を求めて、トラバーサル(ルートの実行方法)も大きな要因です。類推を続けると、これがソーティングアルゴリズムの実装方法です。特定の入力フレームがないと実行できないルートもあります。これはツール支援の最も退屈なプロセスであり、完了したランの生成には数か月、場合によっては数年もかかります。同じアイデアのさまざまなバリエーションを試してみるのが一番だと考えられるため、難しいプロセスではありません(人間にとって)。このタスクへのマシンの適用は、ここでは適切なようです。
私の目標は、今やニンテンドー64システム全体のトラバーサルプロセスを自動化することです。この問題の探索空間があるはるかに強引なアプローチで攻撃するには大きすぎます。N64ランのnフレームセグメントには2つの30n可能な入力があります。つまり、30フレームの入力(30FPSでの1秒)には2つの900可能な入力があります。これらの潜在的なソリューションをテストすることは不可能であり、2時間の実行全体をテストすることはできません。
ただし、フルランの全体的な最適化を試行する(または試行するつもりはありません)ことに興味はありません。むしろ、初期入力が与えられたときに、実行の特定のセグメントの局所最適値(または、ある種のセミグローバル最適化の場合は最も近いn個の局所最適値)を近似したいと思います。つまり、ルートとそのルートの最初のトラバーサルを指定します。そのトラバーサルの近隣を検索してコストを最小限に抑えますが、問題を解決できるすべてのケースを試すように縮退しないでください。
したがって、私のプログラムは、開始状態、入力ストリーム、評価関数を取り、評価の結果を最小化することによって局所最適を出力する必要があります。
現在の状態
現在、すべてのフレームワークを処理しています。これには、エミュレーターの操作、セットアップとティアダウン、構成などによる入力ストリームの評価が含まれます。また、一種のプレースホルダーとして、オプティマイザーは非常に基本的な遺伝的アルゴリズムです。入力ストリームの母集団を評価し、勝者を格納/置換し、勝者ストリームを変更して新しい母集団を生成します。このプロセスは、時間や世代番号など、任意の基準が満たされるまで続きます。
このプログラムの最も遅い部分は、断然、入力ストリームの評価になることに注意してください。これは、nフレームのゲームをエミュレートする必要があるためです。(時間があれば、この種のものへのフックを提供する独自のエミュレーターを作成しますが、今のところ、メッセージの合成と、別のプロセスからの既存のエミュレーターのメモリの変更が残っています。)メインコンピューターかなりモダンで、200フレームの評価には約14秒かかります。そのため、関数の評価の数を最小限に抑えるアルゴリズム(選択した場合)を使用したいと思います。
エミュレータを同時に管理するフレームワークでシステムを作成しました。そのため、線形パフォーマンススケールで一度に多数のストリームを評価できますが、実際には、システムパフォーマンスが低下する前に、実行中のエミュレーターの数は8から32にしかなりません(32は実際にそれを押し上げています)。つまり、オプティマイザは評価を待つ間、かなりの作業を行うことができるため、評価が行われている間に処理を実行できるアルゴリズム(選択した場合)は非常に有益です。
テストとして、私の評価関数(ゲームBanjo Kazooieの)は、フレームごとに、プレーヤーからゴールポイントまでの距離を合計することでした。つまり、最適なソリューションは、できるだけ早くそのポイントに近づくことです。変異をアナログスティックのみに制限すると、問題のないソリューションを取得するのに1日かかりました。(これは同時実行を実装する前でした。)
同時実行を追加した後、Aボタンを押す操作の変更を有効にし、ジャンプが必要な領域で同じ評価関数を実行しました。24個のエミュレーターを実行すると、最初は空白の入力ストリームから目標に到達するのに約1時間かかりましたが、最適に近いものに到達するには、おそらく数日実行する必要があります。
問題
私が直面している問題は、最適化問題を適切にモデル化する方法を知るのに数学的最適化フィールドについて十分に知らないということです!たとえば、Wikipediaで説明されているように、多くのアルゴリズムの概念的なアイデアを大まかに追跡できますが、問題を分類する方法や、そのカテゴリに最新のアルゴリズムを選択する方法がわかりません。
私が知ることができることから、私は非常に大きな近所との組み合わせの問題を抱えています。その上、評価関数は非常に不連続で、勾配がなく、多くのプラトーがあります。また、制約はそれほど多くありませんが、問題を解決するのに役立つ場合は、それらを表現する機能を喜んで追加します。たとえば、[スタート]ボタンを使用しないように指定できますが、これは一般的なケースではありません。
質問
だから私の質問は:これをどのようにモデル化するのですか?どのような最適化問題を解決しようとしていますか?どのアルゴリズムを使用すると思いますか?私は研究論文を読むことを恐れていないので、何を読むべきかを知らせてください!
直感的に、遺伝的アルゴリズムは実際には学習していないように見えるため、最高ではありません。たとえば、[開始]を押すと常に評価が悪化するように見える場合(ゲームが一時停止するため)、「ある時点で[開始]を押しても役に立たない」と学習するある種のデザイナーまたは頭脳があるはずです。しかし、この目標でさえ、思ったほど簡単ではありません。スーパーマリオ64のいわゆる「一時停止後方ロングジャンプ」などのように、プレスを押すのが最適な場合があるためです。ここでは、脳はより複雑なパターンを学習する必要があります。「スタートを押しても、プレーヤーがこの非常に特殊な状態にあり、ボタンを押しながらいくつかの組み合わせを続ける場合を除き、役に立たない」
変更にもっと適した他の方法で入力を表現する(またはマシンが学習できる)ようです。フレームごとの入力は細かく見えます。本当に必要なのは「アクション」であり、これは複数のフレームにまたがる場合があります...しかし、多くの発見はフレームごとに行われるため、完全に除外することはできません(前述の一時停止後方ロングジャンプには、フレームレベルの精度が必要です)。また、入力がシリアルに処理されるということは、活用できるものでなければならないようですが、方法はわかりません。
現在、私は(リアクティブ)タブー検索、超大規模近傍検索、教育学習ベースの最適化、およびアリコロニー最適化について読んでいます。
この問題は、ランダムな遺伝的アルゴリズム以外のものに取り組むのが難しいほど単純ですか?それとも実際にずっと前に解決された些細な問題ですか?読んでくれてありがとう。返事を送ってくれてありがとう。