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

アルゴリズムは、問題に対する抽象的な解決策を定義する明確に定義された一連のステップです。このタグは、問題がアルゴリズムの設計と分析に関連している場合に使用します。

1
「一方向の」コンサートで負けた
あなたと友人は、コンサートのライン上でお互いを失いました。正式には、それぞれが何らかの整数座標にあり、より高い座標に向かって歩くか、所定の位置にとどまることがあります。 あなたとあなたの友人がまったく同じアルゴリズムに従っていると仮定して(そして、いいえ、「if(name == "R B")何もしない:)」と仮定し、あなたの二人の間の最初の距離はでしたあなたに知られている)。バツxx あなたとあなたの友人が出会うまで、予想される歩行距離を最小化するアルゴリズムは何ですか? あなたはあなたの友人とあなた自身が同じ一定の速度で動いていると仮定するかもしれません。 簡単なアルゴリズムの例は次のようになります。 ステージ(0から開始):nnn000 右のwpにステップ歩きます13n3n3^nそれ以外の場合は 2または3n時間単位待機します。1212\frac{1}{2}3n3n3^n このアルゴリズムを見るために、友人は確率1で会います。ステージで何が起こるかを考えます。x一歩進んだ友人が常に歩き、もう一方が常に所定の位置に留まったとしても、両者の距離は x + 1 + 3 + 9 + … + 3 log 3 x = 2 x + x − 1(log3x+1)(log3⁡x+1)(\log_3 x+1)xxxx+1+3+9+…+3log3x=2x+x−12≤3xx+1+3+9+…+3log3⁡x=2x+x−12≤3xx+1+3+9+\ldots+3^{\log_3 x}=2x+\frac{x-1}{2}\leq 3x したがって、反復で、歩くことを選択した友人は、3 log 3 x + 1 = 3 xの距離をカバーするため、確率1になります。log3x+1log3⁡x+1\log_3 x+13log3x+1=3x3log3⁡x+1=3x3^{\log_3 x+1}=3x、背後にいる友人が追いつき、彼らは会います。1414\frac{1}{4} 単純な最適化(歩行距離を短縮する)は、ステップを歩く代わりに、c xステップを歩くことです。ここで、cは2 + …

