示例#1
0
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)
示例#2
0
    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)
示例#3
0
文件: VRP.py 项目: micostabal/VMND
    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)
示例#4
0
    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)
示例#5
0
文件: TSP.py 项目: micostabal/VMND
    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
示例#6
0
文件: IRPCS.py 项目: micostabal/VMND
    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)