Option
Explicit
'
Ostergard, P.R.J., A new algorithm for the maximum-weight clique problem.
Nordic Journal of Computing, Vol. 8. (2001) 424-436
' (without
compresing graphs etc)
Private
level_nodes() As Long, nStart() As Long, NodesNum() As Long
Private t
As Long, mnMaxClique As Long, nMaxCliques() As Long
Private
nLevelWAcc() As Long
'
Public
Function Start() As Long
Dim i As Long, t_minus_1 As Long, nn As Long,
wt As Long
ReDim level_nodes(1 To Nodes, 1 To Nodes, 0
To 1)
ReDim NodesNum(1 To Nodes)
ReDim nStart(1 To Nodes)
ReDim nMaxCliques(1 To Nodes)
mnMaxClique = 0
'''''' each level has its own set of nodes
For i = 1 To Nodes
level_nodes(1, i, 0) = i
Next
NodesNum(1) = Nodes
'''''''''''''''''''''''''''''''''''
DefineClasses
For i = 1 To Nodes
level_nodes(1, i, 1) = i
Next
ReDim nLevelWAcc(1 To Nodes)
For nn = Nodes To 1 Step -1
t = 2
NodesNum(t) = 0
nLevelWAcc(t) = w(level_nodes(1, nn, 0))
For i = nn + 1 To Nodes
If arr(level_nodes(1, nn, 0),
level_nodes(1, i, 0)) Then
NodesNum(t) = NodesNum(t) + 1
level_nodes(t, NodesNum(t), 0) =
level_nodes(1, i, 0)
level_nodes(t, NodesNum(t), 1) =
level_nodes(1, i, 1)
End If
Next
If NodesNum(t) = 0 Then
t = t - 1
If nLevelWAcc(t + 1) > mnMaxClique
Then
mnMaxClique = nLevelWAcc(t + 1)
End If
Else
nStart(t) = 0
End If
While t >= 2
nStart(t) = nStart(t) + 1
If NodesNum(t) < nStart(t) Then
t = t - 1
Else
wt = 0
For i = nStart(t) To NodesNum(t)
wt = wt + w(level_nodes(t, i, 0))
Next
''' Degree control
If (nLevelWAcc(t) + wt) >
mnMaxClique And _
(nLevelWAcc(t) +
nMaxCliques(level_nodes(t, nStart(t), 1))) > mnMaxClique Then
t_minus_1 = t
t = t + 1
nStart(t) = 0
NodesNum(t) = 0
nLevelWAcc(t) = nLevelWAcc(t_minus_1)
+ w(level_nodes(t_minus_1, nStart(t_minus_1), 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),
0), level_nodes(t_minus_1, i, 0)) Then
NodesNum(t) = NodesNum(t) + 1
level_nodes(t, NodesNum(t), 0) =
level_nodes(t_minus_1, i, 0)
level_nodes(t, NodesNum(t), 1) =
level_nodes(t_minus_1, i, 1)
End If
Next
If NodesNum(t) = 0 Then
t = t - 1
If nLevelWAcc(t + 1) >
mnMaxClique Then
mnMaxClique = nLevelWAcc(t + 1)
End If
End If
Else
t = t - 1
End If
End If
Wend
nMaxCliques(nn) = mnMaxClique
Next
''' return size of maximu clique
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, 0)
If i <> mnRemainNodes Then
''' swap rows
level_nodes(1, i, 0) = level_nodes(1,
mnRemainNodes, 0)
level_nodes(1, mnRemainNodes, 0) =
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, 0)
class_init(nkNode) = arr(nNodeNum,
nkNode)
Next
Else
For k = 1 To mnRemainNodes
nkNode = level_nodes(1, k, 0)
class_init(nkNode) = arr(nNodeNum,
nkNode) Or class_init(nkNode)
Next
End If
bFirstNode = False
For i = mnRemainNodes To 1 Step -1
If Not class_init(level_nodes(1, i, 0))
Then Exit For
Next
Wend
Wend
End Sub