import random
from deap import creator, base, tools, algorithms

# 適応度クラスと個体クラスの定義
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

# 評価関数: 1 の個数を最大化
def evalOneMax(individual):
    return sum(individual),

toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)        # 2点交叉
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)  # ビット反転突然変異
toolbox.register("select", tools.selTournament, tournsize=3)  # トーナメント選択

population = toolbox.population(n=300)
hof = tools.HallOfFame(1)

population, log = algorithms.eaSimple(
    population, toolbox,
    cxpb=0.5, mutpb=0.2, ngen=40,
    halloffame=hof, verbose=True
)
print(f"最良個体の適応度: {sum(hof[0])}/100")