我需要使用遗传算法和PSO最小化函数.
不同的帖子建议使用DEAP(我正在使用python),但我甚至不懂如何开始.
我们可以考虑例如区间i上的f
i=arange(-10,10,0.1)
def f(x):
return x*sin(x)
Run Code Online (Sandbox Code Playgroud)
如何使用DEAP最小化此功能?
我正在使用Python的DEAP pacakge,我希望多核我的代码,我使用http://deap.gel.ulaval.ca/doc/dev/tutorials/distribution.html上的教程成功地使用多处理来完成它.
我的问题如下:使用8个核心,理论上我获得了多少加速?我问的原因是因为我想决定我可以在与单核版本相同的时间内运行多少个人和几代人.我的代码用来运行大约200秒,有8个内核,现在需要大约0.5秒(这是400倍的加速).我可以假设任何事情都会加速400倍吗?我知道这很复杂,但非常感谢你的帮助.
一般来说,如果有人可以提供帮助,我想了解多重化如何改变计算流程.它是否只是针对每一代在不同核心上对每个人的评估进行映射?还是它并行运行几代?如果您知道我可以阅读的任何文档,请告诉我.
我没有提供代码示例,因为它似乎没有必要,因为这是一个非常高级的问题.
我刚刚开始使用 DEAP。之前我用的是基于Matlab的GA,交叉变异后就是选择指定大小的较好个体,然后更新种群。但是我很难理解为什么在 DEAP 中,在交叉和变异过程之后需要评估具有无效适应度的个体:
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
Run Code Online (Sandbox Code Playgroud)
我尝试删除这些代码,但似乎算法永远不会收敛。甚至我也没有看到那些可以更新人口/后代的东西,那么它们有什么用呢。提前致谢!!!
我正在使用 deap 符号回归示例问题中的这段代码,图形显示正常,但我希望节点扩展为圆角矩形以自动适应文本。(我不想只是通过反复试验来指定节点大小)。我该怎么做?
# show tree
import matplotlib.pyplot as plt
import networkx
nodes, edges, labels = gp.graph(bests[0])
graph = networkx.Graph()
graph.add_nodes_from(nodes)
graph.add_edges_from(edges)
pos = networkx.graphviz_layout(graph, prog="dot")
plt.figure(figsize=(7,7))
networkx.draw_networkx_nodes(graph, pos, node_size=900, node_color="w")
networkx.draw_networkx_edges(graph, pos)
networkx.draw_networkx_labels(graph, pos, labels)
plt.axis("off")
plt.show()
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 DEAP 来最大化函数。
我了解如何使用基本示例进行操作:
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, 100)
Run Code Online (Sandbox Code Playgroud)
它创建了 100 个随机值或 0 或 1。然后你继续创建一个种群并变异......
例如,当您有两个参数时,如何构建总体:
parameter 1 integer with range [0,1]
parameter 2 float with range [0,2]
Run Code Online (Sandbox Code Playgroud)
然后创建一个结合两个随机采样参数的个体?或对于具有任意步长值的参数 2 样本,例如 0.25。
我正在研究遗传算法的实现,并且正在使用 DEAP 工具箱。我编写了一个初始化染色体的代码,它们的第一个基因是 [0.01, 2048] 范围内的浮点数,第二个基因又是 [0.0001, 10] 范围内的浮点数,最后三个基因是布尔值。这是我的代码:
toolbox.register("attr_flt1", random.uniform, 0.01, 2048)
toolbox.register("attr_flt2", random.uniform, 0.0001, 10)
toolbox.register("attr_bool", random.randint, 0, 1)
enter ctoolbox.register("individual", tools.initCycle, creator.Individual,
(toolbox.attr_flt1, toolbox.attr_flt2, toolbox.attr_bool, toolbox.attr_bool, toolbox.attr_bool),
n=1)
Run Code Online (Sandbox Code Playgroud)
有一个创建人口的样本:
[1817.2852738610263, 6.184224906600851, 0, 0, 1], [1145.7253307024512, 8.618185266721435, 1, 0, 1], ...
Run Code Online (Sandbox Code Playgroud)
现在,我想通过考虑基因类型和范围的差异来对我的染色体进行突变和交叉。目前我有一个错误,因为在应用交叉和变异运算符后,染色体的第一个基因产生了 0 值,这与我的评估函数错误。任何人都可以帮助我使用 DEAP 工具箱来编码选择、突变和交叉,从而在最初定义的范围内产生新的群体吗?
我正在 Python 中使用 DEAP 包编写一个程序,用于使用进化算法(特别是遗传算法)进行优化。
我需要使用 python 中的列表类型创建染色体。该染色体应该有五个不同范围的浮动基因(等位基因)。
我的主要问题是创造这样的染色体。但是,如果我可以使用 deap 包的 tools.initRepeat 函数来实现这一点,那就更好了。
对于所有基因都在同一范围内的情况,我们可以使用以下代码:
import random
from deap import base
from deap import creator
from deap import tools
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
IND_SIZE=10
toolbox = base.Toolbox()
toolbox.register("attr_float", random.random)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_float, n=IND_SIZE)
Run Code Online (Sandbox Code Playgroud)
我从这里得到的。
我正在学习使用 Python DEAP 模块,并且创建了一个最小化适应度函数和一个评估函数。我用于健身功能的代码如下:
ct.create("FitnessFunc", base.Fitness, weights=(-0.0001, -100000.0))
Run Code Online (Sandbox Code Playgroud)
请注意重量差异非常大。这是因为Fitness 的 DEAP 文档说:
权重还可用于改变每个目标相对于另一个目标的重要性。这意味着权重可以是任何实数,并且仅使用符号来确定是否进行最大化或最小化。
对我来说,这意味着你可以通过增大一个权重来优先考虑另一个权重。
我正在使用algorithms.eaSimple(通过名人堂)来进化,并且使用 来选择群体中最好的个体tools.selTournament。
评估函数返回abs(sum(input)), len(input)。运行后,我从 HallOfFame 中获取值并对其进行评估,但是,输出类似于以下内容(行尾的数字是我添加的):
(154.2830144, 3) 1
(365.6353634, 4) 2
(390.50576340000003, 3) 3
(390.50576340000003, 14) 4
(417.37616340000005, 4) 5
Run Code Online (Sandbox Code Playgroud)
让我困惑的是,我认为文档指出较大的第二个权重意味着len(input)会产生更大的影响,并会产生如下输出:
(154.2830144, 3) 1
(365.6353634, 4) 2
(390.50576340000003, 3) 3
(417.37616340000005, 4) 5
(390.50576340000003, 14) 4
Run Code Online (Sandbox Code Playgroud)
请注意,第 4 行和第 5 行交换了位置。这是因为第 4 行的权重比第 5 行的权重大得多。
看来,适应度实际上是首先根据第一个元素进行评估的,然后仅当第一个元素之间存在平局时才考虑第二个元素。如果是这样的话,那么设置除-1或+1以外的权重的目的是什么?
对于我正在研究的项目,我在DEAP中设置了3个不同的目标作为优化目标(这是一个基于Python的演化框架).
它可以使用像NSGA-II这样的算法来应对多目标问题.无论如何都要生成帕累托边界曲面以显示结果.
deap ×10
python ×8
algorithm ×1
genetic ×1
matplotlib ×1
networkx ×1
optimization ×1
python-2.7 ×1