遗传算法的“独特”交叉-TSP

时间:2019-03-28 22:52:13

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

我正在创建一个Genetic Algorithm来解决Traveling Salesman Problem

当前,两个2D列表表示需要交叉的两个父级:

path_1 = np.shuffle(np.arange(12).reshape(6, 2))
path_2 = np.arange(12).reshape(6,2)

假设列表中的每个元素表示在笛卡尔平面上的(x, y)坐标,而2D列表表示“行销员”必须采用的路径(从索引0到索引-1)。

由于TSP要求将所有点都包含在路径中,所以此分频器的结果子级必须没有重复个点。

我不知道如何进行这种交叉并得到父母双方的子女代表。

2 个答案:

答案 0 :(得分:1)

您需要使用有序交叉运算符,例如OX1

  

OX1是一个相当简单的置换交叉。   基本上,来自亲本1的一系列连续等位基因会下降,   剩余的值按照它们的顺序放在子级中   出现在父级2中。

我以前使用这些运算符运行TSP:

答案 1 :(得分:0)

您可以这样做,

使用任何方法从一个父对象中选择一半坐标(或0 to (length - 1)之间的任意随机数),假设i % 2 == 0在哪里。

可以使用多种方法将这些定位到孩子中:随机地,或全部定位在开始(或结束)或替代位置。

现在,剩余的坐标需要来自第二父级,您可以在第二父级中进行遍历,如果未选择坐标,则将其添加到空白处。

例如

我要从父级1选择偶数位置坐标,然后将其放在子级的偶数位置索引中,然后在父级2中遍历以将其余坐标置于子级的奇数位置索引中。

def crossover(p1, p2, number_of_cities):
    chk = {}
    for i in range(number_of_cities):
        chk[i] = 0
    child = [-1] * number_of_cities
    for x in range(len(p1)):
        if x % 2 == 0:
            child[x] = p1[x]
            chk[p1[x]] = 1
    y = 1
    for x in range(len(p2)):
        if chk[p2[x]] == 0:
            child[y] = p2[x]
            y += 2
    return child

这种方法保留了父母双方访问的城市的顺序。

此外,由于它不是对称的,p1p2可以切换为2个孩子,并且可以选择更好的一个(或两个)。