コンピュータサイエンス

コンピュータサイエンスの学生、研究者、実務家のためのQ&A


1
特定の文字列が文字列のコレクションとどの程度類似しているかを判断する
この質問がここにあるかどうかはわかりませんが、そうでない場合はお詫びします。私がやろうとしていることは、与えられた文字列が文字列のバッグに「属する」かどうかを確率論的に決定できるプログラム的な方法を開発することです。たとえば、10,000の米国の都市名のバッグがあり、「フィラデルフィア」という文字列がある場合、「フィラデルフィア」がすでに知っている米国の都市名に基づいて、米国の都市名である可能性を定量的に測定したいと思います。このコンテキストでは、実際の都市名と偽の都市名を区別できないことはわかっていますが、少なくとも、「123.75」や「速い赤狐が怠惰な茶色の犬を飛び越えた」などの文字列は除外されます。いくつかのしきい値。 開始するには、レーベンシュタイン距離を見て、それが少なくとも私が解決しようとしている問題と多少似ている問題にどのように適用されるかについて少し考えました。私が見つけた興味深いアプリケーションの1つは、盗作の検出でした。1つの論文では、変更されたSmith-WatermanアルゴリズムでLevenshtein距離がどのように使用され、特定のベースペーパーの盗聴されたバージョンである可能性に基づいて論文をスコア付けしました。私の質問は、誰かが私を助けるかもしれない他の確立されたアルゴリズムまたは方法論で私を正しい方向に向けることができるかどうかです。これは過去の誰かが解決しようとした問題かもしれないという感じがしますが、これまでのところ、Google-fuは失敗しました。

2
二分木の平均高さはどれくらいですか?
二分木の平均高さについて正式な定義はありますか? 次の2つの方法を使用してバイナリツリーの平均の高さを見つけることに関するチュートリアルの質問があります。 自然な解決策は、ルートからリーフへのすべての可能なパスの平均の長さを取ることです。 。avh1(T)=1# leaves in T⋅∑v leaf of Tdepth(v)avh1⁡(T)=1# leaves in T⋅∑v leaf of Tdepth⁡(v)\qquad \displaystyle \operatorname{avh}_1(T) = \frac{1}{\text{# leaves in } T} \cdot \sum_{v \text{ leaf of } T} \operatorname{depth}(v) 別のオプションは、再帰的に定義することです。つまり、ノードの平均の高さは、サブツリーの平均の高さの平均に1を加えたものです。つまり、 avh2(N(l,r))=avh2(l)+avh2(r)2+1avh2⁡(N(l,r))=avh2⁡(l)+avh2⁡(r)2+1\qquad \displaystyle \operatorname{avh}_2(N(l,r)) = \frac{\operatorname{avh}_2(l) + \operatorname{avh}_2(r)}{2} + 1 リーフのためのL及びAVH 2(_ )= 0空きスロット用。avh2(l)=1avh2⁡(l)=1\operatorname{avh}_2(l) = 1lllavh2(_)=0avh2⁡(_)=0\operatorname{avh}_2(\_) = 0 …

2
記憶に残るIPv6アドレスの弱いハッシュ関数
IPv6の形式のIPv6アドレスは、862A:7373:3386:BF1F:8D77:D3D2:220F:D7E0IPv4の4オクテットよりも記憶や転記がはるかに困難です。 これを緩和する試みが 行われ、IPv6アドレスがより記憶に残るものになっています。 「これは比較的無害であり、支払う価値がないように曲げられている場合、これは比較的無害であり、見つけやすい」というフレーズがターゲットIPv6アドレスにハッシュされることを見つけるために逆にできる意図的に弱いハッシュ関数はありますか?もちろん、ハッシュには衝突する入力が多数あり、この例のフレーズのように、記憶に残る可能性のある文が自動的に提供される可能性があります。 私は2つの部分があると思います:最初に、両方の方向に良い分布を持つ弱いハッシュ。2つ目は、多くの衝突(短い、指定された言語の単語で構成され、場合によっては簡略化された文法に従う)から覚えやすいフレーズを選択するためのアルゴリズムです。 ハッシュ関数は弱くする必要がありますが、努力がまだ重要であることは間違いありません。ただし、フレーズがわかると、ターゲットアドレスへのハッシュの計算は非常に高速になります。 編集 私は、πのいくつかの数字を記憶するために、この関連するアイデア、Piphilologyを見つけました。 量子力学を含む激しい講義の後、もちろんアルコール飲料をどうやって望むか!

1
認識可能なチューリング=>列挙可能
列挙子からチューリングマシンへの移行の証明を取得します(列挙子を実行し続け、それが入力と一致するかどうかを確認します)。 私のメモと本(計算理論入門-Sipser)によると、チューリングマシンからチューリング列挙子を取得するには、基本的にすべてのアルファベットの組み合わせを記述します。次に、この入力でTMを実行し、それが出力を受け入れる場合は、新しい文字列の繰り返し広告を無限に置き換えます。 私が抱えている問題は確かにこれは言語が決定可能である必要があります。そうしないと、受け入れたり拒否したりせず、言語全体を出力することが決してない運命にあるいくつかの無限ループの3番目の単語にスタックする可能性があります。 何が欠けていますか?