2
バランスを取る必要があるコンピューターの対戦相手へのスコアリングアプローチ
この質問は、私が作成し、いくつかのコンピューターゲームで現在使用されているか、使用される予定のコンピューターの対戦相手に対するアプローチに関するものです。 バックグラウンド 昨年、「Minesweeper Flags」と呼ばれるゲームでコンピューターの対戦相手を改善しようとしたとき(簡単な説明:対戦相手よりも多くの地雷を奪わなければならない、ターンベースのマルチプレイヤーバージョンのMinesweeper )、アルゴリズムの動作を大きく変えました。 。if-else-if-elseのようなアプローチを使用する代わりに、指定された重みを持つ「スコアラー」のセットを使用して、最適な動きを決定しています。 マインスイーパフラッグのようなゲームでは、地雷を奪う可能性が最も高いのは動きを作ることだけですが、それほど単純ではありません。通常、コンピューターがどの動きをするかは、現在のゲーム状態での特定の動きのいくつかの機能に依存します。機能の例: この動きが地雷を採点する確率はどのくらいですか? ここで相手に何かを明かす確率はどれくらいですか? システムの説明 システムは基本的に次のように機能します。 「事前採点者」:現在のゲームの状態に対して事前分析が行われます(掃海艇の旗に関しては、これは通常、すべての確率の計算です) 「得点者」:通常の得点者のセットは、各可能な動きの得点を決定するように求められ、各得点者はそれ自身の基準に従って得点を適用します。得点者は、行われた事前分析の結果を確認できます。 上記のステップで計算されたスコアは合計され、移動のスコアに設定されます。 同じスコアのすべての動きが同じランクになるように、動きはスコアに従ってソートされ、ランク付けされます。 「ポストスコアラー」:上記の結果は、ポストスコアラー自身のルールに従って、任意のフィールドのスコアを任意の方法で変更できる「ポストスコアラー」に送信できます。 プリスコアラー、スコアラー(ウェイト付き)、ポストスコアラーの束を組み合わせると、スコア構成と呼ばれるものになります。 結果例 これは、掃海艇旗にスコアが適用された例です。これは得点されたマップです: そして、これは実際のスコア設定の出力です。可能な動きのランクを示しています。1が最高ランクで、白で強調表示されています。 非常に柔軟なコードを記述したおかげで、このAIへのアプローチは他のゲームにも同様に挿入できます。 長所と短所 以下に、このシステムの長所と短所をいくつか挙げます。 長所 AIのさまざまな構成を非常に簡単に作成できます。 遺伝的アルゴリズムで使用することは可能です:各スコアラーには関連する重みがあり、重みが遺伝子になることができます。 いくつかのツールを使用して、特定の移動が行われた理由と、その移動の主な責任者を確認できます。 ツールを使用して、可能な動きの全体的なスコア/ランクのマップを作成することができます(上のスクリーンショットのように) 人間のプレイ方法にスコアを適用することにより、人間が行うと思われる動きをしようとする「#AI_Mirror」を作成することができます 短所 AIを可能な限り良好にプレイするために、スコア構成を「正しく」調整することは非常に困難です。 ご質問 ここで構築したシステムは、AIの世界で広く知られていますか?実際のAI用語では何と呼ばれますか? このアプローチは理にかなっていますか、または推奨する別のアプローチがありますか? スコア設定を微調整するプロセスを簡単にする方法はありますか? 最後の質問について、私は遺伝的アルゴリズムを使用する可能性を知っています。SARSAについても少し気づいていますここに)。SARSAの問題は、ゲームが終わるまで報酬がわからないことだと思います。最良の動きは、報酬(地雷)をまったく与えない動きであることが多いです。現在の勝つ可能性は、現在のスコア(あなたと対戦相手が何個の地雷を奪ったか)と、現在のマップがどのようなものかによって異なります。 この質問はもともと、今では機能しない人工知能サイトに投稿されました。 このアプローチに使用される(Java)コードは、現在Code Reviewに投稿されています。

2
許容されるヒューリスティックは最適なソリューションをどのように保証しますか?
A *(または他の最適なパス検索アルゴリズム)を使用する場合、使用されるヒューリスティックは許容できる必要があります。つまり、実際のソリューションパスの長さ(または移動)を過大評価してはなりません。 許容されるヒューリスティックは最適なソリューションをどのように保証しますか?直感的な説明を探しています。 必要に応じて、8パズルのマンハッタン距離ヒューリスティックを使用して説明できます。

