采用浮点数编码的遗传算法的问题

  最近学习了一下遗传算法,于是参考了一篇论文,采用浮点数编码写了一个算法,运行了一下,发布收敛很慢,遗传了几百代与几十代相比,只是略显稳定,随机性比较强。而且容易限入局部极值中。例如,我以求函数xsin(10PI*x)+2.0为例,最大值大约在x=1.85附近,在x=1.65附近有一个局部极值。我写的算法大约70%的机会取得1.85附近的值,30%机会取得1.65附近的值。总之效果不理想。不知有没有朋友有兴趣帮我看一下。


  初始化种群

复制代码
         public  List < PopUnit >  InitPop()
        {
            
if  (CalculateFitnessHanler  ==   null )
                
throw   new  Exception( " 未设置计算表达式的事件CalculateHanler " );
            
if  (m_Parameters.PopSize <= 10 )
                
throw   new  Exception( " 种群数太小 " );

            List
< PopUnit >  pool  =   new  List < PopUnit > ();
             
            
for  ( int  i  =   0 ; i  <=  m_Parameters.PopSize - 1 ; i ++ )
            {
                
double  d  =  m_Random.NextDouble();
                d 
=  m_Parameters.L  +  (m_Parameters.R  -  m_Parameters.L)  *  d;
                
double  val =  CalculateFitnessHanler( new   double [] { d });
                PopUnit unit 
=   new  PopUnit(d, val);
                pool.Add(unit);
            }
            
return  pool;
        }
复制代码


  选择操作

复制代码
public  List < PopUnit >  Select(List < PopUnit >  data)
        {
            
int  dropoutCount  =  ( int )(m_Parameters.DropoutRate  *  data.Count);

            List
< PopUnit >  newpool  =   new  List < PopUnit > ();
            
for  ( int  i  =   0 ; i  <=  dropoutCount  -   1 ; i ++ )
            {
                newpool.Add(data[i].Clone() 
as  PopUnit);
                newpool.Add(data[i].Clone() 
as  PopUnit);
            }
            
int  tmpCount  =  data.Count  -  newpool.Count;
            
for  ( int  i  =  dropoutCount; i  <=  dropoutCount  +  tmpCount  -   1 ; i ++ )
            {
                newpool.Add(data[i].Clone() 
as  PopUnit);
            }
            
return  newpool;
        }
复制代码


  交叉操作:

 

复制代码
public   void  CrossOver( double  a, double  b, out   double  a1, out   double  b1)
        {
            
if  (m_Random.NextDouble()  >  m_Parameters.CrossOverRate)
            {
                a1 
=  a;
                b1 
=  b;
                
return ;
            }
             

            
double  r  =   0.1 ;
            
double  a2  =  m_Random.NextDouble()  *  r;
            
double  b2  =  m_Random.NextDouble()  *  r;

            a1 
=  ( 1   -  a2)  *  a  +  b2  *  b;
            b1 
=  ( 1   -  b2)  *  b  +  a2  *  a;
           
            
            
if  (a1  <  m_Parameters.L)
                a1 
=  m_Parameters.L;
            
if  (b1  <  m_Parameters.L)
                b1 
=  m_Parameters.L;
            
if  (a1  >  m_Parameters.R)
                a1 
=  m_Parameters.R;
            
if  (b1  >  m_Parameters.R)
                b1 
=  m_Parameters.R;
            
// Console.WriteLine("crossover a1={0},b1={1}  ->  a2={2},b2={3}", a, b, a1, b1); 
        }
复制代码


  变异操作:

 

复制代码
public   double  Mutation( double  c)
        {
            
double  tmpd  =  m_Random.NextDouble();
            
if  (tmpd  >  m_Parameters.MutateRate)
            {
                
return  c;
            }
                        
            
double  k  =   0.2 ;
            
// k = (m_Parameters.MaxGenerations-T)/ (m_Parameters.MaxGenerations + 2D) * 0.4D;
             double  res;
            
if  (m_Random.Next( 2 ==   1 )
            {
                res 
=  c  +  k  *  (m_Parameters.R  -  c)  * m_Random.NextDouble();
            }
            
else
            {
                res 
=  c  -  k  *  (c  -  m_Parameters.L)  * m_Random.NextDouble();
            }
            
// Console.WriteLine("mutation: {0} -> {1}", c, res); 

            
return  res;
        }
复制代码


 种群大小=100,交叉概率=0.7,变异概率=0.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值