definition 1.1 from really cool book "The Design of Approximation Algorithms":
An α-approximation algorithm for an optimization problem is a polynomial-time algorithm that for all instances of the problem produces a solution whose value is within a factor of α of the value of an optimal solution
so you need first to estimate at least size of possible optimal solution, right?
Surprisingly I was unable to find it for maximal clique. stackexchange offers very simple formula (spoiler: the actual size is a couple of orders of magnitude smaller). python networkX offers method with complexity O(1.4422n) to find maximal clique itself only. cool. Let's invent this algorithm by ourselves
From wikipedia:
A clique, C, in an undirected graph G = (V, E) is a subset of the vertices, C ⊆ V, such that every two distinct vertices are adjacent
in other words this means that graph with maximal clique of size K should contains at least K vertices with degree K - 1 or bigger. So we can arrange vertices on degrees and find some degree S where amount of vertices with degree S or bigger is >= S. But this is very rough estimation and it could be refined taking into account the following observation - we can remove all edges to vertices not belonging to this subgraph. So algo is:
- calculate degrees of all vertices and arrange them in descending order
- for each degree S find first where amount of vertices with degree S or bigger is >= S
- put all such vertices in sub-graph SD
- remove from SD all edges to vertices not belonging to SD
- recalculate degrees of all vertices in SD
- find another degree S in SD where amount of vertices with degree S or bigger is >= S. this will be result R
next we can repeat steps 2-6 until enumerate all degrees or some degree will be less than the previously found result R
Complexity
Let N - amount of vertices and M - amount of edges. Then cycle can run max N times and in each cycle we can remove less that M edges (actually in average M/2), so in worst case complexity is O(MN/2)
Results
on graph with N = 20000 and M = 170000:
19 on degree 19, 7216 vertices in SD
predicted with stackexchange: 590.205223
on graph with N = 200000 and M = 1700000:
20 on degree 19, 69489 vertices in SD
predicted with stackexchange: 1846.546113
The strangest thing here is that amount of vertices in SD reduced in ~3 times from whole original graph - like degree in Bron–Kerbosch algorithm
Комментариев нет:
Отправить комментарий