Python パッケージ「deap」を使用して、遺伝的アルゴリズムを使用した多目的最適化問題を解決しています。関数は非常に高価になる可能性があり、GA の進化的な性質により、すぐに複合化されます。現在、このパッケージには、進化的計算をマルチプロセスで並列化できるようにするためのサポートが含まれています。
ただし、さらに一歩進んで、いくつかの最適化パラメーターに異なる値を使用して、最適化を複数回実行したいと考えています。たとえば、さまざまな重みの値を使用して最適化問題を解きたいと思うかもしれません。
これはループの非常に自然なケースのように思えますが、問題は、すべてのサブプロセスがパラメーターについて認識できるように、これらのパラメーターをプログラムのグローバル スコープ (つまり、「メイン」関数の上) で定義する必要があることです。ここにいくつかの擬似コードがあります:
# define deap parameters - have to be in the global scope
toolbox = base.Toolbox()
history = tools.History()
weights = [1, 1, -1] # This is primarily what I want to vary
creator.create("Fitness",base.Fitness, weights=weights)
creator.create("Individual", np.ndarray, fitness=creator.Fitness)
def main():
# run GA to solve multiobjective optimization problem
return my_optimized_values
if __name__=='__main__':
## What I'd like to do but can't ##
## all_weights = list(itertools.product([1, -1],repeat=3))
## for combo in all_weights:
## weights = combo
##
pool = multiprocessing.Pool(processes=6)
# This can be down here, and it distributes the GA computations to a pool of workers
toolbox.register("map",pool.map)
my_values = main()
multiprocessing.Value、multiprocessing のパトス フォークなど、さまざまな可能性を調査しましたが、最終的には、子プロセスが Individual クラスを読み取るときに常に問題が発生します。
私は deap users のグループにこの質問を投げかけましたが、SO ほど大きなコミュニティではありません。さらに、これは deap に関する特定の問題というよりも、一般的な概念的な Python の質問のように思えます。この問題に対する私の現在の解決策は、コードを複数回実行し、毎回パラメーター定義の一部を変更することです。少なくともこの方法でも GA 計算は並列化されますが、必要以上に手作業が必要になります。
アドバイスや提案は大歓迎です!