遗传算法算任意表达式

#pragma warning(disable: 4786)
#include <iostream> 
#include<fstream>
#include<set>
#include <string>
#include <list>
#include <vector>

#include <math.h> 
#include <time.h>
#include <conio.h> 
#include <stdlib.h> 
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <float.h>

 
using namespace std;

#define POP_SIZE 40
#define CROSS_RATE 0.7
#define MUTATE_RATE 0.5
const int iteration_times=2000;


typedef struct
{
 double code;//染色体
 double degree;//适应度
}individual;

individual group[POP_SIZE];//种群规模为40

void max_evaluation(individual &x)
{
 //根据sin2 (5. 1πx + 0. 5)的最大值
 double tmp=sin(5.1*3.14*x.code+0.5)+sin(5.1*3.14*x.code+0.5)-sin(5.1*3.14*x.code+0.5);
 x.degree=(tmp*tmp);
}

int happened(double p)//发生一个p=0~1间概率的事件
{
 return rand()<(int)(p*RAND_MAX);
}

void cross(individual &x,individual &y)//交叉操作,产生一个子代取代父代中最次的一个
{
 individual z;
 z.code=(x.code+y.code)/2.0;
 max_evaluation(z);
 
 if(x.degree<y.degree)
 {
  if(z.degree<=x.degree)return;
  //如果新个体不如双亲,淘汰之
  x=z;
 }
 else
 {
  if(z.degree<=y.degree)return;
  y=z;
 }
}
void mutate(individual &x)
{
 x.code=x.code+rand();
 max_evaluation(x);
 
}
double randfloat()  
{
 return (rand())/(RAND_MAX+1.0);
}

int roulette_wheel_selection(double A[],int n)
{
 srand(time(0));
 double t=randfloat();
 int i;
 double d=0.0;
 for(i=0;i<n;i++)
 {
  d+=A[i];
  if(d>t)return i;
 }
 return rand()%n;//这里出现的概率几乎为0,只有在精度丢失时才发生
}

void main()
{
 srand(time(0));
 int i,j,best ;
 double sum;
 
 for(i=0;i<POP_SIZE;++i)//随机得到初始种群
 {
  group[i].code=1.0+(double)rand()/RAND_MAX;
  max_evaluation(group[i]);
 }
 
 ////////////////////////////////////////////////////////
 for(i=1;i<=iteration_times;++i)//固定进化10代
 {
  sum=0.0;
  best=0;
  for(j=0;j<POP_SIZE;++j)
  {
   sum+=group[j].degree;//求总的适应度sum
   if(group[j].degree>group[best].degree)
    best=j;//求当前最优个体
  }
  
  printf("第%2d代中 最优个体为 %10f\n",i,group[best].degree);
  ///////////////////////////////////
  double probability[POP_SIZE];
  memset(probability,0,sizeof(double)* POP_SIZE);
  
  for(j=0;j<POP_SIZE;++j)
  {
   probability[j]=group[j].degree/sum;
  }
  
  for(j=0;j<POP_SIZE;++j)
  {
   int sel1=roulette_wheel_selection(probability,POP_SIZE);
   int sel2=roulette_wheel_selection(probability,POP_SIZE);
   
   if(happened(CROSS_RATE)) cross (group[sel1],group[sel2]);//交叉
   if(happened(MUTATE_RATE)) mutate(group[sel1]);//变异  
   
  }
 
 }
 system("pause");
}

转载于:https://www.cnblogs.com/dannyboy/archive/2009/11/08/1598324.html

内容概要:本文系统介绍了术优化法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式法,其核心思想来源于四则运,利用乘除运进行全局勘探,加减运进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估法性能,并提出自适应参数调整、模型优化和并行计等改进策略。; 适合人群:具备一定Python编程基础和优化法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化法集成到Web系统中实现工程化应用;④为法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值