多作业多进程给定方案最大工作时间计算(修正版 机器阻塞版)

华电北风吹

天津大学认知计算与应用重点实验室

日期: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;


你可能感兴趣的:(function,计算机)