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

頂点または「ノード」のコレクションと頂点のペアを接続するエッジのコレクションを含む数学的構造

8
プログラミングでDAG(Directed Acyclic Graph)を使用する場合
私は最近ectoという名前のフレームワークを見つけました。 このフレームワークでは、「plasm」という名前の基本コンポーネントは、ecto Directed Acyclic Graphです。ectoでは、plasmはectoスケジューラーで操作できます。 このメカニズムの利点は何ですか、また他のどのような状況でDAGの概念を活用できますか?

3
ワームホールノードで最短パスを見つける方法
これは、コードでやりたいことの例です。ジャンプポイント検索を使用して、緑のノードから赤のノードに問題なく、またはA *でも簡単に取得できることを知っています。しかし、これをワープでどのように計算しますか。 画像では、青のパスを取るときに緑のノードから赤のノードに到達するのに8回の移動しか必要ないことがわかります。青いパスは、紫色のノードから次のノードにすぐに移動します。中央に2移動するスペースは、移動する必要がある2つのワープゾーンの間のポイントです。 黄色のパスまで半分(大まかに)移動するだけでよいので、青いパスを取る方が明らかに高速ですが、プログラムでこれを行うにはどうすればよいですか? この問題を解決するために、使用可能なグラフの周りに複数の紫色の「ワープ」があり、各紫色のポイントがワープする場所とグラフ上のどこにあるかを正確に把握します。 紫色のワープには双方向のものとそうでないものがあります。つまり、片側からしかワープに入ることができず、ワープ後に戻ることができない場合があります。 私は解決策について考えましたが、各ワープポイントまでの距離(一方向のポイントを差し引いたもの)、それらのポイント間の差、およびそれらに近いポイントをチェックすることで問題を計算できると結論付けました。 プログラムは、最初のジャンプから歩くのではなく、2番目のワープを取る方がより有益であることを何らかの方法で把握する必要があります。したがって、6つのスポットを移動してからワープし、残りの8ステップを徒歩で移動する代わりに(ワープをまったく使用しない場合よりも高速です)、6つの動きを取り、2つの動きを2番目のワープに移動します。 編集:青のパスは実際には8回ではなく12回の動きをすることに気付きましたが、問題は同じままです。

3
効率的なグラフクラスタリングアルゴリズム
大きなグラフ(約5000の頂点と10000のエッジを持つ)でクラスターを見つけるための効率的なアルゴリズムを探しています。 これまでは、JUNG javaライブラリに実装されたGirvan–Newmanアルゴリズムを使用していますが、多くのエッジを削除しようとすると非常に遅くなります。 大きなグラフのより良い代替案を提案してもらえますか?

7
グラフ構造を使用してどのようにコードを単体テストしますか?
私は、依存関係グラフをナビゲートし、依存関係のサイクルまたは矛盾を探す(再帰的)コードを書いています。ただし、これを単体テストする方法はわかりません。問題は、発生する可能性があるすべての興味深いグラフ構造のコードハンドルと、すべてのノードが適切に処理されるようにすることです。 通常、一部のコードが動作することを確信するには100%の回線またはブランチのカバレッジで十分ですが、100%のパスカバレッジであってもまだ疑問があるように感じます。 したがって、テストケースのグラフ構造を選択して、コードが実際のデータで見つかる可能性のあるすべての順列を処理できることを確信できるようにするにはどうすればよいでしょうか。 PS-問題がある場合、グラフ内のすべてのエッジに「必要」、「不可」のラベルが付けられ、自明なサイクルはなく、2つのノード間に1つのエッジしかありません。 PPS-この追加の問題ステートメントは、もともと質問の著者によって以下のコメントで投稿されました。 For all vertices N in forest F, for all vertices M, in F, such that if there are any walks between N and M they all must either use only edges labelled 'conflict' or 'requires'.

