clc
clear
%=========数据录入,参数调整=================
swarminitNum=20;%初始生成的粒子数;
MM=[1 2 3 4 5 6
6 6 6 6 6 6];%工件、工序数量矩阵,MM第一行表示工件,第二行表示每个工件的工序数;
machineNum=6; %加工机器数;
initT=1000; %模拟退火初始温度;
gen=500; %循环迭代数;
w1=0.35; %变异率;
changeNum=3; %变异变换对数;
restrictmatrixM=[3 1 2 4 6 5
2 3 5 6 1 4
3 4 6 1 2 5
2 1 3 4 5 6
3 2 5 6 1 4
2 4 6 1 5 3];%job-shop机器约束矩阵;
restrictmatrixT=[1 3 6 7 3 6
8 5 10 10 10 4
5 4 8 9 1 7
5 5 5 3 8 9
9 3 5 4 3 1
3 3 9 10 4 1];%job-shop时间约束矩阵;
%===============PSO算法==========================
swarminit=cell(1,swarminitNum);
swarminitLong=sum(MM(2,:)); %所有工序数即粒子长度;
for i=1:swarminitNum,
swarminit{i}=randomparticle(MM) ;
end %随机生成初始粒子群体
[popu,s] = size(swarminit);
trace = ones(1,gen);
trace(1) = 10000; % 初始全局最佳适应度设为足够大
for i = 1:s,
bestfit(i) = 10000; % 初始个体历史最佳适应度设为足够大
end
bestpar = swarminit; % 个体历史最佳粒子初始化
for u=1:swarminitNum,
fitlist=[0];
end
T=initT;
for step = 1:gen,
for q=1:swarminitNum,
fitlist(q)=timedecode(swarminit{q},restrictmatrixM,restrictmatrixT,machineNum) ;
end % 计算当前粒子群每个粒子的适应度
[minval,sub] = min(fitlist); % 求得这代粒子的适应度最小值及其下标
if(trace(step) > minval) ,
trace(step) = minval;
bestparticle = swarminit{sub};
end
if(step~= gen) ,
trace(step + 1) = trace(step); % 全局最佳适应度及最佳粒子调整
end
T=0.97*T;
for i = 1:s,
tt=fitlist(i)-bestfit(i);
if(tt<0)|(min(1,exp(-tt/T))>=rand(1,1));
bestfit(i) = fitlist(i);
bestpar{i} = swarminit{i};
end
end % 个体历史最佳粒子及适应度调整 ;
for j = 1:s,
if rand(1,1)<w1,
bestparticle1=bianyi(bestparticle,changeNum,swarminitLong);
else
bestparticle1=bestparticle;
end %粒子变异;
l1=1000;
l2=1;
l3=1000;
l4=1;
while (l1-l2)>swarminitLong,
m=fix(swarminitLong*rand(1,1));
n=fix(swarminitLong*rand(1,1));
l1=max(m,n)+1;
l2=min(m,n)+1;
end
while (l3-l4)>swarminitLong,
m1=fix(swarminitLong*rand(1,1));
n1=fix(swarminitLong*rand(1,1));
l3=max(m1,n1)+1;
l4=min(m1,n1)+1;
end
swarminit{j}=cross(bestpar{j},swarminit{j},l2,l1);
swarminit{j}=cross(bestparticle1,swarminit{j},l4,l3);%粒子交叉;
end
end
[a,b,c]=timedecode2(bestparticle,restrictmatrixM,restrictmatrixT,machineNum);
disp(['优化目标: 最小平均流动时间'])
disp(['粒子数:' int2str(swarminitNum) ' 循环代数:' int2str(gen)])
disp(['变异率:' num2str(w1) ' 变异变换对数:' int2str(changeNum)])
disp(['模拟退火初始值:' int2str(initT) ' 模拟退火终值:' int2str(T)])
disp(['迭代循环值:' int2str(trace)])
disp(['最小平均流动时间:' int2str(a) ' 最大完工时间:' int2str(b) ' 最小间隙时间:' int2str(c) ])
disp(['最优粒子' int2str(bestparticle)])
pause
gant(bestparticle,swarminitLong,restrictmatrixM,restrictmatrixT,b)
运用粒子群算法解决车间调度问题matlab
4星 · 超过85%的资源 需积分: 50 57 浏览量
2018-01-17
22:28:32
上传
评论 24
收藏 5KB RAR 举报
qq786201039
- 粉丝: 7
- 资源: 8