数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3847|回复: 3

一个遗传算法的原代码(兼求助!)

[复制链接]
发表于 2004-8-31 22:49:56 | 显示全部楼层 |阅读模式
<>用的都是最基本的算子。求一个有取值范围的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&lt;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&lt;=n;i++)
{
  if(str.GetAt(n-i)=='1')
   value+=m;
  m*=2;</P>
<P>}
return value;
}</P>
<P>
void get_value(CString str,float &amp; x1,float &amp; 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&lt;=n;i++)
{
  
  if((float)rand()/RAND_MAX&gt;=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&lt;=num;i++)
{
  for(int j=1;j&lt;=33;j++)
  {
   if((float)rand()/RAND_MAX&gt;=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&lt;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&lt;num;i++)     //计算累积概率区间
{
  pp=pv/tp;
  pq=pq[i-1]+pp;
}
srand(seed); //进行复制操作。(每次产生的随机数可能是一样的。)
seed=rand();
srand(seed);
for(int i=0;i&lt;num;i++)
{
  p=(float)rand()/RAND_MAX;
  if(p&lt;pq[0]&amp;&amp;p&gt;=0)
   ps=pstr[0];
  else
  {
   for(int j=1;j&lt;num;j++)
   {
    if(p&gt;=pq[j-1]&amp;&amp;p&lt;pq[j])
     ps=pstr[j];
   }
  }
}
for(int i=0;i&lt;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&lt;num;i++)
{
  if((float)rand()/RAND_MAX&lt;=p)
  {
   pPos[m]=i;
   m++;
  }
}
for(int i=0;i&lt;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&lt;num*bits;i++)
{
  if((float)rand()/RAND_MAX&lt;=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&amp; x1,float&amp; x2,float&amp; value)
{
float xx1,xx2,vvalue;
get_value(pstr[0],x1,x2);
value=f(x1,x2);
for(int i=1;i&lt;num;i++)
{
  get_value(pstr,xx1,xx2);
  vvalue=f(xx1,xx2);
  if(value&lt;vvalue)
  {
   value=vvalue;
   x1=xx1;
   x2=xx2;
  }
}
}</P>



<P>MAIN函数内容</P>
<P>for(int i=1;i&lt;=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&gt;value)
   {
    value=y;
    x1=a;
    x2=b;
    findAt=i;
   }
  }
  cout&lt;&lt;"After 1000 iteration,The max value was found at step "&lt;&lt;findAt
   &lt;&lt;",the value is:"&lt;&lt;value&lt;&lt;",x1="&lt;&lt;x1&lt;&lt;",x2="&lt;&lt;x2;</P>
发表于 2005-8-25 05:10:43 | 显示全部楼层
<>太粗糙拉</P>
发表于 2005-8-25 18:24:03 | 显示全部楼层
程序本身就存在错误,算法设计有误
发表于 2005-8-26 04:33:31 | 显示全部楼层
xiexie!
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 10:42 , Processed in 0.049880 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表