遺伝的アルゴリズムの実装
遺伝的なアルゴリズムというものがある.
これは進化のプロセスに習って最適化問題を解くことができる.
その際の便利なライブラリとして,DEAP というものを知ったので備忘として残したい.
コードは下記.
# アニメーション用に必要なライブラリをインストール
!pip install deap
from deap import base, creator, tools, algorithms
import random
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
# 遺伝的アルゴリズムの設定
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=10)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("evaluate", lambda ind: (sum(ind),))
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=3)
# アニメーションのためのデータ収集
generations = []
population = toolbox.population(n=50)
for gen in range(10):
algorithms.eaSimple(population, toolbox, cxpb=0.5, mutpb=0.2, ngen=1, verbose=False)
fitness_values = [ind.fitness.values[0] for ind in population]
generations.append(fitness_values)
# アニメーションの描画
fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 25)
ax.set_xlabel("Fitness Value")
ax.set_ylabel("Frequency")
ax.set_title("Evolution of Fitness Distribution")
def update(frame):
ax.clear()
ax.hist(generations[frame], bins=10, range=(0, 10), color='blue', edgecolor='black')
ax.set_title(f"Generation {frame + 1}")
ax.set_xlabel("Fitness Value")
ax.set_ylabel("Frequency")
ani = FuncAnimation(fig, update, frames=len(generations), repeat=False)
HTML(ani.to_jshtml())