2
ニューラルネットワークの計算能力は活性化関数に関連していますか
有理な重みを持つニューラルネットワークは、ニューラルネットによるUniversal Turing Machine チューリング計算能力の計算能力を備えていることが証明されています。私が得た結果から、実際の重みを使用すると、計算能力がさらに向上するようですが、これについてはよくわかりません。 しかし、ニューラルネットの計算能力とその活性化関数の間には何らかの相関関係がありますか?たとえば、アクティベーション関数が入力をSpeckerシーケンスの制限と比較する場合(通常のTuringマシンでは実行できないことです)、これによりニューラルネットが計算上「より強く」なりますか?誰かが私にこの方向の参照を指摘できますか?

1
PDAでεループが不要であることをどのように証明しますか?
ヒープオートマトンの調査に関連して、特定のバリアントが非コンテキスト依存言語を受け入れることができないことを証明したいと思います。同等の文法モデルがないため、オートマトンのみを使用する証明が必要です。したがって、私はヒープオートマトンがLBA(または同等のモデル)によってシミュレートできることを示す必要があります。 私は、プッシュダウンオートマトンがコンテキスト依存言語のサブセットを受け入れることを示すのと同じように機能する証拠を期待しています。しかし、私が知っているすべての証明は、 文法の使用-ここでは事実は定義から明らかです-または 納得できないほどあいまいです(例:ここ)。 私の問題は、PDA(またはHA)に、シンボル(スタック)にシンボルを書き込む可能性がある -transitionsのサイクルが含まれる可能性があることです。LBAは、そのようなループの任意の反復をシミュレートできません。文法で得られたチョムスキー階層から、εε\varepsilon すべての文脈自由言語には、 -cycle-free PDAまたはεε\varepsilon LBAのシミュレーションにより、 -cyclesが頻繁に繰り返されるのを防ぐことができます。εε\varepsilon 直感的には、これは明らかです。そのようなサイクルは入力とは無関係にシンボルを書き込むため、スタック(ヒープ)のコンテンツは、サイクルの長さにおいて線形の情報のみを保持します(現在のところ、重複するサイクルは無視されます)。また、別の -cycle を使用する以外に、(必要に応じて)ものを再び取り除く方法はありません。本質的に、そのようなサイクルは、複数回繰り返された場合、入力の処理に寄与しないため、必要ありません。εε\varepsilon この引数は、特に -cyclesの重複を考慮して、どのように厳密に/正式に記述することができますか?εε\varepsilon


