遗传算法(JAVA+MATLAB)可视化

总述:

正好人工智能课最后次作业了,用java写下遗传算法,感觉做的还可以,分享到blog供大家参考,不足可以指正。

遗传算法(Genetic Algorithm,GA)的原理先说下,就是基于生物进化理论,包括选择,交叉,变异三个主要操作,然后不停迭代直到限定条件,基本流程如下图,

                                                                          遗传算法(JAVA+MATLAB)可视化_第1张图片

这次作业分别是用GA实现函数极值求解以及N皇后问题,具体的实现代码见github:https://github.com/ericliyanghui/-N-

下面分别说明:

PART1. 函数极值

给出如下题:

                                     

            三个参数自己取,具体看下面代码,先用matlab作个图,

                                 遗传算法(JAVA+MATLAB)可视化_第2张图片

                   然后求下极值:

                                                                         

                   

      下面就是遗传算法套到这上面了,因为正好1024个数,所以用10位二进制编码。我直接给出相应代码块截图了,逻辑自理,

代码:

(1) 全局变量:GA的参数以及相应变量

                                        遗传算法(JAVA+MATLAB)可视化_第3张图片 

(2)  初始化种群:这里包含随机生成N个0-1023的值并转为对应二进制,同时计算对应0-1的x值

                                   遗传算法(JAVA+MATLAB)可视化_第4张图片

(3) 选择:参考网上可靠资料,采用锦标赛法,即每次随机选取2个变量,选取函数值较大的作为下一代

                                  遗传算法(JAVA+MATLAB)可视化_第5张图片

(4) 交叉变异:

首先交叉选取概率+双亲双子,即从前往后遍历,若随机值小于pc,则将当前序列与后一个序列交叉,交叉采用随机生成下标,将两个序列的下标后的子序列相互交换。

然后变异选取概率+单位变异法:即从前到后遍历,对每个序列若随机概率小于pm,则随机生成下标,对相应下标取否。

                                         遗传算法(JAVA+MATLAB)可视化_第6张图片

(5) 更新:主要对上述的序列集更新函数值和x值

                                          遗传算法(JAVA+MATLAB)可视化_第7张图片

结果:

这里我用了java调用matlab的java接口的方式,具体自行搜索以及看我源码readme

                                         遗传算法(JAVA+MATLAB)可视化_第8张图片

                                      

经过实测以及网上的资料,对这个问题1000代即可收敛。

 

PART2. N皇后问题

N皇后主要注意初始化要保证每个下标的值不同,同时在交叉中也要使用去重算子,这样保证在同列不会重叠,使计算冲突时达到最优效率。

下面给出代码块,逻辑很清晰。

代码

(1) 全局变量:

                                     遗传算法(JAVA+MATLAB)可视化_第9张图片

(2) 主函数:

                                       遗传算法(JAVA+MATLAB)可视化_第10张图片

(3) 冲突数函数:采用数组法

                                        遗传算法(JAVA+MATLAB)可视化_第11张图片

(4) 随机数函数:对原算法改进了

                                           遗传算法(JAVA+MATLAB)可视化_第12张图片

(6) 初始化种群:

                             遗传算法(JAVA+MATLAB)可视化_第13张图片

(7) 选择种群:锦标赛法

                                 遗传算法(JAVA+MATLAB)可视化_第14张图片

(8) 交叉:这里采用概率+常规交配法

                                  遗传算法(JAVA+MATLAB)可视化_第15张图片

(9) 变异:这里采用基于次序变异

                                 遗传算法(JAVA+MATLAB)可视化_第16张图片

(10)  更新:主要更新编码数组以及冲突数组

                                 遗传算法(JAVA+MATLAB)可视化_第17张图片

结果

这里就给一组数据,1000皇后

                    遗传算法(JAVA+MATLAB)可视化_第18张图片

                         

然后给下我之前用C实现的改进贪心N皇后结果

                                                     遗传算法(JAVA+MATLAB)可视化_第19张图片

抛开两者差异,贪心还是稍微快点。不过在跑GA时我还在做别的事,所以对GA有点不公平,不过时间性能确实差了很多。

 

总结

为什么要用java写呢,因为这课的作业我是C/C++, python, java循环用的,这次正好轮到java,而且也是测试下java的代码量,确实和matlab没法比,所以大家GA还是尽量用Matlab写,矩阵操作方便多了,java这东西还是写android去吧。

然后可视化也是第一次用matlab的java接口,感觉还可以。

 

转载请注明出处:https://blog.csdn.net/qq_26779635/article/details/84997223

你可能感兴趣的:(人工智能,JAVA,遗传算法,matlab,人工智能)