遺伝的アルゴリズムを可視化してみる
%matplotlib notebook import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import seaborn as sns import math
# パラメータ N = 100 LENGTH = 100 ELITE_NUMBER = 20 CHILDREN_NUMBER = math.ceil(2 * N / ELITE_NUMBER) ERROR_RATE = 0.01
# 初期配列生成 def generate_first_men(): np.random.seed(seed=0) return sort_men(np.random.choice(2, (N, LENGTH)))
# 優秀な順番に並べる def sort_men(data): return sorted(data, key=lambda x: sum(x), reverse=True)
# 交叉する def crossing(data): elites = data[:ELITE_NUMBER] #np.random.seed(seed=0) elites_pairs = np.random.choice(ELITE_NUMBER, (int(ELITE_NUMBER / 2), 2), replace=False) children = [] for i, pair in enumerate(elites_pairs): #np.random.seed(seed=i) positions = np.random.choice(LENGTH, CHILDREN_NUMBER) children += [np.hstack((elites[pair[0]][:position], elites[pair[1]][position:])) for position in positions] return sort_men(children)[:N]
# エラーを起こす def error_occuring(data): #np.random.seed(seed=0) ERROR_loc = np.random.choice(2, (N, LENGTH), p=[ERROR_RATE, 1 - ERROR_RATE]) return sort_men(np.logical_not(np.logical_xor(data, ERROR_loc)).astype(int))
fig = plt.figure() men = generate_first_men() def init(): global men men = generate_first_men() plt.title("Generation: 0") sns.heatmap(men, cmap="Blues", linewidths=0.01, xticklabels=False, yticklabels=False, cbar=False, ) def animate(i): plt.clf() global men men = crossing(men) men = error_occuring(men) plt.title("Generation: " + str(i + 1)) sns.heatmap(men, cmap="Blues", linewidths=0.01, xticklabels=False, yticklabels=False, cbar=False, ) ani = animation.FuncAnimation(fig, animate, interval=500, init_func=init, frames=40, ) #plt.show() ani.save("onemax_error.gif", writer="imagemagick")
暑さのあまり遺伝的アルゴリズムの動画を作った。 pic.twitter.com/NV21JNkdUt
— nweun (@zzgonweun) July 20, 2018