Example #1
0
    def solve1it(self, I):
        self.tinit = time.time()
        random.seed(self.semente)
        Lreq = I.splitReq()
        Lresp = [
        ]  # Lista com os caminhos e os indices dos grafos da requisições
        maxv = max(Lreq, key=lambda maxcmin: maxcmin.cmin)
        maxcm = maxv.cmin  # Atribuindo o maior caminho minimo dos dados
        Glist = [strgr.Rede(I.CriaGrafo(), 1)]  # Lista de grafos
        random.shuffle(Lreq)  # Randomizando a Lista de requisição

        if self.ord == 'cm':
            # Ordenando a Lista de requisiçao em ordem decrescente em relação o Cammin
            Lreq.sort(key=lambda cammin: cammin.cmin, reverse=True)
        elif self.ord == 'fm':
            Lreq.sort(key=lambda cammin: cammin.mxf)
        elif self.ord == 'cm_fm':
            Lreq.sort(key=lambda cammin: (cammin.cmin, (cammin.mxf * -1)),
                      reverse=True)
        elif self.ord == 'fm_cm':
            Lreq.sort(key=lambda cammin: ((cammin.mxf * -1), cammin.cmin),
                      reverse=True)
        result = self.solver.solve(Lreq, Glist, I, Lresp, maxcm,
                                   np.inf)  # Metodo Kapov
        tfim = time.time() - self.tinit

        return [result, Glist, Lresp, tfim]
Example #2
0
    def solve(self, Lreq, Glist, I, LR, Maxv, melhor):
        mc = [
        ]  #Lista para converter a lista do caminho em lista de arestas encontrado

        for k in range(len(Lreq)):
            ig = 0  #Auxiliar para percorrer a lista de grafo
            caminho = False  # Indicador se encontrou o caminho da requisição

            while not caminho:
                if (
                        nkx.has_path(Glist[ig].Grafo, Lreq[k].i, Lreq[k].j)
                ):  #Verifica a existencia de caminho entre a origem e destino no grafo atual
                    Camin = nkx.shortest_path(Glist[ig].Grafo, Lreq[k].i,
                                              Lreq[k].j)
                    tamanho = len(
                        Camin
                    ) - 1  #Tamanho do caminho encontrado para origem e destino

                else:
                    tamanho = float('inf')

                if (
                        tamanho <= Maxv
                ):  #Verifica se o caminho encontrado é menor que o maior caminho minimo da instancia
                    for l in range(
                            0,
                            len(Camin) - 1
                    ):  #Transformar a lista de caminho encontrado em lista de arestas
                        mc.append((Camin[l], Camin[l + 1]))
                    LR.append(strgr.Resp(Camin.copy(), Glist[ig].numg))
                    Glist[ig].Grafo.remove_edges_from(mc)
                    mc.clear()
                    Camin.clear()
                    caminho = True

                elif (Glist[ig].numg < len(Glist)
                      ):  #Verifica se o grafo atual é o ultimo grafo da lista
                    ig = ig + 1
                    Camin.clear()

                elif (Glist[ig].numg == len(Glist)
                      ):  #Verifica se o grafo atual é o ultimo grafo da lista
                    if len(
                            Glist
                    ) == melhor - 1:  #Verifica se o numero de grafos ja criado é igual a melhor solução atual
                        Camin.clear()
                        return melhor
                    else:
                        g = I.CriaGrafo()
                        Glist.append(strgr.Rede(g, len(Glist) + 1))
                        Camin.clear()
                        ig = ig + 1

        return len(Glist)
Example #3
0
    def solve(self, I):
        self.tinit = time.time()
        bGl = []
        bLr = []
        random.seed(self.semente)
        Lreq = I.splitReq()
        Fo = np.inf  # Inicializando a Função objetivo com infinito
        maxv = max(Lreq, key=lambda maxcmin: maxcmin.cmin)
        maxcm = maxv.cmin  # Atribuindo o maior caminho minimo dos dados

        for i in range(self.niter):
            Glist = []  # Lista de grafos
            Lresp = [
            ]  # Lista com os caminhos e os indices dos grafos da requisições
            g = I.CriaGrafo()
            Glist.append(strgr.Rede(g, len(Glist) + 1))
            random.shuffle(Lreq)  # Randomizando a Lista de requisição
            if self.ord == 'cm':
                # Ordenando a Lista de requisiçao em ordem decrescente em relação o Cammin
                Lreq.sort(key=lambda cammin: cammin.cmin, reverse=True)
            elif self.ord == 'fm':
                Lreq.sort(key=lambda cammin: cammin.mxf)
            elif self.ord == 'cm_fm':
                Lreq.sort(key=lambda cammin: (cammin.cmin, (cammin.mxf * -1)),
                          reverse=True)

            elif self.ord == 'fm_cm':
                Lreq.sort(key=lambda cammin: ((cammin.mxf * -1), cammin.cmin),
                          reverse=True)

            result = self.solver.solve(Lreq, Glist, I, Lresp, maxcm,
                                       Fo)  # Metodo Kapov
            if result < Fo:
                Fo = result
                bGl = Glist
                bLr = Lresp

        tfim = time.time() - self.tinit
        return [Fo, bGl, bLr, tfim]
