Option
Explicit
' Ostergard, P.R.J.: A fast algorithm for the maximum
clique problem, Discrete Applied Mathematics, Vol. 120. (2002) 197-207
' (without
compressing graphs etc)
Private level_nodes()
As Long, nStart() As Long, NodesNum()
As Long
Private t As
Long, mnMaxClique As Long
Private nMaxCliques()
As Long
'
Public
Function Start() As Long
Dim i As Long,
t_minus_1 As Long, nn As Long
ReDim level_nodes(1
To Nodes, 1 To Nodes)
ReDim NodesNum(1
To Nodes)
ReDim nStart(1
To Nodes)
ReDim nMaxCliques(1
To Nodes)
' ReDim degree_arr(1
To nodes) As Long
mnMaxClique
= 0
'''''' each level has its own set of nodes
For i = 1 To Nodes
level_nodes(1, i) = i
Next
NodesNum(1) = Nodes
'''''''''''''''''''''''''''''''''''
DefineClasses
For nn = Nodes To 1 Step -1
t = 2
NodesNum(t) = 0
For i = nn + 1 To Nodes
If arr(level_nodes(1, nn), level_nodes(1, i)) Then
NodesNum(t) = NodesNum(t) + 1
level_nodes(t, NodesNum(t))
= level_nodes(1, i)
End If
Next
If NodesNum(t) = 0 Then
t = t - 1
If t > mnMaxClique
Then mnMaxClique = t
Else
nStart(t) = 0
End If
While t >= 2
nStart(t) = nStart(t) + 1
''' Degree control
If (t + NodesNum(t) - nStart(t)) > mnMaxClique And _
(t + nMaxCliques(level_nodes(t, nStart(t)))) > mnMaxClique Then
t_minus_1 = t
t = t + 1
nStart(t) = 0
NodesNum(t) = 0
''' define nodes for the next level
For i = nStart(t_minus_1)
+ 1 To NodesNum(t_minus_1)
If arr(level_nodes(t_minus_1,
nStart(t_minus_1)), level_nodes(t_minus_1,
i)) Then
NodesNum(t) = NodesNum(t) + 1
level_nodes(t, NodesNum(t))
= level_nodes(t_minus_1, i)
End If
Next
If NodesNum(t) = 0 Then
t = t - 1
If t > mnMaxClique
Then
mnMaxClique = t
t = 1
End If
End If
Else
t = t - 1
End If
Wend
nMaxCliques(level_nodes(1, nn)) = mnMaxClique
Next
Start = mnMaxClique
End
Function
Private Sub
DefineClasses()
Dim class_init() As Boolean '' show if
node exist
Dim i As Long, k As Long
Dim mnRemainNodes
As Long, bFirstNode As Boolean, nkNode
As Long, nNodeNum As Long
ReDim class_init(1
To Nodes)
'''''
mnRemainNodes
= Nodes
While True
''' build up new class
bFirstNode
= True
''' position of first node
i = mnRemainNodes
While i > 0
''' swap nodes
nNodeNum
= level_nodes(1, i)
If i <> mnRemainNodes Then
''' swap rows
level_nodes(1, i)
= level_nodes(1, mnRemainNodes)
level_nodes(1, mnRemainNodes)
= nNodeNum
End If
'''
mnRemainNodes
= mnRemainNodes - 1
If mnRemainNodes
= 0 Then Exit Sub
If bFirstNode
Then
For k = 1 To mnRemainNodes
nkNode
= level_nodes(1, k)
class_init(nkNode)
= arr(nNodeNum, nkNode)
Next
bFirstNode
= False
Else
For k = 1 To mnRemainNodes
nkNode
= level_nodes(1, k)
class_init(nkNode)
= arr(nNodeNum, nkNode) Or class_init(nkNode)
Next
End If
For i = mnRemainNodes To 1 Step -1
If Not class_init(level_nodes(1,
i)) Then Exit For
Next
Wend
Wend
End Sub