2
Google Code Jam万里の長城問題のより速い解決策はありますか
次のGoogle Code Jamラウンド1Cの質問を検討してください。 万里の長城は無限の線から始まり、すべての場所の高さはです。000 いくつかの部族NNN、N≤1000N≤1000N \le 1000は、開始日DDD、開始強度SSS、開始西座標WWW、開始東座標Eのパラメーターに従って、壁を壁に攻撃します。EEE。この最初の攻撃は、DDD日、範囲[W,E][W,E][W,E]、強度SSSます。[W、E]内に[W,E][W,E][W,E]高さ&lt;Sの万里の長城の部分がある場合&lt;S&lt;S< S、攻撃は成功し、その日の終わりに、[W,E][W,E][W,E]の高さ&lt;S&lt;S< Sは高さになるSSS(またはその日、他の攻撃が同じセグメントに強度ヒットした場合)S′&gt;SS′&gt;SS' > S 各部族は退却する前に最大攻撃を実行し、各攻撃はその前の攻撃から繰り返し決定されます。すべての部族は、いくつか持っている、、および攻撃の彼らの順序を決定します。お待ちしております攻撃の間に日を、彼らは攻撃範囲に移動します各攻撃(ネガティブ=西、正の単位を=東)、ただし、範囲のサイズは同じままであり、各攻撃の後、その強さも一定の値で増加/減少します。100010001000δDδD\delta_DδXδX\delta_XδSδS\delta_SδD≥1δD≥1\delta_D \ge 1δXδX\delta_X 問題の目標は、攻撃している部族の完全な説明が与えられれば、攻撃が成功する数を決定することです。 約20秒で動作するソリューションをコーディングできました。実装したソリューションにはO(AlogA+(A+X)logX)O(Alog⁡A+(A+X)log⁡X)O(A\log A + (A+X)\log X)時間かかります。ここで、A=A=A =攻撃の総数シミュレーション(最大100000010000001000000)、およびX=X=X =攻撃範囲の一意のエッジポイントの総数(最大200000020000002000000)。 高いレベルで、私のソリューション: すべての部族情報を読み込みます 攻撃範囲のすべての一意のXXX座標を計算しますO(A)O(A)O(A) 最小の高さの値を追跡するXXX範囲上の遅延更新されたバイナリツリーとして壁を表します。リーフは、間に何もない2つのXXX座標のスパンであり、すべての親ノードは、子によってカバーされる連続的な間隔を表します。- O(XlogX)O(Xlog⁡X)O(X \log X) すべての部族が実行するすべての攻撃を生成し、日ごとにソートしますO(AlogA)O(Alog⁡A)O(A \log A) 各攻撃について、成功するかどうかを確認します(logXlog⁡X\log Xクエリ時間)。日が変わったら、未処理のすべての成功した攻撃をループし、それに応じてウォールを更新します(logXlog⁡X\log X各攻撃の\ log X更新時間)。- O(AlogX)O(Alog⁡X)O(A\log X) 私の質問はこれです:よりも良い方法はありか?おそらく、部族の連続攻撃の線形性を利用する戦略的な方法はありますか?20秒は、意図したソリューションには長すぎると感じます(ただし、Javaはそのせいかもしれません)。O(AlogA+(A+X)logX)O(Alog⁡A+(A+X)log⁡X)O(A\log A + (A+X)\log X)

1
任意のカバーを頂点カバーに変換する
平面グラフが与えられ、各エッジの長さ平面stへの埋め込みを示すようにします。さらに、各点が含まれる点のセットがあります。さらに、任意の点、までの測地線距離が最大1のが存在することを保持します。(距離は内の最短距離として測定されます。)G 1 C C ∈ C G P G C ∈ C P GG = (V、E)G=(V,E)G=(V,E)GG\mathcal{G}111CCCC ∈ Cc∈Cc \in CGG\mathcal{G}pppGG\mathcal{G}c∈Cc∈Cc \in CpppGG\mathcal{G} 上記の条件に当てはまるが与えられた、簡単に頂点カバーに変換したり、別の言い方をすれば、同じカーディナリティのに変換したり、任意のを配置できると主張したい は頂点にあり、はカバーしています。、C '、C ∈ C ' G G C ' GCCCC′C′C'c∈C′c∈C′c \in C'GG\mathcal{G}GGGC′C′C'GGG 私のアプローチは、エッジの方向を決めて、円弧の終了頂点でのポイントを移動することでした。しかし、これまでのところ、からを生成する正しい方向を見つけることができませんでした。C ′ CCCCC′C′C'CCC 誰にもアイデアがありますか?

2
二分木の色を赤黒木にする
一般的なインタビューの質問は、特定のバイナリツリーが高さのバランスが取れているかどうかを判断するアルゴリズムを提供することです(AVLツリー定義)。 赤黒木で似たようなことができるのかと思っていました。 任意の未着色のバイナリツリー(NULLノード)が与えられた場合、ノードが赤黒ツリーのすべてのプロパティを満足するようにノードを赤/黒に色付けできるかどうかを判断できる「高速」アルゴリズムがあります。 (この質問のような定義)? 最初の考えは、NULLノードを削除して、結果のツリーが赤黒ツリーになり得るかどうかを再帰的に検証しようとすることでしたが、それはどこにも行かないようでした。 私は論文を(簡単に)ウェブ検索しましたが、この問題に対処していると思われるものを見つけることができませんでした。 単純なものが欠けている可能性があります。