6
距離に関係しないコストを最小限に抑えながら、数直線上のポイントを訪れる
このACM ICPCの問題について、助けが必要です。私の現在の考えは、これを最短経路問題としてモデル化することであり、これは問題ステートメントの下で説明されています。 問題 あるN = 1000において1-Dの数直線に沿って位置する核廃棄物容器の別個の位置は-500,000 to 500,000、を除いx=0。人は、すべてのごみ箱を集める仕事をします。廃棄物容器が収集されない秒ごとに、1単位の放射線を放出します。人は1秒ごとにユニットx = 0を移動でき1、ごみの収集にかかる時間はごくわずかです。すべてのコンテナを収集している間に放出される放射線の最小量を見つけたい。 サンプル入力: 4にあるコンテナ[-12, -2, 3, 7]。 これらのコンテナを収集するのに最適な順序は[-2, 3, 7, -12]、50ユニットの最小排出量です。説明:人は-22秒後に行き、その時間の間2 unitsに放射線が放出されます。その後、彼は3(距離:)に移動し5、バレルが2 + 5 = 7放射単位を放出した。彼はその銃身がユニットを放出4したx = 7場所に到達するまでにさらに数秒かかります2 + 5 + 4 = 11。彼はそのバレルがユニットを放出19したx = -12場所に到達するのに数秒かかります2 + 5 + 4 + 19 = 30。2 + 7 + 11 + 30 = 50、これが答えです。 …
18 algorithms  graph 

4
素人の用語でグラフとは何ですか
コンピューターサイエンスにおけるグラフとは何ですか?素人の用語で好ましくは。 私はウィキペディアで定義を読みました: コンピューターサイエンスでは、グラフは抽象データ型であり、数学からグラフとハイパーグラフの概念を実装することを目的としています。 グラフデータ構造は、ノードまたは頂点と呼ばれる特定のエンティティの、エッジまたはアークと呼ばれる順序付けられたペアの有限(および場合によっては可変)のセットで構成されます。数学のように、エッジ(x、y)はxからyを指すか、またはxからyに向かうと言われます。ノードはグラフ構造の一部であっても、整数インデックスまたは参照によって表される外部エンティティであってもかまいません。 しかし、私はあまり形式的ではなく、理解しやすい定義を探しています。

5
最速ルートを決定するアルゴリズム?
1から5に行くとしましょう。最短ルートは1-4-3-5(合計60 km)です。 これには、ダイクストラのアルゴリズムを使用できます。 問題は、渋滞やその他の要因により、最短ルートが常に最速ルートとは限らないことです。 例えば: 1-2は頻繁に渋滞することが知られているため、避けるべきです。 4-3で突然自動車事故が発生するため、それも避ける必要があります。 等... 渋滞や事故がないため、おそらくルート1-4-5でスピードを上げることができるので、5に速く到着します。 まあそれは一般的な考え方であり、私はまだ詳細については考えていません。 この問題を解決するアルゴリズムはありますか?
17 graph  dijkstra 

