遗传算法Word文件下载.docx

上传人:b****5 文档编号:19355405 上传时间:2023-01-05 格式:DOCX 页数:10 大小:89.14KB
下载 相关 举报
遗传算法Word文件下载.docx_第1页
第1页 / 共10页
遗传算法Word文件下载.docx_第2页
第2页 / 共10页
遗传算法Word文件下载.docx_第3页
第3页 / 共10页
遗传算法Word文件下载.docx_第4页
第4页 / 共10页
遗传算法Word文件下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

遗传算法Word文件下载.docx

《遗传算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《遗传算法Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。

遗传算法Word文件下载.docx

但是交叉操作要在一定的概率下进行,这个概率称为交叉率,一般设置为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.}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 中考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1