山西太原做网站,欧米茄表价格官网报价,php医院网站开发兼职,广东建设项目备案公示网站问题背景#xff1a; 问题四#xff1a;根据实际情况#xff0c;现需要扩大生产规模#xff0c;将生产线每天的运行时间从 8 小时增加 到 24 小时不间断生产#xff0c;考虑生产线与操作人员的搭配#xff0c;制定最佳的操作人员排班方案#xff0c;要求满足以下条件 问题四根据实际情况现需要扩大生产规模将生产线每天的运行时间从 8 小时增加 到 24 小时不间断生产考虑生产线与操作人员的搭配制定最佳的操作人员排班方案要求满足以下条件(1) 各操作人员做五休二尽量连休 2 天 (2) 各操作人员每班连续工作 8 小时 (3) 班次时间早班8:00-16:00、中班16:00-24:00、晚班0:00-8:00 (4) 各工龄操作人员的人数比例与问题 3 中的比例相同 (5) 各操作人员的班次安排尽量均衡。 已知问题三中原本每条生产线与相应操作人员对应如下 问题分析 问题四为优化问题考虑使用遗传算法根据附件三给出的生产线与操作人员信息无法将生产线与操作人员剥离开而单独讨论某条生产线或者某位操作人员的工作能力指标。因此在本题中固定生产线与相应工龄操作人员的搭配即从理论上固定生产效率。那么本题仅为优化问题中的排班问题考虑如下约束条件
1.每天10条线24小时工作
2.一位操作人员每天工作8小时
3.夜班之后必须至少休一天考虑现实情况添加
4.各操作人员上五休二尽量连休
5.各操作人员班次尽量均匀。 其中为了生产线的正常运行与操作人员身体健康1-3为硬性约束4-5为软约束以此建立遗传算法优化模型希望得到合理的排班表。考虑到24小时生产线不间断运营并且要保证操作人员工龄比例与附件三相同至少需要5组生产线操作人员即50人约定员工与产线有如下对应关系 遗传算法排班 使用遗传算法进行排班首先需要确定染色体的编码这里每条染色体代表一个排班表染色体中每两位二进制编码表示一种班型对于一周7天每天有操作人员50人一条染色体由7×50条操作人员基因组成每一个操作人员基因又由2位的班型基因二进制编码构成因此一条染色体由7×50×2位编码的基因组成。
pop 50; %设定初始种群数量
length 700; %种群基因编码长度,一周七天每天50个排班人员总共3种班型用2位二进制编码表示
gen 500; %迭代次数
crossover_probablity 0.9; %交叉概率 %交叉概率一般在0.6~0.9之间
variation_probablity 0.1; %变异概率 %
initial_pop round(rand(pop,length)); %生成初始种群%算法迭代m次
for m1:gen%将每一代 染色体长度为700位的二进制种群 转化为50*7的矩阵50人一周7天x zeros(50,7,pop);for i 1:size(initial_pop,1) %分别遍历排班表for j 1:7 %遍历一周七天for k 1:50 %遍历50个排班人员for l 1:2 %二进制班型转换为十进制x(k,j,i) initial_pop ( i,100*(j-1)2*(k-1)l ) * 2^(2-l) x(k,j,i); % 100是人数50×排班编码数2endend end%%%%%确定每天每个班次不超过十人上班若超过10人按工龄比例随机保留10名员%%%%%工上班其他人放假且各工龄比例如题三for j1:7for f 0:2if sum(x(1:10,j,i)f)2 % 工龄1人数大于2w find(x(1:10,j,i)f); % 获取上班的人索引n_geshu size(w,1);ran_index randperm(n_geshu); % 生成随机索引 n_de n_geshu - 2; % 要改为休假的员工人数de_index ran_index(1:n_de); dey_index w(de_index,:); % 随机抽取放假人员索引x(dey_index,j,i) 3; endif sum(x(11:20,j,i)f)2 % 工龄2人数大于2w find(x(11:20,j,i)f); n_geshu size(w,1);ran_index randperm(n_geshu); % 随机索引 n_de n_geshu - 2; de_index ran_index(1:n_de);dey_index w(de_index,:);x(dey_index10,j,i) 3; endif sum(x(21:25,j,i)f)1 % 工龄3人数大于2w find(x(21:25,j,i)f); n_geshu size(w,1);ran_index randperm(n_geshu); % 随机索引 n_de n_geshu - 1; de_index ran_index(1:n_de);dey_index w(de_index,:);x(dey_index20,j,i) 3; endif sum(x(26:35,j,i)f)2 % 工龄4人数大于2w find(x(26:35,j,i)f); % 人索引n_geshu size(w,1);ran_index randperm(n_geshu); % 随机索引 n_de n_geshu - 2; % 要取消的工作人数de_index ran_index(1:n_de);dey_index w(de_index,:);x(dey_index25,j,i) 3; endif sum(x(36:45,j,i)f)2 % 工龄5人数大于2w find(x(36:45,j,i)f); n_geshu size(w,1);ran_index randperm(n_geshu); % 随机索引 n_de n_geshu - 2; de_index ran_index(1:n_de);dey_index w(de_index,:);x(dey_index35,j,i) 3; endif sum(x(46:50,j,i)f)1 % 工龄6人数大于2w find(x(46:50,j,i)f); n_geshu size(w,1);ran_index randperm(n_geshu); % 随机索引 n_de n_geshu - 1; de_index ran_index(1:n_de);dey_index w(de_index,:);x(dey_index45,j,i) 3; endendend%%%规定夜班后必是休息for j 1:6 %遍历一周前6天for k 1:50 %遍历50个排班人员if x(k,j,i)2x(k,j1,i)3;endendend%%%%%确定每天每个班次不低于十人上班若低于随机选取改工龄内休假的人排班for j1:7for f 0:2if sum(x(1:10,j,i)f)2 w find(x(1:10,j,i)f); % 已经排班的人索引n_geshu size(w,1);ww find(x(1:10,j,i)3); % 休假人索引nj_geshu size(ww,1);ran_index randperm(nj_geshu); % 随机索引 n_cre 2 - n_geshu; % 要由休假变上班的人数de_index ran_index(1:n_cre);dey_index ww(de_index,:);x(dey_index,j,i) f; endif sum(x(11:20,j,i)f)2 % 工龄2w find(x(11:20,j,i)f); n_geshu size(w,1);ww find(x(11:20,j,i)3); nj_geshu size(ww,1);ran_index randperm(nj_geshu); % 随机索引 n_cre 2 - n_geshu; de_index ran_index(1:n_cre);dey_index ww(de_index,:);x(dey_index10,j,i) f; endif sum(x(21:25,j,i)f)0 % 工龄3一班次只需一人所以如果无人上班添加一人ww find(x(21:25,j,i)3); n_geshu size(ww,1);ran_index randperm(n_geshu); % 随机索引 n_de 1; de_index ran_index(1);dey_index ww(de_index,:);x(dey_index20,j,i) f; endif sum(x(26:35,j,i)f)2 % 工龄4w find(x(26:35,j,i)f); n_geshu size(w,1);ww find(x(26:35,j,i)3); n_geshu size(ww,1);ran_index randperm(n_geshu); % 随机索引 n_cre 2 - n_geshu; de_index ran_index(1:n_cre);dey_index ww(de_index,:);x(dey_index25,j,i) f; endif sum(x(36:45,j,i)f)2 % 工龄5w find(x(36:45,j,i)f); n_geshu size(w,1);ww find(x(36:45,j,i)3); n_geshu size(ww,1);ran_index randperm(n_geshu); % 随机索引 n_cre 2 - n_geshu; de_index ran_index(1:n_cre);dey_index ww(de_index,:);x(dey_index35,j,i) f; endif sum(x(46:50,j,i)f)0 % 工龄6ww find(x(46:50,j,i)3); n_geshu size(ww,1);ran_index randperm(n_geshu); % 随机索引 n_de 1; de_index ran_index(1);dey_index ww(de_index,:);x(dey_index45,j,i) f; endendendend%%%%%% 约束条件 %%%%%%约束1--- 每天每班次上班十人且工龄如题三比例 -------硬约束 --y1 zeros(pop,7);%每天的适应值yy1 zeros(pop,7); % yy1,2,3表示早中晚班人员配置适应值yy2 zeros(pop,7);yy3 zeros(pop,7);yy4 zeros(pop,7); % yy4表示每天20人休息适应值--硬for i1:size(initial_pop,1)for j1:7yy1(i,j) 1/((sum(x(1:10,j,i)0)-2)^2 (sum(x(11:20,j,i)0)-2)^2 (sum(x(21:25,j,i)0)-1)^2 (sum(x(26:35,j,i)0)-2)^2 (sum(x(36:45,j,i)0)-2)^2 (sum(x(46:50,j,i)0)-1)^2 1);% 每个时间段的各年龄工人刚好和生产线匹配----早班午班晚班类似yy2(i,j) 1/((sum(x(1:10,j,i)1)-2)^2 (sum(x(11:20,j,i)1)-2)^2 (sum(x(21:25,j,i)1)-1)^2 (sum(x(26:35,j,i)1)-2)^2 (sum(x(36:45,j,i)1)-2)^2 (sum(x(46:50,j,i)1)-1)^2 1);yy3(i,j) 1/((sum(x(1:10,j,i)2)-2)^2 (sum(x(11:20,j,i)2)-2)^2 (sum(x(21:25,j,i)2)-1)^2 (sum(x(26:35,j,i)2)-2)^2 (sum(x(36:45,j,i)2)-2)^2 (sum(x(46:50,j,i)2)-1)^2 1);yy4(i,j) 1/((sum(x(1:10,j,i)3)-4)^2 (sum(x(11:20,j,i)3)-4)^2 (sum(x(21:25,j,i)3)-2)^2 (sum(x(26:35,j,i)3)-4)^2 (sum(x(36:45,j,i)3)-4)^2 (sum(x(46:50,j,i)3)-2)^2 1);y1(i,j) yy1(i,j) yy2(i,j) yy3(i,j) yy4(i,j);endend%y1为每天的适应值最大值为1yw1为每周的适应值理论最大值为7x4此处为1for i1:size(initial_pop,1)yw1(i,1) sum(y1(i,:))/28;end%约束2----- 每人一周内上5休2 y2 zeros(pop,7); %每人的适应值-硬 - 五休二y3 ones(pop,k); %每人的适应值-软for i 1:size(initial_pop,1) for k 1:49y2(i,k) 1/((sum(x(k,1:7,i)3) - 2)^2 1); %最大 1 %上五休二 y4(i,k) 1/((sum(x(k,1:7,i)3)-sum(x(k1,1:7,i)3))^2 1); for j 1:5 %遍历周一至周六if x(k,j,i) 2 % 如果是放假--夜班后 % 若放一天就继续工作的惩罚函数y3(i,k) y3(i,k) - 1/5 *( x(k,j2,i)~3 ); % 最大 1 尽量连休endendendend%y2,y3为每人的适应值最大值为1yr1,yr2为整个排班表的适应值理论最大值为50此处1for i1:size(initial_pop,1)yr1(i,1) sum( y2(pop,:) )/50;yr2(i,1) sum( y3(pop,:) )/50;yr3(i,1) sum( y4(pop,:) )/50;end% 权重凭感觉给的实际应该考虑约束条件的重要性及达到约束的难易程度y 0.8*yw1 0.05*yr1 0.1*yr2 0.15*yr3; %找到种群中的最优基因 [a,b] max(y); % a-单次迭代中最大y值 b-最大y的索引位置fit1y/sum(y); %计算每个种群的适应度在总适应度里所占的比例fit2cumsum(fit1); %累加%基因选择choosesort(rand(pop,1)); %有序随机数序列k1;i1;while kpopif choose(k)fit2(i) % 此处使用的是--轮盘赌选择法choosen_population(k,:)initial_pop(i,:);kk1;elseii1;endend%基因交叉--for i1:2:pop-1if randcrossover_probablitycrossover_lengthround(rand*(length-1))1; %基因交叉长度crossover_population(i,:)[choosen_population(i,1:crossover_length),choosen_population(i1,crossover_length1:end)];crossover_population(i1,:)[choosen_population(i1,1:crossover_length),choosen_population(i,crossover_length1:end)];elsecrossover_population(i:i1,:) choosen_population(i:i1,:);endend%基因变异variation_populationcrossover_population; for i1:popif randvariation_probablityvariation_locationround(rand*(length-1))1;variation_population(i,variation_location)1-variation_population(i,variation_location);endendvariation_population(end,:)initial_pop(b,:); %保留该次迭代中的最优种群initial_popvariation_population; %经选择、交叉、变异后的种群作为下一代的初始种群从而完成迭代best(m,1)y(b); % 记录下第m代的最优函数值best(m,2) yw1(b); %记录第m代的最优适应值们best(m,3) yr1(b);best(m,4) yr2(b);best(m,5) yr3(b);best_pop(:,:,m) x(:,:,b); % 记录下第m代的最优排班表
end%画图
y_smoothed smooth(1:size(best,1),best(:,1), 0.5, loess); %添加平滑曲线
figure;
plot(1:size(best,1),best(:,1),-, LineWidth,1.2);hold on;
plot(1:size(best,1),y_smoothed,-,color,red, LineWidth,1.2);hold on;
xlabel(迭代次数);
ylabel(适应值);
title(适应值变化曲线排班一周);