1
柔軟なDIFF実装のための発見的アプローチ
作業中のドキュメントリビジョンを比較するために、DIFF実装を作成しました。O(ND)差分アルゴリズムとそのバリエーションに基づいています。 重要になった1つのことは、変更のリストを取得し、それらを人間が読めるテキストに変換することです。現在のアルゴリズムは非常に効率的ですが、拡張するのが難しいほど非常に効率的です。 短い質問 私はA *と「ターン」にペナルティを追加するヒューリスティックを使用しようと考えていました。アイデアはしている滑らか人間が読むことができる何かに解析することが容易であるように「削除、追加、追加、削除、追加、削除」不要に。基本的に、私の最短経路問題を最も単純な経路問題に変えてください。 そしてもちろん、常に出力作成「削除しないすべてのものを、追加のすべてを」 これは理にかなっていますか? DIFF実装でヒューリスティックを使用するための優先順位はありますか?ヒューリスティックとは何ですか? 問題: 長い文が削除され、別の長い文が削除されたが、少なくとも1つの単語を共有している場合、「with」と言います。一般的な単語を単独で(追加と削除の両方ではなく)残すと、最短パスが作成されます。ただし、これは実際に、変更から印刷物を読み取ろうとする人間に対する変更のコンテキストを難読化するだけです。 現在のDIFFの例: 古いテキスト: クリーン:ショップエアでパワーウォッシュとブロードライ。 新しいテキスト: クリーニング:アセトンと糸くずの出ない布で拭きます。 メモリストの変更: 「Powerwash and blow dry」を「アセトンで拭く」に変更します 「ショップエア」を「アセトンと糸くずの出ない布」に変更します 注:「「ショップエア」の削除、「アセトン」の追加」の代わりに「変更」が使用されます。 ご覧のとおり、2番目のノートはすべてのコンテキストを失い、テキストの完全な古いテキストセットと新しいテキストセットを見ることなく、その意味を理解できません。 句読点に関する注意: 句読点を別の「単語」として区切り、次のようにします 追加 "(" の代わりに 「修復」を「(修復)」に変更します これは不快だったからです。ただし、これは、両方のテキストにコンマさえある場合(前の例の "with"という単語とは対照的に)、同じことが起こることを意味します。 可能な解決策: 代わりに、異なるパス検索アルゴリズムを使用して、人にとってより意味のある異なる変更「パス」に重みを追加する柔軟性を与えることができると思います。たぶん、句読点を含むノードへの移動にほとんど重みを付けないようにすることもできます(これが他のものにどのように影響するかはわかりません)。 次に、前の例を取得して以下をリストできます。 メモリストの変更: 「パワーウォッシュとショップエアでブロードライ」を「アセトンと糸くずの出ない布で拭いてください」に変更します。 見る!より明確に! パフォーマンスに打撃を与えることはわかっているので、プログラムの大幅なオーバーホールを行う必要があるかもしれませんが、最終結果を得ることがより重要です。 ボトムライン: 繰り返しますが、DIFF実装でヒューリスティックを使用するための優先順位はありますか? 他の考え?合理的な時間投資ですか?他のアイデア?他のアルゴリズム? 前もって感謝します! 編集: A *を使用するのではなく、質問を明確化/固化し、質問をアルゴリズムにヒューリスティックを追加するように一般化しようとしました。この例では基本的に同じことですが、今でもより正確だと思います。 この投稿は洞察に富んでいました。

3
不変状態でオブジェクトグラフの突然変異を効率的に表現することは可能ですか?
私はC ++で不変オブジェクトの使用を練習しています。私の個人的な目標は、一連の不変グラフで(ヒープ内の)汎用オブジェクトグラフを表現することです。 マルチバージョングラフ自体の作​​成はそれほど難しくありません。問題はパフォーマンスです。ブルートフォースバージョン管理にはグラフの完全なコピーが必要であり、これは受け入れられませんでした。 変更されていないノードを共有しようとしました。しかし、この場合、新しい問題が発生しました。参照。他のオブジェクトへの参照は、グラフ全体で更新する必要があります。これは、新しいグラフバージョンを導出するたびにすべてのノードを訪問する必要があります。また、これによりノードが参照で変更されるため、ノードも(コピーすることによって)派生する必要があります。総当たりコピーよりもパフォーマンスはそれほど良くありません。 私が想像できる限り、オブジェクトグラフの変化を不変状態で表現するための実際の効率的な方法はありません。だから私はこれに関するいくつかのアイデアを求めています。 不変状態でオブジェクトグラフの突然変異を効率的に表現することは可能ですか?

