山登り法の実装

OneMax問題(10ビット)を解く。

import numpy as np
import matplotlib.pyplot as plt

R = 500

N_bit = 10
x = [np.random.randint(100)%2 for _ in range(N_bit)]
y = np.zeros_like(x)

def evalOneMax(x):
    return sum(x)

def mutate(x):
    idx = np.random.randint(N_bit)
    x[idx] = 1-x[idx]
    return x.copy()

ys = []
for gen in range(R):
    x2 = mutate(x)
    x_val = evalOneMax(x2)
    y_val = evalOneMax(y)
    if x_val > y_val:
        y = x2.copy()
    print(gen,y_val,y)
    ys.append(y_val)

plt.plot(ys)
plt.show()

f:id:seinzumtode:20211010130249p:plain