作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用通过 Python 的 DEAP 库实现的遗传算法。为了避免过早收敛,并强制探索特征空间,我希望第一代的变异概率很高。但是为了防止一旦它们被识别就偏离极值,我希望最后几代的突变概率更低。我如何让突变概率在几代人中减少? DEAP 中是否有任何内置函数可以完成此操作?
例如,当我注册一个突变函数时
toolbox.register('mutate', tools.mutPolynomialBounded, eta=.6, low=[0,0], up=[1,1], indpb=0.1)
indpb
参数是一个 float 。我怎样才能让它成为其他东西的功能?
最佳答案
听起来像是 Callbackproxy 的工作每次调用时都会计算函数参数。我添加了一个简单的例子,我修改了官方的 DEAP n-queen example 这样突变率设置为 2/N_GENS
(任意选择只是为了说明问题)。
请注意,Callbackproxy 接收一个 lambda,因此您必须将变异率参数作为函数传递(使用完全成熟的函数或仅使用 lambda)。无论如何,结果是每次评估 indpb
参数时都会调用此 lambda,如果 lambda 包含对全局变量生成计数器的引用,您就得到了想要的。
# This file is part of DEAP.
#
# DEAP is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
#
# DEAP is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with DEAP. If not, see <http://www.gnu.org/licenses/>.
import random
from objproxies import CallbackProxy
import numpy
from deap import algorithms
from deap import base
from deap import creator
from deap import tools
# Problem parameter
NB_QUEENS = 20
N_EVALS = 0
N_GENS = 1
def evalNQueens(individual):
global N_EVALS, N_GENS
"""Evaluation function for the n-queens problem.
The problem is to determine a configuration of n queens
on a nxn chessboard such that no queen can be taken by
one another. In this version, each queens is assigned
to one column, and only one queen can be on each line.
The evaluation function therefore only counts the number
of conflicts along the diagonals.
"""
size = len(individual)
# Count the number of conflicts with other queens.
# The conflicts can only be diagonal, count on each diagonal line
left_diagonal = [0] * (2 * size - 1)
right_diagonal = [0] * (2 * size - 1)
# Sum the number of queens on each diagonal:
for i in range(size):
left_diagonal[i + individual[i]] += 1
right_diagonal[size - 1 - i + individual[i]] += 1
# Count the number of conflicts on each diagonal
sum_ = 0
for i in range(2 * size - 1):
if left_diagonal[i] > 1:
sum_ += left_diagonal[i] - 1
if right_diagonal[i] > 1:
sum_ += right_diagonal[i] - 1
N_EVALS += 1
if N_EVALS % 300 == 0:
N_GENS += 1
return sum_,
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
# Since there is only one queen per line,
# individual are represented by a permutation
toolbox = base.Toolbox()
toolbox.register("permutation", random.sample, range(NB_QUEENS), NB_QUEENS)
# Structure initializers
# An individual is a list that represents the position of each queen.
# Only the line is stored, the column is the index of the number in the list.
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.permutation)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("evaluate", evalNQueens)
toolbox.register("mate", tools.cxPartialyMatched)
toolbox.register("mutate", tools.mutShuffleIndexes, indpb=CallbackProxy(lambda: 2.0 / N_GENS))
toolbox.register("select", tools.selTournament, tournsize=3)
def main(seed=0):
random.seed(seed)
pop = toolbox.population(n=300)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("Avg", numpy.mean)
stats.register("Std", numpy.std)
stats.register("Min", numpy.min)
stats.register("Max", numpy.max)
algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=1, ngen=100, stats=stats,
halloffame=hof, verbose=True)
return pop, stats, hof
if __name__ == "__main__":
main()
关于python - DEAP:使变异概率取决于世代数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58990269/
我是一名优秀的程序员,十分优秀!