1
Floyd-Warshall、Dijkstraのアルゴリズム、Bellman-Fordアルゴリズムの違いについては正しいですか?
私は3つを研究しており、それらからの推論を以下に述べています。それらを十分に正確に理解しているかどうかを誰かに教えてもらえますか?ありがとうございました。 ダイクストラのアルゴリズムは、単一のソースがあり、あるノードから別のノードへの最小パスを知りたい場合にのみ使用されますが、このような場合は失敗します Floyd-Warshallのアルゴリズムは、すべてのノードのいずれかがソースになる可能性がある場合に使用されるため、ソースノードから宛先ノードに到達する最短距離が必要です。これは、負のサイクルがある場合にのみ失敗します (これは最も重要なものです。つまり、これは私が最も確信していないものです:) 3.Bellman-Fordは、ソースが1つしかない場合のダイクストラのように使用されます。これは負の重みを処理でき、その動作は1つのソースを除き、Floyd-Warshallの動作と同じですか? 見る必要がある場合、対応するアルゴリズムは次のとおりです(提供:ウィキペディア): ベルマンフォード: procedure BellmanFord(list vertices, list edges, vertex source) // This implementation takes in a graph, represented as lists of vertices // and edges, and modifies the vertices so that their distance and // predecessor attributes store the shortest paths. // Step 1: initialize graph …

1
3の最大多重度で原点から外側にエッジと頂点を生成するアルゴリズム
私は、宇宙が非常に大きくなる(基本的には無限に大きくなる)Webサイト用の2Dゲームを作成しています。最初は、宇宙は原点(0、0)から等しい距離にある6つの星で構成されています。私のタスクは、相互に接続する「パス」(エッジ)を持つより多くの星を生成できるようにすることです。これらの制限を満たすアルゴリズムをどのように設計できますか: 星は外側にランダムに生成されます。(たとえば、新しい星の(x、y)座標は、(0、0)からすべての方向にゆっくりと外側に移動し、できれば螺旋状になります) エッジは交差しません。 多少の違いはあるはずですが、新しい星は他の星に近すぎたり近すぎたりしてはなりません。(たとえば、最小半径が必要です) スター/ポイントの多重度が3を超えることはできません。 このすべてがデータベースに保存されることを考えると、アルゴリズムのコストが高すぎることはありません。言い換えれば、O(n)の複雑さを実現したいと考えています(これが実現可能かどうかはわかりません)。 基本的に、私が目指しているのは、星がグラフ上の点であり、星間の移動がそれらの星の間のエッジで描かれている渦巻き状の銀河です。 解決する必要がある特定の手順は次のとおりです。 まだ3の多重度を持たない他の星の近隣に点をランダムに生成します。 エッジの競合を生成しない3の多重度をまだ持たない最初の星を見つけます。 星がx単位の最小距離にある場合、2点間にエッジを作成します。 解決策を探してみましたが、数学のスキル(およびグラフ理論の知識)には多くの作業が必要です。また、この問題に関するリソース/リンクは大歓迎です。 ここに私が考えていたいくつかの擬似コードがありますが、これがうまくいくかどうかはわかりません。 newStar = randomly generated (x, y) within radius of last star from origin while(newStar has not been connected): for (star in the known universe): if(distance between newStar and star > x units): if(star has < 3 multiplicity): …

