我也一直不舒服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)
感謝您的快速結果。這是我的結果:TypeError:不能實例化抽象的 deap。creator.Fitness'>與抽象屬性權重。創作者需要有明確的權重。 如果我移動「init」函數中的所有創建者的東西(並添加一個相應的全局工具箱),那麼我得到的錯誤如AttributeError:'NoneType'對象沒有屬性'裝飾器'等。工具箱類有幾個在此工具箱= Toolbox()聲明之後的「init」函數內部的「註冊」和「裝飾」方法(爲了簡潔起見,此處省略)。 –
hobscrk777
2014-10-20 16:42:54
@ user3325401好的,我剛剛下載了'deap',並得到了這個例子的工作(見上面的編輯)。儘管沒有看到您的實際代碼,但我不知道它是否適用於您。我們的想法是隻設置依賴'init'內的'weights'的值,並在父進程中執行其他所有操作。 – dano 2014-10-20 16:48:22
再次感謝。但第二點,我認爲問題在於工具箱類註冊了GA流程中使用的一些功能。例如,在全局範圍內,我定義了這樣的東西:「toolbox.register(」population「,tools.initRepeat,list,toolbox.individual)」。然後在主函數中執行所有GA函數,我實際從函數「toolbox.population(n = numIndividuals)」中抽取「 」如果我將toolbox.register語句移動到init函數中,那麼錯誤我得到的是「AttributeError:'工具箱'對象沒有屬性'人口'」。 – hobscrk777 2014-10-20 16:59:18