完整代码:

#include <bits/stdc++.h>#define indiv_per_group    (50) //一个种群中个体的数目
#define probability (60) //变异概率
#define genmax      (100) //最大产生代数using namespace std;
typedef struct indi //一个个体
{int x;           //x in [0, 30] : 横向位置char bi[5];        //二进制编码,长度为5int fx;         //f(x)值:每个个体对环境的适应值,即当前函数值bool live;            //标志这个个体是否还活着
}INDI;typedef struct group//一个种群
{INDI individuals[indiv_per_group]; //数组存储个体INDI best;            //最优个体int  best_gen;        //最优个体所在的代数int  cur_gen;         //种群当前的代数
}GROUP;/* 计算适应值函数(也是我们需要求解的函数) */
int fx(int x)
{return x*x*x-60*x*x+900*x+100;
}GROUP Group;
char *stop;//1.初始化:随机产生5位二进制数
void init()
{Group.best.fx = -0xffffffff;//初始化一个很小的值,便于下面比较Group.best_gen = 0;//记录产生最好结果的代数Group.cur_gen = 0;//当前代数为0//把一个种群中的每一个个体随机初始化for(int j = 0; j < indiv_per_group; j++){int t = rand() % 100;   /*产生0 ~100 的随机数*/for(int k=0;k<5;k++){if(t>50)Group.individuals[j].bi[k]=1;elseGroup.individuals[j].bi[k]=0;}Group.individuals[j].x = strtol(Group.individuals[j].bi,&stop,2);Group.individuals[j].live = true;}
}//2.个体评价:得到每个个体的适应度
void assess()
{//计算出每个个体的fx值for(int i = 0; i < indiv_per_group; i++){Group.individuals[i].fx = fx(Group.individuals[i].x);}
}//3.选择运算:使用轮转盘法进行选择与淘汰
void choose(int gen)
{//使用轮转盘法进行淘汰double totalFxValue = 0.0;int i = 0;for(i = 0; i < indiv_per_group; i++){totalFxValue += Group.individuals[i].fx;}Group.best.fx = Group.individuals[0].fx;Group.best.x = Group.individuals[0].x;double tmp_add = 0;for(i = 0; i < indiv_per_group; i++){double t = rand() / double(RAND_MAX);  /* 0 ~ 1 浮点数*/tmp_add += Group.individuals[i].fx;double tmp = tmp_add / totalFxValue;  //累计概率if(tmp >= t){if(Group.individuals[i].fx > Group.best.fx){Group.best.fx = Group.individuals[i].fx;Group.best.x = Group.individuals[i].x;for(int k=0;k<5;k++)Group.best.bi[k]=Group.individuals[i].bi[k];}continue;}else{Group.individuals[i].live = false; /* 淘汰掉 */}}//选出这个种群的最优个体,并储存if(Group.best.fx > Group.individuals[0].fx){Group.best_gen = gen;}
}//4.交叉运算:单点交叉
void cross()
{int first = 0, second = 0;for(int j = 0; j < indiv_per_group; j++){if(Group.individuals[j].live == false){ /* 如果该个体已经被淘汰*//* 选择两个还活着的个体作为父母 */while(1){while(1){first = rand() % indiv_per_group;if(Group.individuals[first].live == true)break;}second = rand() % indiv_per_group;if(Group.individuals[second].live == true)break;}char str[5];for(int k=0;k<3;k++)str[k]=Group.individuals[first].bi[k];for(int k=3;k<5;k++)str[k]=Group.individuals[second].bi[k];int new_x=strtol(str,&stop,2);int new_fx=fx(new_x);if(new_fx>Group.individuals[first].fx && new_fx > Group.individuals[second].fx){Group.individuals[j].x = new_x;Group.individuals[j].fx = new_fx;for(int k=0;k<5;k++)Group.individuals[j].bi[k]=str[k];}else{if(Group.individuals[first].fx > Group.individuals[second].fx){Group.individuals[j].x = Group.individuals[first].x;Group.individuals[j].fx = Group.individuals[first].fx;for(int k=0;k<5;k++)Group.individuals[j].bi[k]=Group.individuals[first].bi[k];}else{Group.individuals[j].x = Group.individuals[second].x;Group.individuals[j].fx = Group.individuals[second].fx;for(int k=0;k<5;k++)Group.individuals[j].bi[k]=Group.individuals[second].bi[k];}}Group.individuals[j].live = true;}}return;
}//5.变异运算 :位点变异——随机每个位置50%几率取反
//对一个个体的变异运算
void mutation_one(int x)
{int pro = rand() % 100;if(pro > probability)return ;for(int k=0;k<5;k++){int t=rand()%100;if(t>50){if(Group.individuals[x].bi[k]=='1')Group.individuals[x].bi[k]='0';elseGroup.individuals[x].bi[k]='1';}Group.individuals[x].bi[k]^=1;}Group.individuals[x].x=strtol(Group.individuals[x].bi,&stop,2);Group.individuals[x].fx=fx(Group.individuals[x].x);if(Group.individuals[x].fx > Group.best.fx){Group.best.fx = Group.individuals[x].fx;Group.best.x = Group.individuals[x].x;for(int k=0;k<5;k++)Group.best.bi[k]=Group.individuals[x].bi[k];}
}//对一个种群的全部个体都进行变异运算
void mutation()
{for(int i = 0;i < indiv_per_group; i++){if(Group.individuals[i].live == true){mutation_one(i);}}
}//总调用函数,决定一个种群的进化
//对一个种群进行求解。
void sovel()
{init();for(int  i = 1;i <= genmax; i++) //种群繁杂代数{Group.cur_gen = i;assess();               //评估,计算适应值choose(Group.cur_gen);  //找最优个体,淘汰较差个体cross();                //交叉产生子个体mutation();             //变异}
}int main()
{//时间种子产生随机数srand(time(0));sovel();cout<<Group.best.fx<<endl;cout<<Group.best.x<<endl;cout<<Group.best.bi<<endl;return 0;
}

实验结果:

人工智能实验-使用遗传算法求函数最值相关推荐

  1. Python实现遗传算法求函数最值

    Python实现遗传算法求函数最值 详细源代码:GA.py 1.算法过程图解 2.详细过程举例说明 (1)待求解方程 (2)确定编码方案 主要是确定编码长度: def segment_length(s ...

  2. 人工智能遗传算法求函数极值

    ** 人工智能遗传算法求函数极值 ** 1.实验目的与原理 1)目的 熟悉和掌握遗传算法的原理.流程和编码策略,并利用遗传求解函数优化问题,理解求解函数极值问题的流程并测试主要参数对结果的影响,掌握遗 ...

  3. 基于遗传算法求函数最小值

    一.遗传算法概述 遗传算法( genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的"物竞天择.适者生存"的演化法则.遗传算法是把问题参数编码为染色体 ...

  4. python求函数极值_python 遗传算法求函数极值的实现代码

    废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import rando ...

  5. 用标准遗传算法求函数最大值

    题:用标准遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)的最大值,其中x的取值范围为[0,10].只是一个有多个局部极值的函数 仿真过程: (1)初始化种群数目NP=50,染色体二进 ...

  6. 遗传算法求函数极值(含MATLAB代码实现)

    介绍转载自https://blog.csdn.net/xujinpeng99/article/details/6211597,后面用自己设置的函数进行实验. 引言:遗传算法求函数极值算是遗传算法的一种 ...

  7. 实验3-2 计算符号函数的值 (10 分)

    实验3-2 计算符号函数的值 (10 分) 对于任一整数n,符号函数sig**n(n)的定义如下: 请编写程序计算该函数对任一输入整数的值. 输入格式: 输入在一行中给出整数n. 输出格式: 在一行中 ...

  8. 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)

    <蚁群算法代码(求函数最值)>由会员分享,可在线阅读,更多相关<蚁群算法代码(求函数最值)(4页珍藏版)>请在人人文库网上搜索. 1.function F=F(x1,x2) % ...

  9. 均值定理最大值最小值公式_求函数最值问题复杂难算,只要用对方法,考试得分不用愁...

    均值定理也就是我们常说的均值不等式,看到不等式这三个字,大家肯定不会觉得陌生,因为从初中开始,我们就已经接触它了,初中对于不等式的应用都是很浅显易懂的,但是到了高中,随着我们学习的知识不断加深,不等式 ...

最新文章

  1. 就算是戴上口罩,AI也知道你在说什么丨EMNLP 2020最佳论文
  2. Google AI 碾压集成电路设计专家,ASIC智能设计时代来了!
  3. sprintf作用2
  4. 事务、事件(文件、时间、调度和执行)、复制、分片(范围、哈希)、简单的论坛系统分析
  5. WPF 用装饰器制作抽屉效果
  6. 三子棋の局势判断(洛谷P1917题题解,Java语言描述)
  7. 公司盘点员工,不上班的员工要给钱吗?
  8. 中国双色向滤光镜行业市场供需与战略研究报告
  9. php list each搭配循环
  10. 偏微分方程数值解主要步骤
  11. 阵列卡直通模式和raid模式_Dell R730服务器通过RAID在线扩容方法详解
  12. 【PHP框架 | Yii2 系列3】 - Gii 生成代码
  13. (Emitted value instead of an instance of Error) Do not use v-for index as key on <transition-group>
  14. python三级等级考试有什么,python考级有几个级别
  15. php怎么转mp4,php使用memcoder将视频转成mp4格式的方法
  16. emby ios 收费_点播、直播一条龙,使用Jellyfin打造最强媒体中心(篇一)
  17. Linux aarch64交叉编译之 Google filament引擎
  18. 教你“偷偷”的获取微信小游戏好友关系链数据
  19. 风控模型中的KS-指标
  20. 【论文翻译】Learning Generalizable and Identity-Discriminative Representations for Face Anti-Spoofing

热门文章

  1. 时过一年,我还在原地踏步么
  2. 什么是模态分析?什么是振型?
  3. 前端搞一个扭蛋抽奖小动画?
  4. NIO及多线程实现聊天室完整版
  5. Nature|人工智能助力蛋白质折叠预测
  6. postgresql 查看索引是否有效及索引使用情况
  7. 计算机里面的固态硬盘,怎么判断电脑里面的是不是固态硬盘?
  8. 按键精灵制作自用游戏脚本所需的简单操作
  9. android 9.0 c7Pro,透心凉!三星Galaxy C7 Pro上线,还内置热管
  10. 计算机信息学院运动会入场式,厦门大学信息学院第一届新生运动会成功举办