利用遗传算法求解函数
f(x,y)=1/(x2+y2+1),x,y∈[−5,5]f(x,y)=1/(x^2+y^2+1),x,y\in[-5,5]f(x,y)=1/(x2+y2+1),x,y∈[−5,5]的最大值。
显然答案为1。








代码:

/*
* @author:  codancer
* @createTime:  2020-11-28, 21:58:25
*/#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <ctime>
#include <cassert>
#include <complex>
#include <string>
#include <cstring>
#include <chrono>
#include <random>
#include <bitset>
using namespace std;typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1e9+7;
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define fep(i,a,b) for(int i=(a);i>=(b);i--)
#define deb(x) cerr<<#x<<" = "<<(x)<<"\n"
typedef vector<int> VI;
typedef vector<ll> VII;
typedef pair<int,int> pii;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll Rand(ll B) {return (ull)rng() % B;
}
/*由于精度为15位,因此需要10^16个种群需要2^54,二进制需要54位
*/
const int M = 100;//种群个数
const int D = 54;
vector<pair<string,string>> person;//个体/*将基因id换成小数*/
double trans(string s){ll ans=0;for(char c:s){ans=ans*2+c-'0';}return -5+ans*10.0/((1LL<<D)-1);
}/*随机产生M个种群成员*/void Gen(){for(int i=0;i<M;i++){string a="";string b="";for(int j=0;j<D;j++) a+=Rand(2)==0?'0':'1';for(int j=0;j<D;j++) b+=Rand(2)==0?'0':'1';person.pb({a,b});}
}
/*基因评估*/
double eval(pair<string,string> a){double x1=trans(a.first);double x2=trans(a.second);return 1.0/(x1*x1+x2*x2+1);
}
/*遗传算法*/
void Genetic(){double ans=-1e9;//最大值初始化/*不断迭代*/for(int steps=1;steps<=1000;steps++){vector<double> v(M),p(M);double F=0;//种群适度值之和for(int i=0;i<M;i++){v[i]=eval(person[i]);//v[i]是每个个体的评估值ans=max(ans,v[i]);//每一轮更新最大值F+=v[i];p[i]=v[i]/F;//p[i]代表i被选择的概率}/*模拟轮盘赌,q[i]代表个体i的累积概率*/vector<double> q(M);vector<int> cnt(M,0);//每个个体被选择的次数q[0]=p[0];for(int i=1;i<M;i++){q[i]=q[i-1]+p[i];}for(int i=0;i<M;i++){double r=1.0*Rand(100)/100.0;//随机一个[0,1]的小数for(int j=0;j<M;j++){if(r<=q[j]){++cnt[j];break;//选择一次j}}}vector<pair<string,string> > next_gen;//下一代for(int i=0;i<M;i++){for(int j=0;j<cnt[i];j++) next_gen.pb(person[i]);}/*单点交叉,交叉率为0.8*/for(int i=0;i<M;i+=2){double r=Rand(10)/10.0;//交叉概率<=0.8则不交叉if(r>0.8) continue;int dig=Rand(2*D);//随机交叉位数if(dig<D) swap(next_gen[i].first[dig],next_gen[i+1].first[dig]);//交叉第digit位else swap(next_gen[i].second[dig-D],next_gen[i].second[dig-D]);}/*单点变异,变异率0.1*/for(int i=0;i<M;i++){for(int j=0;j<D;j++){double r=Rand(10)/10.0;if(r<=0.1) next_gen[i].first[j]='0'+!(next_gen[i].first[j]-'0');//变异取反}for(int j=0;j<D;j++){double r=Rand(10)/10.0;if(r<=0.1) next_gen[i].second[j]='0'+!(next_gen[i].second[j]-'0');//变异取反}}for(int i=0;i<M;i++) person[i]=next_gen[i];//换代printf("第%d代 的最大值为: %.15lf\n", steps,ans);}
}
int main(){Gen();Genetic();return 0;
}

<<人工智能导论>>上机--遗传算法求解函数最值相关推荐

  1. 【人工智能导论】遗传算法求解TSP问题(含源码github)

    源程序:Github链接 Symmetric traveling salesman problem (TSP) Given a set of n nodes and distances for eac ...

  2. 人工智能实验-使用遗传算法求函数最值

    完整代码: #include <bits/stdc++.h>#define indiv_per_group (50) //一个种群中个体的数目 #define probability (6 ...

  3. 运用遗传算法求解函数极值(fortran)

    运用遗传算法求解函数极值(fortran) 写在前面 遗传算法的前世今生 算法步骤简介 遗传算法的主体结构 开始求解: 结果显示: 最后再来说一些需要注意的地方 写在前面 这篇文章适合一些应急学习最优 ...

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

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

  5. 实值遗传算法求解函数极值问题(基于MATLAB)

    实值遗传算法求解函数极值问题(基于MATLAB) 声明: 1.本文源代码来自书目<智能优化算法及其MATLAB实例(第3版)>,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了 ...

  6. 差分进化算法求解函数最值问题

    差分进化算法求解函数最值问题 声明: 1.本文源代码来自书目<智能优化算法及其MATLAB实例(第3版)>,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了解算法及MATLAB ...

  7. 利用遗传算法求解函数极值

    1.利用遗传算法求解函数极值 例1 利用遗传算法求函数 f(x) = 11sin(6x) + 7cos(5x),x∈[- π,π]的最大值点. 解:在MATLAB中编制绘制函数曲线的代码,运行得到题中 ...

  8. python实现遗传算法求解函数极值问题

    python实现遗传算法求解函数极值问题 import random import numpy as np #定义染色体类 class chromosome:def __init__(self,chr ...

  9. 遗传算法求解函数最小值问题

    遗传算法求解函数最小值问题 继上一次用遗传算法求解TSP问题问题以后,万万没有想到,实验的时候,老师居然改了题目,改成了求解函数的最小值问题(有点坑哈),而且要求结果尽量的稳定,可以确定得到最小值,并 ...

最新文章

  1. 【Qt】QtCreator导入cmake工程
  2. 数据中心的供配电与空调
  3. 不可能解开的谜题 (程序员修炼之道,评注者序)
  4. 10 个冷门但又非常实用的 Docker 使用技巧
  5. stream模式不能接受blob文件_一文带你层层解锁文件下载的奥秘
  6. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
  7. React基础语法学习
  8. diy配置程序php,poscmsDiy字段之文件类型设计指南
  9. 我学习设计模式的一些所想所得
  10. echart 高度 不用 不撑满_你担心的高度近视老了之后是这样的
  11. 谁将称霸跨平台应用市场?
  12. numpy与线性代数(简易版)
  13. 创建Tapestry5 工作环境
  14. 公司java项目上线生产环境发布流程
  15. Bluefish 1.1.3
  16. pygame编写飞机大战(9)-播放爆炸动画
  17. Gradle dependencies 解决项目依赖冲突
  18. 从零开始的RVOS: Referring Video Object Segmentation
  19. java ee 7精粹_Java EE 7精粹 ([美]Arun Gupta) 中文pdf扫描版[68MB]
  20. 信用社计算机专业大纲,信用社计算机专业试题

热门文章

  1. Java(十三)集合类(2)
  2. 计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)
  3. python爬携程景区评论_python爬取携程景点评论信息
  4. 【项目工程】利用安卓手机NFC功能和KPC物联网仿真平台的智能花盆设计
  5. 立体视觉入门指南:对级约束与Fusiello法极线校正
  6. 【区块链108将】流量之王的48小时生死转折
  7. Neo4j CQL简介
  8. App Store应用TOP榜:究竟有多少款App在使用Swift?
  9. android shareSDK 微博分享案例
  10. 管理心理学试题库【1】