問題タブ [stochastic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - 非常に非決定的なシステムで MCTS を実行する方法は?
小さなゲームの AI に MCTS アルゴリズムを実装しようとしています。ゲームはRPGシミュレーションです。AI は、戦闘でどの動きをするかを決定する必要があります。ターンベースバトル(FF6-7風)です。関連する動きはありません。
詳細については触れませんが、プレイヤーがプレイする番になったときに、特定の状況でどの動きがプレイヤーを選択するかを確実に知っていると仮定しても問題ありません。
どちらかのパーティが生きているユニットを失った場合、ゲームは終了します (4v4)。何ターンでもかかる可能性があります(終了しない場合もあります)。ダメージ計算とスキル処理には多くのRNG要素があります(攻撃はヒット/ミス、クリティカルかどうか、「proc」できるかどうかにかかわらず多くのprocsが進行中です、バフは発生する%値を持つことができます. ..)。ユニットにはそれぞれ約 6 つのスキルがあり、分岐要因がわかります。
私は今のところ悪い結果をもたらす MCTS の暫定版を構築しました。私はいくつかの問題を抱えています:
私の主な問題の 1 つは、移動の非決定論的状態をどのように処理するかということです。私はこれについていくつかの論文を読みましたが、私はまだ暗闇の中にいます.
ゲーム情報を決定し、その上で MCTS ツリーを実行し、プロセスを N 回繰り返して、考えられるゲームの状態を幅広くカバーし、その情報を使用して最終決定を行うことを提案する人もいます。最終的には、MCTS ツリーを 1 回ではなく N 回計算する必要があるため、計算時間が大幅に増加します。私は戦いの過程で何千ものRNG要素を持っているので、それに頼ることはできません.
同じ動きに X 個の子を追加するという考えがありましたが、それも良い答えにはならないようです。RNG 曲線を少し滑らかにしますが、特定の RNG のパーセンテージと比較して X の値が大きすぎる/小さすぎる場合は、逆方向にシフトできます。そして、複数の RNG パー ムーブ (ヒット チェンジ、クリティカル チャンス、何かを発動するパーセンテージなど) を取得したので、すべてのケースを満たす適切な X の値を見つけることができません。何よりも悪いバンドエイドです。
同様に、RNG タプルごとに 1 つのノードを追加する {ヒットまたはミス、クリティカルかどうか、proc1 かどうか、proc2 かどうかなど...} は、すべての可能な状況をカバーする必要がありますが、いくつかの重大な欠点があります。移動ごとに 2^5 ノードを考慮する必要があり、計算するには多すぎます。それらをすべて作成できれば、それらに確率 (ノードのタプル内の各 RNG 要素の確率にリンク) を割り当て、選択段階でその確率を使用できます。これは全体的に機能するはずですが、CPU では非常に困難です :/
また、2 つの異なるゲーム状態に基づいてプレイヤー/モンスターの統計値を正確に平均化し、移動処理中に移動の結果を平均化する方法がないため、それらを 1 つのノードに「マージ」することはできませんが、多くのことが必要です。コードを単純化するのは面倒であり、いずれにせよ精度を急速に低下させます。
この問題にアプローチする方法はありますか?
アルゴリズムの他のいくつかの側面は私を避けています:
終了状態になるまで完全なプレイアウトを行うことはできません。これは、A) 計算に多くの時間がかかるため、および B) 一部の戦闘が (設計上) 終わらない可能性があるためです。私は2つの解決策を持っています(私は混ぜることができます)-Xターンのランダムプレイアウトを行います-評価関数を使用して、状況を試してスコアを付けます。
評価するヘルスポイントのみを考慮しても、特定の状況で信頼できる値を返すための適切な評価関数を見つけることができません (プレイヤーの場合は 1 ~ 4 ユニット、モンスターの場合も同じです。現在の HP を知っています/最大値)。私を悩ませているのは、戦いの長さ/力の格差が大きく異なる可能性があることです. つまり、HP の 0.01% の変化が重要な場合 (たとえば、長いゲーム対ボスの場合) もあれば、重要ではない場合もあります (プレイヤーが自分よりも低いレベルのゾーンを耕作する場合)。
戦闘間のパワーと HP の差異の不均衡は、UCB 選択プロセスでの Biais パラメーターを修正するのが難しいことを意味します。私は現在、0.03 のような非常に低い値を使用しています。> 0.1 で、探索係数が非常に高いため、ツリーは深さごとに構築されます:/
今のところ、私はシミュレーション段階で移動を選択するためにバイアスをかけた方法も使用しています。プレイヤーがその状況で選択する移動と、AI のランダムな移動を選択することで、プレイヤーに有利な偏ったシミュレーションにつながります。両方に純粋なランダムなものを使用してみましたが、結果が悪化するようです。偏ったシミュレーション段階を持つことは、アルゴリズムの目的に反すると思いますか? AIに悲観的な見方を与えるだけで、最終結果にあまり影響を与えないと思う傾向があります. たぶん私の考えは間違っています。
どんな助けでも大歓迎です:)
java - グラフベースの検索と確率ベースの検索
これまでのところ、グリッド上の A* 検索とそのバリアントのいくつかしか知りませんでした。最近、Rapidly Random Exploring Trees (RRT) などの確率的検索アルゴリズムについて聞いたことがあります。検索の問題が非常に大きくなると、それらが非常に優れているが、非常に最適ではないパスを提供する方法について聞いています。悲しいことに、RRT やその他の亜種を A* やその亜種とベンチマークする比較は見つかりませんでした。非常に大きなグリッド (2048x2048 以上) での 2 つのアルゴリズムのパフォーマンスの違いを詳しく説明しているリンクを知っている人はいますか? 非格子探索問題もOK
私がこれまでに発見したこと: http://movingai.com/GPPC/は、RRT に基づくツリー キャッシュが、すべての A* バリアントよりも非常に高速であることを示しています。
ベンチマークでない場合、Java で利用可能な RRT の実装はありますか? 編集:私が尋ねる前にグーグルで検索する必要がありました。http://correll.cs.colorado.edu/?p=1623
random - 同じ乱数シードを使用して異なるマシンで、確率的アルゴリズムの同じベンチマーク結果を再現できますか?
確率的アルゴリズムをテストしています。結果を再現可能にするために、同じランダム シードを使用し、このシード番号 (整数) をベンチマーク結果と共に公開する予定です。
しかし、ランダムシードに関して素朴な質問があります。同じランダムシードを使用した場合、別のマシンを使用している他のユーザーが私の結果を再現することが保証されていますか? 実際、私はランダム シードの原理についてほとんど知識がありません。確かに、多くの Web サイトでは多かれ少なかれ詳細な方法で説明されていますが、そのトピックについて共有する考えがあるかもしれません。
具体的には、 scipy.optimizeプロシージャに基づく python プロジェクトがあります。私はnumpy.random.seed(42)
公開されたベンチマーク結果に使用し、同じシード番号が使用されている限り、他のマシンと同じ結果が得られることを期待しています。それは理にかなっていますか?
r - R の確率データからバイナリ関数を抽出する
サイクリングパワーメーターからのパワーデータがあります(これは、問題のメカニズムではなく、コンテキストでのみ必要です)。これはやや確率的に見えます。添付画像を参照してください。power_image
これは、必要なパワー出力の直線目標である一連の目標「レベル」に基づく典型的なセッションです (直線で区切られた一連のブロックのように見えます)。実際に実現された/達成された出力は、当然、これに関して乱雑です。
私が求めているのは、乱雑な電力データからターゲット セッションを抽出することです (これにはアクセスできないため)。添付の画像からわかるように、パワー ターゲットが上向きに傾斜している場合がありますが、基本的にはバイナリ ウェーブ (直線レベル ライン) のように見えます。
さらに複雑なことは、他のセッションの一部では、目標努力ブロックの持続時間が短い可能性があることです。
これを達成するためにさまざまなこと(ウェーブレットなど)を見てきましたが、明らかなものが見つからないようです...私はRを使用しています.
どんな考えや助けも大歓迎です。
python - 確率的勾配降下法とパフォーマンス
MNIST セット (手書き数字のセット) を使用して分類器をトレーニングしようとしていますが、確率的勾配降下アルゴリズムを実装したいと考えています。ここに私が書いた関数があります:
alpha はステップの長さです
h は、transpose(theta).X のシグモイド関数です。
X は 50000*785 で、50000 はトレーニング セットのサイズで、785 = (画像のサイズ) + 1 (定数 theta0 の場合)
この関数は、100 回の反復 (nIter) で約 9 秒、つまり 100*1*785 の乗算で実行されます。私が見つけた分類子は満足のいくものです。この実行時間を勾配降下アルゴリズムと比較したいと思いました。
この関数は、100 回の反復 (nIter) で約 12 秒で実行されるため、(h(theta,X)-y) として 100*50000*785 の乗算は 50000*1 ベクトルです。私が見つけた分類子も満足のいくものですが、このコードは最初のコードよりもそれほど遅くないので驚いています。ベクトル化がドット関数で重要な役割を果たしていることは理解していますが、パフォーマンスが低下すると予想していました。確率的勾配降下法のパフォーマンスを改善する方法はありますか?
ご協力ありがとうございました。
matlab - 2 次元の確率微分方程式 (SDE)
初めて確率微分方程式に取り組んでいます。二次元の確率微分方程式をシミュレートして解こうとしています。
モデルは次のとおりです。
dp=F(t,p)dt+G(t,p)dW(t)
どこ:
- p は 2 行 1 列のベクトルです: p=(theta(t); phi(t))
- F は列ベクトルです: F=(sin(theta)+Psi* cos(phi); Psi* cot(theta)*sin(phi))
- G は 2 行 2 列の行列です: G=(D 0;0 D/sin(theta))
- Psi はパラメータで、D は拡散定数です。
次のようにコードを書きました。
次に、次のスクリプトで関数を呼び出します。
コードを実行すると、次のエラー メッセージが表示されます。
初期条件または一貫性のないモデル次元でドリフト率が無効です。
このエラーを修正する方法はありますか?
java - 正規(ガウス)分布に従ってグリッド(マトリックス)のセルをサンプリングする方法は?
Java の正規分布に従って、グリッド (MXN の行列) のセルをサンプリングする必要があります。
Apache Math ライブラリには、値を 1 次元 (1D) でサンプリングする関数があることを知っているので、ベクトルでは問題ありませんが、2D の代替が見つかりません。
1D アプローチを 2 回使用することを考えました。1 つは行用、もう 1 つは列用です。ただし、(1)幾何学的距離ではなくフォン ノイマン距離を使用するため、正確には適切ではありません。 (2) このアプローチでは繰り返しが回避されません (つまり、サンプリングではありません)。
では、特定のセル (r,c) を中心とした正規 (ガウス) 分布に従ってグリッド (マトリックス) のセルをサンプリングするにはどうすればよいでしょうか。
または、サンプリングが不可能な場合 (または複雑すぎる場合)、特定のセル (r、c) を中心としたグリッド内のセル全体に正規分布を使用して確率を分散するにはどうすればよいですか? たとえば、3x3::
前の値が実際にガウス分布に適合するかどうかはわかりませんが、さらに重要なことは、どのマトリックスでも、セルの合計が 1 でなければならないということです。
ここからは、ただ反復してロールするだけです。またはロールして繰り返し追加します。
math - 確率熱方程式 - Fortran
以下に、周期境界条件を使用して 1D で確率的熱方程式を解くコードの一部を示します。確率項はガウス ホワイト ノイズです。
私の質問は、ノイズを正しく実装していますか?
ガウス ノイズは、平均ゼロと 2 番目のモーメントを持つものとして定義されます。これは、時間の任意のペアの値が同じように分布し、統計的に独立していることを示します。
これはガウス ノイズをコードに追加する適切な方法ですか? ガウス乱数 y1 のみを使用します。y2 は必要ありません。これは正しいです?ありがとう!