遗传算法工具箱GAToolBox 之 Python实现

GAToolBox

该项目主要针对特征筛选进行优化,已编写名为 “A Real-time Human Activity Recognition Approach with Generalization Performance” 会议论文发表在第39届中国控制会议(CCC2020)论文集中,如需可点击论文名查看全文,同时该项目已上传至GitHub以及码云。实现的功能包括但不限于:

在计算机科学和运筹学中,遗传算法(Genetic Algorithm,GA)是受自然选择过程启发的一种元启发法,它属于进化算法(Evolutionary Algorithms, EA)的一种。 遗传算法依赖于诸如突变,交叉和选择等受生物学启发的操作,其通常用于为优化和搜索问题提供高质量解决方案。

In computer science and operations research, a genetic algorithm (GA) is a metaheuristic inspired by the process of natural selection that belongs to the larger class of evolutionary algorithms (EA). Genetic algorithms are commonly used to generate high-quality solutions to optimization and search problems by relying on biologically inspired operators such as mutation, crossover and selection.

所以根据分析我们需要解决算法的突变操作、交叉操作以及选择操作的代码是实现。同时如果需要有中断后继续训练的需求,我们还需要暂存当前数据至文件之中。

首先需要解决染色体的编码问题,常见的染色体编码有2进制、8进制、10进制、16进制。由于其中二进制的位编辑灵活简单,所以只进行了二进制编码的实现。其次是交叉和突变,交叉的可选类型较多,针对其实用性本文实现了单点交叉以及均匀交叉。而突变则是根据突变概率对于每一位进行变异操作。同时为了实现历史计算结果存储、上一代种群计算结果存储以及历史进化曲线存储,以保证程序中断后可以在原有基础上继续搜索进化,避免重复计算,同时实现了32进制与2进制数据间转换以方便染色体字的存储,主要针对计算量较大的情况进行的改进。同时为了特征筛选的需求,对于均匀交叉以及突变操作进行了优化以保证染色体中位为1的个数在允许范围内(也就是特征个数在允许范围内)。示例代码如下:

import numpy as np
from GAToolBox import GAToolBox


def fitness(factor):
    """
    用户的适应度函数
    """
    if type(factor) is list:
        binary = map(str, factor)
        binary_str = ''.join(binary)
        if len(binary_str) > 16:
            print(binary_str, "chromosome is too long !")
        dec = float(int(binary_str, 2)) / 65535.0 * 10.0
        return dec, sum([j * np.cos((j + 1) * dec + j) for j in range(1, 6)])
    else:
        return factor, sum([j * np.cos((j + 1) * factor + j) for j in range(1, 6)])


def chromosome_checker(factor):
    """
    用户的染色体检查器
    """
    return True


if __name__ == "__main__":
    GA = GAToolBox(min_value=-13, size_pop=10, max_gen=100, p_mutation=0.4, function=fitness,
                   chromosome_checker=chromosome_checker)
    GA.run(is_show_trace=True, if_show_search=True)

使用该示例代码的搜索结果如下图,其中蓝色曲线为目标函数,红色×点为当前种群最优解的位置。可以看出该遗传算法的搜索结果接近最优解。
遗传算法工具箱GAToolBox 之 Python实现_第1张图片
打印信息如下:

******************************************* Genetic Algorithm *****************************************
Information of population : 
	size of population : 10 
	length of chromosome : 16 
	max length : 16 
	min length : 0
Restore recorded history!
Path does not exist!
There is not data recorded !
**********************************Population Initialization********************************************
Progress of initialization :10/10, the number of last optimal solution:0 	
******************************************* Solving ***************************************************
Current best fitness_list: -12.869572985017939, current best accuracy: -12.869572985017939, progress of evolution: 100/100
Information of optimal solution : 
	best fitness : -12.869572985017939 
	best accuracy : -12.869572985017939 
	current best fitness : -12.586208312114682 
	current best accuracy : -12.586208312114682
Cost time: 15.184714317321777 s

运行后可看出遗传算法已找到最优解,现在进行参数讲解:

  • size_pop: 种群大小,默认为10
  • max_gen: 进化代数,默认为200
  • len_chromosome: 染色体长度,默认为16:
  • max_length: 染色体中位为1个数的最大值,默认与len_chromosome保持一致
  • min_length: 染色体中位为1个数的最小值,默认为0:
  • p_cross: 两个染色体相互交叉的概率,默认为0.6
  • p_exchange: 使用均匀交叉时每位的交叉概率,默认为0.3
  • p_mutation: 每个选中的染色体变异的概率以及每位变异的概率
  • gap: 隔代差异,即每次进化保留的上一代个体的概率,默认为0.9
  • min_value: 最优解的大小,默认为0,该项目中认为最优解适应度函数值最小
  • factor_best_temp: 已知的最优解染色体,默认为None
  • parallel_num: 使用多线程计算时线程个数
  • function: 适应度函数指针,默认为None
  • accuracy_fun: 准确率辅助函数,默认为None
  • chromosome_checker: 染色体检查器,检查染色体是否可用,默认为None
  • trace_file: 进化曲线存储文件名,默认为: “trace.csv”
  • recorder_file: 历史计算数据存储文件名,默认为: “result.csv”
  • current_chromosome_file: 最新已计算适应度的染色体存储文件名,默认为: “current_chromosome.csv”
  • data_path: 全部数据的存储路径,默认为: “./result”

参考论文如下:

S. -J. Wei, B. Zhang, X. -W. Tan, X. -G. Zhao and D. Ye, “A Real-time Human Activity Recognition Approach with Generalization Performance,” 2020 39th Chinese Control Conference (CCC), 2020, pp. 6334-6339, doi: 10.23919/CCC50068.2020.9188860.


谨以此文祭奠两位国士的离去,先生千古!
遗传算法工具箱GAToolBox 之 Python实现_第2张图片

你可能感兴趣的:(遗传算法,python)