3
バイナリ最小ヒープのキーの増加とキーの減少
バイナリヒープの多くの議論では、通常、min-heapでサポートされている操作として減少キーのみがリストされています。たとえば、CLR 6.1章およびこのウィキペディアのページ。通常、min-heapのキーが増加しないのはなぜですか?増加した要素(x)を最小の子と繰り返し交換することにより、O(height)で、子がxより大きくなるまでそれを行うことができると思います。 例えば IncreaseKey(int pos, int newValue) { heap[pos] = newValue; while(left(pos) &lt; heap.Length) { int smallest = left(pos); if(heap[right(pos)] &lt; heap[left(pos)]) smallest = right(pos); if(heap[pos] &lt; heap[smallest]) { swap(smallest, pos); pos= smallest; } else return; } } 上記は正しいですか?そうでない場合、なぜですか?はいの場合、min-heapのキーがリストされないのはなぜですか?

1
ブルートフォースドローネ三角形分割アルゴリズムの複雑
Mark de Berg等の著書「Computational Geometry:Algorithms and Applications」には、ドロネー三角形分割を計算するための非常に単純なブルートフォースアルゴリズムがあります。このアルゴリズムは、無効なエッジの概念を使用します。有効なドローネ三角形分割では表示されず、他のエッジに置き換える必要があるエッジです。各ステップで、アルゴリズムはこれらの不正なエッジを検出し、不正なエッジがなくなるまで必要な変位(エッジフリップと呼ばれる)を実行します。 アルゴリズムLegalTriangulation(TTT) 入力。いくつかの三角TTT点セットのPPP。 出力。法的三角形分割PPP。 一方、 違法なエッジが含まれているP I 、P jの DOTTTpipjpipjp_ip_j \quadしてみましょうとP I 、P J P lは隣接する2つの三角形ことのp のi のp J。pipjpkpipjpkp_i p_j p_kpipjplpipjplp_i p_j p_lpipjpipjp_ip_j \quadTから削除し、代わりにp k p lを追加します。Tを返します。pipjpipjp_ip_jTTTpkplpkplp_kp_l TTT このアルゴリズムは最悪の場合O(n2)O(n2)O(n^2)時間で実行されると聞きました。ただし、この記述が正しいかどうかは明確ではありません。はいの場合、この上限をどのように証明できますか?

1
ポリゴンが任意の線に関して単調かどうかをテストするにはどうすればよいですか?
定義:Aポリゴン平面では直線に関して単調と呼ばれるLへのすべての行が直交する場合は、Lと交差P最も二回で。PPPLLLLLLPPP 多角形与えられた場合、多角形PがLに関して単調であるような線Lが存在するかどうかを判断することは可能ですか?はいの場合、どのように?PPPLLLPPPLLL 以前、関連する質問(特定のラインに関してポリゴンが単調かどうかを判断する方法を尋ねました)を尋ねましたが、が事前に指定または指定されていない場合に興味があります。LLL

