遗传算法Word文件下载.docx
《遗传算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《遗传算法Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
![遗传算法Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/5/ea298e7c-224f-4e51-9363-ed7cf5726397/ea298e7c-224f-4e51-9363-ed7cf57263971.gif)
但是交叉操作要在一定的概率下进行,这个概率称为交叉率,一般设置为0.5到0.95之间。
交叉后产生的新个体组成的新种群如下:
图3
黑体字表示子代染色体继承母代个体的基因情况。
五、变异
变异就是对染色体的结构进行变异,使其改变原来的结构(值也就改变),达到突变进化的目的。
变异操作也要遵从一定的概率来进行,一般设置为0到0.5之间。
本文的变异方法直接采取基因位反转变异法,即0变为1,1变为0。
要进行变异的基因位的选取也是随机的。
六、终止规则
遗传算法是要一代一代更替的,那么什么时候停止迭代呢?
这个规则就叫终止规则。
一般常用的终止规则有:
若干代后终止,得到的解达到一定目标后终止,计算时间达到一定限度后终止等方法。
本文采用迭代数来限制。
全文代码如下:
viewplaincopytoclipboardprint?
1.#include<
stdio.h>
//调用输入输出函数所需要的头文件
2.#include<
conio.h>
//调用getche函数所需要的头文件
3.#include<
stdlib.h>
//调用随机函数所需要的头文件
4.
5.typedefstructChrom//结构体类型,为单个染色体的结构;
6.{
7.shortintbit[6];
8.intfit;
9.}chrom;
10.
11.void*evpop(chrompopcurrent[4]);
//定义将会用到的几个函数;
12.intx(chrompopcurrent);
13.inty(intx);
14.void*pickchroms(chrompopcurrent[4]);
15.void*crossover(chrompopnext[4]);
16.void*mutation(chrompopnext[4]);
17.
18.voidmain()//主函数;
19.{
20.intnum;
//迭代次数;
21.inti,j,l,Max,k;
22.Max=0;
//函数最大值
23.
24.printf("
\nWelcometotheGeneticAlgorithmcodedbyLuayAl-wesi,editdbyxujinpeng\n"
);
//introductiontotheprogram,欢迎词;
25.printf("
TheAlgorithmisbasedonthefunctiony=-x^2+5tofindthemaximumvalueofthefunction.\n"
26.
27.enter:
printf("
\nPleaseentertheno.ofiterations\n请输入您要设定的迭代数:
"
28.scanf("
%d"
&
num);
//输入迭代次数,传送给参数num;
29.
30.chrompopcurrent[4];
//初始种群规模为4;
31.chrompopnext[4];
//更新后种群规模仍为4;
32.
33.
34.if(num<
1)
35.gotoenter;
//判断输入的迭代次数是否为负或零,是的话重新输入;
36.
37.evpop(popcurrent);
//随机产生初始种群;
38.
39.for(i=0;
i<
num;
i++)//开始迭代;
40.{
41.
42.printf("
\ni=%d\n"
i);
//输出当前迭代次数;
43.
44.for(j=0;
j<
4;
j++)
45.{
46.popnext[j]=popcurrent[j];
//更新种群;
47.}
48.
49.pickchroms(popnext);
//挑选优秀个体;
50.crossover(popnext);
//交叉得到新个体;
51.mutation(popnext);
//变异得到新个体;
52.
53.for(j=0;
54.{
55.popcurrent[j]=popnext[j];
//种群更替;
56.}
57.
58.}//等待迭代终止;
59.
60.for(l=0;
l<
3;
l++)
61.{
62.if(popcurrent[l].fit>
Max)
63.{
64.Max=popcurrent[l].fit;
65.k=l;
66.}
67.
68.}
69.printf("
\n当x等于%d时,函数得到最大值为:
%d"
k,Max);
70.printf("
\nPressanykeytoend!
71.
72.flushall();
//清除所有缓冲区;
73.getche();
//从控制台取字符,不以回车为结束;
74.
75.}
76.
77.
78.
79.void*evpop(chrompopcurrent[4])//函数:
随机生成初始种群;
80.{
81.inti,j,value;
82.intrandom;
83.for(j=0;
j++)//从种群中的第1个染色体到第4个染色体
84.{
85.for(i=0;
6;
i++)//从染色体的第1个基因位到第6个基因位
86.{
87.random=rand();
//产生一个随机值
88.random=(random%2);
//随机产生0或者1
89.popcurrent[j].bit[i]=random;
//随机产生染色体上每一个基因位的值,0或1;
90.}
91.
92.value=x(popcurrent[j]);
//将二进制换算为十进制,得到一个整数值;
93.popcurrent[j].fit=y(x(popcurrent[j]));
//计算染色体的适应度值;
94.printf("
\npopcurrent[%d]=%d%d%d%d%d%dvalue=%dfitness=%d"
j,popcurrent[j].bit[5],popcurrent[j].bit[4],popcurrent[j].bit[3],popcurrent[j].bit[2],popcurrent[j].bit[1],popcurrent[j].bit[0],value,popcurrent[j].fit);
95.//输出整条染色体的编码情况,
96.
97.}
98.return(0);
99.}
100.
101.
102.intx(chrompopcurrent)//函数:
将二进制换算为十进制;
103.{
104.intz;
105.z=(popcurrent.bit[0]*1)+(popcurrent.bit[1]*2)+(popcurrent.bit[2]*4)+(popcurrent.bit[3]*8)+(popcurrent.bit[4]*16);
106.
107.if(popcurrent.bit[5]==1)
108.{
109.z=z*(-1);
//考虑到符号;
110.}
111.
112.return(z);
113.}
114.
115.inty(intx)//函数:
求个体的适应度;
116.{
117.inty;
118.y=-(x*x)+5;
//目标函数:
y=-(x^2)+5;
119.return(y);
120.}
121.
122.void*pickchroms(chrompopcurrent[4])//函数:
选择个体;
123.{
124.inti,j;
125.chromtemp;
//中间变量
126.
127.for(i=0;
i++)//根据个体适应度来排序;
(冒泡法)
128.{
129.for(j=0;
130.{
131.if(popcurrent[j+1].fit>
popcurrent[j].fit)
132.{
133.temp=popcurrent[j+1];
134.popcurrent[j+1]=popcurrent[j];
135.popcurrent[j]=temp;
136.
137.}
138.}
139.}
140.for(i=0;
i++)
141.{
142.printf("
\nSorting:
popnext[%d]fitness=%d"
i,popcurrent[i].fit);
143.printf("
\n"
144.}
145.flushall();
146.return(0);
147.}
148.
149.void*crossover(chrompopnext[4])//函数:
交叉操作;
150.{
151.
152.intrandom;
153.inti;
154.random=rand();
//随机产生交叉点;
155.random=((random%5)+1);
//交叉点控制在1到5之间;
156.for(i=0;
random;
157.{
158.popnext[2].bit[i]=popnext[0].bit[i];
//child1crossover
159.popnext[3].bit[i]=popnext[1].bit[i];
//child2crossover
160.}
161.
162.for(i=random;
i++)//crossingthebitsbeyondthecrosspointindex
163.{
164.popnext[2].bit[i]=popnext[1].bit[i];
165.popnext[3].bit[i]=popnext[0].bit[i];
//chlid2crossover
166.}
167.
168.for(i=0;
169.{
170.popnext[i].fit=y(x(popnext[i]));
//为新个体计算适应度值;
171.}
172.
173.for(i=0;
174.{
175.printf("
\nCrossOverpopnext[%d]=%d%d%d%d%d%dvalue=%dfitness=%d"
i,popnext[i].bit[5],popnext[i].bit[4],popnext[i].bit[3],popnext[i].bit[2],popnext[i].bit[1],popnext[i].bit[0],x(popnext[i]),popnext[i].fit);
176.//输出新个体;
177.}
178.return(0);
179.}
180.
181.void*mutation(chrompopnext[4])//函数:
变异操作;
182.{
183.
184.intrandom;
185.introw,col,value;
186.random=rand()%50;
//随机产生0到49之间的数;
187.
188.if(random==25)//random==25的概率只有2%,即变异率为0.02;
189.{
190.col=rand()%6;
//随机产生要变异的基因位号;
191.row=rand()%4;
//随机产生要变异的染色体号;
192.
193.if(popnext[row].bit[col]==0)//1变为0;
194.{
195.popnext[row].bit[col]=1;
196.}
197.elseif(popnext[row].bit[col]==1)//0变为1;
198.{
199.popnext[row].bit[col]=0;
200.}
201.popnext[row].fit=y(x(popnext[row]));
//计算变异后的适应度值;
202.value=x(popnext[row]);
203.printf("
\nMutationoccuredinpopnext[%d]bit[%d]:
=%d%d%d%d%d%dvalue=%dfitness=%d"
row,col,popnext[row].bit[5],popnext[row].bit[4],popnext[row].bit[3],popnext[row].bit[2],popnext[row].bit[1],popnext[row].bit[0],value,popnext[row].fit);
204.
205.//输出变异后的新个体;
206.}
207.
208.return(0);
209.}