⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmvsoga.txt

📁 遗传算法源程序(C++), 无压缩密码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  current.fitness=current.fitness/sum;
  cfitness.InsertAfter (cfitness .FindIndex(i),current.fitness);
 }
 
 for(i=1;i<popsize; i++)//概率值从小到大;
 {
  current.fitness=cfitness.GetAt (cfitness.FindIndex(i-1))
   +cfitness.GetAt(cfitness.FindIndex(i));   //归一化
  cfitness.SetAt (cfitness .FindIndex(i),current.fitness);
  population.SetAt(population.FindIndex(i),current);
 }
 for (i=0;i<popsize;)//轮盘赌概率选择。本段还有问题。
 {
  p=double(rand()%999)/1000+0.0001;  //随机生成概率
  pindex=0;  //遍历索引
  pc=cfitness.GetAt(cfitness.FindIndex(1));  //为什么取不到数值???20060910
  while(p>=pc&&pindex<popsize) //问题所在。
  {
   pc=cfitness.GetAt(cfitness .FindIndex(pindex));
   pindex++;
  }
  //必须是从index~popsize,选择高概率的数。即大于概率p的数应该被选择,选择不满则进行下次选择。
  for (j=popsize-1;j<pindex&&i<popsize;j--)
  {
   newpopulation.InsertAfter (newpopulation.FindIndex(0),
    population.GetAt (population.FindIndex(j)));
   i++;
  }
 }
 for(i=0;i<popsize; i++)
 {
  population.SetAt (population.FindIndex(i),
   newpopulation.GetAt (newpopulation.FindIndex(i)));
 }
// j=newpopulation.GetCount();
// j=population.GetCount();
 newpopulation.RemoveAll();
}

//current   变化后,以上没有问题了。


