首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将参数传递给DEAP中的"toolbox.population“

如何将参数传递给DEAP中的"toolbox.population“
EN

Stack Overflow用户
提问于 2021-07-08 18:25:48
回答 1查看 69关注 0票数 0

我尝试在DEAP中创建一个自定义的“个体”。原因是个体是由几个解释变量组成的。每个解释变量都有上下界。此外,它可能有步长或精度。

这是我正在编写的代码:

代码语言:javascript
复制
import random
from deap import base, creator, tools
from typing import Optional, List, Any


creator.create("FitnessMin", base.Fitness, weights=(-1.0,))   
creator.create("Individual", list, fitness=creator.FitnessMin)   # individual data-type : List
toolbox = base.Toolbox()


'''
Functions
'''

def random_pick(lower: float, upper: float, step: Optional[int] = None) -> float:
    # Pick random numbers within specified bounds 
    if step is None:
        return random.uniform(lower, upper)
    else:
        candidates_num = round((upper - lower) / step)
        return lower + random.randint(0, candidates_num) * step


def make_individual(explanatories) -> List[Any]:
     individual = []
     for explanatory in explanatories:
         individual.append(
             random_pick(
                 lower=explanatories[explanatory][0],
                 upper=explanatories[explanatory][1],
                 step=explanatories[explanatory][2] if len(explanatories[explanatory]) == 3 else None,
             )
         )
     return creator.Individual(individual)


'''
Main
'''
pop_size = 10

explanatories={
    "a": (30, 100, 1),   # (low, high, step)
    "b": (80, 200, 1),
    "c": (15, 80, 1),
    "d": (1.5, 5, 0.1),
    "e": (15, 200, 1),
    "f": (5, 1699, 1),
    "g": (0.5, 0.5),     # (low, high)
    }


toolbox.register("individual", make_individual)

# Check value of individual
ind = toolbox.individual(explanatories)   # list


# Population (following is the Bag type of population which is common)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

# Check population
pop = toolbox.population(pop_size)   # ERROR  

函数random_pick通过考虑步骤来随机选取下界和上界内的所有解释的值。而函数make_individual则负责制定个体。

上面代码的问题是我试图创建population的地方。当我运行以下代码行时:

代码语言:javascript
复制
pop = toolbox.population(pop_size)    

我得到了错误:

代码语言:javascript
复制
TypeError: make_individual() missing 1 required positional argument: 'explanatories'

我的问题是,在进行填充时,如何将解释作为输入参数传递给"toolbox.population“或"make_individual()”。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-25 11:19:57

您的问题似乎是因为tools.initRepeat只接受了三个参数:containerfuncn (docs here)。

因此,它不能将explanatories参数“传递”给func (在本例中是toolbox.individual)。

您可以通过在注册toolbox.individual时将explanatories指定为make_individual的参数来解决此问题。

也就是说,这是可行的:

代码语言:javascript
复制
toolbox.register(
  "individual", 
  make_individual,
  explanatories=explanatories  # now toolbox.individual uses default explanatories
)
ind = toolbox.individual()  # no longer provide explanatories arg
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
pop = toolbox.population(pop_size)
print(int)
print(pop)

它会打印类似这样的内容

代码语言:javascript
复制
<class 'int'>
[[71, 122, 50, 1.9, 62, 679, 0.5], [88, 192, 24, 3.4000000000000004, 40, 1377, 0.5], [78, 182, 59, 4.1, 65, 1297, 0.5], [39, 174, 49, 3.0, 104, 883, 0.5], [89, 153, 36, 5.0, 102, 718, 0.5], [57, 114, 23, 2.7, 54, 1628, 0.5], [78, 146, 32, 2.1, 145, 961, 0.5], [96, 174, 40, 5.0, 19, 974, 0.5], [39, 150, 80, 4.7, 140, 801, 0.5], [31, 150, 37, 2.8, 109, 1230, 0.5]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68299839

复制
相关文章

相似问题

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