我正在研究一个遗传算法的实现来解决一个高级的旅行商问题(边缘依赖于白天来模拟交通时间)。到目前为止效果还不错。你知道吗
我有一些类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主机上。你知道吗
我最好的猜测是,改变居住者实际上改变了与副本共享的某些属性,可能是居住地点(). 在这种情况下,对原始居民进行变异也会对副本进行变异。您需要创建locations()返回的对象的副本,或者(为了安全起见)更改locations()方法本身以返回副本。你知道吗
你好
如果您想最大化健身效果,是否应该将“<;”改为“>;”?你知道吗
相关问题 更多 >
编程相关推荐