我也对 DEAP 对全局范围的使用感到不舒服,我想我可以为您提供一个替代解决方案。
每次循环迭代都可以导入每个模块的不同版本,从而避免对全局范围的任何依赖。
this_random = importlib.import_module("random")
this_creator = importlib.import_module("deap.creator")
this_algorithms = importlib.import_module("deap.algorithms")
this_base = importlib.import_module("deap.base")
this_tools = importlib.import_module("deap.tools")
据我所知,这似乎与多处理有关。
例如,这里是 DEAP 的 onemax_mp.py 的一个版本,它避免将任何 DEAP 文件放在全局范围内。我已经包含了一个循环__main__
来改变每次迭代的权重。(它第一次最大化数量,第二次最小化它。)多处理一切正常。
#!/usr/bin/env python2.7
# 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 array
import multiprocessing
import sys
if sys.version_info < (2, 7):
print("mpga_onemax example requires Python >= 2.7.")
exit(1)
import numpy
import importlib
def evalOneMax(individual):
return sum(individual),
def do_onemax_mp(weights, random_seed=None):
""" Run the onemax problem with the given weights and random seed. """
# create local copies of each module
this_random = importlib.import_module("random")
this_creator = importlib.import_module("deap.creator")
this_algorithms = importlib.import_module("deap.algorithms")
this_base = importlib.import_module("deap.base")
this_tools = importlib.import_module("deap.tools")
# hoisted from global scope
this_creator.create("FitnessMax", this_base.Fitness, weights=weights)
this_creator.create("Individual", array.array, typecode='b',
fitness=this_creator.FitnessMax)
this_toolbox = this_base.Toolbox()
this_toolbox.register("attr_bool", this_random.randint, 0, 1)
this_toolbox.register("individual", this_tools.initRepeat,
this_creator.Individual, this_toolbox.attr_bool, 100)
this_toolbox.register("population", this_tools.initRepeat, list,
this_toolbox.individual)
this_toolbox.register("evaluate", evalOneMax)
this_toolbox.register("mate", this_tools.cxTwoPoint)
this_toolbox.register("mutate", this_tools.mutFlipBit, indpb=0.05)
this_toolbox.register("select", this_tools.selTournament, tournsize=3)
# hoisted from __main__
this_random.seed(random_seed)
pool = multiprocessing.Pool(processes=4)
this_toolbox.register("map", pool.map)
pop = this_toolbox.population(n=300)
hof = this_tools.HallOfFame(1)
this_stats = this_tools.Statistics(lambda ind: ind.fitness.values)
this_stats.register("avg", numpy.mean)
this_stats.register("std", numpy.std)
this_stats.register("min", numpy.min)
this_stats.register("max", numpy.max)
this_algorithms.eaSimple(pop, this_toolbox, cxpb=0.5, mutpb=0.2, ngen=40,
stats=this_stats, halloffame=hof)
pool.close()
if __name__ == "__main__":
for tgt_weights in ((1.0,), (-1.0,)):
do_onemax_mp(tgt_weights)