1
n個の離散単調関数の先行交差を決定するためのポリタイムおよびポリスペースアルゴリズム
いくつかの前触れ:私はレクリエーションのコンピューター科学者であり、ソフトウェアエンジニアを雇っています。したがって、このプロンプトが左のフィールドの外に見える場合はご容赦ください。私は、数学的なシミュレーションを使って遊んでいるので、やるべきことは何もないときに問題を開いています。 リーマンの仮説で遊んでいる間、私は素数のギャップを、以前の各素数の倍数によって形成されるすべての相補関数の交点に基づいて回帰関係に縮小できると判断しました(鋭いオブザーバーはこれがエラトステネスのふるい)。これがまったく意味をなさない場合でも、心配しないでください。それはまだ最前線です。n−1n−1n-1 これらの関数がどのように関連しているかを見て、各素数の次のインスタンスをこれらの関数の最初の交点に還元し、無限に繰り返し実行できることに気付きました。ただし、これがpolytimeおよびpolyspaceで扱いやすいかどうかを判断できませんでした。したがって、私が探しているのは、多項式の時間と空間で離散(および該当する場合は単調)関数の最初の交点を決定できるアルゴリズムです。そのようなアルゴリズムが現在存在しない、または存在できる場合、簡潔な証明または参照があれば十分です。nnn 私がこれまでに見つけた最も近いものは、ダイクストラの射影アルゴリズムです(そう、それはエドガー・ダイクストラではなくRL ダイクストラです)。これは整数プログラミングの問題に帰着するため、NP困難です。同様に、適用可能なすべてのポイントの推移的な集合交差を実行する場合(それらは現在制限されていると理解されているため)、現在の弱い制限のために、繰り返しのために指数空間に制限する必要があります任意の実数素数(したがって、各素数空間)。ln(m)ln⁡(m)\ln(m)mmmenene^nnnn 世界的には、問題の軽減についての私の理解が間違っているのではないかと思っています。リーマンの仮説(またはこの分野の深遠で未解決の問題)をすぐに解決するつもりはありません。むしろ、私は問題をいじることによってそれについてもっと学びたいと思っています、そして、私は私の研究でひっかかりました。

