1

我一直在尝试在 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 新手,即使在尽我所能搜索互联网之后,我也无法理解。任何帮助将不胜感激。

4

1 回答 1

0

bestsol是一个类方法,所以当你调用它时,你应该使用括号:(sol.bestsol()否则,你打印的是方法对象:)<bound method Environment.bestsol ...

其次,当你定义一个类方法时,你应该声明self为一个参数:

def bestsol(self):  # <-- here
    print("e")
    print max(l,key=attrgetter('fitness')).fitness()

第三,当您声明一个不扩展任何其他类的类时 - 您应该声明它继承自object(旧方式):

class Environment(object):

或者,根本没有括号(新方式)

class Environment:

第四,当你创建一个类成员时,比如说l(你真的应该使用更好的名字顺便说一句),无论何时你想使用它,你都应该使用self注解:self.l. 如果您要使用l它将在方法内创建一个局部变量 - 这可能不是您想要的。

代码还有其他问题,但我会让你有点挣扎,这样你就可以学习了:)

于 2016-02-07T05:20:04.860 回答