2
選択的に非表示にできるノードとエッジ間に許可された複数のエッジを持つグラフを表現する方法
理想的で仮想化されたネットワークの使用をモデル化するためにどのようなデータ構造を使用するかを考えています。 私のシナリオでは、互いに敵対的な多数のユーザーが、潜在的な接続がすべてわかっているコンピューターのネットワークを形成しようとしています。ただし、あるユーザーが接続する必要があるコンピューターは、別のユーザーが接続する必要があるコンピューターとは異なる場合があります。ユーザー1はコンピューターA、B、Dを接続する必要があり、ユーザー2はコンピューターB、C、Eを接続する必要がある場合があります。 NCTM Graph Creatorの助けを借りて生成された画像 このコアは、ノードがコンピューターを表し、エッジがイーサネットケーブルを表す、無向の循環グラフになると思います。ただし、シナリオの性質上、隣接リストと隣接行列を除外するいくつかの珍しい機能があります(少なくとも、重要な変更はありません)。 エッジは使用が制限される場合があります。つまり、あるユーザーが特定のネットワーク接続を取得した場合、他のユーザーはその接続を使用できません この例では、緑のユーザーはコンピューターAに接続できない可能性がありますが、赤のユーザーはBをEに接続していますが、それらの間に直接リンクはありません 場合によっては、ノードの特定のペアが複数のエッジで接続されます この例では、DからEまでの2本の独立したケーブルがあるため、緑と青のユーザーは両方ともこれらのマシンを直接接続できました。ただし、赤はそのような接続を確立できなくなりました 2台のコンピューターが複数のケーブルで接続されている場合、各ユーザーが所有するケーブルは1本のみです このグラフでは、次のようないくつかの操作を行う必要があります。 特定のユーザーに対して特定のコンピューターのペアが接続されているかどうかを判断する 特定のユーザーがターゲットコンピューターに接続するための最適なパスを特定する 特定のユーザーの最大遅延コンピューター接続(つまり、分岐のない最長パス)を識別する 最初に考えたのは、単純にすべてのエッジのコレクションを作成することでしたが、検索にはひどいものです。今考えられる最善の方法は、隣接リストを変更して、リスト内の各アイテムにエッジの長さだけでなく、コストと現在の所有者も含まれるようにすることです。これは賢明なアプローチですか?スペースが問題にならない場合、単一のグラフではなく、グラフの複数のコピー(ユーザーごとに1つ)を作成するのが妥当でしょうか?

3
グリッド上で有向グラフをランダムに生成します
ポケモンのアイススライディングパズルに似たパズルゲームを作成するために、有向グラフをランダムに生成しようとしています。 これは基本的に、http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theoryをランダムに生成できるようにしたいものです。 xおよびy次元でグラフのサイズを制限できる必要があります。リンクに示されている例では、8x4グリッドに制限されます。 私が直面している問題は、グラフをランダムに生成するのではなく、ノードの反対側に何か(岩のようなもの)が必要なので、2D空間に適切にマップできるグラフをランダムに生成することですスライドを止めると視覚的に意味があります。これに伴う問題は、岩が他の2つのノード間のパスまたは場合によっては別のノード自体のパスになり、グラフ全体が破損することがあることです。 私が知っている少数の人々と問題について議論した後、解決策につながる可能性のあるいくつかの結論に達しました。 グリッドを構築するときに、グリッドの障害物をグラフの一部として含める。 完全に満たされたグリッドから始めて、ランダムなパスを描画し、そのパスを機能させるブロックを削除します。 問題は、追加の短いパスの導入を避けるために、どれを削除するかを判断することとなります。また、動的プログラミングアルゴリズムは有益であると考えていましたが、動的プログラミングアルゴリズムをゼロから作成するのに熟練している人はいませんでした。この問題が公式に呼ばれているものについてのアイデアや参考文献(公式のグラフの問題である場合)が最も役立ちます。 ブロックをランダムに配置し、選択した開始/終了からナビゲーショングラフを生成することで、これまでに達成したことの例をいくつか示します。アイデア(前のリンクで説明)は、緑のSから始めて緑のFに到達することです。これを行うには、上/下/左/右に移動し、選択する方向に移動し続けます。壁。これらの写真では、灰色が壁、白が床、紫色の線が開始から終了までの最小の長さであり、黒い線と灰色の点が可能な経路を表しています。 ランダムに生成されたグラフの悪い例は次のとおりです。 ランダムに生成された(または手で調整された)グラフの良い例を次に示します。 また、パズルとして実際にこれをプレイするときに、より難しいものが最小パスに沿って多くの高度なノードを持つものであることに気づいたようです。

