問題タブ [jgrapht]
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.
java - Java で Treelayout グラフを作成する方法
私は、いくつかのxmlファイルを読み取り、それらのxmlファイルの情報に基づいてグラフ図を作成するプログラムに取り組んでいます。
グラフ図を作るのが苦手です。グラフを次のように表示したい: http://pic.dhe.ibm.com/infocenter/elixent/v3r5/topic/com.ibm.ilog.elixir.doc/Content/Visualization/Documentation/Flex/Diagram4Flex/_media/ TreeLayoutExample_default.png
だから、ツリーレイアウト、頂点の名前がいくつかの色付きの長方形の中にあるようにしたい(prefはアイテムの種類ごとに異なる色を持っている)、また2つの頂点間のエッジにいくつかの書き込みをしたい. それに加えて、頂点が自分のプロジェクトで作成したいくつかのオブジェクトであることを非常に望んでいるので、頂点をクリックすると、頂点に配置されたオブジェクトのインスタンスを取得します。
これまでのところ、描画アルゴリズムにあまり手を加えずにグラフを簡単に描画するために、2 つのフレームワークを試しました。
最初にjgraphフレームワークを試しました:
}
このフレームワークは、Rectangles 内の頂点名とエッジの名前を使用してグラフを作成する際にうまく機能し、MouseListener を使用して頂点をクリックすると、頂点内にある文字列を取得できます。
しかし、 TreeLayout を持たせ、 Vertex をクリックすると返される可能性のあるオブジェクトとして頂点を追加する方法を見つけることができませんでした。この例にある汎用クラスを利用しようとしましたが、実行しようとすると例外しか発生しませんでした。インターネットで検索しましたが、このグラフにツリーレイアウトを適用する方法が見つかりませんでした
グラフを描画するためのより多くのオプションがある Java JUNG Framework も試しました。私はこの例を見つけました:
}
このフレームワークを使用すると、作成したいくつかのオブジェクトとして頂点を追加でき、頂点名にそのオブジェクトが toString() メソッドで返すものが表示されます。また、私が欲しかった TreeLayout アルゴリズムも実装されていますが、頂点の外観を変更することはできません。JGraph フレームワークで描画される頂点のように見せたいのですが、JUNG ではいくつかの円しか得られず、頂点の名前が頂点形状の外にあります。頂点の形状が変化する例を発見しましたが、書き込みはまだ外側です。
したがって、これら 2 つのフレームワークで得られるものの間にあるグラフを描画する方法について、いくつかの提案をお願いします。形状内に頂点の名前を持ち、Treelayout を持ち、取得できるオブジェクトとして頂点を追加します。頂点をクリックすると返されます。
Marco13 からの回答は非常に役に立ちました。Rectangle の幅に String.length * 10 を設定することで、Rectangle を String に合うサイズにすることを考えました。
これは、このようなグラフを作成しようとしている他の人にとって役立つかもしれないと思います: この例のほとんどの一般的なクラスに表示される代わりに、必要なオブジェクトは何でも使用できます。文字列は頂点用で、整数はエッジ型用です。Transformer 関数内で、頂点またはエッジに割り当てられたオブジェクトを取得します。このように、特定のプロパティを持つオブジェクトにさまざまな形状、色、およびフォントを設定できます。
クリックすると Edge オブジェクトを返す MouseListener を作成する方法を理解しようとしていますが、それが簡単になることを願っています。
java - JGraphT SimpleGraph で等しい頂点を使用する
Java で、等しい頂点/エッジを含む単純なグラフ (グラフ ループまたは複数のエッジを含まない重み付けされていない無向グラフ) を作成したい。
2 つの Java クラスがあり、1 つは頂点用です。
エッジのクラス:
現在、JGraphT ライブラリを使用しています。しかし、私はIllegalArgumentException: "loops not allowed"
このコードを開始した後に遭遇しました:
問題は、グラフに追加しようとすることですv2
が、グラフに追加されないためv1.equals(v2) == true
v2
です。lib の JavaDoc から:
指定された頂点がまだ存在しない場合は、このグラフに追加します。より正式には、このグラフに u.equals(v) となる頂点 u が含まれていない場合、指定された頂点 v をこのグラフに追加します。
このチェックはここに実装されています。
しかし、それでは、どうすれば自分がやろうとしていることを達成できますか? このライブラリに使用できる別の実装がありますか、それともequals()
メソッドを変更するのは良い考えですか?
java - DB スキーマのカタログを作成する (Java)
この質問で、私は自分の「問題」を解決するためのアイデアを得たいと思っています。
したがって、データベーススキーマを「カタログ化」する必要があります。存在するすべてのテーブルと、それらの間の関係。でプロジェクトを開発しているJAVA
ので、それを続けたいと思います。そのカタログを取得した後、いくつかのテーブル名でクエリを実行し、それらの間の関係を取得したいと思います。私の考えは、頂点がDBテーブルであり、エッジがそれらの間の関係を示す一種のグラフを持つことです。私は見始めましたJGraphT library
。しかし、それでいくつかの情報をエッジに「割り当てる」ことは可能ですか?
グラフは出発点にすぎません。別の構造を使用するようにアドバイスしていただければ、より多くのオプションを「聞く」ことができます.
java - ルートとリーフを指定してグラフからツリーを取得する
jgrapht と jung の両方を見ていますが、やりたいことを実行できる方法が見つからないようです。
グラフがあり、ルート ノードといくつかの葉を指定して、そこからツリーを取得するか、それが不可能な場合は少なくともエラーを取得したいと考えています。
jgraphT と jung の両方が、グラフから最小スパニング ツリーを取得するためのアルゴリズムを持っているようですが、取得されたツリーはランダムであり、特定のノードがリーフになり、別のノードがリレーになるとは誰も保証しません....
java - jGraphT DirectedWeightedMultigraph の等しい頂点
「カスタマイズされた」頂点とエッジを持つ DirectedWeightedMultigraph が必要です。このコードでは、v1 と v4 は同じキーを持っているため、頂点を 3 つだけにしたいのですが、4 つ持っています。
これは私の頂点がどのように見えるかです:
}
私のエッジは次のように見えます
}
エッジを使用する前に、頂点とエッジの equals と hashCode に関するthisとthisを読みました。ParanoidGraph も使用しようとしましたが、機能しません。この問題を解決するために、頂点を追加する前に、特定のキーを持つ頂点が vertexSet にあるかどうかを「手動で」チェックすることにしました。しかし、コードの何が問題なのかがわかりません。まだ 4 つの頂点があります。
java - JGraphT を使用してカスタム頂点を参照してエッジを追加する方法
SimpleWeightedGraph<Vertex, DefaultWeightedEdge> g
Vertex がカスタム クラスであるグラフがあります。postgresql 空間データベースにすべての頂点とエッジがあります。
2 つの頂点からのパスを見つけるには、それらのサブセットのみを読み込む必要があるため、いくつかのクエリを使用します。
Vertex クラスにはString
、db からロードする as 識別子とその他のパラメーターがあります。後で必要になります。
最初に、必要なすべての頂点をいくつかのクエリで読み込みます。2 回目に (他のクエリを使用して) エッジを追加しますが、既にグラフにある頂点を参照する必要があります。
ここで質問:どうすればこれを作ることができますか?
ここに私のコードの抜粋があります。
Vertex クラス:
(同じ ID を持っている場合、Vertex は等しくなり、ID によって文字列と同じ自然な順序で並べられます。また、可能にしたいvertex.equals("something")
)
グラフの頂点を作成するコードの別の部分の抜粋:
次に、エッジを作成する必要があります。コードは次のとおりです。
私も試しました:
しかし、これは機能しません。エッジを追加すると、ソース頂点とターゲット頂点 (既にグラフにある) は、id 以外のすべてのパラメーターを失います。
それらをどのように参照できますか?ありがとう。
java - 推移閉包によって完了した DAG 内の最近傍頂点の計算
次のような有向グラフを考えてみましょう。
ここで、(A) 最初は、真っ黒なエッジがアサートされます。
- 0 → {1,3}
- 1 → {2}
- 3 → {4}
- 4 → {2}
次に、(B)推移閉包が計算され、次の (破線) エッジが追加されます。
- 0 → {2,4}
- 3 → {2}
この最終的なグラフの任意の頂点について、別の長いパスではアクセスできないエッジからアクセスできる「即時」の隣人を効率的に計算するにはどうすればよいでしょうか? 私が望む出力は(A)に示されています。アサートされたエッジ (太字) または推論されたエッジ (破線) を区別していません。
この問題にはよく知られている名前がありますか? JGraphTでこれを達成する簡単な方法はありますか?
考え:
おそらくこれは、頂点のトポロジカルソートを使用することで可能TS = [0,1,3,4,2]
です。
基本的にはトポロジカルソートで v0 > v2 > v1 の場所に (v0 → ... v2 ... → v1) という長いパスが他に存在しない場合、 (v0 → v1) が解であると考えています。これは正しいように見えますか、またはより効率的な方法はありますか?
jgrapht - Equals between two graphs 失敗..どうして?
2 つの jgraphT インスタンスを単純に等しくしようとしましたが、それらが同一であっても false を返します。次に、私の実装で equals をオーバーライドしようとしました。
そして、そのエッジが EXACT オブジェクトでない場合、containsEdge() メソッドが失敗することがわかりました。エッジとスイッチの両方の equals メソッドをオーバーライドしたことを確認したため、これは奇妙です...
編集:この実験を行いました:
ご覧のとおり、containsVertex() メソッドは機能していないようです。
edit2:愚かなフリークのおかげで、ほとんど解決しました: hashcode() メソッドもオーバーライドする必要がありました。現在、これは頂点では機能しましたが、エッジではハッシュコードで null ポインター例外が発生しました。これは私のオーバーライドされたメソッドです。
グラフにエッジを作成しようとすると、null ポインターが返されます (ここで hashcode() が呼び出されると思います)。
問題は、 getSource() と getTarget() がその瞬間に呼び出されたときに null を返すように見えることです...どうすれば解決できますか? これは例外スタックです:
スレッド「メイン」での例外 java.util.HashMap.hash(HashMap.java:366) での org.at.network.types.CustomE.hashCode(CustomE.java:71) での java.lang.NullPointerException。 org.jgrapht.graph.AbstractBaseGraph.containsEdge(AbstractBaseGraph.java:359) で java.util.HashMap.containsKey(HashMap.java:453) で HashMap.getEntry(HashMap.java:466) org.jgrapht.graph.AbstractBaseGraph でorg.jgrapht.graph.GraphDelegator.addEdge(GraphDelegator.java:131) の .addEdge(AbstractBaseGraph.java:208) org.jgrapht.graph.DefaultListenableGraph.addEdge(DefaultListenableGraph.java:162) の org.at.network。 types.MyGraph.addCustomEdge(MyGraph.java:27) at org.at.network.Test.main(Test.java:220)
addcustomedge メソッドは次のとおりです。
ポートは、いくつかの文字列の単純なデータ構造です。
java - jgrapht を使用したカスタム Edge
カスタム エッジを定義したい
しかし、私が使用しようとすると、super()
それは可能ですか? グラフを作成するとき、EdgeFactory には何を使用すればよいですか?
これで十分でしょうか?EdgeFactory
または、同様に拡張する新しいクラスを作成する必要がありますか?
java - JPanelでSimpleWeightedGraphを描画するには?
SimpleWeightedGraph があり、JFrame の JPanel に描画したいと考えています。残念ながら何も描かれていません。
この記事を読みました。彼らは を使用しているListenableDirectedGraph
ので、 を試しましたListenableUndirectedGraph
が成功しませんでした。