www.gusucode.com > 《matlab在数学建模中的应用》一书 所有的 源代码 > 第14章/P14-2/Ch17_gaph.m
%gagh.m 遗传算法主程序 clc %定义遗传算法参数 NIND=40; %个体数目(Number of individuals) MAXGEN=200; %最大遗传代数(Maximum number. of generations) NVAR=9; %变量的维数 PRECI=20; %变量的二进制位数(Precision of variables) GGAP=0.9; %代沟(Generation gap) trace=zeros(MAXGEN,2); %寻优结果的初始值 %建立区域描述器(Build field descriptor) vlb=0.5*[110 66 222 118 72 76 30 40 40]; vub=[69 44 155 79 50 42 17 25 22]; ub=[vlb;vub]; FieldD=[REP([PRECI],[1,NVAR]);ub;REP([1;0;1;1],[1,NVAR])]; Chrom=CRTBP(NIND,NVAR*PRECI); %创建初始种群(2进制) P=BS2RV(Chrom,FieldD); %初始种群的10进制化 gen=0; %代计数器 ObjV=objfunction(P);%计算初始种群个体的目标函数值 while gen<MAXGEN f=RANKING(-ObjV); %分配适应度值(Assign fitness values FitnV=fit(f,P); SelCh=SELECT('SUS',Chrom,FitnV,GGAP); %选择 SelCh=RECOMBIN('XOVSP',SelCh,0.7); %重组 SelCh=MUT(SelCh); %变异 P=BS2RV(SelCh,FieldD); ObjVSel=objfunction(P); [Chrom ObjV]=REINS(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代的新种群 P=BS2RV(Chrom,FieldD); gen=gen+1; %代计数器增加 trace(gen,1)=max(ObjV); %遗传算法性能跟踪 trace(gen,2)=sum(ObjV)/length(ObjV); end for i=1:NIND if ObjV(i)==max(ObjV) value=P(i,:); break end end objvalue=max(ObjV); plot(trace(:,1));hold on; plot(trace(:,2),'-.');grid; legend('解的变化','种群均值的变化') function z=fit(x,y) %适应度函数 %x--40组按目标值的大小预分配的适应度 %y--40组自变量向量(y1,y2...y9) for i=1:40 if abs(sum(y(i,:))-500)>5 x(i)=0.001*x(i); end end z=x; function y=objfunction(a) %遗传算法目标函数程序 %各科目各课程的均价 jsj=[25.8 25.5 28.0 26.0 24.7 25.6 27.0 22.9 25.9 24.5]; jg=[26.4 27.3 24.9 27.5 23.5 23.5 25.7 32.9 31.5 35.3]; sx=[21.0 20.2 24.8 19.6 18.6 23.3 13.1 18.4 22.5 25.7]; yy=[34.4 18.7 33.0 20.6 27.9 21.4 11.4 31.3 23.5 32.3]; lk=[14.7 18.8 26.6 16.7 13.4 14.8 17.5 24.2]; jn=[22.5 32.3 20.8 21.6 23.0 35.4]; hg=[20.0 23.6 25.6 28.0 18.9 26.7]; dl=[21.5 32.4 24.0 23.8 18.2 22.7]; hj=[37.5 22.2 20.7 22.7 24.3 32.2]; %各课程的书号个数百分比 w1=[0.159090909 0.161931818 0.039772727 0.048295455 0.048295455 0.153409091 0.122159091 0.048295455 0.147727273 0.071022727]; w2=[0.135678392 0.08040201 0.090452261 0.070351759 0.090452261 0.090452261 0.095477387 0.16080402 0.095477387 0.090452261]; w3=[0.044354839 0.173387097 0.239247312 0.036290323 0.120967742 0.143817204 0.059139785 0.024193548 0.102150538 0.056451613]; w4=[0.355971897 0.044496487 0.016393443 0.18969555 0.06088993 0.121779859 0.049180328 0.044496487 0.072599532 0.044496487]; w5=[0.065789474 0.149122807 0.105263158 0.157894737 0.074561404 0.140350877 0.157894737 0.149122807]; w6=[0.296482412 0.060301508 0.110552764 0.27638191 0.100502513 0.155778894]; w7=[0.076190476 0.152380952 0.2 0.123809524 0.123809524 0.323809524]; w8=[0.175 0.183333333 0.191666667 0.216666667 0.116666667 0.116666667]; w9=[0.174603175 0.238095238 0.222222222 0.214285714 0.087301587 0.063492063]; c1=[249.4166666 363.8375 118.3333333 238.4375 162.4166667 276.5818181 503.5486111 83.08333333 387.975 414.9375]; c2=[1425.5 1875.75 386.6666666 1106.208333 286.4166667 544.9166667 812.9375 575.2916666 2589.9375 1356.0625]; c3=[746.5416667 847.3785714 8609.903374 1297.5 1462.357843 2617.573864 628.4214286 498.8125 465.6760417 2863.553572]; c4=[747.8024039 525.45 907.9166667 268.5805555 447.8583334 274.1125 59.91666667 632.3875 347.4464286 301.8333333]; c5=[5297.5625 7532.660714 8622.2 4606.104167 16071.85416 7891.25 4104.633929 1241.875]; c6=[681.3461539 266.875 480.25 816.175 1204.683334 1000.75]; c7=[1038.75 863.95 406.975 162.9166667 782.0833333 427.4583333]; c8=[226.6666667 644.875 600.125 810.5 295.1666667 1543.666666]; c9=[593.1875 476.7916667 629.1666666 414.25 718.625 1460.75]; for k=1:length(a) s(1)=sum(a(k,1).*jsj.*w1.*c1); s(2)=sum(a(k,2).*jg.*w2.*c2); s(3)=sum(a(k,3).*sx.*w3.*c3); s(4)=sum(a(k,4).*yy.*w4.*c4); s(5)=sum(a(k,5).*lk.*w5.*c5); s(6)=sum(a(k,6).*jn.*w6.*c6); s(7)=sum(a(k,7).*hg.*w7.*c7); s(8)=sum(a(k,8).*dl.*w8.*c8); s(9)=sum(a(k,9).*hj.*w9.*c9); zc(k)=sum(s); end y=zc';