最近学习人工智能刚好学到了遗传算法,虽然我们的老师就让我们down一个就ok了,不过出于对于研究算法的爱好,就花了一天的功夫整了一下,感觉效率还可以,就记录一下coding的思路,和大家分享一下。
遗传算法介绍
遗传算法(Genetic Algorithm,简称GA)是一种启发式搜索算法,它模拟的是达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,通过不断的进化和遗传来搜索最优解。
简单流程如下:
1. 随机初始化一定数量的种群(Population)个体(Individual),对个体进行基因(DNA)编码
2. 计算种群中个体的适应度(fittness)
3. 根据每一个个体的适应度,通过一定规则进行选择(selection)
4. 对选中的个体按一定概率进行交叉操作(copulation)
5. 对选中的个体按一定概率进行变异操作(heteromorphosis)
6. 生成新的种群Population' ,满足迭代上限则返回,否则进入2
流程图如下:
解决TSP问题
旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
数据结构
本篇先介绍一下基本的数据结构以及一些重要参数的定义。具体的各个算法及分析将在后续篇章跟上。
参数常量定义
#define MAX_CITY_COUNT 20 //最大城市数量
#define MAX_GENRATION_COUNT 20 //最大迭代次数
#define MAX_INIT_POPULATION_COUT 10 //初始种群数量
#define MAX_DNA_SIZE 20 //DNA的长度(相当于城市数量)
#define MAX_COPULATION_SIZE 3 //交叉个体DNA时允许的最大交叉长度
#define MAX_GENERATION_NUM_WHEN_BEST_NOT_CHANGE 100 //当最优个体没有变化时允许的最大迭代周期
#define MIN_ACCEPT_FITTNESS //可以接受的最小适应度,当种群中的最优个体达到最小满足适应度后,停止进化
城市的存储结构
struct City{
int _posX;
int _posY;
};
City cities[MAX_CITY_COUNT]={
{
60,