无法设置属性

2024-10-03 19:32:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个遗传算法的实现来解决一个高级的旅行商问题(边缘依赖于白天来模拟交通时间)。到目前为止效果还不错。你知道吗

我有一些类Inhabitant,其中有GeneticString,a Population和其他一些类。 在每一次迭代中,模拟的生成都有可能发生变异,所以为了安全起见,我想保存我所有的居民(解决方案/旅行)中最好的,以防这一个变异,我永远也找不到更好的。你知道吗

所以Population有一个best属性,在每次迭代之后,我调用determineBest(),看看我当前总体中最好的居住者(我保持总体排序,所以键为0的居住者是最好的)是否比我用best记住的居住者更好

class Population:
    def __init__(self,p,simulation):
        self.inhabitants = []
        self.generation = 0
        self.simulation = simulation
        self.map = self.simulation.map
        for i in range(0,p):
            self.addRandomInhabitant()

        self.best = self.inhabitants[0] 
...
    def setBest(self,b):
        self.best = Inhabitant(b.locations(),self)

    def determineBest(self):
        if (self.inhabitants[0].fitness() < self.best.fitness()):
            # WHY!?
            print "overwriting " + str(self.best.fitness()) + " with "+ str(self.inhabitants[0].fitness())
            self.setBest(self.inhabitants[0])

“这不可能这么难”,但我做错了什么。最好的居民永远不会得救。你知道吗

调试打印的输出是(对于上一代):

overwriting 3.57107095019 with 3.55664843948
overwriting 3.63240015308 with 3.55664843948
overwriting 3.57107095019 with 3.55664843948

由于我的实现依赖于当前时间,并且巡演的适应值随着给定的开始时间而改变,所以我已经检查了这个问题。对于每个适应值计算,使用相同的开始时间。你知道吗

如果你需要访问完整的代码,我可以把它放在git主机上。你知道吗


Tags: selfdefwith时间simulationbestpopulationfitness
2条回答

我最好的猜测是,改变居住者实际上改变了与副本共享的某些属性,可能是居住地点(). 在这种情况下,对原始居民进行变异也会对副本进行变异。您需要创建locations()返回的对象的副本,或者(为了安全起见)更改locations()方法本身以返回副本。你知道吗

(self.inhabitants[0].fitness() < self.best.fitness())

你好

如果您想最大化健身效果,是否应该将“<;”改为“>;”?你知道吗

相关问题 更多 >