📄 cpp1.cpp
字号:
/*#include <stdlib.h>
#include <stdio.h>
main()
{
int i,j;
for(i=0;i<10;i++)
{
j = rand()%7 ;
printf("%d\n",j );
}
}*/
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;//或者把这一句去掉,上面改为#include <iostream.h>,,具体见程序知识!
void GenerationFristIndividual(void);
void decode (void);
void displace(void);
void selection(void);
void crossover(void);
void mutation(void);
void thebestvalue(void);
struct individual
{
int chrom[20];
double value;
double fitness;
};
struct individual population[80];
#define generation 200;//一共繁衍200代
//产生第一代个体
void GenerationFristIndividual(void)
{
int i,j;
for(i=0;i<80;i++)
{
for(j=0;j<20;j++)
{
population[i].chrom[j]=((rand()%10)<5)?0:1;
}
}
}
void main(void)//主程序
{
int i(0),j(0),k(0);
GenerationFristIndividual();
decode ();
for(k=0;k<200;k++)
{
//GenerationFristIndividual();
decode ();
displace();
selection();
crossover();
mutation();
thebestvalue();
}
//for(i=0;i<80;i++)
//{
// for(j=0;j<20;j++)
//{
// cout<<population[i].chrom[j]<<endl;
//cout<<population[i].fitness<<endl;
// }
//}
}
//解码并计算个体值
void decode (void)
{
int *point,temp1,temp2,i,j,k;
double x1(0),x2(0);
for(i=0;i<80;i++)
{
temp1=0;temp2=0;//如果这两个在定义时就赋零,则结果temp1与temp2会逐渐变大。
point=population[i].chrom;
//cout<<*point<<endl;
for(j=0;j<10;j++,point++)
{
temp1+=*point<<(9-j);
}
point=&population[i].chrom[10];//使指针指向i个体的第10号位
for(k=0;k<10;k++)
{
temp2+=*(point++)<<(9-k);
}
x1=4.096*temp1/1023.0-2.048;
x2=4.096*temp2/1023.0-2.048;
//cout<<x2<<endl;
population[i].value=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1);
population[i].fitness=population[i].value;
//cout<<population[i].fitness<<endl;
}
}
//寻找适应度最好的和适应度最差的,并将适应度最差的替换为适应度最好的
void displace(void)
{
int j(0),k(0),z(0),w(0),*point;
double max(0),min(0);
max=population[0].fitness;
min=population[0].fitness;
for(j=1;j<80;j++)
{
if(population[j].fitness>max)
{
max=population[j].fitness;
w=j;
}
}//cout<<w;//查出最大适应度所在位子
//cout<<max<<endl;
for(k=1;k<80;k++)
{
if(population[k].fitness<min)
{
min=population[k].fitness;
z=k;//查出适应度最小的元素所在位置
}
}
//cout<<z<<endl;
//cout<<min<<endl;
point=population[w].chrom;
for(j=0;j<20;j++,point++)
{
population[z].chrom[j]=*point;
}
}
//选择算子
void selection(void)
{
struct individual newpopulation[80];
double fitness[80];//
double sum(0),p(0);
int i,j,k;
for(i=0;i<80;i++)
{
sum+=population[i].fitness;
}
//cout<<sum;
for(j=0;j<80;j++)
{
fitness[j]=population[j].fitness/sum;//相对适应度
}
for(k=0;k<80;k++)
{
fitness[k+1]=fitness[k+1]+fitness[k];//开始进行模拟赌盘
}
//for(i=0;i<80;i++)
//{
// cout<<fitness[i]<<endl;
//}
for(j=0;j<80;j++)
{
p=rand()%1000/1000.0;//cout<<p<<endl;
k=0;
while(p>fitness[k])
{
k++;
}//cout<<k<<endl;//有问题,k一直为1,原因为原先不使用的while语句而使用的if语句,if语句执行完直接跳出。
newpopulation[j]=population[k];
}
for(k=0;k<80;k++)
{
population[k]=newpopulation[k];
}
}
//*进行交叉计算(这里运用的是单点交叉)
void crossover(void)
{
int fenzu[80],temp(0),i(0),q(0),p(0),*point;
for(i=0;i<80;i++)
{
fenzu[i]=i;
}
for(i=0;i<80;i++)
{
p=rand()%(80-i);
temp=fenzu[i];
fenzu[i]=fenzu[p+i];
fenzu[p+i]=temp;
}//将fenzu数组中存储的0到79的数随机打乱
//for(i=0;i<80;i++)
//{
// cout<<fenzu[i]<<endl;
//}
for(i=0,point=fenzu;i<40;i++,point+=2)//分为四十组
{
//cout<<*point<<endl;
q=rand()%1000;//cout<<q<<endl;//为什么显示全为零?
if(q<600)//由于q=rand()%1000/1000.0不对,一直显示零,故这里换一种写法*1000
{
p=rand()%20;//cout<<p<<endl;
for(;p<20;p++)
{
temp=population[*point].chrom[p];//cout<<*point<<endl;
population[*point].chrom[p]=population[*(point+1)].chrom[p];
population[*(point+1)].chrom[p]=temp;
}
}
}
}
//进行变异计算
void mutation(void)
{
int i(0),j(0),p(0);
for(i=0;i<80;i++)
{
for(j=0;j<20;j++)
{
p=rand()%1000;//cout<<p<<endl;
if(p<100)//变异率设为0.001,由于随机数是1000以内的,故这里变为100
{
population[i].chrom[j]=(population[i].chrom[j]=0)?1:0;
}
}
}
}
//寻找并显示最好的适应度,显示此时的x1与x2
void thebestvalue(void)
{
int i(0),j(0),k(0),w(0),*point,temp1,temp2;
double max(0),x1(0),x2(0);
max=population[0].fitness;
for(j=1;j<80;j++)
{
if(population[j].fitness>max)
{
max=population[j].fitness;
w=j;
}
}
cout<<max<<endl;
temp1=0;temp2=0;
point=population[w].chrom;
//cout<<*point<<endl;
for(j=0;j<10;j++,point++)
{
temp1+=*point<<(9-j);
}
point=&population[w].chrom[10];//使指针指向w个体的第10号位
for(k=0;k<10;k++)
{
temp2+=*(point++)<<(9-k);
}//cout<<temp1<<endl;
x1=4.096*temp1/1023.0-2.048;
x2=4.096*temp2/1023.0-2.048;
//cout<<x1<<endl;
//cout<<x2<<endl<<endl<<endl<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -