我必须将DEAP集成到一个更大的框架中。
对于我定义的测试:
from deap import base
from deap import creator
from deap import tools
from collections import *
import random
NAME = 0
TYPE = 1
INITIAL = 2
MIN = 3
MAX = 4
CATEGORY = 5
IND_SIZE = 1
Data = OrderedDict()
Data['P1'] = ['distance' , float, 8. ,7.9 ,8.1 , [] ]
Data['P2'] = ['velocity' , float, 80. ,79.7 ,83.3 , [] ]
Data['P3'] = ['rigid' , int , 0 ,0 ,1 , ['false','true'] ]
toolbox = base.Toolbox()
for Key in Data:
if Data[Key][TYPE] is float:
toolbox.register(Data[Key][NAME], random.uniform, Data[Key][MIN], Data[Key][MAX])
if Data[Key][TYPE] is int:
toolbox.register(Data[Key][NAME], random.randint, Data[Key][MIN], Data[Key][MAX])
AttrSet = (toolbox.distance, toolbox.velocity, toolbox.rigid)
toolbox.register("individual", tools.initCycle, creator.individual, AttrSet, IND_SIZE)这将按预期运行,但如果框架使用不同的len()传递数据,也必须更改AttrSet
有没有办法从数据中创建AttrSet,例如在注册参数的循环中?
toolbox.register()总是返回None,所以这是不起作用的。
发布于 2020-12-18 20:11:58
您可以使用Python内置函数getattr,它允许您按名称获取对象的属性。
正如文档中所解释的:getattr(x, 'foobar')等同于x.foobar。
所以你可以这样做:
toolbox = base.Toolbox()
AttrSet = []
for Key in Data:
if Data[Key][TYPE] is float:
toolbox.register(Data[Key][NAME], random.uniform, Data[Key][MIN], Data[Key][MAX])
elif Data[Key][TYPE] is int:
toolbox.register(Data[Key][NAME], random.randint, Data[Key][MIN], Data[Key][MAX])
AttrSet.append(getattr(toolbox, Data[Key][NAME]))
toolbox.register("individual", tools.initCycle, creator.individual, AttrSet, IND_SIZE)https://stackoverflow.com/questions/65354891
复制相似问题