无法设置 属性

Can't set a property

我正在研究遗传算法的实现,以解决高级旅行商问题(边缘取决于白天以模拟交通时间)。到目前为止效果很好。

我有一些 类 Inhabitant,其中有一个 GeneticString、一个 Population 和一些其他 类。 在每次迭代中,模拟的生成都有可能发生突变,因此为了安全起见,我想保存我所有居民中最好的 (Solutions/Tours),以防这个发生突变而我永远找不到一个更好的。

所以 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])

"This can't be so hard" 但我做错了什么。最好的居民永远不会得救。

调试打印的输出是(对于最后几代):

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

由于我的实施取决于当前时间,并且 Tour 的适应度值会随着给定的开始时间而变化,因此我已经对此进行了检查。对于每个适应度值计算,使用相同的开始时间。

如果您需要访问完整代码,我可以将其托管在 git-hoster 上。

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

嗨,

如果你想最大化健身,你不应该把“<”改成“>”吗?

我最好的猜测是,改变居民实际上改变了与副本共享的某些属性,可能是 return 由 Inhabitant.locations() 编辑的对象。在这种情况下,变异原始居民也会变异副本。您需要创建由 locations() 编辑的对象的副本 return 或(为了安全起见)将 locations() 方法本身更改为 return 副本。