0

我的目标是创建一个旅游列表。每个旅行也是一个列表。

这段代码的问题在于,在循环结束时,列表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
4

1 回答 1

3

几乎可以肯定你在这里犯了两个错误之一——但它在你没有向我们展示的代码中,所以我不知道是哪一个。

第一种可能性是您tour在 Tours 中存储为类属性而不是实例属性,因此它们都共享相同的属性:

class Tour(object):
    tour = something

第二种可能性是您将城市列表复制到tour实例属性中,因此它们都有不同的属性,但它们都是对相同列表值的引用:

class Tour(object):
    def __init__(self, cities):
        self.tour = cities

从您更新的问题来看,这是第二个。

这最终与关于多维列表的常见问题解答相同,只是您有一个对象列表,每个对象都包含一个列表,而不是直接拥有一个列表列表。

无论如何,您希望每个Tour人都有一个单独的列表,因此您可以使用类似的函数分别对它们进行变异shuffle,对吗?然后,您将需要在某处显式复制列表。例如:

class Tour(object):
    def __init__(self, cities):
        self.tour = cities[:]

但是,我可能会以不同的方式写这个。首先,创建了一个不会shuffled就地变异的方法,而是返回一个新列表:

def shuffled(iterable):
    result = list(iterable)
    shuffle(result)
    return result

然后,您可以将整个第一个循环替换为:

tours = [Tour(shuffled(cities)) for _ in xrange(PopulationSize)]

当我们这样做时,您可以将第二个循环替换为:

for tour in tours:
    print ','.join(city.id for city in tour)

循环教程for解释了该部分for tour in tours。第二行使用了一种理解join避免重复五次的方法。

于 2013-11-06T00:00:09.880 回答