function fitness=getScheduling(taskNum,modeNum,resourceNum,predeCess,resourceNeeded,resource_limit,chromosom,popsize,inDeed,nresourceNum,nresource_limit)
%taskNum 任务数量 %resourceNum 可更新资源资源种类 nresourceNum 不可更新资源种类,predeCess 紧前约束关系矩阵 %resourceNeeded 各阶段资源需求量(两种)
%resource_limit可更新资源上限,nresource_limit不可更新资源上限,chromosome染色体(优先排序),popsize种群规模,inDeed入度向量,mode模式选择,modeNum模式数量
mode=zeros(popsize,taskNum);
schema=zeros(2,taskNum,popsize);
chromosome=zeros(popsize,taskNum);
fitness=zeros(1,popsize);
nonfeasible=ones(1,popsize); %不可更新资源可行标记,1=可行,0=不可行
rfeasible=ones(1,popsize); %可更新资源可行标记,1=可行,0=不可行
for i=1:popsize %把染色体分为2部分=模式+优先排序
mode(i,:)=chromosom(1,:,i); %=chromosome的模式
chromosome(i,:)=chromosom(2,:,i); %=chrosome的排序
end
%以下计算各模式的可行性
renewR=resourceNeeded(:,1:resourceNum); %多模式下可更新资源
nonrenewR=resourceNeeded(:,4:end); %多模式下不可更新资源
duration=resourceNeeded(:,3); %多模式下持续时间
resourceN=zeros(taskNum,resourceNum,popsize);%存储popsize个单个体的可更新资源
nresourceN=zeros(taskNum,resourceNum,popsize); %存储popsize个单个体的不可更新资源
sigleduration=zeros(taskNum,popsize); %存储popsize个个体的持续时间
%首先判断是否满足不可更新资源条件
for i=1:popsize %计算每个粒子固定模式下不可更新资源超限值
modea=mode(i,:);
[feasi,resourceNeed,nresourceNeed,sduration]=judgenonRenew(taskNum,resourceNum,renewR,nresourceNum,nonrenewR,nresource_limit,modea,modeNum,duration);
nonfeasible(i)=feasi;
resourceN(:,:,i)=resourceNeed;%存储popsize个单个体的可更新资源
nresourceN(:,:,i)=nresourceNeed; %存储popsize个单个体的不可更新资源
sigleduration(:,i)=sduration; %存储popsize个个体的持续时间
resourceNeedx(:,:,i)=[ resourceNeed sduration nresourceNeed];
end
resourceNeeda=zeros(taskNum,resourceNum+nresourceNum+1);
for i=1:popsize %计算每个粒子固定模式下可更新可行性
modea=mode(i,:);
feasi=judgeRenew(taskNum,renewR,modea,modeNum,resource_limit);
rfeasible(i)=feasi;
end
for x=1:popsize
if nonfeasible(x)==0 %不可更新资源不可行
fitness(x)=100;
continue;
elseif rfeasible(x)==0 %可更新资源不可行
fitness(x)=100;
continue;
else
resourceNeeda=resourceNeedx(:,:,x);
judgeIndeed=zeros(1,taskNum); %判断入度
start_time=zeros(2,taskNum); % have scheduled task 已调度任务集合(第一行)和开始时间初始化(第二行)
unSched=[]; % unschedulued task 当前任务未被调度的紧后任务集合
start_time(:,1)=[1;0]; %the first task1已调度且开始时间=0
for jd=2:taskNum % schedule other task 调度其他活动2~taskNum jd=进度
for i=start_time(1,jd-1)+1:taskNum % 判断当前任务的紧后任务
if predeCess(start_time(1,jd-1),i)==1
% predeCess(start_time(1,jd-1),j)=邻接矩阵中当前任务的紧后任务存在,是1。
judgeIndeed(i)=judgeIndeed(i)+1;% in degree +1 入度
end
end
kd=[start_time(1,1:jd-1) unSched]; %tasks 可调度任务
for j=2:taskNum
if judgeIndeed(j)==inDeed(j)
a=ismember(j,kd); % judge a task is not allowed to the scheduled task 判断某任务不属于已完成任务调度集合
if a==0
unSched=[unSched j]; %update the unscheduled task set 候选任务集合更新
end
end
end
max_unSched=chromosome(x,unSched(1)); %调度第x个染色体
b=unSched(1);
for j=2:length(unSched)
if chromosome(x,unSched(j))<max_unSched % schedule the task with its max_value 调度值最小的任务
max_unSched=chromosome(x,unSched(j));
b=unSched(j); % record the number of the task 记录任务编号
end
end
predeTask=[]; % initiate the predecessor tasks 初始化紧前任务
for j=1:b-1
if predeCess(j,b)==1;
predeTask=[predeTask j];% update the predecessor tasks. 更新紧前任务
end
end
minStarttime=0;
for j=1:length(predeTask) % start time 开始时间下限
for i=1:jd-1
if start_time(1,i)==predeTask(j)
st=start_time(2,i)+resourceNeeda(predeTask(j),resourceNum+1);
if st>minStarttime
minStarttime=st;
end
break;
end
end
end
minStarttime=sumStarttime(minStarttime,resource_limit,resourceNeeda,start_time,jd,b,resourceNum); %判断是否满足资源约束,并返回活动b的最早开始时间。
start_time(:,jd)=[b;minStarttime]; %start_time的活动b,最早开始时间为minStarttime
unSched(unSched==b)=[]; % delete the caculated task 删除已计算任务
end %end of jd
% startTime(1,:,x)= start_time(1,:); %第x个调度方案的各任务开始时间。
% startTime(2,:,x)= start_time(2,:);
schema(:,:,x)=start_time;
fitness(x)=start_time(2,taskNum); %记录第x个调度方案的makespan值
end %if
end %end of x
% duration1=sigleduration';
% for k1=1:popsize
% resourceCal=resourceN(:,:,k1);
% if feasible(k1)==0 %不可更新资源不可行
% continue;
% else %不可更新资源可行
% judgeIndeed=zeros(1,taskNum); %入度空间初始化
% start_time=zeros(2,taskNum); % 已调度任务(第一行)和开始时间(第二行)
% unSched=[]; % 当前任务未被调度的紧后任务集合
% start_time(:,1)=[1;0]; % 第1活动已调度且开始时间=0
% for jd=2:taskNum % 调度其他活动2~taskNum jd=进度
% for i=1:taskNum % 判断当前任务的紧后任务
% if predeCess(start_time(1,jd-1),i)==1
% % predeCess(start_time(1,jd-1),j)=邻接矩阵中当前任务的紧后任务存在,是1。
% judgeIndeed(i)=judgeIndeed(i)+ predeCess(start_time(1,jd-1),i);%
% end
% end
% kd=[start_time(1,1:jd-1) unSched]; %tasks 可调度任务
% for j=2:taskNum
% if inDeed(j)==judgeIndeed(j) %紧前活动数量=累计紧后活动数量 ,判断是否j活动已成为活活动的指标
% a=ismember(j,kd); % judge a task is not allowed to the scheduled task 判断j任务是否已成可调度表中的活动
% if a==0 %若a=1表明一再可调度列表中,否则加入到可调度列表中。
% unSched=[unSched j]; %update the unscheduled task set 候选任务集合更新
% end
% end
% end
% max_unSched=chromosome(k1,unSched(1)); %调度第x个染色体
% b=unSched(1);
% for j=2:length(unSched)
% if chromosome(k1,unSched(j))<max_unSched % schedule the task with its max_value 调度值最小的任务
% max_unSched=chromosome(k1,unSched(j));
% b=unSched(j); % record the number of the task 记录任务编号
% end
% end
% predeTask=[];
% for j=1:b-1 %找到当前活动的所有紧前活动
% if predeCess(j,b)==1;
% predeTask=[predeTask j];
% end
% end
% minStarttime=0; %当前活动最早开始时间<=其所有紧前活动的最迟结束时间
% for j=1:length(predeTask)
% for i=1:jd-1
%
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
2MHs.rar (25个子文件)
job.xlsx 1.19MB
ACS-MRCPSP350
ACS_MRCPSP350.m 6KB
initialData.mat 600B
zygx.m 584B
getScheduling.m 3KB
DrawRoute.m 340B
judgenonRenew.m 1KB
judgeOrder.m 1KB
judgeRenew.m 319B
testFileLoad.m 2KB
getSchedulingNew.m 3KB
sumStarttime.m 882B
ABC-MRCPSP350
SelectionOperator.m 857B
initialData.mat 840B
zygx.m 584B
getScheduling.m 9KB
ABC_MRCPSP350.m 4KB
ABC_MRCPSP.m 4KB
forcerow.m 181B
GenerateInitialPopulation.m 613B
judgenonRenew.m 1KB
judgeRenew.m 450B
GreedySelection.m 978B
testFileLoad.m 3KB
sumStarttime.m 577B
共 25 条
- 1
资源评论
- Skuukzky丶2022-11-14代码可读性太差
z_1966
- 粉丝: 55
- 资源: 118
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功