我正在尝试在 Python 中实现遗传算法并显示算法的结果我想使用来自
matplotlib.animation
的 FuncAnimation 创建动画。
但是,我遇到了问题,最终只有一张图像。最有趣的是,在 Google Colab 中我得到一个框架,但在 Pycharm(我经常使用的 IDE)中我得到另一个框架。
这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def fitness_function(x, y):
return x ** 2 + y ** 2
def initialize_population(pop_size, bounds):
return np.random.uniform(bounds[0], bounds[1], (pop_size, 2))
def select(population, fitnesses):
indices = np.argsort(fitnesses)[:len(population) // 2]
return population[indices]
def crossover(parents, offspring_size):
offsprings = []
for _ in range(offspring_size):
p1, p2 = parents[np.random.choice(len(parents), size=2, replace=False)]
alpha = np.random.rand()
child = alpha * p1 + (1 - alpha) * p2
offsprings.append(child)
return np.array(offsprings)
def mutate(population, bounds, mutation_rate=0.1):
for i in range(len(population)):
if np.random.rand() < mutation_rate:
population[i] += np.random.uniform(-1, 1, size=2)
population[i] = np.clip(population[i], bounds[0], bounds[1])
return population
def genetic_algorithm(pop_size=500, generations=500, bounds=(-10, 10)):
population = initialize_population(pop_size, bounds)
history = []
for gen in range(generations):
fitnesses = np.array([fitness_function(x, y) for x, y in population])
parents = select(population, fitnesses)
offspring_size = pop_size - len(parents)
offspring = crossover(parents, offspring_size)
population = np.vstack((parents, offspring))
population = mutate(population, bounds)
history.append(population.copy())
if gen % 50 == 0:
print(f"Generation {gen}: Best fitness = {fitnesses.min():.4f}")
return history
history = genetic_algorithm()
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.set_title("Evolution of Genetic Algorithm Population")
ax.set_xlabel("X")
ax.set_ylabel("Y")
colors = np.linspace(0, 1, len(history))
scat = ax.scatter([], [], c=[], cmap='viridis', s=50, vmin=0, vmax=1)
ax.plot([0, 0], [-10, 10], color='blue', linewidth=1)
ax.plot([-10, 10], [0, 0], color='blue', linewidth=1)
def update(frame):
print(f"Frame: {frame}, History Length: {len(history)}")
data = history[frame]
scat.set_offsets(data)
scat.set_array(np.full(len(data), colors[frame]))
ax.set_title(f"Generation {frame+1}/{len(history)}")
return scat,
anim = FuncAnimation(fig, update, frames=len(history), interval=50, repeat=False)
plt.show()
print(plt.get_backend())
print(f"Number of generations: {len(history)}")
我读过很多类似的问题,但没有一个答案对我有用。
例如,我运行了这个问题中标记为必填答案的代码,但是我仍然只得到一帧。
如果我只是没有找到可以回答我的问题,我提前道歉。
另外,如果您突然发现算法中有任何错误,如果您能向我指出,我将不胜感激。
希望这有帮助,但我运行了你的代码,它对我来说效果很好。
也许您应该尝试检查已安装的软件包的版本,也许其他版本的软件包/python 存在一些差异,或者可能是硬件方面的问题。
这是我安装的 numpy 和 matplotlib 的版本。 +我正在使用(Python 3.9.12)
python -c "import numpy,matplotlib;print(numpy.__version__);print(matplotlib.__version__)"
1.26.4
3.9.3
请告诉我这是否对您有帮助。