我正在创建一个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要求将所有点都包含在路径中,所以此分频器的结果子级必须没有重复个点。
我不知道如何进行这种交叉并得到父母双方的子女代表。
答案 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
这种方法保留了父母双方访问的城市的顺序。
此外,由于它不是对称的,p1
和p2
可以切换为2个孩子,并且可以选择更好的一个(或两个)。