def varClusterFromMPS(path=os.path.join('MIPLIB', 'binkar10_1.mps'), numClu=10, varFilter=lambda x: x[0] == 'x'): m = read(path) if not varFilter: klist = list(map(lambda var: var.VarName, m.getVars())) else: klist = list( filter(varFilter, list(map(lambda var: var.VarName, m.getVars())))) outerNbhs = {i: (0, ) for i in range(1, numClu + 1)} labels = genClusterNeighborhoods(path=path, nClusters=numClu, verbose=True, fNbhs=True, varFilter=varFilter) def funNbhs(varName, depth, param): return depth != 1 + labels[varName] return Neighborhoods(lowest=1, highest=numClu, keysList=klist, outerNeighborhoods=outerNbhs, useFunction=True, randomSet=False, funNeighborhoods=funNbhs)
def genNeighborhoods(self, verbose=False, classic=False): klist = [ 'x_{}_{}'.format(i, j) for i in range(self.m) for j in range(self.n) ] if not classic: numClu = min(int(self.m * self.n / 10), 20) print(numClu) labelsDict = genClusterNeighborhoods( self.pathMPS, numClu, fNbhs=True, varFilter=lambda x: x[0] == 'x') def fClusterNbhs(varName, depth, param): return labelsDict[varName] != depth - 1 outerNbhs = {i: (0, ) for i in range(1, numClu + 1)} return Neighborhoods(lowest=1, highest=numClu, keysList=klist, randomSet=False, outerNeighborhoods=outerNbhs, useFunction=True, funNeighborhoods=fClusterNbhs) else: nSecond = 4 outerNbhs = { 1: tuple([i for i in range(1, self.m + 1)]), 2: tuple([i for i in range(1, nSecond + 1)]) } def fClassicNbhs(varName, depth, param): elements = varName.split('_') machine = int(elements[1]) job = int(elements[2]) if depth == 1: return machine != param elif depth == 2: return (param - 1) * int( self.n / nSecond) > job or job > param * int( self.n / nSecond) else: return True return Neighborhoods(lowest=1, highest=2, keysList=klist, randomSet=False, outerNeighborhoods=outerNbhs, useFunction=True, funNeighborhoods=fClassicNbhs)
def genNeighborhoods(self, varCluster=False, funNbhs=False): if varCluster: numClu = int(self.trucks * self.retailers / 7) outerNbhs = {i: (0, ) for i in range(1, numClu + 1)} labelsDict = genClusterNeighborhoods( self.pathMPS, numClu, fNbhs=True, varFilter=lambda x: x[0] == 'y') def fClusterNbhs(varName, depth, param): return labelsDict[varName] != depth - 1 klist = [ 'y_{}_{}_{}'.format(i, j, k) for i in range(self.retailers + 1) for j in range(self.retailers + 1) for k in range(1, self.trucks + 1) if i < j ] return Neighborhoods(lowest=1, highest=numClu, keysList=klist, randomSet=False, outerNeighborhoods=outerNbhs, useFunction=True, funNeighborhoods=fClusterNbhs) if funNbhs: def fNbhs(varName, depth, param): elements = varName.split('_') if len(elements) < 4: return False else: kl = int(elements[3]) il = int(elements[1]) jl = int(elements[2]) if depth == 1: return kl != param elif depth == 2: return kl != param[0] and kl != param[1] else: print('Error 23 Nbhds Function!! ') return 0 return False outer = { 1: tuple([tf for tf in range(1, self.trucks + 1)]), 2: tuple([(tr1, tr2) for tr1 in range(1, self.trucks + 1) for tr2 in range(1, self.trucks + 1) if tr1 < tr2]) } klist = [ 'y_{}_{}_{}'.format(i, j, k) for k in range(1, self.trucks + 1) for i in range(self.retailers + 1) for j in range(self.retailers + 1) if i < j ] return Neighborhoods(lowest=1, highest=2, keysList=klist, randomSet=False, outerNeighborhoods=outer, funNeighborhoods=fNbhs, useFunction=True) outerN = { 1: { truck: [ 'y_{}_{}_{}'.format(i, j, k) for k in range(1, self.trucks + 1) for i in range(self.totalNodes) for j in range(self.totalNodes) if i < j and k != truck ] for truck in range(1, self.trucks + 1) }, 2: {(tr1, tr2): [ 'y_{}_{}_{}'.format(i, j, k) for k in range(1, self.trucks + 1) for i in range(self.totalNodes) for j in range(self.totalNodes) if i < j and k != tr1 and k != tr2 ] for tr1 in range(1, self.trucks + 1) for tr2 in range(1, self.trucks + 1) if tr1 < tr2} } return Neighborhoods(lowest=1, highest=2, keysList=None, randomSet=False, outerNeighborhoods=outerN)
def genNeighborhoods(self, k=25, Kvicinities=False, funNbhs=False, varCluster=False): if varCluster: numClu = int(self.H * self.V / 7) outerNbhs = {i: (0, ) for i in range(1, numClu + 1)} labelsDict = genClusterNeighborhoods( self.pathMPS, numClu, fNbhs=True, varFilter=lambda x: x[0] == 'x') def fClusterNbhs(varName, depth, param): return labelsDict[varName] != depth - 1 klist = [ 'x_{}_{}_{}'.format(i, j, t) for i in range(self.V + 1) for j in range(self.V + 1) for t in range(1, self.H + 1) if i != j ] return Neighborhoods(lowest=1, highest=numClu, keysList=klist, randomSet=False, outerNeighborhoods=outerNbhs, useFunction=True, funNeighborhoods=fClusterNbhs) if funNbhs: X = self.positions # In larrain et al 2019 the neighbors parameter is set to 20. nbrs = NearestNeighbors(n_neighbors=20, algorithm='ball_tree').fit(X) indices = nbrs.kneighbors(X)[1] def fNbhs(varName, depth, param): elements = varName.split('_') if len(elements) < 4: return False else: tl = int(elements[3]) il = int(elements[1]) jl = int(elements[2]) if depth == 1: return tl != param elif depth == 2: return il not in indices[param] and jl not in indices[ param] else: print('Error 23 Nbhds Function!! ') return 0 return True outer = { 1: tuple([tf for tf in range(1, self.H + 1)]), 2: tuple([i for i in range(1, self.V + 1)]) } klist = [ 'x_{}_{}_{}'.format(i, j, t) for t in range(1, self.H + 1) for i in range(self.V + 1) for j in range(self.V + 1) if i != j ] return Neighborhoods(lowest=1, highest=2, keysList=klist, randomSet=False, outerNeighborhoods=outer, funNeighborhoods=fNbhs, useFunction=True) if Kvicinities: X = self.positions nbrs = NearestNeighbors(n_neighbors=k, algorithm='ball_tree').fit(X) indices = nbrs.kneighbors(X)[1] outerMVRPD = { 1: { # Period Neighborhood tAct: tuple([ 'x_{}_{}_{}'.format(i, j, t) for i in range(self.V + 1) for j in range(self.V + 1) for t in range(1, self.H + 1) if i != j and t != tAct ]) for tAct in range(1, self.H + 1) }, 2: { # k Vecinity Neighborhood ip: tuple([ 'x_{}_{}_{}'.format(i, j, t) for i in range(self.V + 1) for j in range(self.V + 1) for t in range(1, self.H + 1) if i != j and (i in indices[ip] or j in indices[ip]) ]) for ip in range(self.V + 1) } } return Neighborhoods(lowest=1, highest=2, keysList=None, randomSet=False, outerNeighborhoods=outerMVRPD, useFunction=False) else: X = self.positions kmp = 3 # K means parameter kmeans = KMeans(n_clusters=kmp, random_state=0).fit(X) labels = kmeans.labels_ outerMVRPD = { 1: { # Period Neighborhood tAct: tuple([ 'x_{}_{}_{}'.format(i, j, t) for i in range(self.V + 1) for j in range(self.V + 1) for t in range(1, self.H + 1) if i != j and t != tAct ]) for tAct in range(1, self.H + 1) }, 2: { # K means Neighborhood (selK, tAct): tuple([ 'x_{}_{}_{}'.format(i, j, t) for i in range(self.V + 1) for j in range(self.V + 1) for t in range(1, self.H + 1) if i != j and t != tAct and labels[i] != selK and labels[j] != selK ]) for selK in range(kmp) for tAct in range(1, self.H + 1) } } return Neighborhoods(lowest=1, highest=2, keysList=None, randomSet=False, outerNeighborhoods=outerMVRPD)
def genNeighborhoods(self, setRandom=False, varCluster=False): if varCluster: numClu = int(self.n / 20) + 1 outerNbhs = {i: (0, ) for i in range(1, numClu + 1)} labelsDict = genClusterNeighborhoods( self.pathMPS, numClu, fNbhs=True, varFilter=lambda x: x[0] == 'x') def fClusterNbhs(varName, depth, param): return labelsDict[varName] != depth - 1 klist = [ 'x_{}_{}'.format(i, j) for i in range(self.n) for j in range(self.n) if i < j ] return Neighborhoods(lowest=1, highest=numClu, keysList=klist, randomSet=False, outerNeighborhoods=outerNbhs, useFunction=True, funNeighborhoods=fClusterNbhs) if not setRandom: outer = {} groups = [5] for k in range(1, 2): kmeans = KMeans(n_clusters=groups[k - 1], random_state=0).fit(self.positions) labels = kmeans.labels_ params = {} for i in range(groups[k - 1]): indexes = [ index for index in range(self.n) if labels[index] == i ] params[i] = [ 'x_{}_{}'.format(i, j) for i in indexes for j in indexes if i < j ] outer[k] = params nNbh = Neighborhoods(1, 2, keysList=None, randomSet=False, outerNeighborhoods=outer) return nNbh else: nNbh = Neighborhoods(1, 4, keysList=[ 'x_{}_{}'.format(i, j) for i in range(self.n) for j in range(self.n) if i < j ], randomSet=True, outerNeighborhoods=None) return nNbh
def genNeighborhoods(self, varCluster=False, k=20, funNbhs=False): if funNbhs: def fNbhs(varName, depth, param): elements = varName.split('_') if len(elements) < 5: return False else: kl = int(elements[3]) tl = int(elements[4]) if depth == 2: return (kl, tl) != param elif depth == 3: return tl != param elif depth == 4: return kl != param elif depth == 5: return tl != param[0] and tl != param[1] else: print('Error 23 Nbhds Function!! ') return 0 return False outer = { 2: tuple([(kf, tf) for kf in range(1, self.K + 1) for tf in range(1, self.H + 1)]), 3: tuple([tf for tf in range(1, self.H + 1)]), 4: tuple([kf for kf in range(1, self.K + 1)]), 5: tuple([(tf1, tf2) for tf1 in range(1, self.H + 1) for tf2 in range(1, self.H + 1) if tf1 < tf2]) } klist = [ 'x_{}_{}_{}_{}'.format(i, j, k, t) for k in range(1, self.K + 1) for t in range(1, self.H + 1) for i in range(self.V + 1) for j in range(self.V + 1) if i < j ] return Neighborhoods(lowest=2, highest=5, keysList=klist, randomSet=False, outerNeighborhoods=outer, funNeighborhoods=fNbhs, useFunction=True) if varCluster: amountClusters = self.H * self.K outerNbhs = {i: (0, ) for i in range(1, amountClusters + 1)} labelsDict = genClusterNeighborhoods( self.pathMPS, amountClusters, fNbhs=True, varFilter=lambda x: x[0] == 'x') def fClusterNbhs(varName, depth, param): return labelsDict[varName] == depth klist = [ 'x_{}_{}_{}_{}'.format(i, j, k, t) for k in range(1, self.K + 1) for t in range(1, self.H + 1) for i in range(self.V + 1) for j in range(self.V + 1) if i < j ] return Neighborhoods(lowest=1, highest=amountClusters, keysList=klist, randomSet=False, outerNeighborhoods=outerNbhs, useFunction=True, funNeighborhoods=fClusterNbhs) outerNhs = { 2: {(kf, tf): [ '{}_{}_{}_{}_{}'.format('x', i, j, k, t) for k in range(1, self.K + 1) for t in range(1, self.H + 1) for i in range(self.V + 1) for j in range(self.V + 1) if i < j and (k, t) != (kf, tf) ] for kf in range(1, self.K + 1) for tf in range(1, self.H + 1)}, 3: { tf: [ '{}_{}_{}_{}_{}'.format('x', i, j, k, t) for k in range(1, self.K + 1) for t in range(1, self.H + 1) for i in range(self.V + 1) for j in range(self.V + 1) if i < j and t != tf ] for tf in range(1, self.H + 1) }, 4: { kf: [ '{}_{}_{}_{}_{}'.format('x', i, j, k, t) for k in range(1, self.K + 1) for t in range(1, self.H + 1) for i in range(self.V + 1) for j in range(self.V + 1) if i < j and k != kf ] for kf in range(1, self.K + 1) }, 5: {(tf1, tf2): [ '{}_{}_{}_{}_{}'.format('x', i, j, k, t) for k in range(1, self.K + 1) for t in range(1, self.H + 1) for i in range(self.V + 1) for j in range(self.V + 1) if i < j and tf1 != t and tf2 != t ] for tf1 in range(1, self.H + 1) for tf2 in range(1, self.H + 1) if tf1 < tf2} } return Neighborhoods(lowest=2, highest=5, keysList=None, randomSet=False, outerNeighborhoods=outerNhs, useFunction=False)