|
<>用的都是最基本的算子。求一个有取值范围的2元非线形函数(既ff(x1,x2)函数)。</P>
<>但结果总是收敛到局部最小值。</P>
<>我想可能是由于C++中取随机数函数不够随机(只有一个rand( )函数)的缘故。恳请高手给予指点,谢谢!</P>
<P>头文件:(由于比较仓促,没有很多注释,代码也不完善,不便之处恳请原谅:)</P>
<P>#include "math.h"
#include "time.h"
#define pi 3.14159
int seed;
/******/
int get_bit(int N)
{
int m=0;
int t=1;
while(t<N)
{
m++;
t*=2;
}
return m;
}</P>
<P>int change(CString str)
{
int n=str.GetLength();
int m=1;
int value=0;
for(int i=1;i<=n;i++)
{
if(str.GetAt(n-i)=='1')
value+=m;
m*=2;</P>
<P>}
return value;
}</P>
<P>
void get_value(CString str,float & x1,float & x2) //取得染色体对应的实际解的值;
{
CString x1_str=str.Left(18);
CString x2_str=str.Right(15);
int x1n=change(x1_str);
int x2n=change(x2_str);
x1=-3.0+x1n*(12.1-(-3.0))/(pow(2,18)-1);
x2=4.1+x2n*(5.8-4.1)/(pow(2,15)-1);</P>
<P>}</P>
<P>
float f(float x1,float x2)
{
float y=21.5+x1*sin(4*pi*x1)+x2*sin(2*pi*x2);
return y;
}</P>
<P>CString rand_make(int n)
{
CString s;
srand((unsigned)time(NULL));
for(int i=1;i<=n;i++)
{
if((float)rand()/RAND_MAX>=0.5)
s+='0';
else
s+='1';</P>
<P>}
return s;
}</P>
<P>
void InitPop(CString ps[],int num,int bit) //num为染色体个数,bit为每个染色体的基因数
{
CString s;
srand((unsigned)time(NULL));
seed=rand();
srand(seed);
for(int i=1;i<=num;i++)
{
for(int j=1;j<=33;j++)
{
if((float)rand()/RAND_MAX>=0.5)
s+='0';
else
s+='1';
}
ps[i-1]=s;
s.Empty();
}
}</P>
<P>
void duplicate(CString pstr[],int num)
{
float x1,x2;
CString * ps=new CString[num];
float* pp=new float[num];
float* pq=new float[num];
float* pv=new float[num];
float tp=0;
float p=0;
for(int i=0;i<num;i++)
{
get_value(pstr,x1,x2);
pv=f(x1,x2);
tp+=pv;
}
pp[0]=pv[0]/tp;
pq[0]=pp[0];
for(int i=1;i<num;i++) //计算累积概率区间
{
pp=pv/tp;
pq=pq[i-1]+pp;
}
srand(seed); //进行复制操作。(每次产生的随机数可能是一样的。)
seed=rand();
srand(seed);
for(int i=0;i<num;i++)
{
p=(float)rand()/RAND_MAX;
if(p<pq[0]&&p>=0)
ps=pstr[0];
else
{
for(int j=1;j<num;j++)
{
if(p>=pq[j-1]&&p<pq[j])
ps=pstr[j];
}
}
}
for(int i=0;i<num;i++)
pstr=ps;</P>
<P>delete[] ps;
delete[] pp;
delete[] pv;
delete[] pq;
}</P>
<P>
void exchange(CString pstr[],int num,int bits,float p)
{
int * pPos=new int[num];
int pos=0;
int m=0,k1=0,k2=0;
CString str11,str12,str21,str22;
srand(seed);
seed=rand();
srand(seed);
for(int i=0;i<num;i++)
{
if((float)rand()/RAND_MAX<=p)
{
pPos[m]=i;
m++;
}
}
for(int i=0;i<m-1;i++)
{
k1=pPos; //pstr[k1],pstr[k2]两个染色体进行交换、
k2=pPos[i+1];
pos=int((float)rand()/RAND_MAX*bits);
str11=pstr[k1].Left(pos);
str12=pstr[k1].Right(bits-pos);
str21=pstr[k2].Left(pos);
str22=pstr[k2].Right(bits-pos);
pstr[k1]=str11+str22;
pstr[k2]=str21+str12;
}
}</P>
<P>void mutation(CString pstr[],int num,int bits,float p)
{
srand(seed);
seed=rand();
srand(seed);
for(int i=0;i<num*bits;i++)
{
if((float)rand()/RAND_MAX<=p) //在的i个位置上进行基因突变。
{
int a=i/bits;
int b=i-a*bits;
if(pstr[a].GetAt(b)=='1')
pstr[a].SetAt(b,'0');
else
pstr[a].SetAt(b,'1');
}
}
}</P>
<P>void GetMax(CString pstr[],int num,float& x1,float& x2,float& value)
{
float xx1,xx2,vvalue;
get_value(pstr[0],x1,x2);
value=f(x1,x2);
for(int i=1;i<num;i++)
{
get_value(pstr,xx1,xx2);
vvalue=f(xx1,xx2);
if(value<vvalue)
{
value=vvalue;
x1=xx1;
x2=xx2;
}
}
}</P>
<P>MAIN函数内容</P>
<P>for(int i=1;i<=1000;i++)
{
duplicate(pstr,num);
exchange(pstr,num,bit,0.7);
mutation(pstr,num,bit,0.01);
GetMax(pstr,num,a,b,y);
if(y>value)
{
value=y;
x1=a;
x2=b;
findAt=i;
}
}
cout<<"After 1000 iteration,The max value was found at step "<<findAt
<<",the value is:"<<value<<",x1="<<x1<<",x2="<<x2;</P> |
|