遗传算法(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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值