演化算法作业Word文档下载推荐.docx
- 文档编号:21487109
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:14
- 大小:173.12KB
演化算法作业Word文档下载推荐.docx
《演化算法作业Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《演化算法作业Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
第一次运行
第二次运行
第三次运行
第四次运行
1.227
1.248
1.245
1.253
3.303
3.342
3.259
3.251
0.10944011045
0.09385124541
0.11469797685
0.11279980732
由表1可以看出迭代次数越多遗传算法的效果可能越好;
并且多次迭代结果较为稳定,证明没有陷入局部优化。
表2某2次迭代过程表
代数(迭代总次数1000)
1
1.289
4.363
.0572********
31
1.295
4.23
.0732********
75
1.292
4.254
.0751********
134
1.241
4.256
0.09465988458390849
137
1.225
4.262
.0952********
最终结果
1.337
3.246
0.0569004294795720
3
1.321
3.306
0.06461712393829212
10
1.297
3.296
.0837********
48
1.281
3.275
.0973********
149
1.271
3.219
0.10366960257048366
由表2可以看出迭代结果在经过若干代后已经趋于稳定;
同时随着迭代次数的增加,最优值越来越靠近目标值。
对原有遗传算法进行改进,在进行重组时将最好的两个个体保留下来直接进入下一次迭代,剩余个体继续保持原来重组方式。
表3不同遗传算法运算比对表
原遗传算子
改进遗传算子
第五次
第六次
1.267
1.251
3.235
3.249
0.10687750692
0.11349618572
由表3可以看出实验结果稳定。
附录(演化算法java实现代码):
importjava.lang.Math;
importjava.util.Random;
publicclassGA
{
publicstaticfinalintPOP_SIZE=30;
//种群数目
publicstaticString[]pop=newString[POP_SIZE];
//种群编码
publicstaticPair[]result=newPair[POP_SIZE];
//种群代表的结果
publicstaticfinalintLENGTH=28;
//编码长度,因为要精确到小数点后六位,所以编为22位长,有一公式可参考
publicstaticdouble[]fitness=newdouble[POP_SIZE];
//存放种群适应度
publicstaticfinaldoublePC=0.90;
//交叉率
publicstaticfinaldoublePM=0.1;
//变异率
publicstaticdouble[]p=newdouble[POP_SIZE];
//轮盘赌方法个体适应度概率
publicstaticdouble[]q=newdouble[POP_SIZE];
//q[i]是前i项p之和
publicstaticPairpair=newPair(0,0);
publicstaticMaxmax=newMax(0,pair);
//最大值
publicstaticRandomrandom=newRandom();
//用于产生随机数的工具
/*约束条件*/
publicstaticdoublegx1(Pairresult)
{
returnMath.pow(result.getX1(),2)-result.getX2()+1;
}
publicstaticdoublegx2(Pairresult)
return1-Math.pow(result.getX1(),2)+Math.pow(result.getX2()-4,2);
/*初始化种群*/
publicvoidinitialization()
Stringa="
0000000000000000000000000000"
;
for(inti=0;
i<
pop.length;
i++)
{
pop[i]=a;
}
POP_SIZE;
StringBuffers=newStringBuffer(pop[i]);
for(intj=0;
j<
LENGTH;
j++)
{
doubletemp=Math.random();
if(temp<
0.5)
s.setCharAt(j,'
0'
);
else
1'
}
//剔除不符合约束的初始化
pop[i]=s.toString();
decoding();
fitness();
if(gx1(result[i])>
0||gx2(result[i])>
0||result[i].getX1()>
10||result[i].getX1()>
10)
i--;
/*
*解码方法,将二进制字节码还原为解
*/
publicvoiddecoding()
for(inti=0;
i<
i++)
StringsubX1=pop[i].substring(0,14);
StringsubX2=pop[i].substring(14,28);
doublex1=Integer.parseInt(subX1,2);
doublex2=Integer.parseInt(subX2,2);
result[i]=newPair(x1*0.001,x2*0.001);
/*适应度函数,也是目标函数*/
publicvoidfitness()
result.length;
i++)
fitness[i]=Math.pow(Math.sin(2*Math.PI*result[i].getX1()),3)*Math.sin(2*Math.PI*result[i].getX2())
/(Math.pow(result[i].getX1(),3)*(result[i].getX1()+result[i].getX2()));
/*交叉操作*/
publicvoidcrossover()
POP_SIZE/2;
doubled=random.nextDouble();
if(d<
PC)
intk1=random.nextInt(POP_SIZE);
intk2=random.nextInt(POP_SIZE);
while(k1==k2||k1==1||k1==2||k2==1||k2==2)
k1=(int)random.nextInt(POP_SIZE);
k2=(int)random.nextInt(POP_SIZE);
intposition=random.nextInt(LENGTH);
Strings11=null,s12=null,s21=null,s22=null;
s11=pop[k1].substring(0,position);
s12=pop[k1].substring(position,LENGTH);
s21=pop[k2].substring(0,position);
s22=pop[k2].substring(position,LENGTH);
pop[k1]=s11+s22;
pop[k2]=s21+s12;
//恢复不符合约束的重组,再重组
fitness();
if(gx1(result[k1])>
0||gx2(result[k1])>
0||gx1(result[k2])>
0||gx2(result[k2])>
0||
result[k1].getX1()>
10||result[k2].getX1()>
{
pop[k1]=s11+s12;
pop[k2]=s21+s22;
i--;
decoding();
fitness();
}
*变异操作
publicvoidmutation()
for(inti=2;
pop.length;
Strings=pop[i];
for(intj=0;
j<
LENGTH;
j++)
doublek=random.nextDouble();
if(k<
PM)
StringBuffersb=newStringBuffer(s);
if(sb.charAt(j)=='
)
sb.setCharAt(j,'
pop[i]=sb.toString();
//恢复不符合约束的变异,重新变异
decoding();
if(gx1(result[i])>
pop[i]=s;
i--;
*轮盘赌方法算法
publicvoidroulettewheel()
doublesum=0;
sum=fitness[i]+sum;
POP_SIZE;
p[i]=fitness[i]/sum;
=i;
j++)
q[i]+=p[j];
double[]ran=newdouble[POP_SIZE];
String[]tempPop=newString[POP_SIZE];
ran.length;
ran[i]=random.nextDouble();
intk=0;
while(ran[i]>
q[k])
k++;
tempPop[i]=pop[k];
tempPop.length;
pop[i]=tempPop[i];
publicvoidevaluate()
fitness.length;
if(fitness[i]>
max.getMax())
max.setMax(fitness[i]);
max.setPair(result[i]);
publicstaticvoidmain(String[]args)
GAga=newGA();
System.out.println("
初始化中.."
System.out.println();
ga.initialization();
ga.decoding();
ga.fitness();
for(inti=0;
1000;
ga.roulettewheel();
ga.decoding();
ga.fitness();
ga.crossover();
ga.mutation();
ga.evaluate();
System.out.println(i+"
."
+"
最优解为:
X1="
+max.getPair().getX1()+"
\tX2="
+max.getPair().getX2()+"
\tMax="
+max.max);
迭代结果为:
"
\rX1="
\r\n"
X2="
+max.getPair().getX2());
函数最大值\rf="
+max.getMax());
/*测试代码段*/
doublea=Math.pow(Math.sin(2*Math.PI*max.getPair().getX1()),3)*Math.sin(2*Math.PI*max.getPair().getX2())
/(Math.pow(max.getPair().getX1(),3)*(max.getPair().getX1()+max.getPair().getX2()));
doublegx1=Math.pow(max.getPair().getX1(),2)-max.getPair().getX2()+1;
doublegx2=1-Math.pow(max.getPair().getX1(),2)+Math.pow(max.getPair().getX2()-4,2);
System.out.println();
System.out.println(a);
System.out.print(gx1<
=0);
System.out.println("
\t"
+gx1);
System.out.print(gx2<
+gx2);
}
classMax
doublemax;
Pairpair=newPair(0,0);
publicMax(doublem,Pairp)
max=m;
pair=p;
publicvoidsetMax(doublem)
publicvoidsetPair(Pairp)
publicdoublegetMax()
returnmax;
publicPairgetPair()
returnpair;
classPair
privatedoublex1;
privatedoublex2;
publicPair(doublea,doubleb)
x1=a;
x2=b;
publicvoidsetX1(doublex)
x1=x;
publicvoidsetX2(doublex)
x2=x;
publicdoublegetX1()
returnx1;
publicdoublegetX2()
returnx2;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 演化 算法 作业