📄 ga.cpp
字号:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#define Max_num 50
double Buffer[Max_num];//存储样本个体
double func_yc(double x)
{ //构造被遗传函数
double i,j,k;
i=5*3.1415926*x;
j=sin(i);
k=pow(j,6);
return k;
//while (x<=1 && x>=0);
}
double Random_float()
{//类型转换隐藏在运算中//产生一个0到1之间的数
double d=(rand() * 1.0)/RAND_MAX;
return d;
}
void yc_func(int maxID)
{ //后代生成函数,实际为最优良染色体变异而来生成新的个体群
Buffer[0]=Buffer[maxID];
for(int i=1; i<=Max_num/2; i++)
{
Buffer[i]=Buffer[0]+(Random_float()/30);
if (Buffer[i]>1)
Buffer[i]=1;
}
for(i=Max_num/2;i<=Max_num;i++)
{
Buffer[i]=Buffer[0]-(Random_float()/30);
if (Buffer[i]<0)
Buffer[i]=0;
}
}
int GetMax()
{//寻找最大个体元
int maxID=0;//取得最大值的x的下标
double maxvaule=func_yc(Buffer[0]);//函数最大值
for (int i=1;i<=Max_num;i++)
{//求解最大值
if (func_yc(Buffer[i])>maxvaule)
{
maxvaule=func_yc(Buffer[i]);
maxID=i;
}
}
return maxID;//返回最大值自变量下标
}
///主函数入口
int main(void)
{ int n;//遗传的代数
double maxvalue=0;//保存函数最大值
char ch=' ';//执行控制标志 继续—退出?a
do{cout<<"初始化种群中含有的个体数("<<Max_num<<"个)"<<endl<<endl;
for (int i=0;i<Max_num; i++) // 随机初始化群体
{
Buffer[i]=Random_float();//保存至缓冲数组
}
cout<<"提示:输入代数n值应适中,太大影响效率"<<endl;
cout<<"======太小结果不精确,推荐值为30======"<<endl<<endl;
cout<<"请输入要产生的代数n: "<<endl;//过大影响效率,过小结果不精确
scanf("%d",&n);//请求输入后代数
cout<<endl;
cout<<"============下面是各代函数值的情况============="<<endl;
cout<<"通过遗传算法的优胜劣汰准则将越来越接近全局极大值"<<endl<<endl;
for(i=0;i<n;i++)
{
int maxID=GetMax();
if (func_yc(Buffer[maxID])>maxvalue)
maxvalue=func_yc(Buffer[maxID]);
yc_func(maxID);
cout<<"第"<<i+1<<"代取值情况为:"<<endl;
cout<<"当x取"<<Buffer[0]<<"时"<<"函数sin^6(5*pi*x)值= "<<maxvalue<<endl<<endl;
}//选取优良后代
cout<<"-----------------------------------------------------"<<endl;
cout<<"当x取"<<Buffer[0]<<"时"<<"函数sin^6(5*pi*x)有最大值=: "<<maxvalue<<endl;
cout<<"-----------------------------------------------------"<<endl;
cout<<"选择操作"<<endl;
cout<<"a---重新进行计算\t"<<" 其他字符---退出程序"<<endl;
cout<<"-----------------------------------------------------"<<endl;
cin>>ch;//结果输出
}while(ch=='a');
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -