Combinatorica`PlanarQ不起作用

时间:2011-06-02 11:47:11

标签: wolfram-mathematica mathematica-8

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

为什么PlanarQ不回馈“真”或“假”?

4 个答案:

答案 0 :(得分:4)

您的图表不是Combinatorica图表,而是System图表。您需要明确指定上下文。

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

这会返回True但是,一般来说,这个过程很痛苦而且很麻烦。我相信Combinatorica即将结束,我建议不要试着过去。

答案 1 :(得分:2)

您可能需要:

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

cg1 = ToCombinatoricaGraph[g1];

PlanarQ[cg1]

然而,我没有v8来检查。

答案 2 :(得分:2)

请注意,Combinatorica即将退出。但是,三个月前Graph项目的一位负责人告诉我,没有计划为System Graph重新实现算法特定接口,如BrelazColoring。因此,有些事情可能需要Combinatorica一段时间,而解决这个问题的一种方法是尝试将System'Graph用于所有内容,将Combinatorica保留在包路径之外,并通过以下方式获取Combinatorica函数:显式地将Graph对象转换为Combinatorica'Graph对象,调用Combinatorica`function然后转换回系统图。 Here is some discussion with the details

对于后代,这是我用来解决TomD报告的排序问题的relabelGraph函数,

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]
];

使用它的一种方法如下。这会产生与IndexGraph类似的结果,但排序为VertexList

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

我的“烦恼修复”功能的其他一些功能在包here

中的graphUsage.nb中有所描述

答案 3 :(得分:1)

这也只是一个注释。

我想特别提请注意ToCombinatoricaGraph中可能存在的错误以及可能的解决方法。它可能与原始问题无关。

另外,我使用的是Mma 7,因此可以在v8中修复。

如果我按如下方式定义图表

Needs["Combinatorica`"]

Needs["GraphUtilities`"]

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

gr1的GraphPlot

enter image description here

比较以下内容:

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}}

我使用的解决方法是尽可能忽略ToCombinatoricaGraph,而是使用FromOrderedPairs转换为 Combinatorica 图表。

例如

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 codes中添加一个示例,因为我在这里被“抓住了”(我当时不知道那样)

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

输出

{2, 3}
{3, 4}

(只有第二个答案是正确的)

我已向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 包。它包含许多有用的功能(如果记录非常严重)。