Python - 求助遗传算法错误
Python - Help on genetic algorithm error
我一直在尝试在 python 中创建遗传算法,但我要么得到:
<bound method Environment.bestsol of <__main__.Environment instance
at 0x10a5d4ab8>>
或者不打印。我尝试重新排列函数,并直接调用函数,但它仍然没有输出任何东西。我似乎遇到了与函数 bestsol()
.
相关的问题
import random
import sys
from operator import attrgetter
input = 1
target = 5.5
class Individual:
def __init__(self, constant):
self.fitness = getfitness()
self.constant = constant
def getconstant():
return self.constant
def getresult():
return self.constant * input
def getfitness():
return 10 - abs(target - self.getresult())
def mutate():
if(random.random() > .05):
self.constant + random.random()
def offspring(partner):
return Individual(((self.getconstant() + partner.getconstant())/2))
class Generation(list):
def __init__(self, gensize, fitsize, startinglist=[]):
self.extend(startinglist)
self.bredoff = []
self.gensize = gensize
self.fitsize = fitsize
self.make()
def make():
self = [Individual(random.randint(-10,10)) for x in xrange((self.gensize-len(self)))]
def getfittest():
return heapq.nlargest(self.fitsize,self,key=attrgetter('fitness'))
def getbredoffspring():
for i in self.getfittest():
bredoff.append(i.offspring(self.getfittest[random.randint(0,len(self.getfittest()))]))
return bredoff
class Environment():
def __init__(self, maxgens):
self.l = []
self.b = []
self.maxgens = maxgens
def create():
l = Generation(100,20)
for i in maxgens:
b = l.getbredoffspring()
l = Generation(100,20,b)
def bestsol():
print("e")
print max(l,key=attrgetter('fitness')).fitness()
def main():
sol = Environment(2)
print sol.bestsol
if __name__ == '__main__':
main()
由于我是 python 的新手,即使尽我所能搜索互联网后我也无法理解。任何帮助将不胜感激。
bestsol
是一个 class 方法,所以当你调用它时你应该使用方括号:sol.bestsol()
(否则,你将打印方法对象:<bound method Environment.bestsol ...
).
其次,当您定义一个 class 方法时,您应该将 self
声明为一个参数:
def bestsol(self): # <-- here
print("e")
print max(l,key=attrgetter('fitness')).fitness()
第三,当你声明一个不扩展任何其他 class 的 class - 你应该声明它继承自 object
(旧方式):
class Environment(object):
或者,完全没有括号(新方式)
class Environment:
第四,当你创建一个 class 成员时,说 l
(顺便说一句,你 真的 应该使用更好的名字),无论何时你想使用它你应该使用 self
注释:self.l
。如果您将使用 l
,它将在方法内创建一个局部变量 - 这可能 不是 您想要的。
代码还有其他问题,但我会让你稍微努力一下,这样你就可以学习:)
我一直在尝试在 python 中创建遗传算法,但我要么得到:
<bound method Environment.bestsol of <__main__.Environment instance
at 0x10a5d4ab8>>
或者不打印。我尝试重新排列函数,并直接调用函数,但它仍然没有输出任何东西。我似乎遇到了与函数 bestsol()
.
import random
import sys
from operator import attrgetter
input = 1
target = 5.5
class Individual:
def __init__(self, constant):
self.fitness = getfitness()
self.constant = constant
def getconstant():
return self.constant
def getresult():
return self.constant * input
def getfitness():
return 10 - abs(target - self.getresult())
def mutate():
if(random.random() > .05):
self.constant + random.random()
def offspring(partner):
return Individual(((self.getconstant() + partner.getconstant())/2))
class Generation(list):
def __init__(self, gensize, fitsize, startinglist=[]):
self.extend(startinglist)
self.bredoff = []
self.gensize = gensize
self.fitsize = fitsize
self.make()
def make():
self = [Individual(random.randint(-10,10)) for x in xrange((self.gensize-len(self)))]
def getfittest():
return heapq.nlargest(self.fitsize,self,key=attrgetter('fitness'))
def getbredoffspring():
for i in self.getfittest():
bredoff.append(i.offspring(self.getfittest[random.randint(0,len(self.getfittest()))]))
return bredoff
class Environment():
def __init__(self, maxgens):
self.l = []
self.b = []
self.maxgens = maxgens
def create():
l = Generation(100,20)
for i in maxgens:
b = l.getbredoffspring()
l = Generation(100,20,b)
def bestsol():
print("e")
print max(l,key=attrgetter('fitness')).fitness()
def main():
sol = Environment(2)
print sol.bestsol
if __name__ == '__main__':
main()
由于我是 python 的新手,即使尽我所能搜索互联网后我也无法理解。任何帮助将不胜感激。
bestsol
是一个 class 方法,所以当你调用它时你应该使用方括号:sol.bestsol()
(否则,你将打印方法对象:<bound method Environment.bestsol ...
).
其次,当您定义一个 class 方法时,您应该将 self
声明为一个参数:
def bestsol(self): # <-- here
print("e")
print max(l,key=attrgetter('fitness')).fitness()
第三,当你声明一个不扩展任何其他 class 的 class - 你应该声明它继承自 object
(旧方式):
class Environment(object):
或者,完全没有括号(新方式)
class Environment:
第四,当你创建一个 class 成员时,说 l
(顺便说一句,你 真的 应该使用更好的名字),无论何时你想使用它你应该使用 self
注释:self.l
。如果您将使用 l
,它将在方法内创建一个局部变量 - 这可能 不是 您想要的。
代码还有其他问题,但我会让你稍微努力一下,这样你就可以学习:)