タグ付けされた質問 「algorithms」

特定の問題を明確な方法で解決するために必要な特定の手順の説明。抽象的な形式で表現されます。

1
N体シミュレーションの最適化、名前または既存の作業の検索
WebGLで視覚化したN体シミュレーションの開発中に、最適化を考案しましたが、名前があるかどうか疑問に思っています。これまでに行われたことがない可能性は低いと思います。 これは次のように機能します。最初のタイムステップで、すべてのペアの反復を作成します。その反復中、各パーティクルについて: すべての密接な相互作用をリストに保存します-この相互作用に近いすべての粒子を表します。これらの相互作用は、それ以降、タイムステップごとに評価されます。このリストには通常、少数のエントリが含まれます。 他のすべてのパーティクルで反復し、パーティクルと一緒に保存する正味のフォースを計算します。したがって、この正味の力はタイムステップ間で記憶され、継続的に粒子に適用されます。 次に、シミュレーションが最初のタイムステップを過ぎてラウンドロビン方式で続行されると、各タイムステップは、少数の粒子の近接相互作用と正味の遠方力のリストを更新します。そのため、特定の数のタイムステップ(たとえば1000)を超えると、すべてのパーティクルの密接な相互作用と正味の遠方の力が更新されます。更新しないものは、それらの密接な相互作用をチェックし、正味の遠方の力を適用します。この例では、各時間ステップの計算の複雑さのようなものであるの代わりにN 2。N2/ 1000N2/1000N^2 / 1000N2N2N^2 これをある程度正確にするための秘訣は、「密接な相互作用」をよりよく識別することです。近接性が最適な指標ではない場合もあります。質量や相対速度なども考慮できます。「最も重要な相互作用」の方がいいかもしれません。または、「変更の可能性が最も高い、すぐに相互作用」。 この最適化により、すべてのペアの方法よりも相互作用する粒子が多くなりますが、 O()で表現する方法がわかりません。これは、タイムステップごとに完全なソリューションを作成するのではなく、古いものを(わずかに正しくない)再利用するためです。情報を収集し、時間の経過とともに計算量を分散させます。 (免責事項:私のwebglシミュレーションにも影響を受けるだけの「vfx」パーティクルがあります、重力のて効果を往復しないため、表示されるほど高速ではありません) この最適化手法には名前がありますか?

1
除算なしの立方根のニュートン反復
Newtonの方法を検索1 / x−−√1/バツ1/\sqrt{x}に適用するために平方根を計算する際に除算を回避することはかなりよく知られたトリックであり、おそらく除法なしで逆数を見つけるためにNewtonの方法を使用します。 StackOverflowスレッドを救出する際、リンクの腐敗から立方根のニュートン反復を効率的にシードすることで、立方根の除算なしの反復も可能であるはずだと考えました。 たとえば、次のように解決するとします。 バツ− 3= a2バツ−3=a2 x^{-3} = a^2 次に、およびです。上記の方程式のニュートン反復は単純です:x = a- 2 / 3バツ=a−2/3x = a^{-2/3}a−−√3= a xa3=aバツ\sqrt[3]{a} = ax バツn + 1= xん− x− 3ん− a2− 3 x−4ん=43バツん−13a2バツ4んxn+1=バツん−バツん−3−a2−3バツん−4=43バツん−13a2バツん4 x_{n+1} = x_n - \frac{ x_n^{-3} - a^2 }{-3x_n^{-4}} = \frac{4}{3}x_n - \frac{1}{3}a^2 x_n^4 ここでも、少なくとも分数定数がFP乗算用に事前評価されている場合は、除算演算を回避します。 だから、ある種のことは可能ですが、私は(確かに浅い)Webの検索でそのような方法についての具体的な議論を見つけられませんでした。要するに、賢い人はすでにより良いアイデアを発見しており、あなたの大切な同僚の1人がそれを見て、または考え抜いていたのではないかと思います。

1
次の式を計算する改良された方法はありますか?
対称行列と任意の行列X \ in \ mathbb {R} ^ {n \ times n}、およびベクトルv \ in \ mathbb {R } ^ {n \ times 1}、O(n ^ 2)時間で次の式を計算することは可能ですか?Y∈Rn×nY∈Rn×nY \in \mathbb{R}^{n \times n}X∈Rn×nX∈Rn×nX \in \mathbb{R}^{n \times n}v∈Rn×1v∈Rn×1v \in \mathbb{R}^{n \times 1}O(n2)O(n2)O(n^2) diag(XTYX)⋅vdiag(XTYX)⋅vdiag(X^TYX) \cdot v ここで、diag(X)diag(X)diag(X)は、主な対角要素がXの要素に等しく、非対角要素が0に等しいn×nn×nn \times n行列を返します。X^ TはXの転置行列です。XXXXTXTX^TXXX

2
3次元Delaunay三角形分割の適切なデータ構造とアルゴリズム
私は3Dデローニー三角形分割(E3のランダムポイント)の目標を達成するためにいくつかの貧弱なコードを作成しましたが、時間がかかり、5つのポイントが1つの球で正確に(または丸め誤差が原因で)ある場合、私のコードはこの状況を適切に処理できません。 四面体のリストと点のリスト、および四面体とその近傍との関係のリストである基本的なデータ構造を使用します。アルゴリズムはインクリメンタル挿入です。 誰かがどの種類のデータ構造とアルゴリズムを優先するべきか教えてもらえますか?クアッドエッジのデータ構造をこの状況で使用できますか?このトピックに関する論文を読んだとき、このデータ構造は3Dアプリケーションには適していない可能性があります(厳密に言えば、3Dマニホールドアプリケーションには適していませんか?分割統治はより良いアルゴリズムですか?ありがとう!

1
この「買い物かご」の最適化問題の正しい定式化とは何ですか。どうすれば効率的に解決できますか?
次の問題の解決策を探していますが、賢明にそれを定式化し、それを解決するための適切なアルゴリズムを見つけるのに苦労しています。 ショッピングバッグに入れられたアイテムのリストを考えてみましょう:1、2、3、4 ... 各アイテムは、1つ以上のプロモーションの一部にすることができます:A、B、C、D 割引の価値を最大化するように、プロモーションのセットを適用します。アイテムは複数のプロモーションに参加できませんが、各プロモーションは複数回適用できます。 プロモーションはさまざまな方法で定義できますが、今のところ、「2つの対象アイテムを購入してXを節約」というタイプを検討しているだけなので、ここから一般化できると期待しています。 私の例は: プロモーションA-購入2割引8 プロモーションB-購入2割引10 プロモーションC-購入2保存6 アイテム1-A、Bの対象 項目2-Bの対象 項目3-A、Cの対象 アイテム4-B、Cの対象 プロモーションの正しい適用は、アイテム1に対して3、Bに対して2、4であることが簡単にわかります。これにより、合計で18割引になります。 大きなケースでは困難になるため、アルゴリズム的に解決する必要があります。 私は以下を試しました: 適用可能なプロモーションの可能な組み合わせをすべてリストアップしてください。 明らかに貧弱なものはすべて破棄します(例:値の高いプロモーションの直接コピー)。 他のプロモーションと重複しないものを適用します(たとえば、アイテム1と2がプロモーションAに対してのみ有効である場合、そのプロモーションを適用します)。 残りのセットを取得し、結果に対してブランチアンドバウンドタイプの検索を試みます。 ただし、これには時間がかかる場合があります(同様の割引のある大規模なセットの場合)。 これは一種のナップザックまたは割り当て問題だと思いますが、私はそれを賢く書くことができません。うまく書けなくては解決できません。 これは問題の認識されたバリアントですか?特にそれを解決するのに役立つ擬似コードでそれを攻撃する助けは大歓迎です

2
クライミングホールドカラーを壁のセクターに割り当てるアルゴリズムを探す
以前にこの質問をstackoverflowに投稿しましたが、オフトピックとして閉じられました。私はそれがここで生き残ることを望みます。 私のクライミングジムでは、ルートは時々再設定する必要があります。次の規則が適用されます。 私たちは、さまざまな量のさまざまな色で登りを保持しています。-セクターにルートを設定する場合、混乱を避けるために、そのセクターまたは近くのセクターに同じ色の他のルートを設定してはなりません。 白/灰色または赤/ピンクなど、一部の色の組み合わせは、セクターで避ける必要があります。 目標は、各セクターに4つのルートを設定することですが、4つが上記のルールに違反する場合は、それより少なくてもかまいません。 今までに2つの異なるアプローチを試しました。1つ目はSimulated Annealingで、ランダムなパターンの色(ただし、指定された色の重み)で壁を初期化し、各色の組み合わせの悪さを計算しました。この悪さは、1つのセクターとその近隣のセクターの組み合わせについても計算されました。各反復で、最悪のセクターからランダムに選択されたルートが、ランダムに選択された他のセクターからのルートと交換されました。これはある種の収束を示しましたが、結果は使用できませんでした(つまり、結果の状態には2色または3色のセクターが含まれていました)。 それから反対側から問題に取り組み、空の壁から始めました。今回は、すべての色に1つのセクターから隣接するセクターに減衰する濃度がありました。同様の色の濃度も増加しました。つまり、赤いルートは、セクターとその周辺のオレンジの濃度を増加させました。重み付けされたランダムな色のソース(バケット)により、壁の次の色が得られました。これは、この色の濃度が最も低いセクターに配置されました。濃度が特定のしきい値を超えた場合、色は追加されませんでした(ただし、バケットに戻されました)。結果の状態にダブルカラーが含まれていなかったため、これは部分的に成功しました。 だから:上記のルールを考えると、この問題を解決するための適切なアルゴリズムは何でしょうか?必要に応じて、情報を追加させていただきます。 編集1-詳細: 私のテストケースには15のセクターがあります。 各セクターには4つのルートが含まれている必要があります 実際のジムには平均50セクターの建物が3つあります 一部のセクターは柱の周りに配置され、一部は屋根で接続されています 約10種類のホールドカラーがあります セクターの高さは6(初心者セクション)から20メートル(13垂直+ 7屋根)の間で変化するため、ホールドの消費量は異なります。ただし、平均は約12で、これは一定と見なすことができます。 各色の量には限りがあり、量は等しくありません いくつかの色はより簡単で、いくつかはより困難です(つまり、どんな困難でも黄色のルートを作成できますが、子供のために非常に簡単なオレンジのルートを作成することはほとんど不可能です) 一部のセクターは「より簡単」なので、簡単な色を使用する必要があります(これはオプションです。ルートセッターは、広範囲で困難または簡単にすることができます)。 セクター内または隣接するセクター内でどの色がうまく調和し、どの組み合わせがうまくいかないかを安全に判断できます。白と黒(コンボが悪い)など、いくつかの驚きがあります。ゴム(靴)またはチョーク(手)が残っていると、どちらも灰色になります。 一部の保持色は、紫/白(縞模様)のような組み合わせです。 編集2:遺伝的アルゴリズムに関するいくつかの質問 ParadisEOをダウンロードしてコンパイルし、IDE(Code :: Blocksを使用)でQuickStartサンプルをコンパイルしました。ParadisEOは、単一目的と多目的GAを備えた遺伝的アルゴリズムを提供します。GertVdEは、各セクターの適合度を計算し、すべてのセクターの適合度の合計を単一の目的として最大化することを提案しました。また、多目的GAを使用して、各セクターの適応度を最大化できますか?それは約50の目標になります。 また、私は賢明なクロスオーバー関数の定義に苦労しています。各色の最大量が固定されているため、交差すると違法な状態になる可能性があります。以前に与えられた最大量よりも多くを許可すると、パターン全体が、厄介な色が捨てられた「厄介な」組み合わせの繰り返しに収束する可能性があります。一方、最大に達するまで余分な色を捨てて、クロスオーバー機能を非保守的にすることもできます。 (私は遺伝的アルゴリズムに完全に新しいです)

1
最大で8つのコアで並列密行列反転に使用するアルゴリズムは何ですか?
このための既存のライブラリがないように見える、使用している言語の並列密行列反転を実装する必要があります(特に、メッセージパッシングにIDLブリッジを使用するIDL)。C ++でMPIを使用した経験から、並列プログラミング方法に精通していますが、主に並列FFTおよびNボディメソッドが対象です。線形代数の計算方法について、シリアルまたはパラレルの経験や知識はほとんどありません。 私が探しているのは、(現在はシリアル)IDLタスクを実行するマシンには8つのコアがあるため、少数のコアに適した、堅牢で安定した並列行列反転アルゴリズムの明確な疑似コード記述です。実際には、おそらく4つだけを使用して、他のタスクのためにコアを解放します。 このタスクによく知られたアルゴリズムの範囲がある場合は、最先端のパフォーマンスよりも単純さを優先します。

2
疑似コードの辞書
疑似コードで辞書(=マップ)を表現するための良い、一般的な方法は何ですか?つまり、基本的にキーの値を格納し、すべてのキーと値のペアを反復処理し、特定のキーが含まれているかどうかをテストできるデータ構造です。以下のような(この場合は無意味な)Pythonコードを念頭に置いています。 D = {} D[1] = 2 for key, value in D.items(): # do something with key and value if key in D: # do something そして、それを出版物で疑似コードとして表現したいと思います。数学的に考えると、辞書は関数であり、関係はペアのセットなので、次のようなものを書く D ← ∅ D[1] ← 2 for all (k, v) ∈ D 実際に意味があります。しかし、それは理解できますか?そしてテストのために、私は使用します if k ∈ keys(D) それとも、よりリテラルになるほうがいいですか、例えば D ← empty dictionary for …

2
線形制約付きの片側非線形最小二乗
私は線形制約付きの片側非線形最小二乗問題、つまり問題を解決しようとしています: minx∑mi=1ri(x) s.t Ax≤bminx∑i=1mri(x) s.t Ax≤b\min_{\mathbf{x}} \quad \sum^m_{i=1} \mathbf{r}_i(\mathbf{x}) \qquad \text{ s.t } \quad A\mathbf{x} \leq \mathbf{b} どこ ri(x)=fi(x)2ri(x)=fi(x)2r_i(\mathbf{x})=f_i(\mathbf{x})^2 if fi(x)&gt;0fi(x)&gt;0f_i(\mathbf{x})>0場合、ri(x)=0ri(x)=0r_i(\mathbf{x})=0。 言い換えれば、これは正の残差(fff)のみが含まれる最小二乗問題と考えることができます。これがデータフィッティングケースではないことを強調できません。ほとんどのデータフィッティングの場合に使用するとどうなるかを知っています。結果は、すべての観測値の「上の」関数にすぎません。このアプリケーションは、通常minmaxノルムで解決される特定の最適化問題を解決するためのものです(minx||f(x)||∞minx||f(x)||∞\min_{\mathbf{x}} ||\mathbf{f}(\mathbf{x})||_\infty)。すべての実際的なケースでは、f関数の動作により、解はゼロに到達しません。つまり、|| \ mathbf {f}(\ mathbf {x})|| _ \ infty \ neq 0です。||f(x)||∞≠0||f(x)||∞≠0||\mathbf{f}(\mathbf{x})||_\infty \neq 0fff 関数は、非線形であり、我々は解析的にあまり余計なトラブルもなくヤコビアンを計算することができるようなその誘導体へのアクセスを、持っています。fff いくつかの成功を収めて、目的関数が上記のように定式化されるLevenberg-Marquardtアルゴリズムを適用しました。つまり、0未満のが合計から削除され、ヤコビアン対応する行がゼロに設定されます(つまり、 ifこれはかなり大雑把ですが問題なく動作しますが、残念ながら線形制約を組み込むことができませんでした。fffJJJJi,:=0Ji,:=0J_{i,:}=0fi(x)&lt;=0fi(x)&lt;=0f_i(\mathbf{x})<=0 制限された制約のみでNLLSQ問題を解決する多くの方法を認識していますが、これらの方法は明らかに問題を解決しません。DQEDと呼ばれる線形制約付きのNLLSQを1つだけ見つけ、それをLevenberg Marquardtで行ったように目的関数を変更することにより、制限された成功(反復/関数評価の数に不満)で使用しました。 私が探しているもの 線形制約のある非線形最小二乗問題を解く方法の提案。また、正の残差のみを含めるという事実を組み込むためにアルゴリズムを変更する方法に関する提案も歓迎されます。最後に、ヒントや考えは大歓迎ですが、問題の定式化は間違っていないことを再度強調しなければなりませんが、微分可能性がないため、最適化には最適ではないことに気づきました場合。ri(x)ri(x)r_i(\mathbf{x})ri(x)=0ri(x)=0r_i(\mathbf{x})=0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.