遺伝的アルゴリズムの実装


遺伝的なアルゴリズムというものがある.

これは進化のプロセスに習って最適化問題を解くことができる.

その際の便利なライブラリとして,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())

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です