Python中如何使用GAFT遗传算法框架进行优化

最近需要用到遗传算法来做优化,就写了个小框架,可以自定义遗传算子和分析插件,后续将添加一装饰器方式的适值函数标定。

GitHub: https://github.com/PytLab/gaft


Python中如何使用GAFT遗传算法框架进行优化
3 回复

要使用GAFT框架进行遗传算法优化,首先得安装它:pip install gaft。然后你得定义自己的问题,主要是实现一个适应度函数。下面我直接给你一个完整的例子,比如我们要找函数 f(x) = x^2 在 [-10, 10] 区间的最小值。

from gaft import GAEngine
from gaft.components import BinaryIndividual, Population
from gaft.operators import TournamentSelection, UniformCrossover, FlipBitMutation
from gaft.analysis import FitnessStore

# 1. 定义适应度函数
def fitness_func(indv):
    # 将二进制基因解码为十进制数
    x = indv.decode()
    # 我们求最小值,所以适应度取负(框架默认求最大值)
    return - (x[0] ** 2)

# 2. 创建个体和种群
indv_template = BinaryIndividual(ranges=[(-10, 10)], eps=0.001) # eps是精度
population = Population(indv_template=indv_template, size=50).init()

# 3. 创建遗传算法引擎并注册组件
engine = GAEngine(population=population, fitness=fitness_func)

# 注册遗传算子
engine.selection_operator = TournamentSelection()
engine.crossover_operator = UniformCrossover(pc=0.8, pe=0.5)
engine.mutation_operator = FlipBitMutation(pm=0.1)

# 4. 运行优化
engine.run(ng=100) # ng是迭代代数

# 5. 获取最佳个体
best_indv = engine.population.best_indv(fitness_func)
best_x = best_indv.decode()[0]
best_fitness = -fitness_func(best_indv) # 记得转换回原函数值

print(f'最优解 x ≈ {best_x:.6f}')
print(f'最优值 f(x) ≈ {best_fitness:.6f}')

核心步骤拆解:

  1. 写适应度函数:这是你的优化目标。GAFT默认求最大值,如果你要求最小值,就像我上面那样加个负号。
  2. 定义个体BinaryIndividual 用二进制编码,你需要指定变量的取值范围和精度。对于连续问题,也可以考虑用 DecimalIndividual
  3. 设置种群和引擎:把个体模板和种群大小给 Population,然后连同适应度函数一起传给 GAEngine
  4. 配遗传算子:选择、交叉、变异算子都得装上,参数像交叉概率 pc、变异概率 pm 按需调整。
  5. 跑起来:调用 engine.run(ng)ng 是迭代次数。

如果想优化多个变量,比如找 f(x, y) = x^2 + y^2 的最小值,只需要改两个地方:

# 个体模板里 ranges 给两个区间
indv_template = BinaryIndividual(ranges=[(-5, 5), (-5, 5)], eps=0.001)
# 解码后 x 是一个列表,x[0], x[1] 对应两个变量
def fitness_func(indv):
    x, y = indv.decode()
    return - (x**2 + y**2)

一句话建议:先跑通这个简单例子,再把你自己的问题套进适应度函数里。


学习学习~~~
不过倒是第一次见到 pyThon 这种写法,愣了一下才反映过来。

哈哈,起名字的时候瞎写的

回到顶部