4
 g1=Graph[{UndirectedEdge[a,b]}];
 GraphQ[g1]
 (*
   OUT: True
 *)
   (*Needs["Combinatorica`"]*)
 PlanarQ[g1]
 (*
    OUT: PlanarQ[.-.]
 *)
 Combinatorica`PlanarQ[g1]
 (*
   OUT: Combinatorica`PlanarQ[.-.]
 *)

PlanarQが「True」または「False」を返さないのはなぜですか?

4

4 に答える 4

4

あなたのグラフはグラフCombinatoricaではなく、Systemグラフです。コンテキストを明示的に指定する必要があります。

Needs["GraphUtilities`"];
g1 = System`Graph[{UndirectedEdge[a, b]}];
Combinatorica`PlanarQ[
  GraphUtilities`ToCombinatoricaGraph[g1]]

これは戻りますTrueが、一般に、このプロセスは面倒でバグが多いです。私はそれが途方に暮れていると信じてCombinatoricaおり、それなしでやっていくことをお勧めします.

于 2011-06-02T12:37:06.477 に答える
2

ちょっと注意してください、Combinatoricaは途中です。ただし、3か月前、Graphプロジェクトのリーダーから、SystemGraphのようなアルゴリズム固有のインターフェイスを再実装する計画はないと言われましたBrelazColoring。したがって、しばらく時間がかかる場合がありますCombinatorica。これに対処する1つの方法は、すべてにSystem'Graphを使用Combinatoricaし、パッケージパスを避け、GraphオブジェクトをCombinatorica'Graphオブジェクトに明示的に変換してCombinatorica関数にアクセスすることです。 、Combinatorica`関数を呼び出してから、システムグラフに変換し直します。これが詳細との議論です

後世のrelabelGraphために、TomDによって報告された順序の問題を解決するために私が使用する関数は次のとおりです。

relabelGraph[g_Graph,labeling_]:=Module[{vcoords,gstyle,labelMap,adjMat,newOrder,newCoords,verts},
    verts=VertexList@g;
    vcoords=VertexCoordinates/.AbsoluteOptions[g,VertexCoordinates];
    gstyle=GraphStyle/.AbsoluteOptions[g,GraphStyle];
    labelMap=Thread[Range[Length[verts]]->labeling];

    adjMat=Normal@AdjacencyMatrix[g];
    newOrder=Ordering[VertexList[g]/.labelMap];

    newCoords=Thread[(VertexList[g]/.labelMap)->vcoords];

    AdjacencyGraph[adjMat[[newOrder,newOrder]],VertexCoordinates->newCoords,GraphStyle->gstyle]
];

それを使用する1つの方法は以下の通りです。これによりIndexGraph、と同様の結果が生成されますが、並べ替えられますVertexList

g=relabelGraph[g,Range@Length@VertexList@g];

私の「不快感の修正」機能の他のいくつかは、ここgraphUsage.nbのパッケージで説明されています

于 2011-06-03T16:25:54.767 に答える
2

おそらく次のものが必要です。

Needs["GraphUtilities`"]
Needs["Combinatorica`"]

cg1 = ToCombinatoricaGraph[g1];

PlanarQ[cg1]

ただし、チェックするv8はありません。

于 2011-06-02T12:20:04.323 に答える
1

これも単なるメモです。

考えられるバグと回避策に特に注意を向けたいと思いToCombinatoricaGraphます。元の質問とは関係ないかもしれません。

また、Mma 7 を使用しているため、v8 で修正される可能性があります。

次のようにグラフを定義すると

Needs["Combinatorica`"]

Needs["GraphUtilities`"]

gr1 = {2 -> 4, 4 -> 3, 3 -> 1}

gr1のGraphPlot

ここに画像の説明を入力

以下を比較してください。

EdgeList@gr1
EdgeList@ToCombinatoricaGraph@gr1
Edges@ToCombinatoricaGraph@gr1

出力

{{2, 4}, {4, 3}, {3, 1}}
{{1, 2}, {2, 3}, {3, 4}}
{{1, 2}, {2, 3}, {3, 4}}

私が使用する回避策は、可能な限り無視し、代わりに を使用してCombinatoricaグラフToCombinatoricaGraphに変換することです。FromOrderedPairs

例えば

Edges@FromOrderedPairs@EdgeList@gr1
EdgeList@FromOrderedPairs@EdgeList@gr1

出力

{{2, 4}, {4, 3}, {3, 1}}
{{2, 4}, {3, 1}, {4, 3}}

もう一つの例、Degrees

比較

Degrees@MakeSimple@ToCombinatoricaGraph[gr1]
VertexList@MakeSimple@ToCombinatoricaGraph[gr1]

出力

{1, 2, 2, 1}
{1, 2, 3, 4}

Degrees@MakeSimple@FromOrderedPairs@EdgeList@gr1
VertexList@MakeSimple@FromOrderedPairs@EdgeList@gr1

{1, 1, 2, 2}
{1, 2, 3, 4}

また、Prufer コードの例も含めます。

LabeledTreeToCode@MakeSimple@ToCombinatoricaGraph@gr1
LabeledTreeToCode@MakeSimple@FromOrderedPairs@EdgeList@gr1

出力

{2, 3}
{3, 4}

(2番目の答えだけが正しいです)

これを Wolfram に報告しました。によるグラフ作成時の頂点の並べ替えにつながっているようToCombinatoricaGraphです。これが返信の一部です(2009)

Edges と EdgeList が ToCombinatoricaGraph オブジェクトで機能しない理由は、Combinatorica パッケージがこれらの関数よりも前に開発されており、構造がこれらの関数で動作するようにまだ適合されていないためです。

Our development team is currently working to update the Combinatorica
package so that these functions will be compatible.  If you happen to

他の問題に出くわしたり、質問がある場合は、お知らせください。

私の見解でToCombinatoricaGraphは、注意して使用する必要があります (可能な限り避けてください)。ただし、違いがない場合(元の質問に対する他の回答で与えられた使用法を含む)はおそらく多くの場合があります。

個人的には、Combinatoricaパッケージがなくなるのは見たくありません。多くの便利な機能が含まれています (ドキュメントが非常に悪い場合)。

于 2011-06-03T17:31:18.060 に答える