data cvartotal;
set data1; /*data1包括yield,b,scale,pc,pm,stopnum的数据集;*/
m=dim(yield,1);
n=dim(yield,2);
/*1、产生随机种群规模;*/
do i=1 to n+1
ARRAY weights(i,scale)=RANNOR(seed);
ARRAY weight(i,scale)=RANNOR(seed);
end;
cvar1=50;
a=1;
/*2、随机产生的权重比例归一化 ; */
sum=SUM(weights);
do j=1to scale
do i=1to n
weights(i,j)=weights(i,j)/sum(1,j);
end
end
/* 3、计算适应度函数 ;*/
do j=1 to scale
do k=1 to m
do i=1 to n
mid(1,i)=weights(i,j);
end
mid1=-(mid*yield);
flag(1,k)=mid1(1,k)-weights(n+1,j);
if flag(1,k)<0 then flag(1,k)=0;
end
end
mid2=sum(flag);
oldcvar(1,j)=weights(1+n,j)+mid2/(m*(1-b));
end
/*4、循环开始*/
do while(a<stopnum);
/*5、选择算法:最优精英策略*/
maxV=oldcvar(,><);
column=oldcvar(,>:<);
maxV1=oldcvar(,<>);
column1=oldcvar(,<:>);
if(maxV>=cvar)
do i=1 to n+1
weights(i:column1)=weight(i:1);
// 如果本次迭代中得到的最优个体比历史最优个体更优, 把当前最优个体取代历史最优个体, 否则用历史最优个体取代本次迭代中的最差的个体。
end
end
cvar=maxV;
do i=1 to n+1
weight(i,1)=weights(i,column);
end
do i=1 to n+1
var=weights(n+1,i);
end
6、交叉 ;而 其中为 一个随机数。
a=RANNOR(seed);
exchange1=abs(RANNOR(1,2)*scale);
exchange2=abs(RANNOR(1,2)*(n+1));
if(r<pc) weights(exchange2(1,1),exchange1(1,1))=weights(exchange2(1,1),exchange1(1,1))*a+(1-a)*weights(exchange2(1,2),exchange1(1,2)); weights(exchange2(1,2),exchange1(1,2))=weights(exchange2(1,1),exchange1(1,1))*(1-a)+a*weights(exchange2(1,2),exchange1(1,2));
end
7、突变: .当前最优个体的微变异算子。采用选取当前种群中的“最优个体”和“次优个体”都进行微变异操作,即对个体中只选取一位基因进行上述变异操作,然后直接成为下一代个体;
r1=RANNOR(1,scale);
do i=1 to scale
if(r1(1,i)<pm)
pmRow=abs(RANNOR(seed)*(n+1));
weights(pmRow,i)=weights(pmRow,><))+r1(1,i)*weights(pmRow,<>);
end
end
sum=sum(weights);
do j=1to scale
do i=1 to n
weights(i,j)=weights(i,j)/sum(1,j);
end
end
do j=1 to scale
do k=1 to m
do i=1 to n
mid(1,i)=weights(i,j);
end
mid1=-(mid*yield);
flag(1,k)=mid1(1,k)-weights(n+1,j);
if(flag(1,k)<0)
flag(1,k)=0;
end
end
mid2=sum(flag);
oldcvar(1,j)=weights(1+n,j)+mid2(1,m)/(m*(1-b));
end
a=a+1;
end;
run;
请教大虾帮忙修改啊···谢谢啊··遗传算法求最优化····