FuncAnimation 只显示一帧

问题描述 投票:0回答:1

我正在尝试在 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 matplotlib animation
1个回答
0
投票

希望这有帮助,但我运行了你的代码,它对我来说效果很好。

也许您应该尝试检查已安装的软件包的版本,也许其他版本的软件包/python 存在一些差异,或者可能是硬件方面的问题。

这是我安装的 numpy 和 matplotlib 的版本。 +我正在使用(Python 3.9.12)

python -c "import numpy,matplotlib;print(numpy.__version__);print(matplotlib.__version__)"
1.26.4
3.9.3

请告诉我这是否对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.