华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/8/22
本文代码对应论文
内蒙古大学学报(自然科学版),2014年1月,第45卷第1期
求解作业车间调度问题的混合粒子群算法
function fitness=fitnessfunc(planList)
% 计算一个方案的适应度
global workTime; % 机器工作时间
global machineList; %机器工作列表
global row; % 数据行数 工件个数
global col; % 数据列数 机器个数
%% 计算每个机器工作量
% machineTime=zeros(1,col);
% workID=zeros(row,1);
% for i=1:length(planList)
% k=planList(i); %工件序号
% workID(k)=workID(k)+1;
% p=machineList(k,workID(k)); %机器序号
% machineTime(p)=machineTime(p)+workTime(k,workID(k))+repairTime(k,workID(k));
% end
% fitness=max(machineTime);
%% 计算机器最长需要时间
workState=zeros(1,row);
workTimes=zeros(1,row);
machine(col)=struct('State',[],'workID',[]);
machineWorkTimeLeft=zeros(1,col);
machineOnTime=0; % 机器距离已经开始时间向量
for i=1:row
workState(i)=true; % 工件是否可被加工向量
workTimes(i)=0; % 工件已经加工次数向量
end
for i=1:col
machine(i).State=true; % 机器是否可用向量
machine(i).workID=0; % 机器加工的工件号
machineWorkTimeLeft(i)=inf; % 机器工作剩余时间向量
end
for i=1:length(planList)
stepvisited(i)=false;
end
%% 循环分配工件到可用机器
while judgeToStopFunc(workTimes)==false
for i=1:row % 工件是否可被加工向量
if workTimes(i)~=col
workState(i)=true; % 加工次数不够的工件可被加工
else
workState(i)=false; % 加工次数够的工件不可被加工
end
end
for j=1:col
if machine(i).workID>0 % 正在机器上加工的工件不可被加工
workState(machine(i).workID)=false;
end
end
for i=1:length(planList)
if stepvisited(i)==false
k=planList(i); %工件序号
p=machineList(k,workTimes(k)+1); %工件所需机器序号
if (workState(k)==true)&&(machine(p).State==true)
stepvisited(i)=true;
workTimes(k)=workTimes(k)+1;
machineWorkTimeLeft(p)=workTime(k,workTimes(k));
machine(p).workID=k;
end
machine(p).State=false;
workState(k)=false;
end
end
Ptime=min(machineWorkTimeLeft);
machineOnTime=machineOnTime+Ptime;
machineWorkTimeLeft=machineWorkTimeLeft-Ptime;
for i=1:col
if machineWorkTimeLeft(i)==0
machineWorkTimeLeft(i)=inf;
machine(i).State=true;
machine(i).workID=0;
end
if machine(i).workID==0
machine(i).State=true;
end
end
end
for i=1:col
if machineWorkTimeLeft(i)==inf
machineWorkTimeLeft(i)=0;
end
end
machineOnTime=machineOnTime+max(machineWorkTimeLeft);
fitness=machineOnTime;