最近和学院的教授开始学习数据挖掘和机器学习的课程,第一步就是学习简单的遗传算法。
在网上找了篇教程,于是将其实现。文章地址文章地址。
内容是求求f(x1,x2)=x1^2+x2^2的最大值 ,x1∈{1,2,3,4,5,6,7} , x2∈{1,2,3,4,5,6,7} 。
选择样本数量为8,经过100代的迭代,效果还不错
代码如下:
/*
** 遗传算法求f(x1,x2)=x1^2+x2^2的最大值
** x1∈{1,2,3,4,5,6,7} , x2∈{1,2,3,4,5,6,7}
** @Jet-Muffin
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
#include <ctime>
using namespace std;
#define SAMPLE_NUM 8 //样本数量
#define EVOLVE_NUM 300 //进化代数
#define random(x) (rand()%x) //随机函数
#define VARIATE_RATE 10 //变异率
void init();
void output();
void cross();
void cross_change(int a,int b);
//样本node
struct node{
int bin[6];
int x1,x2;
int f;
double pct;
}group[SAMPLE_NUM];
//样本集合group
node temp[SAMPLE_NUM]; //操作中间变量数组
int choosen[SAMPLE_NUM]; //概率分布区域数组
//初始化,随机生成样本
void init()
{
for(int i = 0; i < SAMPLE_NUM; i++)
{
//随机生成bin数组
for(int j = 0; j < 6; j++)
{
int pct = random(100);