注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

说好的遗传算法实践  

2012-06-04 09:14:11|  分类: 数据组织和算法 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://lnlover.blog.163.com/blog/static/1980304322012515313833/ 
上篇日志中对遗传算法有了一定的认识,但是没有动手实践,今天特意早起把这个算法实践出来,一方面自我学习,一方面也可以交下午人工智能的报告咯。因为快要期末考试了,时间比较局促所以条件设置的都非常简单,但是基本的原理和步骤还是有的。
用遗传算法求函数F(y)=3*pow(y,4)-20*pow(y,3)+8*x-ldexp(y,5)+1000在【0,15】上的局部最大值首先上图实验结果:
说好的遗传算法实践 - 刘邓 - 刘邓
下面是代码部分:

//Inherit.h
#ifndef INHERIT_H
#define InHERIT_H
#include<iostream>
#include<string>
#include<vector>
#include<cstdlib>
#include<fstream>
#include<cmath>
#include<time.h>
using namespace std;
namespace LD
{
inline float random(float a, float b)//用于产生(0,1)浮点随机数
{
return a+static_cast<float>(rand())/RAND_MAX*(b-a);
}
inline size_t select(float *a)
{
//srand((unsigned)time(NULL));
float t = random(0,1);
if(t<a[0]) return 0;
if(t<a[1]) return 1;
if(t<a[2]) return 2;
return 3;
}
int Adapta(int x) //适应度函数求值
{
float y = x;
return 3*pow(y,4)-20*pow(y,3)+8*x-ldexp(y,5)+1000;
}
class CUnit //个体表示
{
public:
int m_Num;//个体
int m_Ada;//个体适应度
CUnit(int Num)
{
m_Num = Num;
m_Ada = Adapta(Num);
}
};

class CRace
{
public:
static int m_count; //种族代数计数
vector<CUnit> m_Race; //种群集合
CRace(const vector<CUnit> & race)
{
m_Race = race;
}
void print()
{
cout<<"第"<<m_count<<"代种的个体及其适应度分别为:"<<endl;
for(size_t i = 0;i<m_Race.size();i++)
cout<<m_Race[i].m_Num<<" "<<m_Race[i].m_Ada<<endl;
}
CRace inherit()
{
//选择复制
int sumAda = m_Race[0].m_Ada+m_Race[2].m_Ada+
m_Race[2].m_Ada+m_Race[3].m_Ada;
float f[4];
for(size_t i=0;i<4;++i)
f[i] =(float) m_Race[i].m_Ada/sumAda;
//累计概率
float sumf[4] = {f[0],f[0]+f[1],f[0]+f[1]+f[2],1};
vector<CUnit> Gt1; //过渡带1要产生了
for(size_t i= 0;i<4;++i)
Gt1.push_back(m_Race[select(sumf)]);
//CRace race(Gt2); //测试
//race.print();
//这里选择了四个个体 所以100%杂交
//为方便起见这里之间选择1和2杂交 3和4杂交(实际情况可以生成随机数判断)
//通过移位运算和位操作模拟杂交过程
vector<CUnit> Gt2;
int t =Gt1[1].m_Num>>2;
Gt2.push_back(CUnit(t^Gt1[0].m_Num));
t = Gt1[0].m_Num>>2;
Gt2.push_back(CUnit(t^Gt1[1].m_Num));
t = Gt1[0].m_Num>>2;
Gt2.push_back(CUnit(t^Gt1[3].m_Num));
t = Gt1[3].m_Num>>2;
Gt2.push_back(CUnit(t^Gt1[2].m_Num));
//CRace race(Gt2); //测试
//race.print();
//变异:直接设置为50%变异率
t = rand()%4;
Gt2[t] =CUnit( Gt2[t].m_Num^t);
srand((unsigned)time(NULL));
t = t = rand()%4;
Gt2[t]= CUnit(Gt2[t].m_Num^t);
++m_count;
//CRace race(Gt2); //测试
//race.print();
return CRace(Gt2);
}
};


}

#endif

//Inherit.cpp
#include"Inherit.h"
using namespace LD;
int CRace::m_count = 1;
int main()
{
srand((unsigned)time(NULL));
vector<CUnit> race;
for(size_t i =0;i<4;++i)
race.push_back(CUnit(rand()%16));
CRace RACE(race);
RACE.print();
for(size_t i = 0;i<5;++i){
RACE = RACE.inherit();
RACE.print();
}
return 0;
}


 
  评论这张
 
阅读(70)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017