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

总述:

正好人工智能课最后次作业了,用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

  • 1
    点赞
  • 5
    收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

eHackyd

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值