分享一个遗传和神经元网络的算法C源码,希望大家多多交流
#include<fstream.h>#include <iostream>
#include <conio.h>
#include <time.h>
#include "malloc.h"
#include <math.h>
#include "stdlib.h"
int n=0;//表示输入神经元个数
int o=0;//表示输出神经元个数
int h=0;//表示隐层神经元个数
double e=0;//表示误差
double s=0;//步长
double a=0;//学习
int num=0;//训练个数
double **X;//表示输入
double *XY1;
double *XY3;
double *XY2;//存放各各神经元的输入值
double **Y;//存放最后一列的输入值
double **W1,**WChangei;//表示各层的权值
double **W2,**WChangeo;//存放最后一列的权值
double *DX2,*DX3;//存放各层误差
double *IHB,*HOB;//存入阀值
ifstream fin("output.txt");
ifstream fin2("test2.txt");
ifstream fin1("GAdata.txt");
double dblErr=0;
double **individual,**Tindividual;//初始种群T是temp
double *bestChrom;//最佳个体染色体
double *fitness;//各种群的适应度
double minFitness=100.0;
double pc;//交叉概率
double pm;//变异概率
int popsize;//种群大小
int lchrom;//染色体长度
int gen;//当前世代数
int maxgen;//最大世代数
double sumfitness;//总的适应度
double rl=0;
int *b;double *bTemp;//临时变量
static double oldrand;
static int jrand;
static double rndx2;
static int rndcalcflag;
void advance_random();
int flip(double);rnd(int, int);
void randomize();
double randomnormaldeviate();
double randomperc(),rndreal(double,double);
void warmup_random(double);
void forward(int);
void forward1(int);
double randab(double , double );
void advance_random()/* 产生55个随机数 */
{
int j1;
double new_random;
for(j1 = 0; j1 < 24; j1++)
{
new_random = oldrand - oldrand;
if(new_random < 0.0) new_random = new_random + 1.0;
oldrand = new_random;
}
for(j1 = 24; j1 < 55; j1++)
{
new_random = oldrand - oldrand ;
if(new_random < 0.0) new_random = new_random + 1.0;
oldrand = new_random;
}
}
int flip(double prob) /* 以一定概率产生0或1 */
{
if(randab(-1.0,1.0) <= prob)
return(1);
else
return(0);
}
void randomize()/* 设定随机数种子并初始化随机数发生器 */
{
float randomseed=1.0;
int j1;
for(j1=0; j1<=54; j1++)
oldrand = 0.0;
jrand=0;
do
{
printf("随机数种子:");
scanf("%f", &randomseed);
}
while((randomseed < 0.0) || (randomseed > 1.0));
warmup_random(randomseed);
}
double randomnormaldeviate() /* 产生随机标准差 */
{
double t, rndx1;
if(rndcalcflag)
{ rndx1 = sqrt(- 2.0*log((double) randomperc()));
t = 6.2831853072 * (double) randomperc();
rndx2 = rndx1 * sin(t);
rndcalcflag = 0;
return(rndx1 * cos(t));
}
else
{
rndcalcflag = 1;
return(rndx2);
}
}
double randomperc() /*与库函数random()作用相同, 产生之间一个随机数 */
{
jrand++;
if(jrand >= 55)
{
jrand = 1;
advance_random();
}
return((double) oldrand);
}
int rnd(int low, int high) /*在整数low和high之间产生一个随机整数*/
{
int i;
double randomperc();
if(low >= high)
i = low;
else
{
i =(int)((randomperc() * (high - low + 1)) + low);
if(i > high) i = high;
}
return(i);
}
void warmup_random(double random_seed)/* 初始化随机数发生器*/
{
int j1, ii;
double new_random, prev_random;
oldrand = random_seed;
new_random = 0.000000001;
prev_random = random_seed;
for(j1 = 1 ; j1 <= 54; j1++)
{
ii = (21*j1)%54;
oldrand = new_random;
new_random = prev_random-new_random;
if(new_random<0.0) new_random = new_random + 1.0;
prev_random = oldrand;
}
advance_random();
advance_random();
advance_random();
jrand = 0;
}
void initPop()
{
fin1>>popsize>>pc>>pm>>maxgen;
lchrom=n*h+h*o+h+o;
fitness=new double;
bestChrom=new double;
individual=new double*;
Tindividual=new double*;
for(int i=1;i<=popsize;i++)
{
Tindividual=new double;
individual=new double;
for(int j=1;j<=lchrom;j++)
{
//individual=(double)randomperc();
individual=randab(-1.0,1.0);
cout<<individual<<endl;
}
}
b=new int;
bTemp=new double;
}
void initPop1()
{
lchrom=n;
fitness=new double;
bestChrom=new double;
individual=new double*;
Tindividual=new double*;
for(int i=1;i<=popsize;i++)
{
Tindividual=new double;
individual=new double;
for(int j=1;j<=lchrom;j++)
{
individual=randab(-1.0,1.0);
}
}
b=new int;
bTemp=new double;
}
void Swap2(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void Swap(double &a,double &b)
{
double temp;
temp=a;
a=b;
b=temp;
}
int Partition(double a[],int b[],int p,int r)
{
int i=p,j=r+1;
double x=a;
while(true)
{
while(a[++i]>x);
while(a[--j]<x);
if(i>=j) break;
Swap(a,a);
Swap2(b,b);
}
a=a;
a=x;
return j;
}
void QuickSort(double a[],int b[],int p,int r)
{
if(p<r)
{
int q=Partition(a,b,p,r);
QuickSort(a,b,p,q-1);
QuickSort(a,b,q+1,r);
}
}
void setFitness()
{
for(int g=1;g<=popsize;g++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=h;j++)
W1=individual[(i-1)*h+j];
for(i=1;i<=h;i++)
for(int j=1;j<=o;j++)
W2=individual;
for(i=1;i<=h;i++)
IHB=individual;
for(i=1;i<=o;i++)
HOB=individual;
double dblTotal=0.0;
for(int iSample=1;iSample<=num;iSample++)
{
forward(iSample);
dblErr=0.0;
for(i=1;i<=o;i++)
dblErr+=0.5*(Y-XY3)*(Y-XY3);
dblTotal+=dblErr;//总误差
}
fitness=dblTotal;
if(minFitness>dblTotal)
{cout<<"dblTotal"<<dblTotal<<endl;
minFitness=dblTotal;
for(int i=1;i<=lchrom;i++)
bestChrom=individual;
}
}
//排序
for(g=1;g<=popsize;g++)
b=g;
QuickSort(fitness,b,1,popsize);
for(g=1;g<=popsize;g++)
for(int i=1;i<=popsize;i++)
{
if(b==g)
{
for(int j=1;j<=lchrom;j++)
{
bTemp=individual;
individual=individual;
individual=bTemp;
}
}
}
}
void setFitness1()
{
for(int g=1;g<=popsize;g++)
{
double dblTotal=0.0;
forward1(g);
for(int i=1;i<=o;i++)
dblTotal=XY3;
//总误差
fitness=dblTotal;
if(minFitness>dblTotal)
{cout<<"dblTotal1"<<dblTotal<<endl;
minFitness=dblTotal;
for(int i=1;i<=lchrom;i++)
bestChrom=individual;
}
}
//排序
for(g=1;g<=popsize;g++)
b=g;
QuickSort(fitness,b,1,popsize);
for(g=1;g<=popsize;g++)
for(int i=1;i<=popsize;i++)
{
if(b==g)
{
for(int j=1;j<=lchrom;j++)
{
bTemp=individual;
individual=individual;
individual=bTemp;
}
}
}
}
void preselect()
{
sumfitness=0;
for(int j=1;j<=popsize;j++)
sumfitness+=fitness;
}
int select()
{
double sum, pick;
int i;
pick=randab(-1.0,1.0);
sum = 0;
if(sumfitness != 0)
{
for(i = 1; (sum < pick) && (i <=popsize); i++)
sum += (double)(fitness/sumfitness);
}
else
i = rnd(1,popsize);
return(i-1);
}
void crossover(int x1,int x2)//交叉运算
{
if(flip(pc))
{
rl=randab(-1.0,1.0);
for(int i=1;i<=popsize;i++)
individual=individual*rl+individual*(1-rl);
for(i=1;i<=popsize;i++)
individual=individual*rl+individual*(1-rl);
}
}
void mutation(int x)//变异
{
for(int i=1;i<=lchrom;i++)
{
if(flip(pm))
//individual=randomperc();
individual=randab(-1.0,1.0);
//esle individual=1+
}
}
void generation()
{
int mate1, mate2, j = 0;
/*每代运算前进行预选 */
setFitness();
preselect();
/* 选择, 交叉, 变异 */
do
{
/* 挑选交叉配对 */
mate1 = select();
mate2 = select();
/* 交叉和变异 */
crossover(mate1,mate2);
for(int g=1;g<=lchrom;g++)
{
Tindividual=individual;
Tindividual=individual;
}
mutation(j+1);
mutation(j+2);
/* 解码, 计算适应度 */
j = j + 2;
}
while(j < (popsize-1));
for(int i=1;i<=popsize;i++)
for(int j=1;j<=lchrom;j++)
individual=Tindividual;
}
void generation1()
{
int mate1, mate2, j = 0;
/*每代运算前进行预选 */
setFitness1();
preselect();
/* 选择, 交叉, 变异 */
do
{
/* 挑选交叉配对 */
mate1 = select();
mate2 = select();
/* 交叉和变异 */
crossover(mate1,mate2);
for(int g=1;g<=lchrom;g++)
{
Tindividual=individual;
Tindividual=individual;
}
mutation(j+1);
mutation(j+2);
/* 解码, 计算适应度 */
j = j + 2;
}
while(j < (popsize-1));
for(int i=1;i<=popsize;i++)
for(int j=1;j<=lchrom;j++)
individual=Tindividual;
}
double randab(double a, double b)
{
double temp=((float)(rand()-rand())/32767*0.1);
if(temp<0) temp=temp*-1.0;
return temp;
}
void init()
{
srand((unsigned int)time((time_t *)NULL));
fin>>n;
fin>>o;
fin>>h;
fin>>e;
fin>>s;
fin>>a;
fin>>num;
W1=new double *;
for(int j=1;j<=n;j++)
{
W1=new double;
for(int i=1;i<=h;i++)
W1=randomperc();//randab(-1.0,1.0);
}
W2=new double *;
for(j=1;j<=h;j++)
{
W2=new double;
for(int i=1;i<=o;i++)
W2=randomperc();//randab(-1.0,1.0);
}
IHB=new double;
for(j=1;j<=h;j++)
IHB=randomperc();//randab(-1.0,1.0);
HOB=new double;
for(j=1;j<=o;j++)
HOB=randomperc();//randab(-1.0,1.0);
WChangei=new double *;
for(j=1;j<=n;j++)
{
WChangei=new double;
for(int i=1;i<=h;i++)
WChangei=0.0;
}
WChangeo=new double *;
for(j=1;j<=h;j++)
{
WChangeo=new double;
for(int i=1;i<=o;i++)
WChangeo=0.0;
}
DX3=new double;
for(j=1;j<=o;j++)
DX3=0.0;
DX2=new double;
for(j=1;j<=h;j++)
DX2=0.0;
XY1=new double;
XY2=new double;
XY3=new double;
X=new double *;
for(j=1;j<=num;j++)
X=new double;
Y=new double*;
for(j=1;j<=num;j++)
Y=new double;
}
void readXY()
{
for(int j=1;j<=num;j++)
{
for(int i=1;i<=n;i++)
{
fin>>X;
}
for(i=1;i<=o;i++)
fin>>Y;
}
}
void forward(int iSample)
{
//根据第iSample个样本,前向计算
int i,j;
double sum=0.0;
//输入层数据
for(i=1;i<=n;i++)
XY1=X;
//隐层数据
for(j=1;j<=h;j++){
sum=0.0;
for(i=1;i<=n;i++)
sum+=XY1*W1;;
sum-=IHB;
XY2=1.0/(1.0+exp(-sum));
}
//输出数据
for(j=1;j<=o;j++){
sum=0.0;
for(i=1;i<=h;i++)
sum+=XY2*W2;
sum-=HOB;
XY3=1.0/(1.0+exp(-sum));
}
}
void forward1(int g)
{
//根据第iSample个样本,前向计算
int i;
double sum=0.0;
//输入层数据
for(int j=1;j<=lchrom;j++)
{
XY1=individual;
}
//隐层数据
for(j=1;j<=h;j++){
sum=0.0;
for(i=1;i<=n;i++)
sum+=XY1*W1;;
sum-=IHB;
XY2=1.0/(1.0+exp(-sum));
}
//输出数据
for(j=1;j<=o;j++){
sum=0.0;
for(i=1;i<=h;i++)
sum+=XY2*W2;
sum-=HOB;
XY3=1.0/(1.0+exp(-sum));
}
}
void backward(int iSample)
{
int i,j;
//输出误差
for(i=1;i<=o;i++)
DX3=XY3*(1-XY3)*(Y-XY3);
//隐层误差
double sum=0.0;
for(j=1;j<=h;j++){
sum=0.0;
for(i=1;i<=o;i++)
sum+=DX3*W2;
DX2=XY2*(1-XY2)*sum;
}
//更新隐层-输出权重
double dblChange;
for(j=1;j<=h;j++)
for(i=1;i<=o;i++){
dblChange=DX3*XY2;
W2=W2+s*dblChange+a*WChangeo;
WChangeo=dblChange;
}
//更新输入-隐层权重
for(i=1;i<=n;i++)
for(j=1;j<=h;j++){
dblChange=DX2*XY1;
W1=W1+s*dblChange+a*WChangei;
WChangei=dblChange;
}
//修改阙值
for(j=1;j<=o;j++)
HOB-=s*DX3;
for(i=1;i<=h;i++)
IHB-=s*DX2;
//计算误差
dblErr=0.0;
for(i=1;i<=o;i++)
dblErr+=0.5*(Y-XY3)*(Y-XY3);
}
void learn()
{
int count=0;
double dblError=1.0;
int iSample=1;
double dblTotal;
while(dblError>e)
{
dblTotal=0.0;
for(iSample=1;iSample<=num;iSample++){
forward(iSample);
backward(iSample);
dblTotal+=dblErr;//总误差
}
if(dblTotal/dblError>1.04)
{//动态改变学习速率
s*=0.7;
}
else{
s*=1.05;
}
count++;
dblError=dblTotal;
///////////显示训练数次和误差//////
}
cout<<count<<endl;
}
void getWBFormChrom()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=h;j++)
W1=bestChrom[(i-1)*h+j];
for(i=1;i<=h;i++)
for(int j=1;j<=o;j++)
W2=bestChrom;
for(i=1;i<=h;i++)
IHB=bestChrom;
for(i=1;i<=o;i++)
HOB=bestChrom;
}
void main()
{
//思想:先用GA来训练神经网络,再用GA来求该网络的最优解!
randomize();
init();
readXY();
initPop();
for(int i=1;i<=maxgen;i++)
generation();
getWBFormChrom();
learn();
initPop1();
for(i=1;i<=1;i++)
generation1();
} 感谢分享。。。。 高大上,谢谢分享 感谢分享 感觉看不懂 看不懂,有网络图就好了
搞明白原理才有可能看懂 楼主要不顺便讲解一下代码的原理啥的 做什么用的呢,看名称就是高上大的 分享下流程图 不懂,但给我高大上的感觉 有程序没原理讲解,没啥作用啊。 深度学习,阿法狗? 看到这个高大上的标题,进来了,也只能放点水 这个高大上,LZ可以讲干原理吗? 原理推出代码容易,由代码推出原理难 高端,楼主能不能给个使用演示的demo。 听着名字好像很高端,其实就………………………………………………………………………………………………………………………………………………我也不懂! 坐等大神来科普 跟机器人控制算法有关? 看不懂啊,不知道能干啥 坐等科普。。。 用于信号识别或者图像识别的程序。 楼主能不能给点效果图什么的 前几天上研究生课,老师给讲了讲遗传算法,好像又理解深了点
好复杂,不知道这个代码能实现什么具体功能呢? 讲讲应用吧,比如能否用到图像识别上? 感谢分享 可以参考一些算法有关概念性的东西 感谢分享{:handshake:} 强大的算法,感谢楼主分享 有什么应用的实例么 收藏备用 懂原理才是最重要的 有大神指点下不,
完全不懂 谢谢分享,学习下 mark下班后看看 gzhua20088ssj 发表于 2016-5-20 16:59
可以参考一些算法有关概念性的东西
Hi LZ请问有完整的ppt可以分享吗~ 感觉挺高端的 学习,慢慢研究 坐等大神来科普 mark 听着名字好像很高端,其实就………………………………………………………………………………………………………………………………………………我也不懂! 没看懂,需要看流程图 目前正需要相关资料,项目的信号识别需要用到,不过一头雾水啊
页:
[1]