我正致力于遗传算法的实施,以解决先进的旅行商问题(边缘取决于白天模拟交通时间)。到目前为止,它的表现相当不错。
我有一些课程Inhabitant
,其中包含GeneticString
,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])
&#34;这可能太难了#34;但我做错了什么。最好的居民永远不会得救。
调试打印的输出是(对于后代):
overwriting 3.57107095019 with 3.55664843948
overwriting 3.63240015308 with 3.55664843948
overwriting 3.57107095019 with 3.55664843948
由于我的实施取决于当前时间和巡回赛的健身值随着给定的开始时间而变化,我已经检查了这一点。对于每个适合度值计算,使用相同的起始时间。
如果您需要访问完整代码,我可以将其托管在git-hoster上。
答案 0 :(得分:1)
我最好的猜测是,改变居民实际上会改变与副本共享的某些属性,可能是Inhabitant.locations()返回的对象。在这种情况下,改变原始居民也将改变副本。您需要创建由locations()或(为安全起见)返回的对象的副本,更改locations()方法本身以返回副本。
答案 1 :(得分:0)
(self.inhabitants[0].fitness() < self.best.fitness())
您好,
如果你想最大化健身,你是否应该改变&#34;&lt;&#34;到&#34;&gt;&#34;?