ごみの掃き溜めは美味ぬ

ごみの掃き溜めです

遺伝的アルゴリズムを可視化してみる

%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")