function [Pbest,maxtime,Lc1,Lc2]=JSPGA2(M,N,Pc,Pm,T,P)
Pbest=zeros(1,size(P,2));
Lc1=zeros(1,N);
Lc2=zeros(1,N);
farm=cell(1,M);
if mod(floor(M*Pc),2)==1
error('Exchange Rate illegal!');
end
for i=1:M
farm{i}=randperm(6);
end
counter=0;
while(counter<N)
newfarm=cell(1,floor(M*Pc));
%确定产生子代的亲代
%交叉概率为Pc
Fmp=randperm(M);
nochangenum=randperm(ceil(M*(1-Pc)));%保留没有发生交叉的亲代信息
unchange=Fmp(nochangenum);
Fmp(nochangenum)=[];
%没有交叉的亲代自动获得加入新一代种群的资格
%交叉产生子代
for i=1:size(Fmp,2)/2
Fa=farm{Fmp(2*i-1)};
Ma=farm{Fmp(2*i)};
pp=randperm(3);
a=pp(1);
Za=Fa;
Zb=Ma;
Za(2*a-1:2*a)=Ma(2*a-1:2*a);
Zb(2*a-1:2*a)=Fa(2*a-1:2*a);
[Za,Zb]=legalson(Fa,Ma,Za,Zb,a);%子代合法化处理
newfarm{2*i-1}=Za;
newfarm{2*i}=Zb;
end
%tempFarm=[farm,newfarm,farm{unchange}];
for i=1:M
tempFarm{i}=farm{i};
end
for i=M+1:2*M-size(unchange,2)
tempFarm{i}=newfarm{i-M};
end
for i=2*M-size(unchange,2)+1:2*M
tempFarm{i}=farm{unchange(2*M+1-i)};
end
%选择复制采取两两随机配对竞争的方式,具有保留最优个体的能力
FITNESS=zeros(1,2*M);
fitness=zeros(1,M);
for i=1:2*M
X=tempFarm{i};
FITNESS(i)=cost2(T,X);
end
Ser=randperm(2*M);
for i=1:M
f1=FITNESS(Ser(2*i-1));
f2=FITNESS(Ser(2*i));
if f1<=f2
farm{i}=tempFarm{Ser(2*i-1)};
fitness(i)=FITNESS(Ser(2*i-1));
else
farm{i}=tempFarm{Ser(2*i)};
fitness(i)=FITNESS(Ser(2*i));
end
end
%排序所有个体,保留最优的M个个体作为新的种群
%FITNESS=zeros(1,2*M);
%fitness=zeros(1,M);
%for i=1:2*M
%X=tempFarm{i};
%FITNESS(i)=cost2(T,X);
%end
%for i=1:2*M-1
%for j=i:2*M
%if FITNESS(i)>FITNESS(j)
%Z=tempFarm{i};
%tempFarm{i}=tempFarm{j};
%tempFarm{j}=Z;
%h=FITNESS(i);
%FITNESS(i)=FITNESS(j);
%FITNESS(j)=h;
%end
%end
%end
%for k=1:M
%farm{k}=tempFarm{k};
%fitness(k)=FITNESS(k);
%end
%新一代种群产生合法变异的个体
for i=1:M
if Pm>rand;
Y=farm{i};
Ix=randperm(6);
temp=Y(Ix(1));
Y(Ix(1))=Y(Ix(2));
Y(Ix(2))=temp;
farm{i}=Y;
end
end
%记录最佳个体和收敛曲线
minfitness=min(fitness);
meanfitness=mean(fitness);
Lc1(counter+1)=minfitness; %收敛曲线1,各代最优个体适应值的记录
Lc2(counter+1)=meanfitness; %收敛曲线2,各代群体平均适应值的记录
%计算最大需求时间并产生新的种群,保持种群数量不变,记录平均值和最佳值
pos=find(fitness==minfitness);
Pbest=farm{pos(1)};
counter=counter+1;%循环自增
end
%输出结果并绘图
figure(1);
[maxtime,Ts,Te]=cost2(T,Pbest);
DrawGante(Ts,Te,T,Pbest);
figure(2);
plot(1:N,Lc1);
figure(3);
plot(1:N,Lc2);