Beispiel #1
0
    def BULK(self, graph, Q, Wq, k, d):
        l = 0
        Gl1 = copy.deepcopy(graph)
        distG = GraphFunc.getDistG(graph, Q)
        d = max(max(distG.values()), d)
        S = [v for v in Gl1.keys() if distG[v] <= d]
        Gl2 = GraphFunc.buildNewGraph(Gl1, S)
        ktemp = self.INF
        TE, supE = ATindex.StructuralTrussness(Gl2)
        for q in Q:
            ktmp = max(TE[self.cedge(q, v)] for v in Gl2[q][0])
            k = min(ktemp, ktmp)
        k = min(ktemp, k)
        while True:
            if k == 2: break
            if GraphFunc.connected(self.MaintainKDTruss(k, d, Gl2, Q, Wq), Q):
                break
            k -= 1
        Gl = self.MaintainKDTruss(k, d, Gl2, Q, Wq)
        maxfunc, ansg = -self.INF, None
        while GraphFunc.connected(Gl, Q):
            attriscore = AttributeScoreFunc.attributeScore(Gl, Wq)
            if maxfunc < attriscore:
                maxfunc, ansg = attriscore, copy.deepcopy(Gl)

            gain = AttributeScoreFunc.computeGainFunc(k, Gl, Wq)
            mingain = self.INF
            for v in gain:
                if gain[v] < mingain and not v in Q: mingain = gain[v]
            if mingain == self.INF:
                break
            S = [v for v in gain.keys() if gain[v] == mingain and not v in Q]
            if len(S) == 0:
                break
            S = random.sample(
                S, max(1, int(len(S) * self.erlta / (self.erlta + 1))))
            edgesToDelete = GraphFunc.getNeighborEdges(Gl, S)
            Gl = GraphFunc.deleteEdges(Gl, edgesToDelete)
            Gl = self.MaintainKDTruss(k, d, Gl, Q, Wq)
        return list(ansg.keys())
Beispiel #2
0
 def MaintainKDTruss(self, k, d, graph, Q, Wq):
     Gt = copy.deepcopy(graph)
     while GraphFunc.connected(Gt, Q):
         TE, supE = ATindex.StructuralTrussness(Gt)
         distG = GraphFunc.getDistG(Gt, Q)
         edgestodelete = {}
         for v in distG:
             if distG[v] > d:
                 for u in Gt[v][0]:
                     edgestodelete[self.cedge(u, v)] = 1
         for e in supE:
             if supE[e] < k - 2:
                 edgestodelete[e] = 1
         if len(edgestodelete) == 0: return Gt
         Gt = GraphFunc.deleteEdges(Gt, edgestodelete)
         if len(Gt) == 0: break
     return Gt