遗传算法的C语言实现
//目标函数:y=(x1-1)^2+(x2-2)^2;
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<windows.h>
#define delta 3
#define T 200 //进化代数
#define N 200 //群体个数
#define INT 4 //整数基因长度
#define FLOAT 0//小数基因长度
#define MUTATE 0.005//基因突变率int t = 0; //代数计数
int gene[N][(INT + FLOAT) * delta]; //基因
double value[N]; //函数值
double ratio[N]; //适应度概率区间
int pair[N]; //随机配对规则
int totalRate = 0;void InitGroup();
double GetValue(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,double c=15) {return 2 * a * a - 3 * b * b - 4 * a + 5 * b + c;
}//初始化种群
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) * delta; 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];}}for (int i = 0; i < N; i++) {value[i] = Function(GetValue(gene[i], 1), GetValue(gene[i], 2),GetValue(gene[i],3));}
}//输出种群信息
void Output() {printf("个体基因:\n");for (int i = 0; i < N; i++) {printf("【");for (int j = 0; j < (INT + FLOAT) * delta; j++) {if (j == INT) printf(",");else if (j == INT + FLOAT) printf("】,【");else if (j == INT * delta + FLOAT) printf(",");printf("%d", gene[i][j]);}printf("】\n");}printf("个体数值:\n");for (int i = 0; i < N; i++) {printf("%5d: ", i);for (int j = 0; j < delta - 1; j++)printf("%.2f + ", GetValue(gene[i],j+1));printf("%.2f = ", GetValue(gene[i], delta));printf("%.0f\n", value[i]);}
}//求十进制值
double GetValue(int a[(INT + FLOAT) * delta], int n) {int v = 0;double ans=0;for (int i = 1 + (INT + FLOAT) * (n - 1); i <= (INT + FLOAT) * n; i++) {if (a[i - 1] != 0) v += pow(2, (INT + FLOAT) * n - i);}ans = v / (double)pow(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) * delta; 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) * delta];for (int i = 0; i < N - 1; i += 2) {int pos = rand() % ((INT + FLOAT) * delta - 1) + 1;//printf("%d ",pos);for (int k = 0; k < (INT + FLOAT) * delta; 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) * delta; 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),GetValue(gene[i],3));}
}//基因突变
void GeneMutate() {for (int i = 0; i < N; i++) {for (int j = 0; j < (INT + FLOAT) * delta; 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),GetValue(gene[i],3));}
}//输出答案
void Answer() {printf("\n\n最大值是:%.0f\n", value[N - 1]);for(int i=0;i<delta;i++)printf("x%d=%.0f\n", i+1,GetValue(gene[N - 1], i+1));
}
这是一个别人写好的遗传算法,在此基础上修改为任意元遗传算法,但是其中套用的时候需要修改一些地方而不是只修改宏定义,除非将其中的参数列表写为...的形式,就不花这个时间了.
遗传算法的C语言实现相关推荐
- 遗传算法的C语言实现(一):以非线性函数求极值为例
以前搞数学建模的时候,研究过(其实也不算是研究,只是大概了解)一些人工智能算法,比如前面已经说过的粒子群算法(PSO),还有著名的遗传算法(GA),模拟退火算法(SA),蚁群算法(ACA)等.当时懂得 ...
- 遗传算法二进制编码c语言,遗传算法,实数编码的交叉操作之SBX(模拟二进制交叉)...
本文主要介绍遗传算法(实数编码)的交叉操作中的SBX,模拟二进制交叉. 首先,给出个人用python2.7实现的代码,具体模块已上传到: https://github.com/guojun007/sb ...
- 遗传算法的c++语言程,C++实现简单遗传算法
本文实例讲述了C++实现简单遗传算法.分享给大家供大家参考.具体实现方法如下: //遗传算法 GA #include #include #include using namespace std; co ...
- 遗传算法的c++语言程,遗传算法 C++的程序
遗传算法 C++的程序 #include #include #include /* Change any of these parameters to match your needs */ #def ...
- 数据分析-R语言资料整理
独家分享--48页PPT解密数据可视化! Excel图表快捷操作小技巧 基于随机森林的分类与回归 R语言制作网页 ggplot2:可视化设计师的神器,了解一下 [译]R包介绍:Online Rando ...
- R语言中文社区2018年终文章整理(作者篇)
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...
- 精心整理 | R语言中文社区历史文章整理(类型篇)
2018年过去一半了~又到了盘点的时间~感谢长时间来各位好友的关注,我们的成长与你们的爱护是分不开的.更感谢各位老师的投稿,支撑起了我们的这个社区,让更多R语言的爱好者和从业者获得最棒的知识!本文选取 ...
- 工行智能客服服务量突破1.7亿笔;迪拜机场拟用人脸识别技术替代护照检查
韩国防部:计划于2025年前将人工智能投入野战运营 雷锋网 AI 掘金志消息,据韩联社10月9日报道,韩国国防部消息人士当天表示,军方计划到2025年研发人工智能,并将其投入到野战部队的实战运营中. ...
- R+ECharts2Shiny实现web动态交互式可视化数据(中)
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...
最新文章
- AV1时代要来了,超高清视频时代视频编码技术的机遇与挑战
- 读excel图片到数据库和上传图片到数据库
- ROS+Turtlebot3+RVIZ 显示机器人历史轨迹方法
- 快速构建Windows 8风格应用22-MessageDialog
- Spring5参考指南:容器扩展
- 1036 Boys vs Girls (25 分)_27行代码AC
- 图像种类的基本概念整理
- 分析一个BO上创建的extension field detail
- Python3字符串
- 怎么看另一个电脑端口是否通_谁一个人睡觉另一个看看夫妻的睡眠习惯
- 在win server 2003上安装SQL Server 2008的步骤
- [转载] python cmp函数比较字典_Python 字典(Dictionary) cmp()方法
- 亿级流量架构服务降级,写得太好了!
- SSIM和PSNR计算
- Laravel学习笔记(8)利用SEEDER或者模型工厂批量导入数据
- ContextCapture Master 倾斜摄影测量实景三维建模技术
- elasticsearch从入门到入门系列(二)---快速入门B
- 命令行创建文件和文件夹
- 三维向量求夹角(0-360)
- mysql gis_MySQL的GIS、GEO入门笔记
热门文章
- android禁止下拉刷新,Android开发之无痕过渡下拉刷新控件的实现思路详解
- PHPCMS手机访问,调用手机模板
- 计算机网络实验:PPP配置与分析
- 大数据三种主流架构(Lambda、Kappa、IOTA)
- 第三方数据采集卡在LabVIEW中使用Express VI简化编程范例
- html 保存草稿,利用localStorage实现对ueditor编辑内容定时保存为草稿,ueditor草稿箱...
- 学python对工作有什么帮助_学python有什么好处 学好了能干什么
- Photoshop实用的快捷键分享
- 双指针、BFS与图论
- 怎么将照片压缩变小一点?超实用的几种方法