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

来源:互联网 发布:怎样彻底清除手机数据 编辑:程序博客网 时间:2024/06/06 17:56

华电北风吹

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

日期: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;               % 工件已经加工次数向量endfor i=1:col    machine(i).State=true;       % 机器是否可用向量    machine(i).workID=0;         % 机器加工的工件号    machineWorkTimeLeft(i)=inf;  % 机器工作剩余时间向量endfor 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    endendfor i=1:col    if machineWorkTimeLeft(i)==inf        machineWorkTimeLeft(i)=0;    endendmachineOnTime=machineOnTime+max(machineWorkTimeLeft);fitness=machineOnTime;


0 0
原创粉丝点击