搜索
您的当前位置:首页正文

遗传算法实验指导书

2022-02-07 来源:保捱科技网
. -

实 验 一

XX科技大学 理 学院(系) 2010 年 月 日 课名:遗传算法 班级: : 题目:随机函数与函数调用 学号: 机台号: 同组人: 任课教师:熊 焱 实验目的: 1. 掌握随机数的生成函数 2. 熟悉函数调用的基本操作 实验内容及步骤: 内容:利用随机函数生成 [1,10] 和 [0,1] 内随机数各个; 编写数组作为参量的函数调用程序 条件:调用函数关系自己选定(如:xyxy ),数组取为实型 要求:生成随机数之后屏幕显示出来;数组、函数关系、函数值显示在屏幕上。 程序: #include #include void main() { float e[5]; int d[5]; int j,x; float y,z; for(j=0;j<5;j++) 23- . 可修编.

. -

{ d[j]=1+(int)(10.0*rand()/(RAND_MAX+1.0)); printf(\" %d \ } printf(\"\\n\"); for(j=0;j<5;j++) { e[j]=rand()/(RAND_MAX+1.0); printf(\" %.2f \ } printf(\"\\n\"); for(j=0;j<5;j++) { x=d[j]; y=e[j]; z=x*x+y*y*y+x*y; printf(\" %.2f \ } printf(\"\\n\"); printf(\"x*x+y*y*y+x*y\\n\"); } 实 验二

XX科技大学 理 学院(系) 2010 年 月 日 课名:遗传算法 班级: : 题目:编码、解码 学号: 机台号: 同组人: 任课教师:熊 焱 - . 可修编.

. -

实验目的: 1.掌握二进制数与十进制数的相互转化 2.熟悉不同划分长度下的二进制与十进制的转化操作 实验内容及步骤: 内容:将十进制数转化为指定长度下的二进制数 将二进制数转化为指定长度下的十进制数 条件:利用函数调用的方法编写程序,长度设为输入量(可调节),十进制数为单变量实型、二进制数存为数组(每个数组单元存储一位); 要求:转换结果屏幕输出。 #include #include void sje(int n,int m) { int x=0,a[100]={0}; while(n) { a[x++]=n%2; n/=2; } while(m>0) { m--; printf(\"%d\ } } void ejs(int *a,int x) { int sum=0; - . 可修编.

. -

while(x>0) { x--; sum+=a[x]*pow(2.0,x); } printf(\"%d\\n\} void main() { int m,n,x,a[100]; int i; printf(\"请输入转换的数:\\n\"); scanf(\"%d\ printf(\"请输入要转化在长度:\\n\"); scanf(\"%d\ sje(n,m); printf(\"\\n\"); printf(\"请输入转换的二进制数长度:\\n\"); scanf(\"%d\ printf(\"请输入转换的二进制数:\\n\"); for(i=x-1;i>=0;i--) scanf(\"%d\ ejs(a,x); } 实 验 三

XXXX科技大学 理 学院(系) 2010 年 月 日 课名:遗传算法 班级: : 题目:初始种群 学号: 机台号: 同组人: 任课教师:熊 焱 - . 可修编.

. -

实验目的: 掌握初始群体的生成过程 实验内容及步骤: 内容:生成二进制编码下的初始种群。 条件:个体X围给定,种群规模设为变量(可调节)。 要求:屏幕显示所生成的初始群体 #include #include #include int random() { return rand()%100; } void sje(int n,int m) { int x=0,a[100]={0}; while(n) { a[x++]=n%2; n/=2; } while(m>0) { m--; printf(\"%d\ } } void main() { - . 可修编.

. -

} int x,y=0; printf(\"种群规模:\\n\"); scanf(\"%d\while(yXX科技大学 理 学院(系) 2010 年 月 日 课名:遗传算法 班级: : 题目:选择算子 学号: 机台号: 同组人: 任课教师:熊 焱 实验目的: 掌握轮盘赌选择算子 - . 可修编.

. -

实验内容及步骤: 内容:编写二进制编码下的轮盘赌选择算子程序。 条件:延用前次实验所生成的初始种群和群体规模。 要求:屏幕显示选择算子操作后的结果。 #include #include #include using namespace std; int Rand_a(int n) { return rand()%n+1; } int main() { int N; cout<<\"请输入种群大小:\"<>N; int *syd=new int[N]; int *lsyd=new int[N]; int i; int n; int p=0; int *a=new int[N]; cout<<\"请输入适应度:\"<>syd[i]; lsyd[0]=syd[0]; for(i=1;i<10;i++) { lsyd[i]=lsyd[i-1]+syd[i]; } cout<<\"其适应度和累积适应度如下:\"<. -

} { cout<a[p]) { cout<- . 可修编.

. -

XXXX科技大学 理 学院(系) 2010 年 月 日 课名:遗传算法 班级: : 题目:单点交叉算子 学号: 机台号: 同组人: 任课教师:熊 焱 实验目的: 掌握单点交叉算子 实验内容及步骤: 内容:编写二进制编码下的单点交叉算子程序。 条件:延用前次实验所生成的种群和群体规模。 要求:屏幕显示交叉算子操作后的结果。 #include #include #include using namespace std; void fun(int *a,int n) { int i=0; while(n!=0) { a[i]=n%2; n=n/2; i++; } } void f(int model,int *num) - . 可修编.

. -

{ int num1,num2,shu=0,k=0; while(k!=model) { num1=rand()%(model+1); if(k==0&&num1!=0) num[k++]=num1; else { for(int i=0;i. -

int p1,p2; p1=b[i]-1,p2=b[i+1]-1; if(c[i]>N; int *a=new int[8]; for(i=0;i<8;i++) a[i]=0; int **b; b=new int*[N]; for(i=0;i. -

n=rand()%100+1; fun(a,n); for(j=0;j<8;j++) { b[i][j]=a[j]; a[j]=0; } } cout<=0;j--) cout<=0;j--) cout<. -

} return 0; 实 验 六

XXXX科技大学 理 学院(系) 2010 年 月 日 课名:遗传算法 班级: : 题目:单点变异算子 学号: 机台号: 同组人: 任课教师:熊 焱 实验目的: 掌握单点变异算子 - . 可修编.

. -

实验内容及步骤: 内容:编写二进制编码下的单点变异算子程序。 条件:延用前次实验所生成的种群和群体规模。 要求:屏幕显示变异算子操作后的结果。 #include #include #include using namespace std; void fun(int *a,int n) { int i=0; while(n!=0) { a[i]=n%2; n=n/2; i++; } } int main() { int N; int n; double p=0.5; int i,j; cout<<\"请输入种群规模:\"<>N; int *a=new int[8]; for(i=0;i<8;i++) a[i]=0; int **b; b=new int*[N]; for(i=0;i. -

c=new double*[N]; for(i=0;i=0;j--) cout<=0;j--) { c[i][j]=rand()%1000*1.0/1000; } } cout<<\"随机数是:\"<. -

} for(j=7;j>=0;j--) cout<=0;j--) if(c[i][j]=0;j--) cout<- . 可修编.

. -

XXXX科技大学 理 学院(系) 2010 年 月 日 课名:遗传算法 班级: : 题目:综合试验 学号: 机台号: 同组人: 任课教师:熊 焱 实验目的: 1. 掌握基本遗传算法操作; 2. 针对实际问题学会利用遗传算法、选用适合的遗传参数求解。 实验内容及步骤: 内容:编写二进制编码下的基本遗传算法解决实际问题。 条件:实际求解问题可以选为实数变量的最优化问题,也可以选为10个城市的TSP(旅行商)问题,遗传参数自选。 要求:屏幕显示相关运行结果。 #include #include #include using namespace std; const int N=1000; //最大代数 const double Pc=0.9; //交叉概率 const double Pm=0.1; //变异概率 int CityToCity[10][10]={ {0,118,1272,2567,1653,2097,1425,1177,3947,1574}, {118,0,1253,2511,1633,2077,1369,1157,3961,1518}, {1272,1253,0,1462,380,1490,821,856,3660,385}, {2567,2511,1462,0,922,2335,1562,2165,3995,933}, {1653,1633,380,922,0,1700,1041,1135,3870,456}, {2097,2077,1490,2335,1700,0,2311,920,2170,1920}, - . 可修编.

. -

{1425,1369,821,1562,1041,2311,0,1420,4290,626}, {1177,1157,856,2165,1135,920,1420,0,2870,1290}, {3947,3961,3660,3995,3870,2170,4290,2870,0,4090}, {1574,1518,385,993,456,1920,626,1290,4090,0} }; int Max(int *f,int *k) { int max=f[0]; for(int i=1;i<100;i++) if(maxf[i]) { min=f[i]; *k=i; } return min; } void convert(int pos1,int pos2,int *so,int *dest) //交叉 { int temp[10]; int ii = 0; int jj = 0; int kk = 0; for(ii=0;ii<10;ii++) - . 可修编.

