这就是我到目前为止所拥有的.正如我从输出中看到的,我的参数不足以将Mutations 约束到我的需求.有时不会改变一个基因,有时会改变不止一个.

import pygad
import numpy as np


def divider(ga_instance):
    return np.max(np.sum(ga_instance.population, axis=1))


def on_start(ga_instance):
    print("on_start()")
    print(f'Начальная популяция:\n {ga_instance.population}')


def fitness_function(ga_instance, solution, _):
    return np.sum(solution) / divider(ga_instance)


def on_fitness(ga_instance, population_fitness):
    print(f'\non_fitness()')
    print(f'Делитель: {divider(ga_instance)}')
    for idx, (instance, fitness) in enumerate(zip(ga_instance.population, ga_instance.last_generation_fitness)):
        print(f'{idx}. {instance}: {fitness}')


def on_parents(ga_instance, selected_parents):
    print("\non_parents()")
    print(f'Выбранные индексы родителей: {ga_instance.last_generation_parents_indices}')
    print(f'Выбранные родители:\n {ga_instance.last_generation_parents}')


def on_crossover(ga_instance, offspring_crossover):
    print("\non_crossover()")
    print(f'Результат кроссинговера:\n {ga_instance.last_generation_offspring_crossover}')


def on_mutation(ga_instance, offspring_mutation):
    print("\non_mutation()")
    print(f'Результат мутации:\n {ga_instance.last_generation_offspring_mutation}')


def on_generation(ga_instance):
    print(f"\non_generation()")
    print("Выведенное поколение:\n ", ga_instance.population)
    sol = ga_instance.best_solution()
    print(f"Лучшее решение: {sol[0]} : {sol[1]}")


ga_instance = pygad.GA(
    num_generations=1,
    num_parents_mating=2,
    fitness_func=fitness_function,
    gene_type=int,
    init_range_low=0,
    init_range_high=2,
    sol_per_pop=10,
    num_genes=8,
    crossover_type='single_point',
    parent_selection_type="rws",
    mutation_type="inversion",
    mutation_num_genes=1,
    on_start=on_start,
    on_fitness=on_fitness,
    on_parents=on_parents,
    on_crossover=on_crossover,
    on_mutation=on_mutation,
    on_generation=on_generation,
)

ga_instance.run()

有关堆栈溢出算法的更多详细信息,请访问sdfgdsfdddddddddddfffffffffadsgadfgdafgdasgadsgdsagdsagdsagadsgdsagdsagdsag.

推荐答案

反转Mutations 颠倒了基因子集的顺序.它不会将基因的值从0反转到1.也就是说,如果你有一个类似abcd的染色体,那么反转Mutations 会将基因反转为dcba.

要应用将基因从0翻转为1和从1翻转为0的变异运算符,请使用以下代码.它创建新函数flip_mutation()来翻转比特.

import pygad
import numpy as np


def divider(ga_instance):
    return np.max(np.sum(ga_instance.population, axis=1))


def on_start(ga_instance):
    print("on_start()")
    print(f'Начальная популяция:\n {ga_instance.population}')


def fitness_function(ga_instance, solution, _):
    return np.sum(solution) / divider(ga_instance)


def on_fitness(ga_instance, population_fitness):
    print(f'\non_fitness()')
    print(f'Делитель: {divider(ga_instance)}')
    for idx, (instance, fitness) in enumerate(zip(ga_instance.population, ga_instance.last_generation_fitness)):
        print(f'{idx}. {instance}: {fitness}')


def on_parents(ga_instance, selected_parents):
    print("\non_parents()")
    print(f'Выбранные индексы родителей: {ga_instance.last_generation_parents_indices}')
    print(f'Выбранные родители:\n {ga_instance.last_generation_parents}')


def on_crossover(ga_instance, offspring_crossover):
    print("\non_crossover()")
    print(f'Результат кроссинговера:\n {ga_instance.last_generation_offspring_crossover}')


def on_mutation(ga_instance, offspring_mutation):
    print("\non_mutation()")
    print(f'Результат мутации:\n {ga_instance.last_generation_offspring_mutation}')


def on_generation(ga_instance):
    print(f"\non_generation()")
    print("Выведенное поколение:\n ", ga_instance.population)
    sol = ga_instance.best_solution()
    print(f"Лучшее решение: {sol[0]} : {sol[1]}")


def flip_mutation(offspring, ga_instance):
    for idx in range(offspring.shape[0]):
        mutation_gene1 = np.random.randint(low=0, high=np.ceil(offspring.shape[1]/2 + 1), size=1)[0]
        if offspring[idx, mutation_gene1] == 1:
            offspring[idx, mutation_gene1] = 0
        else:
            offspring[idx, mutation_gene1] = 1

    return offspring

ga_instance = pygad.GA(
    num_generations=1,
    num_parents_mating=2,
    fitness_func=fitness_function,
    gene_type=int,
    init_range_low=0,
    init_range_high=2,
    sol_per_pop=10,
    num_genes=8,
    crossover_type='single_point',
    parent_selection_type="rws",
    mutation_type=flip_mutation,
    mutation_num_genes=1,
    on_start=on_start,
    on_fitness=on_fitness,
    on_parents=on_parents,
    on_crossover=on_crossover,
    on_mutation=on_mutation,
    on_generation=on_generation,
)

ga_instance.run()

Python相关问答推荐

Python-Polars:如何用两个值的平均值填充NA?

如何确保Flask应用程序管理面板中的项目具有单击删除功能?

在Python中,如何才能/应该使用decorator 来实现函数多态性?

如何在不使用字符串的情况下将namedtuple属性传递给方法?

KNN分类器中的GridSearchCV

阅读Polars Python中管道的函数定义

如何根据情况丢弃大Pandas 的前n行,使大Pandas 的其余部分完好无损

剧作家Python:expect(locator).to_be_visible()vs locator.wait_for()

Pythind 11无法弄清楚如何访问tuple元素

删除最后一个pip安装的包

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

运行Python脚本时,用作命令行参数的SON文本

可变参数数量的重载类型(args或kwargs)

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

计算每个IP的平均值

UNIQUE约束失败:customuser. username

CommandeError:模块numba没有属性generated_jit''''

旋转多边形而不改变内部空间关系

在matplotlib中使用不同大小的标记顶部添加批注

python sklearn ValueError:使用序列设置数组元素