我的目标是创建一个旅游列表。每个旅行也是一个列表。
这段代码的问题在于,在循环结束时,列表tours
不是一个不同的、打乱过的旅行的列表,而是一个添加到列表中的最后一个旅行的列表。我想这与 Python 对象引用有关,但我不知道如何改变它。我试过del tour
但没有用。
def initialisePopulation(self, cities):
tours = []
for i in xrange(0, PopulationSize):
tour = Tour(cities)
shuffle(tour.tour)
tours.append(tour)
print str(tour.tour[0].id) + "," + str(tour.tour[1].id) + "," + str(tour.tour[2].id) + "," + str(tour.tour[3].id) + "," + str(tour.tour[4].id)
del(tour)
print "-"
for j in xrange(0, PopulationSize):
print str(tours[j].tour[0].id) + "," + str(tours[j].tour[1].id) + "," + str(tours[j].tour[2].id) + "," + str(tours[j].tour[3].id) + "," + str(tours[j].tour[4].id)
当我打印每次旅行时,一切都很好。当我打印 的内容时tours
,每个项目都是相同的。这是输出:
2,3,1,5,4
2,4,3,1,5
2,3,4,1,5
4,3,1,5,2
3,4,1,5,2
-
3,4,1,5,2
3,4,1,5,2
3,4,1,5,2
3,4,1,5,2
3,4,1,5,2
旅游班:
class Tour(object):
'''
classdocs
'''
def __init__(self, cityList):
self.tour = cityList
self.size = len(cityList)
self.fitness = self.getFitness(self.tour)
def getFitness(self, tour):
fitness = sum([self.euclideanDistance(tour[i], tour[i+1]) for i in xrange(0, self.size-1)])
return fitness
def euclideanDistance(self, p, q):
distance = sqrt((p.x - q.x)**2 + (p.y - q.y)**2)
return distance