总述:
正好人工智能课最后次作业了,用java写下遗传算法,感觉做的还可以,分享到blog供大家参考,不足可以指正。
遗传算法(Genetic Algorithm,GA)的原理先说下,就是基于生物进化理论,包括选择,交叉,变异三个主要操作,然后不停迭代直到限定条件,基本流程如下图,
这次作业分别是用GA实现函数极值求解以及N皇后问题,具体的实现代码见github:https://github.com/ericliyanghui/-N-
下面分别说明:
PART1. 函数极值
给出如下题:
三个参数自己取,具体看下面代码,先用matlab作个图,
然后求下极值:
下面就是遗传算法套到这上面了,因为正好1024个数,所以用10位二进制编码。我直接给出相应代码块截图了,逻辑自理,
代码:
(1) 全局变量:GA的参数以及相应变量
(2) 初始化种群:这里包含随机生成N个0-1023的值并转为对应二进制,同时计算对应0-1的x值
(3) 选择:参考网上可靠资料,采用锦标赛法,即每次随机选取2个变量,选取函数值较大的作为下一代
(4) 交叉变异:
首先交叉选取概率+双亲双子,即从前往后遍历,若随机值小于pc,则将当前序列与后一个序列交叉,交叉采用随机生成下标,将两个序列的下标后的子序列相互交换。
然后变异选取概率+单位变异法:即从前到后遍历,对每个序列若随机概率小于pm,则随机生成下标,对相应下标取否。
(5) 更新:主要对上述的序列集更新函数值和x值
结果:
这里我用了java调用matlab的java接口的方式,具体自行搜索以及看我源码readme
经过实测以及网上的资料,对这个问题1000代即可收敛。
PART2. N皇后问题
N皇后主要注意初始化要保证每个下标的值不同,同时在交叉中也要使用去重算子,这样保证在同列不会重叠,使计算冲突时达到最优效率。
下面给出代码块,逻辑很清晰。
代码
(1) 全局变量:
(2) 主函数:
(3) 冲突数函数:采用数组法
(4) 随机数函数:对原算法改进了
(6) 初始化种群:
(7) 选择种群:锦标赛法
(8) 交叉:这里采用概率+常规交配法
(9) 变异:这里采用基于次序变异
(10) 更新:主要更新编码数组以及冲突数组
结果
这里就给一组数据,1000皇后
然后给下我之前用C实现的改进贪心N皇后结果
抛开两者差异,贪心还是稍微快点。不过在跑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