2
クラスタリング問題の最適な欲張り
一連の2次元ポイントが与えられますおよび整数K。最大の円の半径ができるだけ小さくなるように、すべてのnポイントを囲むk個の円のコレクションを見つける必要があります。換言すれば、我々は、設定された見つけなければならないC = { C 1、C 2、... 、CのK }のk個のそのようなコスト関数その中心点コスト(C )= maxのI 分jは Dを(|P|=n|P|=n|P| = nkkkkkknnnC={c1,c2,…,ck}C={c1,c2,…,ck}C = \{ c_1,c_2,\ldots,c_k\}kkkは最小化されます。ここで、 Dは入力点 p iと中心点 c jの間のユークリッド距離を示します。各ポイントは、頂点を k個の異なるクラスターにグループ化する最も近いクラスター中心に割り当てられます。cost(C)=maximinjD(pi,cj)cost(C)=maximinjD(pi,cj)\text{cost}(C) = \max_i \min_j D(p_i, c_j)DDDpipip_icjcjc_jkkk この問題は(離散)クラスタリング問題として知られ、NPハードです。NP完全な集合集合問題からの縮約により、ρ &lt; 2の問題に対するρ近似アルゴリズムが存在する場合、P = NPであることが示されます。kkkNPNP\text{NP}NPNP\text{NP}ρρ\rhoρ&lt;2ρ&lt;2\rho < 2P=NPP=NP\text{P} = \text{NP} 最適な近似アルゴリズムは非常にシンプルで直感的です。一つの第一のピック点P ∈ P任意セットを入れ、それをCクラスタ中心の。次に、他のすべてのクラスターセンターから可能な限り離れた次のクラスターセンターを選択します。だから| C | &lt; K、我々が繰り返しポイントを見つけるJ ∈ P距離いるD (J 、Cは)最大化に追加されるCを。一度| C | …

2
AO *アルゴリズムを実装する方法は?
検索アルゴリズムを実装するときに、異なるデータ構造が使用されることに気付きました。たとえば、キュ​​ーを使用して幅優先検索を実装し、スタックを使用して深さ優先検索を実装し、最小ヒープを使用してA *アルゴリズムを実装します。これらの場合、検索ツリーを明示的に構築する必要はありません。 しかし、AO *アルゴリズムの検索プロセスをシミュレートする単純なデータ構造を見つけることはできません。検索ツリーを明示的に構築することがAO *アルゴリズムを実装する唯一の方法であるかどうかを知りたいですか?誰でも私に効率的な実装を提供できますか?

1
書かれたルールのシステムを評価する方法
私は、組織の基本的な論理を決定するために組織の細則を評価するシステムを考え出そうとしていました。 一次述語システムは、ルールを表すために機能すると思います。ルールは、品詞タグ付けやその他のNLPテクニックを使用してテキストから翻訳できます。 全体として一次論理規則を解釈する体系的な方法、または要素間の類似性を見つけるための第2層として機能する何らかのタイプのMLアーキテクチャがありますか。 例えば、 楽しいアクティビティのリスト: ゴルフ コーヒーブレイク ピザ 細則: 金曜日、ゴルフをします 金曜日または土曜日に、私たちは短いコーヒー休憩を取り、それが土曜日の場合、ピザを受け取ります 結論:私たちのグループは週末は楽しい それははるかにフェッチされたように聞こえますが、可能かどうか私は興味があります。また、2次層の結論を導き出すには、おそらく1次論理のほうが適していると思います。

2
最小カットから最大フローを計算する
最大フローの応答を計算することを知っています。容量のあるネットワークの最小カットは同等です。cf. 最大フロー最小カット定理。 最大フローを計算するためのアルゴリズム(多少効率的)があり、最大フローが与えられた場合の最小カットの計算も難しくも高価でもありません。 しかし、その逆はどうですか?最小カットが与えられた場合、最大フローをどのように決定できますか?もちろん、ゼロからMax-Flowを解決することなく、できればそれよりも高速です。 いくつかの考え: 最小カットから、最大流量値がわかります。この情報が標準パスのAugmenting-PathおよびPush-Relabelのアプローチにどのように役立つかはわかりませんが、後者の適応はやや理にかなっています。 最小カットを使用してネットワークを2つの部分に分割して再帰することはできません(最悪の場合(1つのパーティションがシングルトンの場合)、問題を縮小しないためです)。また、小さなインスタンスの最小カットもありません。 最大フロー速度の値を知っていると、おそらく補完的なスラックネス条件によって、Max-Flow LPを解くことができますか?

1
量子コンピューティング-ハミルトニアンモデルとユニタリモデルの関係
量子コンピューティングのアルゴリズムを開発するとき、これを行う主なモデルが2つあることに気付きました。いくつかのアルゴリズム-例えばハミルトニアンNANDツリー問題(Farhi、ゴールドストーン、ガットマン)のよう-ハミルトニアンと、いくつかの初期状態を設計し、次にある時間のためのシュレディンガー方程式によるシステムの進化をさせることにより、作業の測定を行う前に。ttt その他のアルゴリズム(Shorの因数分解アルゴリズムなど)は、一連のユニタリ変換(ゲートに類似)を設計し、これらの変換を一度に1つずつ初期状態に適用してから測定を実行します。 私の質問は、量子コンピューティングの初心者として、ハミルトニアンモデルとユニタリ変換モデルの関係は何ですか?NANDツリー問題のようないくつかのアルゴリズムは、その後、一連のユニタリ変換(Childs、Cleve、Jordan、Yonge-Mallo)で動作するように適合されました。あるモデルのすべてのアルゴリズムを、別のモデルの対応するアルゴリズムに変換できますか?たとえば、特定の問題を解決するためのユニタリ変換のシーケンスが与えられた場合、ハミルトニアンを設計し、代わりにそのモデルで問題を解決することは可能ですか?他の方向はどうですか?もしそうなら、システムが進化しなければならない時間と問題を解決するために必要なユニタリ変換(ゲート)の数との関係は何ですか? 私はこれが事実であると思われるいくつかの他の問題を発見しましたが、これが常に可能または真実であることを示す明確な議論や証拠はありません。おそらく、この問題が何と呼ばれているのかわからないために、何を検索すればよいかわからないからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.