我一直在研究基于以下内容的 TSP 解决方案的实现:
https://github.com/lmarti/evolutionary-computation-course/blob/master/AEC.03%20-%20Solving%20the%20TSP%20with%20GAs.ipynb
因此,对于我的实现,我有一个初始城市列表,称为“城市”,我将每个人表示为一个索引列表,这些索引对应于初始列表中每个城市的位置。这意味着生成新个体的机制是根据 numpy 的 random.permutation 函数。但有两种情况,一种是起点和终点不固定,所以我们在工具箱中声明机制如下:
toolbox.register("indices", numpy.random.permutation, len(cities))
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
但是,以防万一“城市”初始列表的第一个和最后一个位置是固定的,那么您需要排列除第一个和最后一个之外的其余位置。所以你声明这样的机制:
permutableList = []
for row in range(1, len(cities)-1):
permutableList.append(row-1)
toolbox.register("indices", numpy.random.permutation, permutableList)
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
然后你只需要更改评估函数以包含“城市”初始列表的第一个点和最后一个点,如下所示:
def create_tour(individual):
listOfLocations = [list(cities)[e+1] for e in individual]
# Adding first and last points to the tour
listOfLocations.insert(0, cities[0])
listOfLocations.append(cities[len(cities)-1])
return listOfLocations
然后根据 listOfLocations 列表计算距离。