EA:Python中列表列表的自定义交叉功能

时间:2018-09-11 15:40:42

标签: python-3.x genetic-algorithm traveling-salesman evolutionary-algorithm crossover

有人可以向我解释一下如何对列表进行自定义交叉吗?假设我有这样的候选人:

candidate = [[0,1,2,3][4,5,6,7,8][9,10,11]]

我知道如何对单个列表进行交叉。但是实际上如何对列表列表进行操作?

这是单个列表的交叉方法:

@crossover
def partially_matched_crossover(random, mom, dad, args):
    """Return the offspring of partially matched crossover on the candidates.

    This function performs partially matched crossover (PMX). This type of
    crossover assumes that candidates are composed of discrete values that
    are permutations of a given set (typically integers). It produces offspring
    that are themselves permutations of the set.

    .. Arguments:
       random -- the random number generator object
       mom -- the first parent candidate
       dad -- the second parent candidate
       args -- a dictionary of keyword arguments

    Optional keyword arguments in args:

    - *crossover_rate* -- the rate at which crossover is performed 
      (default 1.0)

    """
    crossover_rate = args.setdefault('crossover_rate', 1.0)
    if random.random() < crossover_rate:
        size = len(mom)
        points = random.sample(range(size), 2)
        x, y = min(points), max(points)
        bro = copy.copy(dad)
        bro[x:y+1] = mom[x:y+1]
        sis = copy.copy(mom)
        sis[x:y+1] = dad[x:y+1]
        for parent, child in zip([dad, mom], [bro, sis]):
            for i in range(x, y+1):
                if parent[i] not in child[x:y+1]:
                    spot = i
                    while x <= spot <= y:
                        print(child[spot])
                        spot = parent.index(child[spot])
                    child[spot] = parent[i]
        return [bro, sis]
    else:
        return [mom, dad]

以上内容来自基于Python的inpyred库。我正在尝试为“车辆路径问题”制定一种算法,其中上面的列表列表是提议的解决方案的一个示例。

0 个答案:

没有答案
相关问题