2
グラフ彩色問題のNP完全性
代替処方 私は以下の問題に対する別の定式化を思いつきました。代替の定式化は、実際には以下の問題の特殊なケースであり、2部グラフを使用して問題を説明します。しかし、私は代替処方はまだNP難しいと私は信じています。代替の定式化では、問題の定義を単純化する着信ノードと発信ノードの互いに素なセットを使用します。 与えられた送信およびN受信ノード(それぞれ、図中の赤色および青色のノード)、及びセットW I jの大きさのN × Nの発信と着信頂点間の辺の重みの。この問題の目標は、図の太いエッジに色を付けて、すべての入力ノードに対して条件が成立するようにすることです。んnnんnnw私はjwijw_{ij}n × nn×nn \times n セットの出力頂点、セット { I i{ O私|i = 1 … n }{Oi|i=1…n}\{ O_i \; | \; i=1 \dots n \}入力頂点の、 N × Nの重み wは、I 、J ≥ 0との間の O I 'sおよび I 、Jのための I 、J = 1 ... nは、正の定数を β、色の最小数を見つけます。エッジに対する E I …


2
ポリゴンがラインに関して単調かどうかをテストするにはどうすればよいですか?
モノトーンポリゴンがポリゴンの三角形分割で重要な役割を果たすことはよく知られています。 定義: Aポリゴン平面では直線に関して単調と呼ばれるへのすべての行が直交する場合は、Lと交差P最も二回で。PPPLLLLLLPPP ラインLLLとポリゴンPが与えられたPPP場合、ポリゴンPPPがLに関して単調かどうかを判断する効率的なアルゴリズムはありLLLますか?

1
敵対的な引数を使用してk番目に小さい要素を見つけるための下限
多くのテキストでは、中央値を使用する引数を使用して、番目に小さい要素を見つけるための下限が導出されます。敵対的な議論を使用してどのように見つけることができますか?kkk ウィキペディアによると、トーナメントアルゴリズムはで実行され、は下限として与えられます。N - K + Σ N J = N + 2 - K ⌈ LGO(n+klogn)O(n+klog⁡n)O(n+k\log n)N - K + Σんj = n + 2 − k⌈ LGJ ⌉n−k+∑j=n+2−kn⌈lgj⌉n - k + \sum_{j = n+2-k}^{n} \lceil{\operatorname{lg}\, j}\rceil

2
エミュレーター入力の最適化問題をどのように分類しますか?どのアルゴリズムでそれにアプローチする必要がありますか?
質問の性質上、多くの背景情報を含める必要があります(私の質問は:これをどのように絞り込むのですか?)とはいえ、要約すると(私の知る限り)次のようになります。 非常に大きな組み合わせ検索空間で局所最適を見つける方法は何ですか? バックグラウンド ツールを使用したスーパープレイコミュニティでは、コスト(通常は完了までの時間)を最小限に抑えるために、ビデオゲームコンソールまたはエミュレータに特別に細工された(リアルタイムでは生成されない)入力を提供することを目指しています。これが現在行われている方法は、例えば(何度もゲームフレーム・バイ・フレームを再生し、フレームごとに入力を指定して、多くの場合、実行の部分をやり直すことである最近発表されたため、実行ゼルダの伝説を:時間のオカリナを持っています合計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のいわゆる「一時停止後方ロングジャンプ」などのように、プレスを押すのが最適な場合があるためです。ここでは、脳はより複雑なパターンを学習する必要があります。「スタートを押しても、プレーヤーがこの非常に特殊な状態にあり、ボタンを押しながらいくつかの組み合わせを続ける場合を除き、役に立たない」 変更にもっと適した他の方法で入力を表現する(またはマシンが学習できる)ようです。フレームごとの入力は細かく見えます。本当に必要なのは「アクション」であり、これは複数のフレームにまたがる場合があります...しかし、多くの発見はフレームごとに行われるため、完全に除外することはできません(前述の一時停止後方ロングジャンプには、フレームレベルの精度が必要です)。また、入力がシリアルに処理されるということは、活用できるものでなければならないようですが、方法はわかりません。 現在、私は(リアクティブ)タブー検索、超大規模近傍検索、教育学習ベースの最適化、およびアリコロニー最適化について読んでいます。 この問題は、ランダムな遺伝的アルゴリズム以外のものに取り組むのが難しいほど単純ですか?それとも実際にずっと前に解決された些細な問題ですか?読んでくれてありがとう。返事を送ってくれてありがとう。

2
AがBに還元可能にマッピングされる場合、Aの補数はBの補数に還元可能にマッピングされます。
私は計算理論の最後の勉強をしており、この発言が真実か偽かに答える適切な方法に取り組んでいます。 定義の≤メートル≤メートル\leq_m我々は、次のステートメントを構築することができます W ∈ A⟺f(W )∈ B → W ∉ A⟺f(W )∉ Bw∈あ⟺f(w)∈B→w∉あ⟺f(w)∉Bw \in A \iff f(w) \in B \rightarrow w \notin A \iff f(w) \notin B これは私が行き詰まっているところです、私はそのような計算可能な関数があるので、AからBへのマッピングがあればそれだけを提供し、そうでなければそれを提供しないと言いたいです。fff これを正しく表現する方法がわからない場合や、正しい方向に進んでいるかどうかはわかりません。

1
Appelの隠線消去アルゴリズムの等高線を見つける方法
楽しみのために、私はDCPU-16のワイヤーフレームビューアーを作成しようとしています。ワイヤーフレームで非表示になっている線を非表示にする方法を除いて、すべての方法を理解しています。SOに関するすべての質問は、OpenGLへのアクセス権があることを前提としていますが、残念ながら、DCPU-16(またはあらゆる種類のハードウェアアクセラレーション)のようなものにはアクセスできません。 GoogleブックスでAppelのアルゴリズムについてかなり良い説明を見つけました。しかし、私が理解するのに苦労している1つの問題があります。 Appelは、前面と背面のポリゴンで共有されるエッジ、または閉じた多面体の一部ではない前面のポリゴンの共有されていないエッジとして輪郭線を定義しました。2つの前面ポリゴンで共有されるエッジは、可視性に変化を与えないため、等高線ではありません。図8.4では、エッジAB、EF、PC、GK、CHは等高線ですが、エッジED、DC、GIは等高線ではありません。 アルゴリズムのルールと、等高線が作成された後のアルゴリズムのしくみを理解していますが、エッジが「前向きポリゴンと後ろ向きポリゴンで共有されているかどうかを判断するために何をする必要があるかわかりません。コーディングの観点からは、閉じた多面体の一部ではない、正面を向いたポリゴンの共有されていないエッジ。私は形状を見ることができ、頭の中でどの線が等高線であるかを知ることができますが、その「理解」をコード化されたアルゴリズムに転送する方法についての手がかりはありません。 更新 等高線の決定にある程度の進歩がありました。コンピューターグラフィックスに関するバッファロー大学のクラスからのこれら 2つの講義ノートを見つけました。 エッジを考慮してください。これらは3つのカテゴリに分類されます。 2つの見えない面をつなぐエッジは、それ自体は見えません。これはリストから削除され、無視されます。 表示される可能性のある2つの面をつなぐエッジは「マテリアルエッジ」と呼ばれ、さらに処理する必要があります。 表示される可能性のある面と表示されない面を結ぶエッジは、「マテリアルエッジ」の特別なケースであり、「輪郭エッジ」とも呼ばれます。 上記の2つの情報を使用すると、これをコードとして書き出すことができるようになりますが、まだ長い道のりがあります。

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