一个简单问题的遗传算法的实现
2010-05-23 14:54
405 查看
刚开始研究遗传算法,所以先尝试用该算法实现解决一个简单的问题问题如下:
求函数
f(x)=x^2
在区间
[0,31]
内的最大值,其中
x
取整数
利用遗传算法解决的
思路如下:
1.
编码策略
用五位二进制表示
x
的
0~31
共
32
个数
2.
初始种群
初始种群为随机的
4
个个体
3.
适应函数
将二进制转换为十进制,并取其平方即得到适应度
4.
选择算子
适应性大的个体被选中的概率也大
5.
交叉算子与变异算子
交叉概率为
1
,变异概率为
0.01
交叉点为随机产生的一个范围为
1-5
的数,假定产生一个随机数位
3
,则
10000
与
11111
交叉后为
10111
,
11000
以下是该算法的java代码实现,代码写的时间比较短,没怎么优化及注释,不过可以看到结果了。代码只输出了遗传算法中每一代中的种群个体染色体情况。从代码的输出结果可以看出,算法找到了最优解11111,但是由于变异的存在,又会跳到其他解,不过运行几秒之后停下来后你会发现他的解是接近最优的。
本文参考了《人工智能导论》(鲍军鹏,张选平等著,机械工业出版社,第207-209页)
本文为lgjfly原著,转载时请注明出处:http://blog.csdn.net/lgjfly
求函数
f(x)=x^2
在区间
[0,31]
内的最大值,其中
x
取整数
利用遗传算法解决的
思路如下:
1.
编码策略
用五位二进制表示
x
的
0~31
共
32
个数
2.
初始种群
初始种群为随机的
4
个个体
3.
适应函数
将二进制转换为十进制,并取其平方即得到适应度
4.
选择算子
适应性大的个体被选中的概率也大
5.
交叉算子与变异算子
交叉概率为
1
,变异概率为
0.01
交叉点为随机产生的一个范围为
1-5
的数,假定产生一个随机数位
3
,则
10000
与
11111
交叉后为
10111
,
11000
以下是该算法的java代码实现,代码写的时间比较短,没怎么优化及注释,不过可以看到结果了。代码只输出了遗传算法中每一代中的种群个体染色体情况。从代码的输出结果可以看出,算法找到了最优解11111,但是由于变异的存在,又会跳到其他解,不过运行几秒之后停下来后你会发现他的解是接近最优的。
import java.util.Random; /** * 一个遗传算法的简单例子: * 求函数f(x)=x^2在区间[0,31]内的最大值,其中x取整数 */ /** * 思路: * 1.编码策略 * 用五位二进制表示x的0~31共32个数 * 2.初始种群 * 初始种群为随机的4个个体 * 3.适应函数 * 将二进制转换为十进制,并取其平方即得到适应度 * 4.选择算子 * 适应性大的个体被选中的概率也大 * 5.交叉算子与变异算子 * 交叉概率为1,变异概率为0.01 * 交叉点为随机产生的一个范围为1-5的数,假定产生一个随机数位3,则10000与11111交叉后为10111,11000 */ /** * @author lgjfly * Class: GATest.java * Date: 2010-5-23 * @see http://blog.csdn.net/lgjfly */ public class GATest { public static void main(String[] args) { // TODO Auto-generated method stub GATest test = new GATest(); test.GA(); } //遗传算法核心 public int GA() { int[][] syngen = new int [4][5];//种群,共4个个体,每个个体编码为5位 int[] f=new int[4];//对应于每一个个体的适应度 int fsum=0;//适应度总和 int i,j; Random random = new Random(); //随机产生初始种群 for(i=0;i<4;i++) { for(j=0;j<5;j++) { syngen[i][j]=Math.abs(random.nextInt())%2; } } int[] p= new int [4];//对应的个体能够存活的概率*100 int[] survived= new int [4];//筛选之后对应的个体生存下来的个数 int m;//临时数 int generation=0; while(fsum<100000) { generation++; System.out.print("the "+generation+" generation : "); for(i=0;i<4;i++) { for(j=0;j<5;j++) { System.out.print(syngen[i][j]); } System.out.print(" "); } System.out.print("/n "); fsum=0; //计算当前代的种群适应度 for(i=0;i<4;i++) { f[i]=Evaluate(syngen[i]); fsum+=f[i]; } //计算当前代的每一个个体存活的概率,并将survived清零 for(i=0;i<4;i++) { p[i]=(100*f[i])/fsum; survived[i]=0; } //得到生存下来的个体的下标 for(i=0;i<4;i++) { m=Math.abs(random.nextInt())%100; if(m<p[0]) survived[0]++; else if(m<p[0]+p[1]) survived[1]++; else if(m<p[0]+p[1]+p[2]) survived[2]++; else survived[3]++; } //由下标得到新种群 for(i=0;i<4;i++) { if(survived[i]>0) continue; //从前面找第一个大于一的 j=0; while(survived[j]<=1) j++; //将j复制给i System.arraycopy(syngen[j], 0, syngen[i], 0, syngen[i].length); survived[j]--; } //交换 m=Math.abs(random.nextInt())%3+1; Exchange(syngen[0],syngen[m]); if(m==1) Exchange(syngen[2],syngen[3]); else if(m==2) Exchange(syngen[1],syngen[3]); else Exchange(syngen[1],syngen[2]); //变异 if(generation%8==0) { i=Math.abs(random.nextInt())%4; j=Math.abs(random.nextInt())%5; syngen[i][j]=(syngen[i][j]+1)%2; } } return 0; } //交叉算子,交换数组a,b后的随机位数 public int Exchange(int[] a,int[] b) { Random random = new Random(); int expoint=Math.abs(random.nextInt())%5;//交叉点位置,为一个1-5之间的数 int temp; for(int i=expoint;i>0;i--) { //交换a[i],b[i] temp=a[i]; a[i]=b[i]; b[i]=temp; } return 0; } //适应函数 public int Evaluate(int[] a) { int value=0; //将a转换为十进制 for(int i=0;i<5;i++) { value=value*2+a[i]; } value=value*value; return value; } }
本文参考了《人工智能导论》(鲍军鹏,张选平等著,机械工业出版社,第207-209页)
本文为lgjfly原著,转载时请注明出处:http://blog.csdn.net/lgjfly
相关文章推荐
- 实现简单的MVC模式,通过一个小例子,不是很完美,但是可以说明一部分的问题
- 分享一个简单的unityAI框架,基于神经网络和遗传算法,可以简单的实现自成长的游戏对象
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 火车运煤问题 - 增加一个简单算法实现
- 关于S5PV210的启动问题和u-boot分析并自己实现一个简单的boot(一)
- 问题:关于贴友的一个书本页面简单布局(html+css)的实现
- 问题:关于贴友一个用js传递value默认值的简单实现
- [异常解决] 初玩SAE遇到的小问题——注册&创建项目+MyEclipse装插件直接部署+一个简单的JSP部署实现
- 实现一个最简单图片列表所引发的问题
- Tensorflow实现一个简单的二分类问题
- 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行
- 问题:关于贴友一个用js传递value默认值的简单实现
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- RF框架-一个简单的脚本实现及元素定位不到问题的解决
- 实现了一个简单的聊天软件,但是有个BUG,一直没有想通问题出在哪里。
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- 一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题
- 用C#实现的一个简单任务机,解决了一般任务机无法定时执行任务的问题
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- Qt5.4.2实现一个简单的浏览器 及相关问题的解决