首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DEAP向个人注册多个参数

使用DEAP向个人注册多个参数
EN

Stack Overflow用户
提问于 2020-12-18 17:54:18
回答 1查看 127关注 0票数 0

我必须将DEAP集成到一个更大的框架中。

对于我定义的测试:

代码语言:javascript
复制
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,所以这是不起作用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-18 20:11:58

您可以使用Python内置函数getattr,它允许您按名称获取对象的属性。

正如文档中所解释的:getattr(x, 'foobar')等同于x.foobar

所以你可以这样做:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65354891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档