📄 myga.cpp
字号:
#include "MyGa.h"
#include "MyRan.h"
#include <cmath>
namespace ProeGa
{
Ga1::Ga1()
{
Param.M=10;//10 个个体
Param.T=500;//500次迭代
Param.pc=0.4;//交叉
Param.pm=0.2;//变异
Param.Umax=100;
Param.Umin=-100;
Param.GussR=12;
Param.val=2;
//spand();
for(int i=0;i<10;i++)
{
for(int j=0;j<Param.val;j++)
{
if(IntRandom0_1()) Parent[i].Gene[j]=DouRandom0_1()*100;
else Parent[i].Gene[j]=DouRandom0_1() * (-100);
}
GetFit(Parent[i]);
Parent[i].Pselect=0;
}
}
Ga1::~Ga1()
{
}
///////////
double Ga1::GetGuss()
{
double b=0;
for (int i=0 ;i<Param.GussR;i++)
{
b=b+DouRandom0_1();
}
return (b-6)*(Param.Umax-Param.Umin)/6+(Param.Umax+Param.Umin)/2;
/*
if (IntRandom0_1()) return DouRandom0_1()*100;
else return DouRandom0_1()*(-100); */
}
/////////////
int Ga1::GetFit(Individual& a)//修改输入的函数
{
double b= pow(a.Gene[0],2)+pow(a.Gene[1],2);
double c=pow(1+0.001*b,2);
b=pow(sin(pow(b,0.5)),2);
a.Fitness=0.5+(b-0.5)/c;
return EXIT_SUCCESS;
}
///////////////////////////
int Ga1::IntersectInd(Individual& a,Individual& b)
{
double temp;
for (int i=0;i<Param.val;i++)
{
if(!IntRandom0_1())
{
temp=a.Gene[i];
a.Gene[i]=b.Gene[i];
b.Gene[i]=temp;
}
}
return EXIT_SUCCESS;
}
/////////////////
int Ga1::Intersect()
{
int count=int(Param.pc*Param.M);
for (int i=0 ; i<count/2;i++)
{
Individual a1=Parent[IntRandom0_val(Param.M)];
Individual a2=Parent[IntRandom0_val(Param.M)];
IntersectInd(a1,a2);
GetFit(a1);GetFit(a2);
Child.push_back(a1);
Child.push_back(a2);
}
return EXIT_SUCCESS;
}
int Ga1::varia()
{
int VarGenCoun=int(Param.M*Param.val*Param.pm);
for (int i=0 ; i<VarGenCoun;i++)
{
int x=IntRandom0_val(Param.M);
Individual a=Parent[x];
double mm=GetGuss();
a.Gene[IntRandom0_val(Param.val)]=mm;
GetFit(a);
Child.push_back(a);
}
return EXIT_SUCCESS;
}
int Ga1::Sort()
{
Individual a;
for (int i=0;i<Param.M;i++)
Child.push_back(Parent[i]);
for(int j=0;j<Param.M;j++)
{
a=Child[0];int m=0;
for(int k=0;k<Child.size();k++)
{
if (Child[k].Fitness<a.Fitness)
{
a=Child[k];
m=k;
}
}
Parent[j]=a;
Child.erase(Child.begin()+m);
}
return EXIT_SUCCESS;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -