人工智能实验-使用遗传算法求函数最值
完整代码:
#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;
}
实验结果:
人工智能实验-使用遗传算法求函数最值相关推荐
- Python实现遗传算法求函数最值
Python实现遗传算法求函数最值 详细源代码:GA.py 1.算法过程图解 2.详细过程举例说明 (1)待求解方程 (2)确定编码方案 主要是确定编码长度: def segment_length(s ...
- 人工智能遗传算法求函数极值
** 人工智能遗传算法求函数极值 ** 1.实验目的与原理 1)目的 熟悉和掌握遗传算法的原理.流程和编码策略,并利用遗传求解函数优化问题,理解求解函数极值问题的流程并测试主要参数对结果的影响,掌握遗 ...
- 基于遗传算法求函数最小值
一.遗传算法概述 遗传算法( genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的"物竞天择.适者生存"的演化法则.遗传算法是把问题参数编码为染色体 ...
- python求函数极值_python 遗传算法求函数极值的实现代码
废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import rando ...
- 用标准遗传算法求函数最大值
题:用标准遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)的最大值,其中x的取值范围为[0,10].只是一个有多个局部极值的函数 仿真过程: (1)初始化种群数目NP=50,染色体二进 ...
- 遗传算法求函数极值(含MATLAB代码实现)
介绍转载自https://blog.csdn.net/xujinpeng99/article/details/6211597,后面用自己设置的函数进行实验. 引言:遗传算法求函数极值算是遗传算法的一种 ...
- 实验3-2 计算符号函数的值 (10 分)
实验3-2 计算符号函数的值 (10 分) 对于任一整数n,符号函数sig**n(n)的定义如下: 请编写程序计算该函数对任一输入整数的值. 输入格式: 输入在一行中给出整数n. 输出格式: 在一行中 ...
- 蚁群算法求最值c语言实现,蚁群算法代码(求函数最值)
<蚁群算法代码(求函数最值)>由会员分享,可在线阅读,更多相关<蚁群算法代码(求函数最值)(4页珍藏版)>请在人人文库网上搜索. 1.function F=F(x1,x2) % ...
- 均值定理最大值最小值公式_求函数最值问题复杂难算,只要用对方法,考试得分不用愁...
均值定理也就是我们常说的均值不等式,看到不等式这三个字,大家肯定不会觉得陌生,因为从初中开始,我们就已经接触它了,初中对于不等式的应用都是很浅显易懂的,但是到了高中,随着我们学习的知识不断加深,不等式 ...
最新文章
- 就算是戴上口罩,AI也知道你在说什么丨EMNLP 2020最佳论文
- Google AI 碾压集成电路设计专家,ASIC智能设计时代来了!
- sprintf作用2
- 事务、事件(文件、时间、调度和执行)、复制、分片(范围、哈希)、简单的论坛系统分析
- WPF 用装饰器制作抽屉效果
- 三子棋の局势判断(洛谷P1917题题解,Java语言描述)
- 公司盘点员工,不上班的员工要给钱吗?
- 中国双色向滤光镜行业市场供需与战略研究报告
- php list each搭配循环
- 偏微分方程数值解主要步骤
- 阵列卡直通模式和raid模式_Dell R730服务器通过RAID在线扩容方法详解
- 【PHP框架 | Yii2 系列3】 - Gii 生成代码
- (Emitted value instead of an instance of Error) Do not use v-for index as key on <transition-group>
- python三级等级考试有什么,python考级有几个级别
- php怎么转mp4,php使用memcoder将视频转成mp4格式的方法
- emby ios 收费_点播、直播一条龙,使用Jellyfin打造最强媒体中心(篇一)
- Linux aarch64交叉编译之 Google filament引擎
- 教你“偷偷”的获取微信小游戏好友关系链数据
- 风控模型中的KS-指标
- 【论文翻译】Learning Generalizable and Identity-Discriminative Representations for Face Anti-Spoofing