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}')
核心步骤拆解:
- 写适应度函数:这是你的优化目标。GAFT默认求最大值,如果你要求最小值,就像我上面那样加个负号。
- 定义个体:
BinaryIndividual用二进制编码,你需要指定变量的取值范围和精度。对于连续问题,也可以考虑用DecimalIndividual。 - 设置种群和引擎:把个体模板和种群大小给
Population,然后连同适应度函数一起传给GAEngine。 - 配遗传算子:选择、交叉、变异算子都得装上,参数像交叉概率
pc、变异概率pm按需调整。 - 跑起来:调用
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 这种写法,愣了一下才反映过来。


