DarthVader
DarthVader

Reputation: 55022

Graph Isomorphism

Is there an algorithm or heuristics for graph isomorphism?

Corollary: A graph can be represented in different different drawings.

What s the best approach to find different drawing of a graph?

Upvotes: 17

Views: 9210

Answers (9)

estama
estama

Reputation: 71

I've found out that the algorithm belongs in the category of k-dimension Weisfeiler-Lehman algorithms, and it fails with regular graphs. For more here:

http://dabacon.org/pontiff/?p=4148

Original post follows:

I've worked on the problem to find isomorphic graphs in a database of graphs (containing chemical compositions).

In brief, the algorithm creates a hash of a graph using the power iteration method. There might be false positive hash collisions but the probability of that is exceedingly small (i didn't had any such collisions with tens of thousands of graphs).

The way the algorithm works is this:

Do N (where N is the radius of the graph) iterations. On each iteration and for each node:

  • Sort the hashes (from the previous step) of the node's neighbors
  • Hash the concatenated sorted hashes
  • Replace node's hash with newly computed hash

On the first step, a node's hash is affected by the direct neighbors of it. On the second step, a node's hash is affected by the neighborhood 2-hops away from it. On the Nth step a node's hash will be affected by the neighborhood N-hops around it. So you only need to continue running the Powerhash for N = graph_radius steps. In the end, the graph center node's hash will have been affected by the whole graph.

To produce the final hash, sort the final step's node hashes and concatenate them together. After that, you can compare the final hashes to find if two graphs are isomorphic. If you have labels, then add them (on the first step) in the internal hashes that you calculate for each node.

There is more background here:

https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF

You can find the source code of it here:

https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py

Upvotes: 0

user5501583
user5501583

Reputation:

As for heuristics: i've been fantasising about a modified Ullmann's algorithm, where you don't only use breadth first search but mix it with depth first search the way, that first you use breadth first search intensively, than you set a limit for breadth analysis and go deeper after checking a few neighbours, and you lower the breadh every step at some amount. This is practically how i find my way on a map: first locate myself with breadth first search, then search the route with depth first search - largely, and this is the best evolution of my brain has ever invented. :) On the long term some intelligence may be added for increasing breadth first search neighbour count at critical vertexes - for example where there are a large number of neighbouring vertexes with the same edge count. Like checking your actual route sometimes with the car (without a gps).

Upvotes: 0

Human Learning
Human Learning

Reputation: 111

nauty and Traces are programs for computing automorphism groups of graphs and digraphs [*]. They can also produce a canonical label. They are written in a portable subset of C, and run on a considerable number of different systems.

Upvotes: 1

trg787
trg787

Reputation: 219

My project - Griso - at sf.net: http://sourceforge.net/projects/griso/ with this description:
Griso is a graph isomorphism testing utility written in C++. It is based on my own POLYNOMIAL-TIME (in this point the salt of the project) algorithm. See Griso's sample input/output on http://funkybee.narod.ru/graphs.htm page.

Upvotes: 2

Igor Markov
Igor Markov

Reputation: 141

A very similar problem - graph automorphism - can be solved by saucy, which is available in source code. This finds all symmetries of a graph. If you have two graphs, join them into one and any isomorphism can be discovered as an automorphism of the join.

Disclaimer: I am one of co-authors of saucy.

Upvotes: 4

ravi
ravi

Reputation: 21

I recently came across the following paper : http://arxiv.org/abs/0711.2010 This paper proposes "A Polynomial Time Algorithm for Graph Isomorphism"

Upvotes: 2

Rich Apodaca
Rich Apodaca

Reputation: 29004

One of the best algorithms out there for finding graph isomorphisms is VF2.

I've written a high-level overview of VF2 as applied to chemistry - where it is used extensively. The post touches on the differences between VF2 and Ullmann. There is also a from-scratch implementation of VF2 written in Java that might be helpful.

Upvotes: 7

Stefano Borini
Stefano Borini

Reputation: 143765

It is a hell of a problem.

In general, the basic idea is to simplify the graph into a canonical form, and then perform comparison of canonical forms. Spanning trees are generated with this objective, but spanning trees are not unique, so you need to have a canonical way to create them.

After you have canonical forms, you can perform isomorphism comparison (relatively) easy, but that's just the start, since non-isomorphic graphs can have the same spanning tree. (e.g. think about a spanning tree T and a single addition of an edge to it to create T'. These two graphs are not isomorph, but they have the same spanning tree).

Other techniques involve comparing descriptors (e.g. number of nodes, number of edges), which can produce false positive in general.

I suggest you to start with the wiki page about the graph isomorphism problem. I also have a book to suggest: "Graph Theory and its applications". It's a tome, but worth every page.

As from you corollary, every possible spatial distribution of a given graph's vertexes is an isomorph. So two isomorph graphs have the same topology and they are, in the end, the same graph, from the topological point of view. Another matter is, for example, to find those isomorph structures enjoying particular properties (e.g. with non crossing edges, if exists), and that depends on the properties you want.

Upvotes: 15

Paul Hsieh
Paul Hsieh

Reputation: 1526

There are algorithms to do this -- however, I have not had cause to seriously investigate them as of yet. I believe Donald Knuth is either writing or has written on this subject in his Art of Computing series during his second pass at (re)writing them.

As for a simple way to do something that might work in practice on small graphs, I would recommend counting degrees, then for each vertex, also note the set of degrees for those vertexes that are adjacent. This will then give you a set of potential vertex isomorphisms for each point. Then just try all those (via brute force, but choosing the vertexes in increasing order of potential vertex isomorphism sets) from this restricted set. Intuitively, most graph isomorphism can be practically computed this way, though clearly there would be degenerate cases that might take a long time.

Upvotes: 3

Related Questions