Example #4
0
    def solve(self, Lreq, Glist, I, LR, Maxv, melhor):
        if (melhor == np.inf):
            result = kv.kapovBFD.solve(self, Lreq, Glist, I, LR, Maxv, np.inf)
            melhor = result + 1
            LR.clear()

        Glist.clear()
        for x in range(melhor - 1):
            g = I.CriaGrafo()
            Glist.append(strgr.Rede(g, len(Glist) + 1))

        mc = [
        ]  # Lista para converter a lista do caminho em lista de arestas encontrado
        auxCamin = []

        for k in range(len(Lreq)):
            ig = 0  # Auxiliar para percorrer a lista de grafo
            caminho = False  # Indicador se encontrou o caminho da requisição
            mincam = float('inf')
            while not caminho:
                # Verifica a existencia de caminho entre a origem e destino no grafo atual
                if (nkx.has_path(Glist[ig].Grafo, Lreq[k].i, Lreq[k].j)):
                    Camin = nkx.shortest_path(Glist[ig].Grafo, Lreq[k].i,
                                              Lreq[k].j)
                    # Tamanho do caminho encontrado para origem e destino
                    tamanho = len(Camin) - 1

                else:
                    tamanho = float('inf')

                if tamanho == Lreq[k].cmin:
                    # Transformar a lista de caminho encontrado em lista de arestas
                    for l in range(0, len(Camin) - 1):
                        mc.append((Camin[l], Camin[l + 1]))
                    LR.append(strgr.Resp(Camin.copy(), Glist[ig].numg))
                    Glist[ig].Grafo.remove_edges_from(mc)
                    mc.clear()
                    Camin.clear()
                    caminho = True

                # Verifica se o caminho encontrado é menor que o maior caminho minimo da instancia
                elif tamanho <= Maxv or mincam <= Maxv:
                    if tamanho < mincam:
                        mincam = tamanho
                        auxg = ig
                        auxCamin.clear()
                        auxCamin = Camin.copy()
                        Camin.clear()
                        if Glist[ig].numg == len(Glist):
                            # Transformar a lista de caminho encontrado em lista de arestas
                            for l in range(0, len(auxCamin) - 1):
                                mc.append((auxCamin[l], auxCamin[l + 1]))
                            LR.append(
                                strgr.Resp(auxCamin.copy(), Glist[auxg].numg))
                            Glist[auxg].Grafo.remove_edges_from(mc)
                            mc.clear()
                            auxCamin.clear()
                            caminho = True
                        else:
                            ig = ig + 1

                    # Verifica se o grafo atual é o ultimo grafo da lista
                    elif (Glist[ig].numg < len(Glist)):
                        ig = ig + 1
                        Camin.clear()

                    elif (Glist[ig].numg == len(Glist)):
                        # Transformar a lista de caminho encontrado em lista de arestas
                        for l in range(0, len(auxCamin) - 1):
                            mc.append((auxCamin[l], auxCamin[l + 1]))
                        LR.append(strgr.Resp(auxCamin.copy(),
                                             Glist[auxg].numg))
                        Glist[auxg].Grafo.remove_edges_from(mc)
                        mc.clear()
                        auxCamin.clear()
                        caminho = True

                # Verifica se o grafo atual é o ultimo grafo da lista
                elif (Glist[ig].numg < len(Glist)):
                    ig = ig + 1
                    Camin.clear()

                # Verifica se o grafo atual é o ultimo grafo da lista
                elif (Glist[ig].numg == len(Glist)):
                    Camin.clear()
                    return melhor

        return len(Glist)