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]
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)
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]
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)