clc
clear
global tau num_jq num_gongxu num_gongjian
num_jq=6;
num_gongjian=4;
num_gongxu=[3,3,3,3];
tau=[2,3,4,0,0,0;
0,3,0,2,4,0;
1,4,5,0,0,0;
3,0,5,0,2,0;
4,3,0,0,6,0;
0,0,4,0,7,11;
5,6,0,0,0,0;
0,4,0,3,5,0;
0,0,13,0,9,12;
9,0,7,9,0,0;
0,6,0,4,0,5;
1,0,3,0,0,3];
popsize= 40;
maxgen =10;
proc = 0.85;
pmut = 0.012;
pop1=zeros(popsize,sum(num_gongxu));
pop2=zeros(popsize,sum(num_gongxu));
tic;
for i=1:popsize
pop_lin=[];
for j=1:num_gongjian
pop_lin=[pop_lin,j*ones(1,num_gongxu(j))];
end
[~,index]=sort(randperm(length(pop_lin)));
pop1(i,:)=pop_lin(index);
pop2(i,:)=randi(num_jq,1,length(pop_lin));
pop2(i,:)=chuli(pop1(i,:),pop2(i,:));
end
fissness=1000*ones(1,maxgen);
x1_best=pop1(1,:);
x2_best=pop2(1,:);
for gen=1:maxgen
gen
for i=1:popsize
fitness(i)=diaodu_fun(pop1(i,:),pop2(i,:));
end
[min_fissness,loation]=min(fitness);
if min_fissness<min(fissness)
fissness(gen)=min_fissness;
x1_best=pop1(loation(1),:);
x2_best=pop2(loation(1),:);
else
fissness(gen)=fissness(gen-1);
end
fmax=max(fitness);
fs=popsize*fmax-sum(fitness);
fit=(fmax-fitness)/fs;%求个体的适应度
q=zeros(1,popsize);
q(1)=fit(1);
for i=2:popsize
q(i)=q(i-1)+fit(i);%累加个体适应度形成赌轮
end
[pop1,pop2]=select(pop1,pop2,q,popsize);%保留优质个体
for i=1:popsize/2
if proc>rand()
pop11=pop1(i,:);pop12=pop1(i+popsize/2,:);
pop21=pop2(i,:);pop22=pop2(i+popsize/2,:);
[pop11,pop12]=intercross(pop11,pop12,1);%交叉
[pop21,pop22]=intercross(pop21,pop22,0);
pop21=chuli(pop11,pop21);
pop22=chuli(pop12,pop22);
pop1(i,:)=pop11;pop1(i+popsize/2,:)=pop12;
pop2(i,:)=pop21;pop2(i+popsize/2,:)=pop22;
end
end
[pop1,pop2]=mutation(pop1,pop2,pmut);%变异
for i=1:popsize
pop2(i,:)=chuli(pop1(i,:),pop2(i,:));
end
end
minf=fissness(gen);
for i=1:popsize
fval=diaodu_fun(pop1(i,:),pop2(i,:)); %求个体的函数值
if fval<minf %最优点及最优值得到最终种群中的
minf=fval;
x1_best=pop1(i,:);
x2_best=pop2(i,:);
end
end
run_time=toc;
table=re_fun(x1_best,x2_best);
disp(['第',num2str(maxgen),'代繁殖完毕后,种群挑选出的染色体为:']);
disp(x1_best);
disp(x2_best);
%disp(table);
disp('各台机器的调度情况为:');
s1=[];s2=[];s3=[];s4=[];s5=[];s6=[];
for i=1:12
if x2_best(i)==1
s1=strcat(s1,num2str(x1_best(i)));
s1=strcat(s1,num2str(table(1,i)));
s1=strcat(s1,'<');
s1=strcat(s1,num2str(table(2,table(4,i))));
s1=strcat(s1,'--');
s1=strcat(s1,num2str(table(3,table(4,i))));
s1=strcat(s1,'> .');
end
if x2_best(i)==2
s2=strcat(s2,num2str(x1_best(i)));
s2=strcat(s2,num2str(table(1,i)));
s2=strcat(s2,'<');
s2=strcat(s2,num2str(table(2,table(4,i))));
s2=strcat(s2,'--');
s2=strcat(s2,num2str(table(3,table(4,i))));
s2=strcat(s2,'> .');
end
if x2_best(i)==3
s3=strcat(s3,num2str(x1_best(i)));
s3=strcat(s3,num2str(table(1,i)));
s3=strcat(s3,'<');
s3=strcat(s3,num2str(table(2,table(4,i))));
s3=strcat(s3,'--');
s3=strcat(s3,num2str(table(3,table(4,i))));
s3=strcat(s3,'> .');
end
if x2_best(i)==4
s4=strcat(s4,num2str(x1_best(i)));
s4=strcat(s4,num2str(table(1,i)));
s4=strcat(s4,'<');
s4=strcat(s4,num2str(table(2,table(4,i))));
s4=strcat(s4,'--');
s4=strcat(s4,num2str(table(3,table(4,i))));
s4=strcat(s4,'> .');
end
if x2_best(i)==5
s5=strcat(s5,num2str(x1_best(i)));
s5=strcat(s5,num2str(table(1,i)));
s5=strcat(s5,'<');
s5=strcat(s5,num2str(table(2,table(4,i))));
s5=strcat(s5,'--');
s5=strcat(s5,num2str(table(3,table(4,i))));
s5=strcat(s5,'> .');
end
if x2_best(i)==6
s6=strcat(s6,num2str(x1_best(i)));
s6=strcat(s6,num2str(table(1,i)));
s6=strcat(s6,'<');
s6=strcat(s6,num2str(table(2,table(4,i))));
s6=strcat(s6,'--');
s6=strcat(s6,num2str(table(3,table(4,i))));
s6=strcat(s6,'> .');
end
end
disp(['机器1: ',s1]);
disp(['机器2: ',s2]);
disp(['机器3: ',s3]);
disp(['机器4: ',s4]);
disp(['机器5: ',s5]);
disp(['机器6: ',s6]);
disp(['第',num2str(maxgen),'代繁殖完毕,所用时间为',num2str(run_time),'秒']);
plot(fissness)
title('进化曲线');
xlabel('迭代次数');
ylabel('最优值');
figure(1)
axis([0,20,0,6.9]);%x轴 y轴的范围
set(gca,'xtick',0:2:56) ;%x轴的增长幅度
set(gca,'ytick',0:1:6.5) ;%y轴的增长幅度
xlabel('加工时间'),ylabel('机器号');%x轴 y轴的名称
title(['柔性车间作业的最佳调度(最短完工时间为:',num2str(minf),')']);%图形的标题
n_bay_nb=6;%total bays //机器数目
n_task_nb = 12;%total tasks //任务数目
table1=table(2:3,table(4,:));
table2=table1(2,:)-table1(1,:);
%x轴 对应于画图位置的起始坐标x
n_start_time=table1(1,:);%start time of every task //每个工序的开始时间
%length 对应于每个图形在x轴方向的长度
n_duration_time =table2;%duration time of every task //每个工序的持续时间
%y轴 对应于画图位置的起始坐标y
n_bay_start=x2_best; %bay id of every task ==工序数目,即在哪一行画线
%工序号,可以根据工序号选择使用哪一种颜色
n_job_id=x2_best;%
rec=[0,0,0,0];%temp data space for every rectangle
for i =1:n_task_nb
rec(1) = n_start_time(i);%矩形的横坐标
rec(2) = n_bay_start(i)-0.3; %矩形的纵坐标
rec(3) = n_duration_time(i); %矩形的x轴方向的长度
rec(4) = 0.6;
txt=sprintf('%d-%d',x1_best(i),table(1,i));%将机器号,工序号,加工时间连城字符串
rectangle('Position',rec,'LineWidth',0.5,'LineStyle','-');%draw every rectangle
text(n_start_time(i)+0.2,n_bay_start(i),txt);%label the id of every task ,字体的坐标和其它特性
text(n_start_time(i)+n_duration_time(i)+0.1,n_bay_start(i)+0.5,num2str(table1(2,i)));
end
%% QQ115075524