void CMVSOGA:: crossoveroperator()   //非均匀算术线性交叉,浮点数适用,alpha ,beta是(0,1)之间的随机数
          //对种群中两两交叉的个体选择也是随机选择的。也可取beta=1-alpha;
          //current的变化会有一些改变。
{
 int i,j;
 double alpha,beta;
 CList <int,int> index;
 int point,temp;
 double p;
// srand( (unsigned)time( NULL ) );
 for (i=0;i<popsize;i++)//生成序号
 {
  index.InsertAfter (index.FindIndex(i),i);
 }
 for (i=0;i<popsize;i++)//打乱序号
 {
  point=rand()%(popsize-1);
  temp=index.GetAt(index.FindIndex(i));
  index.SetAt(index.FindIndex(i),
   index.GetAt(index.FindIndex(point)));  
  index.SetAt(index.FindIndex(point),temp);
 }
 for (i=0;i<popsize-1;i+=2)
 {//按顺序序号,按序号选择两个母体进行交叉操作。
  p=double(rand()%10000)/10000.0;
  if (p<crossoverrate)
  {   
   alpha=double(rand()%10000)/10000.0;
   beta=double(rand()%10000)/10000.0;
   current=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i))));
   current1=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i+1))));//临时使用current1代替
   for(j=0;j<variablenum;j++)
   { 
    //交叉
    double sign;
    sign=rand()%2;
    if(sign)
    {
     current.chromosome[j]=(1-alpha)*current.chromosome[j]+
      beta*current1.chromosome[j];
    }
    else
    {
     current.chromosome[j]=(1-alpha)*current.chromosome[j]-
      beta*current1.chromosome[j];
    }
    if (current.chromosome[j]>variabletop[j])  //判断是否超界.
    {
     current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
    }
    if (current.chromosome[j]<variablebottom [j])
    {
     current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
    }
    if(sign)
    {
     current1.chromosome[j]=alpha*current.chromosome[j]+
      (1- beta)*current1.chromosome[j];
    }
    else
    {
     current1.chromosome[j]=alpha*current.chromosome[j]-
      (1- beta)*current1.chromosome[j];
    }
    if (current1.chromosome[j]>variabletop[j])
    {
     current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
    }
    if (current1.chromosome[j]<variablebottom [j])
    {
     current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+variablebottom[j];
    }
   }
   //回代
  }
  newpopulation.InsertAfter  (newpopulation.FindIndex(i),current);
  newpopulation.InsertAfter  (newpopulation.FindIndex(i),current1);
 }
 ASSERT(newpopulation.GetCount()==popsize);
 for (i=0;i<popsize;i++)
 {
  population.SetAt (population.FindIndex(i),
   newpopulation.GetAt (newpopulation.FindIndex(i)));
 }
 newpopulation.RemoveAll();
 index.RemoveAll();
}
void CMVSOGA:: findbestandworstindividual( )  
{
 int i;
 bestindividual=population.GetAt(population.FindIndex(best_index));
 worstindividual=population.GetAt(population.FindIndex(worst_index));
 for (i=1;i<popsize; i++)
 {
  current=population.GetAt(population.FindIndex(i));
  if (current.fitness>bestindividual.fitness)
  {
   bestindividual=current;
   best_index=i;
  }
  else if (current.fitness<worstindividual.fitness)
  {
   worstindividual=current;
   worst_index=i;
  }
 }
 population.SetAt(population.FindIndex(worst_index),
  population.GetAt(population.FindIndex(best_index)));
 //用最好的替代最差的。
 if (maxgeneration==0)
 {
  currentbest=bestindividual;
 }
 else
 {
  if(bestindividual.fitness>=currentbest.fitness)
  {
   currentbest=bestindividual;
  }
 }
}
void CMVSOGA:: calculatefitnessvalue() //适应度函数值计算,关键是适应度函数的设计
          //current变化,这段程序变化较大,特别是排序。
{
 int  i;
 double temp;//alpha,beta;//适应度函数的尺度变化系数
 double cmax=100;
 for(i=0;i<popsize;i++)
 {
  current=population.GetAt(population.FindIndex(i));
  if(current.value<cmax)
  {
   temp=cmax-current.value;
  }
  else
  {
   temp=0.0;
  }
  /*
  if((population[i].value+cmin)>0.0)
  {temp=cmin+population[i].value;}
 else
 {temp=0.0;
   }
  */
  current.fitness=temp;
  population.SetAt(population.FindIndex(i),current); 
 }
}
void CMVSOGA:: performevolution() //演示评价结果,有冗余代码,current变化,程序应该改变较大
{
 if (bestindividual.fitness>currentbest.fitness)
 {
  currentbest=population.GetAt(population.FindIndex(best_index));
 }
 else
 {
  population.SetAt(population.FindIndex(worst_index),currentbest);
 }
}
void CMVSOGA::GetResult(double *Result)
{
 int i;
 for (i=0;i<variablenum;i++)
 {
  Result[i]=currentbest.chromosome[i];
 }
 Result[i]=currentbest.value;
}

void CMVSOGA::GetPopData(CList <double,double>&PopData)  
{
 PopData.RemoveAll();
 int i,j;
 for (i=0;i<popsize;i++)
 {
  current=population.GetAt(population.FindIndex(i));
  for (j=0;j<variablenum;j++)
  {
   PopData.AddTail(current.chromosome[j]);
  }
 }
}
void CMVSOGA::SetFitnessData(CList <double,double>&PopData,CList <double,double>&FitnessData,CList <double,double>&ValueData)
{
 int i,j;
 for (i=0;i<popsize;i++)
 {  
  current=population.GetAt(population.FindIndex(i)); //就因为这一句,出现了很大的问题。 
  for (j=0;j<variablenum;j++)
  {
   current.chromosome[j]=PopData.GetAt(PopData.FindIndex(i*variablenum+j));
  }
  current.fitness=FitnessData.GetAt(FitnessData.FindIndex(i));
  current.value=ValueData.GetAt(ValueData.FindIndex(i));
  population.SetAt(population.FindIndex(i),current);
 }
 FitnessData.RemoveAll();
 PopData.RemoveAll();
 ValueData.RemoveAll();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -