遗传算法(求函数极值)简易代码C语言200行
思路:
//目标函数:y=(x1-1)^2+(x2-2)^2;
#include<stdio.h>
#include<time.h>
#include<windows.h>
#define T 2000 //进化代数
#define N 200 //群体个数
#define INT 8 //整数基因长度
#define FLOAT 20 //小数基因长度
#define MUTATE 0.005 //基因突变率int t=0; //代数计数
int gene[N][(INT+FLOAT)*2]; //基因
double value[N]; //函数值
double ratio[N]; //适应度概率区间
int pair[N]; //随机配对规则
int totalRate=0;void InitGroup();
double GetValue(int[],int);
int Mi(int,int);
void SortGroup();
void Output();
double Function(float,float);
void PairGroup();
void GeneMutate();
void Answer();int main() {InitGroup();Output();while((t++)!=T) {GeneMutate();SortGroup();PairGroup();}SortGroup();Output();Answer();
}//目标函数
double Function(double a,double b) {return -(a-1)*(a-1)-(b-2)*(b-2)+2;
}//初始化种群
void InitGroup() {for(int i=1; i<=N; i++) {totalRate+=i*i;}srand((unsigned)time(0));for(int i=0; i<N; i++) {for(int j=0; j<(INT+FLOAT)*2; j++) {gene[i][j]=rand()%2;}}for(int i=0; i<N; i++) {if(i==0) {ratio[i]=(i+1)*(i+1)/(double)totalRate;} else {ratio[i]=(i+1)*(i+1)/(double)totalRate;ratio[i]+=ratio[i-1];}//printf("%f\n",ratio[i]);}for(int i=0; i<N; i++) {value[i]=Function(GetValue(gene[i],1),GetValue(gene[i],2));}
}//输出种群信息
void Output() {printf("个体基因:\n");for(int i=0; i<N; i++) {printf("【");for(int j=0; j<(INT+FLOAT)*2; j++) {if(j==INT) printf(",");else if(j==INT+FLOAT) printf("】,【");else if(j==INT*2+FLOAT) printf(",");printf("%d",gene[i][j]);}printf("】\n");}printf("个体数值:\n");for(int i=0; i<N; i++) {printf("%d: %f + %f -> %.16f\n",i,GetValue(gene[i],1),GetValue(gene[i],2),value[i]);}
}//求a的b次方
int Mi(int a,int b) {int ans=1;for(int i=0; i<b; i++) {ans*=a;}return ans;
}//求十进制值
double GetValue(int a[(INT+FLOAT)*2],int n) {int v=0;double ans;if(n==1) {for(int i=1; i<=INT+FLOAT; i++) {if(a[i-1]!=0) v+=Mi(2,INT+FLOAT-i);}ans=v/(double)Mi(2,FLOAT);} else if(n==2) {for(int i=1+INT+FLOAT; i<=(INT+FLOAT)*2; i++) {if(a[i-1]!=0) v+=Mi(2,(INT+FLOAT)*2-i);}ans=v/(double)Mi(2,FLOAT);}return ans;
}//计算适应度并排序
void SortGroup() {for(int i=0; i<N; i++) {for(int j=0; j<N-1; j++) {if(value[j]>value[j+1]) {double b=value[j];value[j]=value[j+1];value[j+1]=b;for(int k=0; k<(INT+FLOAT)*2; k++) {int a=gene[j][k];gene[j][k]=gene[j+1][k];gene[j+1][k]=a;}}}}
}//基因自由组合
void PairGroup() {float b;//printf("\n配对规则:");for(int i=0; i<N; i++) {b=rand()/(RAND_MAX+1.0);for(int j=0; j<N; j++) {if(ratio[j]>=b) {pair[i]=j;//printf("%d ",pair[i]);break;}}}//printf("\n分割位置:");int gene1[N][(INT+FLOAT)*2];for(int i=0; i<N-1; i+=2) {int pos=rand()%((INT+FLOAT)*2-1)+1;//printf("%d ",pos);for(int k=0; k<(INT+FLOAT)*2; k++) {gene1[i][k]=gene[pair[i]][k];gene1[i+1][k]=gene[pair[i+1]][k];}for(int j=0; j<pos; j++) {int a=gene1[i][j];gene1[i][j]=gene1[i+1][j];gene1[i+1][j]=a;}}for(int i=0; i<N; i++) {for(int j=0; j<(INT+FLOAT)*2; j++) {gene[i][j]=gene1[i][j];}}for(int i=0; i<N; i++) {value[i]=Function(GetValue(gene[i],1),GetValue(gene[i],2));}
}//基因突变
void GeneMutate() {for(int i=0; i<N; i++) {for(int j=0; j<(INT+FLOAT)*2; j++) {if(rand()/(RAND_MAX+1.0)<MUTATE) {gene[i][j]=(gene[i][j]+1)%2;}}}for(int i=0; i<N; i++) {value[i]=Function(GetValue(gene[i],1),GetValue(gene[i],2));}
}//输出答案
void Answer() {printf("\n\n最大值是:%.16f\n",value[N-1]);printf("此时,x1=%f, x2=%f\n",GetValue(gene[N-1],1),GetValue(gene[N-1],2));
}
运行结果:
遗传算法(求函数极值)简易代码C语言200行相关推荐
- python求函数极值_python 遗传算法求函数极值的实现代码
废话不多说,大家直接看代码吧! """遗传算法实现求函数极大值-Zjh""" import numpy as np import rando ...
- 遗传算法求函数极值(含MATLAB代码实现)
介绍转载自https://blog.csdn.net/xujinpeng99/article/details/6211597,后面用自己设置的函数进行实验. 引言:遗传算法求函数极值算是遗传算法的一种 ...
- 人工智能遗传算法求函数极值
** 人工智能遗传算法求函数极值 ** 1.实验目的与原理 1)目的 熟悉和掌握遗传算法的原理.流程和编码策略,并利用遗传求解函数优化问题,理解求解函数极值问题的流程并测试主要参数对结果的影响,掌握遗 ...
- 遗传算法求函数最小值(多维)1
目标函数: 代码: %%实值遗传算法求函数极值%%%% %%%%%初始化参数%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 NP=100; %染色 ...
- 遗传算法求函数最小值(多维)2
目标函数: 代码: function o=func21(x) o=sum(x.^2-10*cos(2*pi.*x)+10); end %%实值遗传算法求函数极值%%%% %%%%%初始化参数%%% ...
- GA求函数极值问题MATLAB代码学习
标准遗传算法求函数极值y=x+10*sin(5*x)+7*cos(4*x) 一.代码 0 初始化参数 %x=0:0.1:10; %y=x+10*sin(5*x)+7*cos(4*x); %plot(x ...
- MATLAB 求函数极值的内置函数一览表(实则优化算法函数汇总)
MATLAB 求函数极值的内置函数一览表 收集了几乎所有的 MATLAB 内置的优化函数,可收藏,需要时查阅. 文章目录 MATLAB 求函数极值的内置函数一览表 简介 概览 求函数极值(或最大值最小 ...
- 运用遗传算法求解函数极值(fortran)
运用遗传算法求解函数极值(fortran) 写在前面 遗传算法的前世今生 算法步骤简介 遗传算法的主体结构 开始求解: 结果显示: 最后再来说一些需要注意的地方 写在前面 这篇文章适合一些应急学习最优 ...
- 利用遗传算法求解函数极值
1.利用遗传算法求解函数极值 例1 利用遗传算法求函数 f(x) = 11sin(6x) + 7cos(5x),x∈[- π,π]的最大值点. 解:在MATLAB中编制绘制函数曲线的代码,运行得到题中 ...
最新文章
- php mysql int string_mysql查出的 int 型字段都是 string
- java删除一级域名下cookie_java操作cookie示例(删除cookie)
- 为什么有了接口还要增加一层抽象类?
- Template Metaprogramming
- windows创建进程的过程
- Linux文件删除原理
- azure 免费帐户注册_如何使用模拟器模拟Azure SQL数据库存储帐户行为
- (面试)涉及到继承和类加载
- 扇贝编程python是干嘛的-扇贝新推出的python课程值得买吗?
- 医疗系统流程软件测试用例,医疗管理系统案例测试用例.doc
- oracle健康检查脚本下载,oracle 数据库性能健康检查脚本
- 基于数组(非链表)实现软件定时器---可以移植到未使用系统的单片机,通用型
- __init__.py 文件用法
- 需求文档 | 商业需求文档(BRD)
- 美貌智慧不可兼得?超模琳赛 斯科特变身程序员
- 博弈论之:防止背叛与促进背叛
- 检测labview安装visa驱动,并实现串口仪器控制(上篇)
- 大神教你如何搭建自己的web speedtest站点
- 计算机辩证技巧,庄子:辩证智慧与诡辩技巧
- [办公软件教程] Excel迷你图在哪里?Excel迷你图怎么设置
热门文章
- C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.10 轻松一下---国际C语言混乱代码大赛
- 阿里云虚拟主机使用教程
- Codeforce C. Barcode
- 数据度量消费贷款—影响因素数据分析
- oracle 11g for solaris,solaris 11 下安装oracle 11g 与 11g RAC
- IAR里面的icf文件的解析
- 大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase
- 安卓安装kali教程
- Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED参数详解
- 聊聊这次试用期“被”离职和感悟(大前端组)