2
不変データを持つ言語で二重にリンクされたデータ構造または循環データ構造に操作を実装するための回避策
Haskellでグラフを作成してローカル操作を行う方法を学びたいのですが、問題はHaskellに固有のものではなく、グラフの代わりに二重リンクリストを検討することもできます。 質問: 主に不変のデータ構造(Haskell、Clojureなど)をサポートおよび推奨する言語で、二重リンクリスト(または他の二重リンクまたは循環データ構造)とその操作を実装する慣用的または推奨される方法は何ですか? ?特に、言語で正式に禁止されているインプレース更新の使用方法は? 二重にリンクされたリストでローカル操作を実行した場合(アイテムが挿入された場合など)、言語の遅延により、リスト全体をすぐにコピーする必要がない場合があることは容易に想像できます。ただし、リストは二重にリンクされているため、1か所で変更された場合、リストの新しいバージョンで古いノードを使用することはできず、何らかの方法でマーク、コピー、ガベージコレクションを行う必要があります。 。リストの更新されたコピーのみを使用する場合、これらは明らかに冗長な操作ですが、リストのサイズに比例した「オーバーヘッド」が追加されます。 これは、そのようなタスクでは不変データが単に不適切であり、可変データを「ネイティブ」でサポートしていない関数型宣言言語は、命令型言語ほど優れていないことを意味しますか?または、トリッキーな回避策はありますか? PS私はインターネットでこの主題に関するいくつかの記事やプレゼンテーションを見つけましたが、それらをフォローするのに苦労しましたが、この質問への答えは1段落以上、そしておそらく図を取るべきではないと思います...つまり、もしあればこの問題に対する「機能的な」解決策はありません。答えは「Cを使用する」でしょう。ある場合、それはどれほど複雑になる可能性がありますか? 関連する質問 「関数型プログラミングのデータ構造」。非効率的な代替手段の代わりにインプレース更新を使用することについての私の特定の質問はそこでは議論されていません。 「永続的データ構造の内部変異」。ここでは、不特定の言語での低レベルの実装に重点が置かれているようですが、私の質問は、言語(関数型またはその他)の正しい選択と、関数型言語で可能な慣用的な解決策についてです。 関連する引用 純粋に関数型のプログラミング言語では、多くのアルゴリズムを非常に簡潔に表現できますが、その場で更新可能な状態が重要な役割を果たすと思われるアルゴリズムがいくつかあります。これらのアルゴリズムの場合、更新可能な状態がない純粋に関数型の言語は本質的に非効率的であるように見えます([Ponder、McGeer and Ng、1988])。 -John LaunchburyおよびSimon Peyton Jones、レイジー機能状態スレッド(1994)、John LaunchburyおよびSimon Peyton Jones、Haskell州(1995)。これらの論文STでは、Haskellのモナディック型コンストラクタを紹介しています。

1
複雑な作業スケジュールのモデリング
私が表現して自動化しようとしている現実の問題があります。私はそれを次のように簡略化して抽象化しました: nの作業場所があります(P1、P2、...、Pn)。 各場所、Pnにはキー、Knがあります。 ワーカーがm人います(W1、W2、...、Wm)。 Pnで働くためには、労働者はKnを持たなければなりません。 各キーは、労働者が保持するか、取引所Eに残しておくことができます。 ワーカーはいつでもExchangeにアクセスして、要求されていないキーを取得したり、他のユーザーが使用できるようにいくつかのキーをドロップしたりできます。 現在、厳格な順序で完了する必要がある外因性の作業スケジュールがあります。例えば: 2016-04-21 W1はP6で働く必要があります 2016-04-21 W2はP3で働く必要があります **鍵の交換が必要です** 2016-04-22 W3はP3で働く必要があります 2016-04-22 W2はP6で働く必要があります 同じ日に決してではないが、スケジュールのある時点でPnで働く必要のある労働者はいくつもいる可能性がある 私たちは知っています: すべてのキーの開始場所(労働者またはEのいずれか) 各ワーカーが満たす必要がある将来の作業指示 それで、私はこの全体の状況をモデル化するのに苦労しています。データ構造とアルゴリズムを提案して、それを把握し、各ワーカーのエクスチェンジへのトリップの最適化を開始するために検討する必要がありますか? 私が最小限にしたいのは、Eへの旅行の総数です。2番目の目標は、労働者が不釣り合いな数の旅行をしないようにすることです。 前もって感謝します!!

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