无法设置 属性
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 副本。
我正在研究遗传算法的实现,以解决高级旅行商问题(边缘取决于白天以模拟交通时间)。到目前为止效果很好。
我有一些 类 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 副本。