使用遗传算法求解函数最大值【精品毕业设计】(完整版)
遗传算法求复杂函数极值问题【精品毕业设计】(完整版)
遗传算法求复杂函数极值问题中文摘要:本文首先介绍遗传算法的历史背景,基本思想,对遗传算法的常见的编码解码方法进行了深入的阐述,并对算子选择方法进行深入分析和对比,在此基础上把遗传算法应用于求解复杂函数的极值计算。
最后在MATLAB语言环境下编写程序,对求解函数的最大值进行了仿真,并对调试的结果进行了分析,得出了部分结论。
关键词:遗传算法最优解算子选择复杂函数作者:xx xx指导老师:xxxx xxUsing Genetic Algorithm to Solve Extreme Problemof Complex FunctionAbstractFirstly,the historical background and basic idea of genetic algorithm are introduced in this paper. The common coding and decoding method of genetic algorithm are discussed too.Secondly, the selection method of genetic operator is analyzed and compared deeply, based on which genetic algorithm is used to solve extreme problem of complex function.Finally, with MATLAB software, the program is compiled and the maximum is sought out. At the end of the paper, the debugging result is analyzed and the conclusion is given.Keywords: Genetic Algorithm Optimal Solution Operator Selection Complex FunctionWritten by : xx xxSupervised by: xxxx xx目录第一章绪论 (5)1.1 遗传算法生物学背景 (5)1.1.1 遗传与变异 (5)1.1.2 进化 (5)1.2 本文主要内容 (5)第二章遗传算法简介 (6)2.1 遗传算法历史和发展 (6)2.2 遗传算法的基本原理 (6)2.3 遗传算法的特点 (7)2.4 遗传算法的目的 (7)2.5 遗传算法应用 (8)第三章遗传算法的参数和算子选择 (10)3.1 遗传算法的数学理论 (10)3.2 编码 (11)3.2.1 编码方法 (11)3.2.2 编码原则 (13)3.3 个体适应度函数 (13)3.3.1 评价个体适应 (13)3.2.2 适应度尺度变换 (14)3.3 算子选择 (14)3.3.1 选择运算 (14)3.3.2 交叉运算 (16)3.3.3 变异运算 (18)3.4 其他运行参数 (18)第四章遗传算法求解复杂函数极值问题 (20)4.1 遗传算法的求解步骤 (20)4.2 算例验证 (24)第五章结论 (28)参考文献 (28)附录(程序) (29)第一章绪论1.1遗传算法生物学背景生物的进化是一个奇妙的优化过程,它通过选择淘汰,突然变异,基因遗传等规律产生适应环境变化的优良物种。
最新遗传算法解决最大值问题_免费下载-药学医学精品资料
• 可见,经交叉后得到的新的种群为: • S01=10001,S02=11010,S03=01101,S04=11001
• ⑹变异 • 变异概率一般都很小,假设本次循环中没有发生变异,则变异 前的种群即为进化后所得到的第1代种群。即: • S11=10001,S12=11010,S13=01101,S14=11001 • 然后,对第1代种群重复上述(4)——(6)的操作。 • 对第1代种群,同样重复上述(4)——(6)的操作。其选择情况如 图所示: • 第1代种群的选择情况表 • 编号 染色体 x 适应值 百分比% 累计百分比% 选中次数 • S11 10001 27 289 16.43 16.437 1 • S12 11010 26 676 38.43 54.86 2 • S13 01101 13 169 9.61 64.47 0 • S14 11001 25 625 35.53 100 1
• • • • • • • • •
初始种群情况表
编号 染色体 x 适应值 百分比% 累计百分比% 选中次数 S01 01101 13 169 14.44 14.44 1 S02 11001 25 625 52.88 67.18 2 S03 01000 8 64 5.41 72.59 0 S04 10010 18 324 27.41 100 1 ⑷选择操作 假设采用轮盘赌方式选择个体,且依次生成的4个随机数(相 当于轮盘上指针所指的数)为0.85、0.32、0.12和0.46,经选择后得到 的新的种群为: • S01=10010,S02=11001,S03=01101,S04=11001 • 其中,染色体11001在种群中出现了2次,而原染色体01000则 因适应值太小而被淘汰。
• • •
• • • • • •
matlab遗传算法计算函数区间最大值和最小值
matlab遗传算法计算函数区间最大值和最小值下面是用matlab实现遗传算法计算函数区间最大值和最小值的示例代码:首先定义函数(此处以f(x)=x*sin(10*pi*x)+1为例):matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;end然后设置遗传算法参数:matlaboptions = gaoptimset('Generations', 1000, 'PopulationSize', 50,'StallGenLimit', 200, 'TolCon', 1e-10);其中,Generations表示遗传算法的迭代次数,PopulationSize表示种群大小,StallGenLimit表示在连续多少代没有改变时停止迭代,TolCon表示收敛精度。
接着,编写遗传算法主函数:matlab[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);其中,第一个参数为要优化的函数,第二个参数为变量维度,后面的参数为变量的取值范围。
最后,输出结果:matlabfprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);其中,-fval表示函数最大值,fval表示函数最小值。
完整代码如下:matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;endoptions = gaoptimset('Generations', 1000, 'PopulationSize', 50, 'StallGenLimit', 200, 'TolCon', 1e-10);[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);fprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);参考资料:[1][2]。
利用遗传算法求函数的极大值
利用遗传算法求函数的极大值function[BestSfi,BestS,x1,x2]=GenericAlgorithm(Size,G,Codel,umax,umin,pc,pm)----------------------------------------------------------------------------------------------------------------------%主要符号说明% Size 种群大小,选为60% G 终止进化代数,选为100% Codel 用二进制编码串表示决策变量x1,x2,选为10位% umax 决策变量上限2.048% umin 决策变量下限2.048% pc 交叉概率,选为0.8% pm 变异概率,选为0.01----------------------------------------------------------------------------------------------------------------------E=round(rand(Size,2*Codel)); %随机生成二十位的编码,前十位为x1,后十位为x2for k=1:1:Gtime(k)=k;for s=1:1:Sizem=E(s,:);y1=0;y2=0; %初始化m1=m(1:1:Codel);for i=1:1:Codely1=y1+m1(i)*2^(i-1); %二进制转化为十进制endx1=(umax-umin)*y1/1023+umin; %解码后x1的实际值m2=m(11:1:2*Codel);for i=1:1:Codely2=y2+m2(i)*2^(i-1);endx2=(umax-umin)*y2/1023+umin; %解码后x2的实际值F(s)=100*(x1^2-x2)^2+(1-x1)^2; %所求函数endJi=1./F; %目标函数,此处取适应度的倒数%第一步,算出最优染色体BestJ(k)=min(Ji);fi=F;[Oderfi,Indexfi]=sort(fi);Bestfi=Oderfi(Size);BestS=E(Indexfi(Size),:);bfi(k)=Bestfi;%第二步,选择和复制过程fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size); %适配值大的被复制kk=1;for i=1:1:Sizefor j=1:1:fi_S(i)TempE(kk,:)=E(Indexfi(i),:);kk=kk+1;endend%第三步,交叉过程n=ceil(20*rand);for i=1:2:(Size-1)temp=rand;if pc>tempfor i=n:1:20TempE(i,j)=E(i+1,j);TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%第四步,变异过程for i=1:1:Sizefor j=1:1:Codeltemp=rand;if pc>tempif TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendend%保证TempPop(30,:)是最大适应度的代码TempE(Size,:)=BestS;E=TempE;end%输出结果Max_Value=Bestfi;Bestfi %显示最大适应度值BestS %显示对应的染色体x1x2subplot(1,2,1);plot(time,BestJ); %目标函数title('目标函数J的优化过程')xlabel('Times');ylabel('Best J');subplot(1,2,2);plot(time,bfi); %适应度函数title('适应度F的优化过程')xlabel('times');ylabel('Best F');在Matlab下运行的结果为:GenericAlgorithm(60,100,10,2.048,-2.048,0.80,0.01),回车Bestfi = 3.9059e+003。
遗传算法用matlab求函数极大值
遗传算法用matlab求函数极大值一、题目:寻找f(x)=x2,,当x在0~31区间的最大值。
二、源程序:%遗传算法求解函数最大值%本程序用到了英国谢菲尔德大学(Sheffield)开发的工具箱GATBX,该工具箱比matlab自带的GATOOL使用更加灵活,但在编写程序方面稍微复杂一些Close all;Clear all;figure(1);fplot('variable*variable',[0,31]); %画出函数曲线%以下定义遗传算法参数GTSM=40; %定义个体数目ZDYCDS=20; %定义最大遗传代数EJZWS=5; %定义变量的二进制位数DG=0.9; %定义代沟trace=zeros(2, ZDYCDS); %最优结果的初始值FieldD=[5;-1;2;1;0;1;1]; %定义区域描述器的各个参数%以下为遗传算法基本操作部分,包括创建初始种群、复制、交叉和变异Chrom=crtbp(GTSM, EJZWS); %创建初始种群,即生成给定规模的二进制种群和结构gen=0; %定义代数计数器初始值variable=bs2rv(Chrom, FieldD); %对生成的初始种群进行十进制转换ObjV=variable*variable; %计算目标函数值f(x)=x2 while gen<ZDYCDS %进行循环控制,当当前代数小于定义的最大遗传代数时,继续循环,直至代数等于最大遗传代数FitnV=ranking(-ObjV); %分配适应度值SelCh=select('sus', Chrom, FitnV, DG); %选择,即对个体按照他们的适配值进行复制SelCh=recombin('xovsp', SelCh, 0.7); %交叉,即首先将复制产生的匹配池中的成员随机两两匹配,再进行交叉繁殖SelCh=mut(SelCh); %变异,以一个很小的概率随机地改变一个个体串位的值variable=bs2rv(SelCh, FieldD); %子代个体的十进制转换ObjVSel=variable*variable; %计算子代的目标函数值[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);%再插入子代的新种群,其中Chrom为包含当前种群个体的矩阵,SelCh为包好当前种群后代的矩阵variable=bs2rv(Chrom, FieldD); %十进制转换gen=gen+1; %代数计数器增加%输出最优解及其序号,并在目标函数图像中标出,Y为最优解, I为种群的%序号[Y, I]=max(ObjV);hold on; %求出其最大目标函数值plot(variable(I), Y, 'bo');trace(1, gen)=max(ObjV); %遗传算法性能跟踪trace(2, gen)=sum(ObjV)/length(ObjV);end%以下为结果显示部分,通过上面计算出的数值进行绘图variable=bs2rv(Chrom, FieldD); %最优个体进行十进制转换hold on, grid;plot(variable,ObjV,'b*'); %将结果画出三、运行结果:由图可见该函数为单调递增函数,即当X=31时,该取得最大值f(x)max =961。
实验五:遗传算法求解函数最值问题实验
EJdoublefitness(constCh^crrcscrcRc)
{
doublek,y;
decode(cx# y);
retiurnf(x, y)+5;
2•交叉操作
首先是根据交叉概率probCross选择要交叉的个体进行交叉
//根据交叉槪率进行交叉
for(inti=pre = -1;i<N; i++)
//根据变异概率迸行变异
for (inti=0;i<N; i++)
if(randQm61() < probMutation)
mutate(group[i]);
变异时先随机生成变异的位置,然后把改位的01值翻转。
//变异操作
Hvoidmutate(ChrcfnosomeS c)
{
//随机选行翻转
inti-rand()%len; c-g[i] =
//骑越
boolflag-令;
for(inti = j=0; i<1.亡n;i++)
swap(d.g[l]Jc2.g[i]);
if(i== crosspcint[j])
//妇杲若干个交叉点重合”则效果叠加 "偃数个交叉点效果瑁当于没有交叉点while(j<
flag = [flag;
3.变异操作
首先是根据变异概率probMutation选择要变异的个体
经过一定的进化之后得到最终种群,从中选择最优的个体即可得
到最终的结果。
//获取种群最优你
-intgetOptimal(Ch^crescr:-oup[mxn]doubled—double&』doubled\)
R语言GA遗传算法【精品毕业设计】(完整版)
GA包遗传算法最大化使用遗传算法的适应度函数。
默认求最大值。
用法:ga(type = c("binary", "real-valued", "permutation"), fitness, ..., min, max, nBits, population = gaControl(type)population,<br/>selection=gaControl(type)selection, crossover = gaControl(type)crossover,<br/> mutation=gaControl(type)mutation, popSize = 50, pcrossover = 0.8, pmutation = 0.1, elitism = base::max(1, round(popSize*0.05)), maxiter = 100, run = maxiter, maxfitness = Inf, names = NULL, suggestions = NULL, keepBest = FALSE, parallel = FALSE, monitor = gaMonitor, seed = NULL)参数说明•type: 解得编码类型–binary :二进制编码–real-valued:实数浮点编码–permutation:问题涉及到重新排序的列表,字符串编码。
可求解TSP 问题•fitness:适应度函数•min:解得下界(多元变量为一个向量)•max:解得上界(多元变量为一个向量)•nBits:一个种群用二进制编码的长度是多少(长度越大代表精度越高) •population:初始种群•selection:选择•crossover: 交叉•crossover:变异•popsize:种群大小•pcrossover: 交叉概率(默认0.8)•pmutation:变异概率(默认0.1)•elitism: 代沟(默认情况下,前5%个体将在每个迭代中保留)•maxiter:最大迭代次数(默认100)•maxfitness:适应度函数的上界,GA搜索后中断•keepBest:是否保留每一代的最优解•parallel:是否采用并行运算•monitor:绘图用的,监控遗传算法的运行状况•seed:一个整数值包含随机数发生器的状态。
完整的遗传算法函数Matlab程序【精品毕业设计】(完整版)
完整的遗传算法函数Matlab程序function [x,endPop,bPop,traceInfo] = ga(bounds,eevalFN,eevalOps,startPop,opts,... termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)n=nargin;if n<2 | n==6 | n==10 | n==12disp('Insufficient arguements')endif n<3 %Default eevalation opts.eevalOps=[];endif n<5opts = [1e-6 1 0];endif isempty(opts)opts = [1e-6 1 0];endif any(eevalFN<48) %Not using a .m fileif opts(2)==1 %Float gae1str=['x=c1; c1(xZomeLength)=', eevalFN ';'];e2str=['x=c2; c2(xZomeLength)=', eevalFN ';'];else %Binary gae1str=['x=b2f(endPop(j,:),bounds,bits); endPop(j,xZomeLength)=',...eevalFN ';'];endelse %Are using a .m fileif opts(2)==1 %Float gae1str=['[c1 c1(xZomeLength)]=' eevalFN '(c1,[gen eevalOps]);'];e2str=['[c2 c2(xZomeLength)]=' eevalFN '(c2,[gen eevalOps]);'];else %Binary gae1str=['x=b2f(endPop(j,:),bounds,bits);[x v]=' eevalFN ...'(x,[gen eevalOps]); endPop(j,:)=[f2b(x,bounds,bits) v];'];endendif n<6 %Default termination informationtermOps=[100];termFN='maxGenTerm';endif n<12 %Default muatation informationif opts(2)==1 %Float GAmutFNs=['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation']; mutOps=[4 0 0;6 termOps(1) 3;4 termOps(1) 3;4 0 0];else %Binary GAmutFNs=['binaryMutation'];mutOps=[0.05];endendif n<10 %默认的交叉信息if opts(2)==1 %浮点编码xOverFNs=['arithXover heuristicXover simpleXover'];xOverOps=[2 0;2 3;2 0];else %Binary GAxOverFNs=['simpleXover'];xOverOps=[0.6];endendif n<9 %Default select opts only i.e. roullete wheel.selectOps=[];endif n<8 %Default select infoselectFN=['normGeomSelect'];selectOps=[0.08];endif n<6 %默认的算法终止准则termOps=[100];termFN='maxGenTerm';endif n<4 %初始种群为空startPop=[];endif isempty(startPop) %随机生成初始种群startPop=initializega(80,bounds,eevalFN,eevalOps,opts(1:2));endif opts(2)==0 %二进制编码bits=calcbits(bounds,opts(1));endxOverFNs=parse(xOverFNs);mutFNs=parse(mutFNs);xZomeLength = size(startPop,2); %Length of the xzome=numVars+fittness numVar = xZomeLength-1; %变量数目popSize = size(startPop,1); %种群中个体数目endPop = zeros(popSize,xZomeLength); %次种群矩阵c1 = zeros(1,xZomeLength); %个体c2 = zeros(1,xZomeLength); %个体numXOvers = size(xOverFNs,1); %交叉操作次数numMuts = size(mutFNs,1); %变异操作次数epsilon = opts(1); %适应度门限值oeval = max(startPop(:,xZomeLength)); %初始种群中的最优值bFoundIn = 1;done = 0;gen = 1;collectTrace = (nargout>3);floatGA = opts(2)==1;display = opts(3);while(~done)[beval,bindx] = max(startPop(:,xZomeLength)); %当前种群的最优值best = startPop(bindx,:);if collectTracetraceInfo(gen,1)=gen; %当前代traceInfo(gen,2)=startPop(bindx,xZomeLength); %最优适应度traceInfo(gen,3)=mean(startPop(:,xZomeLength)); %平均适应度traceInfo(gen,4)=std(startPop(:,xZomeLength));endif ( (abs(beval - oeval)>epsilon) | (gen==1))if displayfprintf(1,'\n%d %f\n',gen,beval);endif floatGAbPop(bFoundIn,:)=[gen startPop(bindx,:)];elsebPop(bFoundIn,:)=[gen b2f(startPop(bindx,1:numVar),bounds,bits)... startPop(bindx,xZomeLength)];endbFoundIn=bFoundIn+1;oeval=beval;elseif displayfprintf(1,'%d ',gen);endendendPop = feeval(selectFN,startPop,[gen selectOps]); %选择操作if floatGAfor i=1:numXOvers,for j=1:xOverOps(i,1),a = round(rand*(popSize-1)+1); %一个父代个体b = round(rand*(popSize-1)+1); %另一个父代个体xN=deblank(xOverFNs(i,:)); %交叉函数[c1 c2] = feeval(xN,endPop(a,:),endPop(b,:),bounds,[gen… xOverOps(i,:)]);if c1(1:numVar)==endPop(a,(1:numVar))c1(xZomeLength)=endPop(a,xZomeLength);elseif c1(1:numVar)==endPop(b,(1:numVar))c1(xZomeLength)=endPop(b,xZomeLength);elseeeval(e1str);endif c2(1:numVar)==endPop(a,(1:numVar))c2(xZomeLength)=endPop(a,xZomeLength);elseif c2(1:numVar)==endPop(b,(1:numVar))c2(xZomeLength)=endPop(b,xZomeLength);elseeeval(e2str);endendPop(a,:)=c1;endPop(b,:)=c2;endendfor i=1:numMuts,for j=1:mutOps(i,1),a = round(rand*(popSize-1)+1);c1 = feeval(deblank(mutFNs(i,:)),endPop(a,:),bounds,[gen mutOps(i,:)]);if c1(1:numVar)==endPop(a,(1:numVar))c1(xZomeLength)=endPop(a,xZomeLength);elseeeval(e1str);endendPop(a,:)=c1;endendelse %遗传操作的统计模型for i=1:numXOvers,xN=deblank(xOverFNs(i,:));cp=find(rand(popSize,1)if rem(size(cp,1),2) cp=cp(1:(size(cp,1)-1)); endcp=reshape(cp,size(cp,1)/2,2);for j=1:size(cp,1)a=cp(j,1); b=cp(j,2);[endPop(a,:) endPop(b,:)] = feeval(xN,endPop(a,:),endPop(b,:), bounds,[gen xOverOps(i,:)]); endendfor i=1:numMutsmN=deblank(mutFNs(i,:));for j=1:popSizeendPop(j,:) = feeval(mN,endPop(j,:),bounds,[gen mutOps(i,:)]);eeval(e1str);endendend。
遗传算法求函数极大值(matlab实现)
遗传算法求函数最大值(matlab实现)一、题目:寻找f(x)=x2,,当x在0~31区间的最大值。
二、源程序:%遗传算法求解函数最大值%本程序用到了英国谢菲尔德大学(Sheffield)开发的工具箱GATBX,该工具箱比matlab自带的GATOOL使用更加灵活,但在编写程序方面稍微复杂一些Close all;Clear all;figure(1);fplot('variable*variable',[0,31]); %画出函数曲线%以下定义遗传算法参数GTSM=40; %定义个体数目ZDYCDS=20; %定义最大遗传代数EJZWS=5; %定义变量的二进制位数DG=0.9; %定义代沟trace=zeros(2, ZDYCDS); %最优结果的初始值FieldD=[5;-1;2;1;0;1;1]; %定义区域描述器的各个参数%以下为遗传算法基本操作部分,包括创建初始种群、复制、交叉和变异Chrom=crtbp(GTSM, EJZWS); %创建初始种群,即生成给定规模的二进制种群和结构gen=0; %定义代数计数器初始值variable=bs2rv(Chrom, FieldD); %对生成的初始种群进行十进制转换ObjV=variable*variable; %计算目标函数值f(x)=x2 while gen<ZDYCDS %进行循环控制,当当前代数小于定义的最大遗传代数时,继续循环,直至代数等于最大遗传代数FitnV=ranking(-ObjV); %分配适应度值SelCh=select('sus', Chrom, FitnV, DG); %选择,即对个体按照他们的适配值进行复制SelCh=recombin('xovsp', SelCh, 0.7); %交叉,即首先将复制产生的匹配池中的成员随机两两匹配,再进行交叉繁殖SelCh=mut(SelCh); %变异,以一个很小的概率随机地改变一个个体串位的值variable=bs2rv(SelCh, FieldD); %子代个体的十进制转换ObjVSel=variable*variable; %计算子代的目标函数值[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);%再插入子代的新种群,其中Chrom为包含当前种群个体的矩阵,SelCh为包好当前种群后代的矩阵variable=bs2rv(Chrom, FieldD); %十进制转换gen=gen+1; %代数计数器增加%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I 为种群的%序号[Y, I]=max(ObjV);hold on; %求出其最大目标函数值plot(variable(I), Y, 'bo');trace(1, gen)=max(ObjV); %遗传算法性能跟踪trace(2, gen)=sum(ObjV)/length(ObjV);end%以下为结果显示部分,通过上面计算出的数值进行绘图variable=bs2rv(Chrom, FieldD); %最优个体进行十进制转换hold on, grid;plot(variable,ObjV,'b*'); %将结果画出三、运行结果:由图可见该函数为单调递增函数,即当X=31时,该取得最大值f(x)max=961。
遗传算法求解函数最大值
精选文档S311067019 李麒星用遗传算法经过复制交错过程循环求解函数f(x)=x^2 在 [0,31]区间上的最大值点 x。
代码以下:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespaceProject2{class Class1{public int ff( int a){return a * a;}public int Max( int [] args){int s = 0;int m = args[0];for ( int i = 0; i < args.Length; i++){if (m < args[i]){m = args[i];s = i;}}return s;}public int Min( int [] args){int s = 0;int m = args[0];for ( int i = 0; i < args.Length; i++){if (m > args[i]){m = args[i];s = i;}}return s;}static void Main( String [] args){string [] A = new string [4];A[0] = "01101" ;A[1] = "11000" ;A[2] = "01000" ;A[3] = "10011" ;Class1 cl = new Class1 ();Randoma = new Random();int [] x = new int [4]; // 储存 x值float [] C = new float [4]; // 储存每个适配值所占比率int [] B = new int [4]; // 储存 x对应的 y值int k1 = 0; // 交错时所需的随机整数范围在0-4 之间int k2 = 0; // 交错时所需的随机整数范围在0-4 之间int max = 0; // 适配值总最大的值在 x中的下标int sum = 0; // 全部适配值对应的函数值的总和int min = 0; // 适配值总最小的值在 x中的下标int t1 = 0; // 初始最大值int ave1 = 0; // 初始均匀值int t2 = 0; // 每次循环得出的最大值int ave2 = 0; // 每次循环得出的均匀值int smax = 20; // 循环最大次数for ( int l = 1; l < smax; l++){for ( int i = 0; i < 4; i++){x[i] =Convert .ToInt32(A[i],2);//x[i] = Int32.Parse(A[i]);//怎么把二进制数转变为十进制数}for ( int i = 0; i < 4; i++){B[i] = cl.ff(x[i]);// 求出 f(x)=x^2 的值存入 B中sum += B[i];}for ( int i = 0; i < 4; i++){C[i] = B[i] / sum;}max =cl.Max(x);min = cl.Min(x);t2 = x[max];// 用来记录每次循环的最大值ave2 = sum / 4;// 用来记录每次循环的均匀值if (t2 < t1 && ave2 < ave1){break ;}else{t1 = t2;ave1 = ave2;}for ( int i = 0; i < 4; i++)// 输出每次循环的结果{System. Console .Write(x[i]); //System.Console .Write( ' ' );} System. Console .Write( "\n" ); // 换行A[min] = A[max];// 适配值较小的被裁减,由最大的代替 k1 = a.Next(1,4);// 从 1-4 之间选一个随机数 k2 =a.Next(1,4);if (max + min != 3){string s1 = A[max].Substring(k1); // 从第 k 个数开始获 得后边的子串string s2 = A[min].Substring(k2);string s3 = A[3 - max].Substring(k1);string s4 = A[3 - min].Substring(k2); A[max] = A[max].Substring(0, k1) + s3; A[min] = A[min].Substring(0, k2) + s4; A[3 - max] = A[3 - max].Substring(0,k1) + s1; A[3 - min] = A[3 - min].Substring(0,k2) + s2; }else{ if ((max > min) && (min + 1 == max)) //max=2 min=1string s1 = A[max].Substring(k1); // 从第 k 个数开 始获取后边的子串string s2 = A[min].Substring(k2); string s3 = A[3].Substring(k1); string s4 = A[0].Substring(k2);A[max] = A[max].Substring(0,k1) + s3; A[min] = A[min].Substring(0,k2) + s4; A[3] = A[3].Substring(0,k1) + s1;.S311067019李麒星}elseif ((max < min) &&(min == max+ 1))//max=1 min=2 {string s1 = A[max].Substring(k1); // 从第 k 个数开始获取后边的子串string s2 = A[min].Substring(k2);string s3 = A[0].Substring(k1);string s4 = A[3].Substring(k2);A[max] = A[max].Substring(0,k1) + s3;A[min] = A[min].Substring(0,k2) + s4;A[0] = A[0].Substring(0,k1) + s1;A[3] = A[3].Substring(0,k2) + s2;}elseif ((max > min) && (max ==min + 3))//max=3 min=0{string s1 = A[max].Substring(k1);// 从第 k个数开始获取后边的子串string s2 = A[min].Substring(k2);string s3 = A[2].Substring(k1);string s4 = A[1].Substring(k2);A[max] = A[max].Substring(0,k1) + s3;A[min] = A[min].Substring(0,k2) + s4;A[2] = A[2].Substring(0,k1) + s1;A[1] = A[1].Substring(0,k2) + s2;}elseif((max < min) && ( min==max +3 )) //max=0 min=3{string s1 =A[max].Substring(k1);// 从第 k个数开始获取后边的子串string s2 = A[min].Substring(k2);string s3 = A[1].Substring(k1);string s4 = A[2].Substring(k2);A[max] = A[max].Substring(0,k1) +s3;A[min] = A[min].Substring(0,k2) +s4;A[1] = A[1].Substring(0,k1) + s1;A[1] = A[1].Substring(0,k2) + s2;}}Console .WriteLine( " 最大值是 ={0}" , t1);}}}输出以下:结论:由图可知每次循环结果不独一。
遗传算法求解函数最大值
遗传算法求解函数最大值研究者们广泛使用各种数学方法来求解函数的最大值,其中遗传算法是一种有效的解决方案。
遗传算法是一种仿生算法,使用相似的进化过程来搜索函数的最大值,这种算法在解决复杂问题时尤其有效。
遗传算法的工作原理是利用遗传操作来进行搜索。
它的步骤大致如下:首先,从初始种群中随机选择一定数量的个体,并进行多次重复,对其属性进行多次迭代,形成较优个体。
然后,根据结果,重建种群,以提高适应度。
在这个过程中,种群中的属性将不断改变,个体之间会遗传和变异,从而改变函数的最大值。
当属性变化趋于稳定时,这种改变的步骤就会停止,最大值就得到了。
为了更好地理解遗传算法,我们先来看一个例子。
一维函数f(x)=x^2-2x+5可以用遗传算法来求最大值。
我们以染色体序列长度为10作为种群大小,创建初始种群,并在每一代经历重复,变异,选择和交叉过程之后,依次获得较优个体。
在这个过程中,染色体序列不断变异,最后形成二进制数f(x)的最大值,最终求得f(x)的最大值为9。
遗传算法具有很多优点,其中最重要的是,它可以解决最优化问题,而且能够在有限的时间里达到不错的效果。
此外,遗传算法不会受到维度或者变量数量的限制,而且它可以根据需要改变变量的组合,从而获得更好的运算结果。
最后,遗传算法也可以应用在实际工程中,这就是遗传算法求解函数最大值的重要应用之一。
总的来说,遗传算法是一种通用的解决方案,能有效地搜索函数的最大值。
虽然它具有很多优点,但也有一些限制。
例如,算法的效率跟种群的大小有关,种群大小越大,搜索效率就越低,而且有时它也会陷入局部最优解中,从而无法搜索到全局最优解。
遗传算法可以给出不错的搜索结果,可以有效地求解函数最大值,是一种普遍应用的有效搜索方法。
因此,在未来,它将继续受到研究者们的广泛关注,并为世人带来更多的益处。
实验五:遗传算法求解函数最值问题实验
实验五:遗传算法求解函数最值问题实验一、实验目的使用遗传算法求解函数在及y的最大值。
二、实验内容使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。
算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。
定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。
设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。
然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。
1.选择操作首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。
但实验时发现结果不好,经过仔细研究之后发现,这里在x、y 取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。
对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。
实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。
2.交叉操作首先是根据交叉概率probCross选择要交叉的个体进行交叉。
这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。
3.变异操作首先是根据变异概率probMutation选择要变异的个体。
变异时先随机生成变异的位置,然后把改位的01值翻转。
遗传算法求解函数最大值
用遗传算法通过复制交叉过程循环求解函数f(x)=x^2在[0,31]区间上的最大值点x。
代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Project2{class Class1{public int ff(int a){return a * a;}public int Max(int[] args){int s = 0;int m = args[0];for (int i = 0; i < args.Length; i++){if (m < args[i]){m = args[i];s = i;}}return s;}public int Min(int[] args){int s = 0;int m = args[0];for (int i = 0; i < args.Length; i++){if (m > args[i]){m = args[i];s = i;}}return s;}static void Main(String[] args){string[] A = new string[4];A[0] = "01101";A[1] = "11000";A[2] = "01000";A[3] = "10011";Class1 cl = new Class1();Random a = new Random();int[] x = new int[4];//存储x值float[] C = new float[4];//存储每个适配值所占比例int[] B = new int[4];//存储x对应的y值int k1 = 0;//交叉时所需的随机整数范围在0-4之间int k2 = 0;//交叉时所需的随机整数范围在0-4之间int max = 0;//适配值总最大的值在x中的下标int sum = 0;//所有适配值对应的函数值的总和int min = 0;//适配值总最小的值在x中的下标int t1 = 0;//初始最大值int ave1 = 0;//初始平均值int t2 = 0;//每次循环得出的最大值int ave2 = 0;//每次循环得出的平均值int smax = 20;//循环最大次数for (int l = 1; l < smax; l++){for (int i = 0; i < 4; i++){x[i] = Convert.ToInt32(A[i],2);//x[i] = Int32.Parse(A[i]);//怎么把二进制数转化为十进制数}for (int i = 0; i < 4; i++){B[i] = cl.ff(x[i]);//求出f(x)=x^2的值存入B中sum += B[i];}for (int i = 0; i < 4; i++){C[i] = B[i] / sum;}max =cl.Max(x);min = cl.Min(x);t2 = x[max];//用来记录每次循环的最大值ave2 = sum / 4;//用来记录每次循环的平均值if (t2 < t1 && ave2 < ave1){break;}else{t1 = t2;ave1 = ave2;}for (int i = 0; i < 4; i++) //输出每次循环的结果{System.Console.Write(x[i]);//System.Console.Write(' ');}System.Console.Write("\n");//换行A[min] = A[max];//适配值较小的被淘汰,由最大的取代k1 = a.Next(1,4);//从1-4之间选一个随机数k2 =a.Next(1,4);if (max + min != 3){string s1 = A[max].Substring(k1);//从第k个数开始获得后面的子串string s2 = A[min].Substring(k2);string s3 = A[3 - max].Substring(k1);string s4 = A[3 - min].Substring(k2);A[max] = A[max].Substring(0, k1) + s3;A[min] = A[min].Substring(0, k2) + s4;A[3 - max] = A[3 - max].Substring(0,k1) + s1;A[3 - min] = A[3 - min].Substring(0,k2) + s2;}elseif ((max > min) && (min + 1 == max))//max=2 min=1 {string s1 = A[max].Substring(k1);//从第k个数开始获得后面的子串string s2 = A[min].Substring(k2);string s3 = A[3].Substring(k1);string s4 = A[0].Substring(k2);A[max] = A[max].Substring(0,k1) + s3;A[min] = A[min].Substring(0,k2) + s4;A[3] = A[3].Substring(0,k1) + s1;A[3] = A[3].Substring(0,k2) + s2;}elseif((max < min) && (min == max + 1))//max=1 min=2 {string s1 = A[max].Substring(k1);//从第k 个数开始获得后面的子串string s2 = A[min].Substring(k2);string s3 = A[0].Substring(k1);string s4 = A[3].Substring(k2);A[max] = A[max].Substring(0,k1) + s3;A[min] = A[min].Substring(0,k2) + s4;A[0] = A[0].Substring(0,k1) + s1;A[3] = A[3].Substring(0,k2) + s2;}elseif ((max > min) && (max ==min + 3))//max=3 min=0{string s1 = A[max].Substring(k1);//从第k个数开始获得后面的子串string s2 = A[min].Substring(k2);string s3 = A[2].Substring(k1);string s4 = A[1].Substring(k2);A[max] = A[max].Substring(0,k1) + s3; A[min] = A[min].Substring(0,k2) + s4; A[2] = A[2].Substring(0,k1) + s1;A[1] = A[1].Substring(0,k2) + s2;}elseif ((max < min) && ( min==max +3 ))//max=0 min=3{string s1 =A[max].Substring(k1);//从第k个数开始获得后面的子串string s2 = A[min].Substring(k2);string s3 = A[1].Substring(k1);string s4 = A[2].Substring(k2); A[max] = A[max].Substring(0,k1) + s3;A[min] = A[min].Substring(0,k2) + s4;A[1] = A[1].Substring(0,k1) + s1;A[1] = A[1].Substring(0,k2) + s2; }}Console.WriteLine("最大值是={0}", t1);}}}输出如下:结论:由图可知每次循环结果不唯一。
[精品]遗传算法求f(x)=x10sin(5x)7cos(4x)的最大值
【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08【程序清单】%编写目标函数function[sol,eval]=fitness(sol,options)x=sol(1);eval=x+10*sin(5*x)+7*cos(4*x);%把上述函数存储为fitness.m文件并放在工作目录下initPop=initializega(10,[0 9],'fitness');%生成初始种群,大小为10[x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',...[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遗传迭代运算借过为:x =7.8562 24.8553(当x为7.8562时,f(x)取最大值24.8553)注:遗传算法一般用来取得近似最优解,而不是最优解。
遗传算法实例2【问题】在-5<=Xi<=5,i=1,2区间内,求解f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.7128 2的最小值。
【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3【程序清单】%源函数的matlab代码function [eval]=f(sol)numv=size(sol,2);x=sol(1:numv);eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282;%适应度函数的matlab代码function [sol,eval]=fitness(sol,options)numv=size(sol,2)-1;x=sol(1:numv);eval=f(x);eval=-eval;%遗传算法的matlab代码bounds=ones(2,1)*[-5 5];[p,endPop,bestSols,trace]=ga(bounds,'fitness')注:前两个文件存储为m文件并放在工作目录下,运行结果为p =0.0000 -0.0000 0.0055大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。
(完整版)遗传算法求解函数最大值(matlab)
遗传算法求解函数F(x1,x2)=100*(x1^2-x2)^2+(1-x1)^2;的最大值(MATLAB)%Generic Algorithm for function f(x1,x2) optimum (最大值)clear all;close all;%ParametersSize=80;G=100;CodeL=10;umax=2.048;umin=-2.048;E=round(rand(Size,2*CodeL)); %Initial Code%Main Programfor k=1:1:Gtime(k)=k;for s=1:1:Sizem=E(s,:);y1=0;y2=0;%Uncodingm1=m(1:1:CodeL);for i=1:1:CodeLy1=y1+m1(i)*2^(i-1);endx1=(umax-umin)*y1/1023+umin;m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1);endx2=(umax-umin)*y2/1023+umin;F(s)=100*(x1^2-x2)^2+(1-x1)^2;endJi=1./(F+1);%****** Step 1 : Evaluate BestJ ******BestJ(k)=min(Ji);fi=F; %Fitness Function[Oderfi,Indexfi]=sort(fi); %Arranging fi small to biggerBestfi=Oderfi(Size); %Let Bestfi=max(fi)BestS=E(Indexfi(Size),:); %Let BestS=E(m), m is the Indexfi belong to max(fi)bfi(k)=Bestfi;%****** Step 2 : Select and Reproduct Operation******fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size;fi_S=floor(fi_Size); %Selecting Bigger fi value (取整)kk=1;for i=1:1:Sizefor j=1:1:fi_S(i) %Select and ReproduceTempE(kk,:)=E(Indexfi(i),:);kk=kk+1; %kk is used to reproduceendend%************ Step 3 : Crossover Operation ************pc=0.60;n=ceil(20*rand);for i=1:2:(Size-1)temp=rand;if pc>temp %Crossover Conditionfor j=n:1:20TempE(i,j)=E(i+1,j);TempE(i+1,j)=E(i,j);endendendTempE(Size,:)=BestS;E=TempE;%************ Step 4: Mutation Operation **************%pm=0.001;%pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm%pm=0.0; %No mutationpm=0.1; %Big mutationfor i=1:1:Sizefor j=1:1:2*CodeLtemp=rand;if pm>temp %Mutation Conditionif TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendend%Guarantee TempPop(30,:) is the code belong to the best individual(max(fi)) TempE(Size,:)=BestS;E=TempE;endMax_Value=BestfiBestSx1x2figure(1);plot(time,BestJ);xlabel('Times');ylabel('Best J');figure(2);plot(time,bfi);xlabel('times');ylabel('Best F');轐行绒果Map_Falue =3.9059e+ 03BestS =0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Р0ɸ1 =-2&0480x2 =-2.0080。
遗传算法求解函数最大值
499,34.295500976, 34.295500976, 0.000000664
500,34.295500976, 34.295500976, 0.000000664
Simulation completed
var(0) = 4.654000000
广西大学机械学院人工智能课程设计
人工智能
遗传算法函数优化
第1页
广西大学机械学院人工智能课程设计
1引言............................................................................. 3
1.1摘要...........................................................................................................................................3
FILE *output;
struct genotype
第7页
广西大学机械学院人工智能课程设计
{
doublegene[NVARS];
double fitness;
doubleupper[NVARS];
doublelower[NVARS];
double rfitness;
double cfitness;
字pos表示杂交点的位置。
6)算子变异。在一位一位基础上执行。变异概率pm = 0.01,所以我们预计平均将
有1%的位经历变异。整个群体共有m*pop_size=660位,可以预计平均每代有6.6
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用遗传算法求解函数最大值
题目
使用遗传算法求解函数
f(x,y)=x∗sin(6∗y)+y∗cos(8∗x)
在x∈[1,2]及y∈[1,2]的最大值。
解答
算法
使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。
算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。
定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。
设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。
然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。
一选择操作
首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。
但实验时发现结果不好,经过仔细研究之后发现,这里在x、y取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。
对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。
实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。
二交叉操作
首先是根据交叉概率probCross选择要交叉的个体进行交叉。
这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。
三变异操作
首先是根据变异概率probMutation选择要变异的个体。
变异时先随机生成变异的位置,然后把改位的01值翻转。
经过一定的进化之后得到最终种群,从中选择最优的个体即可得到最终的结果。
运行结果
借助matlab软件,我们可以知道该函数在该定义域下的图像为:
以下设置不同的参数值进行对比试验:
表1 不同参数的对比实验
以上我们主要对种群规模N,个体染色体长度len,迭代次数maxGeneration进行比较。
可以看出,随着种群规模的增大,染色体长度的增长,迭代次数的增加,算法得到的结果越来越精确。
当参数规模达到一定程度时,再增加参数的值会明显地增加程序运行时间,但却不一定能明显改善解的质量,反而可能因为一些随机因数而产生质量更差的解,如第6组实验一所示。
同时也大概比较了一下多点交叉的交叉点个数crossnum,交叉概率probCross,变异概率probMutate等参数,由于参数太多,这里没有一一进行控制变量的比较。
大致估算可知,交叉概率及交叉点的个数影响交叉操作产生新个体的质量,过多的交叉及变化过大的交叉可能会产生不好的结果,而过多的变异也应该会造成算法的不稳定。
下面给出以上几个实验结果的实验截图,其中到现在为止结果最好的一个为:
其余若干个为:
算法改进
以上实验得到的最好结果仍然是差强人意,这里对算法做一个小的优化,即添加防止种群退化的操作。
记录当前位置所得到的最优值及对应的个体,每次更新种群之后,计算新种群的最优值,如果最优值变差了,则把之前较优的个体替换进新种群,防止种群退化;否则。