. -

{ temp[ii] = so[(ii+pos2+1)%10]; } for(ii=0;ii<10;ii++) { for(jj=pos1;jj<=pos2;jj++) { if(temp[ii]==dest[jj]) { temp[ii]=100; break; } } } jj = 0; ii = 0; while(jj<10) { if(temp[jj] != 100) { temp[ii] = temp[jj]; ii++; } jj++; } for(kk=0; kk<(10-(pos2-pos1)-1); kk++) { dest[(kk+pos2+1)%10] = temp[kk]; } } void Rand_Pair(int num,int *result) //随机配对 { int r1,r2,shu=0,k=0; while(k!=num) { - . 可修编.

. -

r1=rand()%(num+1); if(k==0&&r1!=0) result[k++]=r1; else { for(int i=0;i. -

jj=rand()%10; while(ii==jj) { jj=rand()%10; } trasfs=a[jj]; a[jj]=a[ii]; a[ii]=trasfs; } } void Primary_gen(int city[][10]) { int *a=new int[10]; for(int i=0;i<10;i++) a[i]=i; for(int j=99;j>=0;j--) //生成初代种群 { for(int i=9;i>=0;i--) { int n = rand()%(i+1); int trsf=a[i]; a[i]=a[n]; a[n]=trsf; city[j][i]=a[i]; } city[j][0]=a[0]; } } int main() { int recardmin[10],recardmax[10]; int *r1,*r2; int temp=10; r1=&temp; r2=&temp; int g,i,j,k; - . 可修编.

. -

int city[100][10]; int gen = 0; int tt=1000000,dai; int distance[100]={0}; //种群中个体总距离 double fitness[100]; //适应度 double Sum_fitness[100]={0.0}; //累计适应度 double CrossP; //随机产生的交叉概率 int rand_pair[100]; //存放随机配对的结果 double rand_pm; //随机产生的变异概率 srand((unsigned int)time(NULL)); Primary_gen(city); while(gen=0;i--) { for(j=9;j>=1;j--) distance[i]+=CityToCity[city[i][j]][city[i][j-1]]; distance[i]+=CityToCity[city[i][0]][city[i][9]]; fitness[i]=1.0/distance[i]; } Sum_fitness[99]=fitness[99]; for(i=98;i>=0;i--) Sum_fitness[i]=Sum_fitness[i+1]+fitness[i]; int mind,maxd; mind=Min(distance,r1); maxd=Max(distance,r2); for(g=9;g>=0;g--) { recardmin[g]=city[*r1][g]; recardmax[g]=city[*r2][g]; } if(tt>mind) - . 可修编.

. -

{ tt=mind; dai=gen+1; } for(g=9;g>=0;g--) city[*r2][g]=recardmin[g]; cout<<\"第 \"<=0;g--) cout<=0;i--) { m = rand()%(int)(Sum_fitness[0]*1000000)*1.0/1000000; for(j=99;j>=0;j--) if(Sum_fitness[j]m) for(k=9;k>=0;k--) city[i][k]=city[j][k]; } //交叉算子 Rand_Pair(100,rand_pair); for(i=0;i<100;i++) rand_pair[i]-=1; int a1[10],a2[10],b1[10]={0},b2[10]={0}; i=0; while(i<100) { CrossP=rand()%100*1.0/100; if(CrossP=0;j--) { a1[j]=city[rand_pair[i]][j]; - . 可修编.

. -

a2[j]=city[rand_pair[i+1]][j]; } int p1=-1,p2=-1; int sum1=0,sum2=0; for(g=0;g<10;g++) { sum1+=b1[g]; sum2+=b2[g]; } while(p1==p2) { p1=rand()%(9)+1; p2=rand()%(9)+1; } if(p1>p2) { int t=p1; p1=p2; p2=t; } for(k=p1;k<=p2;k++) { b1[k]=a2[k]; b2[k]=a1[k]; } convert(p1,p2,a1,b1); convert(p1,p2,a2,b2); for(j=9;j>=0;j--) { city[rand_pair[i]][j]=b1[j]; city[rand_pair[i+1]][j]=b1[j]; } for(g=0;g<10;g++) { sum1+=b1[g]; sum2+=b2[g]; - . 可修编.

. -

} } } for(g=0;g<10;g++) { b1[g]=0;b2[g]=0; } i=i+2; } //变异算子 int cc[10]; for(j=99;j>=0;j--) { rand_pm=rand()%1000*1.0/1000; if(rand_pm

因篇幅问题不能全部显示,请点此查看更多更全内容

Top