私の目標は、ツアーのリストを作成することです。各ツアーもリストです。
このコードの問題は、ループの最後で、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