📄 untitled.m
字号:
%注意:1.当所有过程的时间固定时,必须有:冶炼中厚板的时间(T_zhhb)大于两倍的冶炼CSP的时间(T_csp),即
% T_zhhb > 2*T_csp
% 2.冶炼csp的的时间(T_csp)必须大于转炉的冶炼时间(T_zhl),既:
% T_csp > T_zhl
clc;
clear;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输入参数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Num_csp_jc = 2; %CSP连铸机上冶炼钢水的浇次数 注意:此参数不可随意修改,修改此参数,程序要做相应改变
Num_csp = 8; %CSP连铸机上每浇次冶炼钢水的数目
T_interval_csp12 = 40; %CSP连铸机1、2浇次之间的调整时间
%T_csp = 25; %CSP连铸机第一浇次冶炼钢水的时间
%T_csp_jc2 = 25; %CSP连铸机第二浇次冶炼钢水的时间
T_arrive_csp_last = 95; %第一炉钢水到达CSP连铸机的时间
Num_zhhb_jc = 3; %中厚板连铸机上冶炼钢水的浇次数 注意:此参数不可随意修改,修改此参数,程序要做相应改变
Num_zhhb = 3; %中厚板连铸机上每浇次冶炼钢水的数目
T_interval_zhhb12 = 50; %中厚板连铸机上1、2浇次之间的调整时间
T_interval_zhhb23 = 40; %中厚板连铸机上2、3浇次之间的调整时间
%T_zhhb = 60; %中厚板连铸机第一浇次冶炼钢水的时间
%T_zhhb_jc2 = 60; %中厚板连铸机第二浇次冶炼钢水的时间
%T_zhhb_jc3 = 60; %中厚板连铸机第浇次冶炼钢水的时间
T_arrive_zhhb_last = 115; %第一炉钢水到达中厚板连铸机的时间
Num_select = 3; %插入中厚板序列中CSP序列钢水的数目
Num_min = 1; %2号转炉上相邻中厚板序列的最小数目
Num_max = 5; %2号转炉上相邻中厚板序列的最大数目
T_zhl1_early = 0; %1号转炉最早开始冶炼钢水的时间
T_zhl2_early = 0; %2号转炉最早开始冶炼钢水的时间
%以下参数为工厂根据实际情况设定的值,通常设定后不要轻易修改
T_csp = 25; %CSP连铸机冶炼钢水的时间
T_zhhb = 60; %中厚板连铸机冶炼钢水的时间
T_zhl1 = 20; %1号转炉冶炼钢水的时间
T_zhl2 = 20; %2号转炉冶炼钢水的时间
T_zhl1_jll1 = 5; %一号转炉到一号精炼炉的运输时间
T_zhl2_jll1 = 5; %二号转炉到一号精炼炉的运输时间
T_zhl2_jll2 = 5; %二号转炉到二号精炼炉的运输时间
T_jll1 = 35; %一号精炼炉的冶炼时间
T_jll2 = 35; %二号精炼炉的冶炼时间
T_jll1_csp = 5; %一号精炼炉到csp连铸机的运输时间
T_jll2_RH = 5; %二号精炼炉到RH精炼炉的运输时间
T_RH = 30; %RH精炼炉的冶炼时间
T_RH_zhhb = 5; %RH精炼炉到中厚板连铸机的运输时间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 参数合并 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
From1_csp = T_zhl1 + T_zhl1_jll1 + T_jll1 + T_jll1_csp; %一号转炉到CSP连铸机的时间
From2_csp = T_zhl2 + T_zhl2_jll1 + T_jll1 + T_jll1_csp; %二号转炉到CSP连铸机的时间
From2_zhhb = T_zhl2 + T_zhl2_jll2 + T_jll2 + T_jll2_RH + T_RH + T_RH_zhhb; %二号转炉到中厚板连铸机的时间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 主程序 %%%%%%%%%%
%穷举所有可能序列,这里假设中厚板序列的编号是1~Num_zhhb,CSP序列的编号为Num_zhhb+1 ~ Num_zhhb + Num_csp
%all_result = sequence(Num_zhhb*Num_zhhb_jc,Num_select,Num_min,Num_max);
Arrive_csp = zeros(1,Num_csp);
%Arrive_csp(1) = T_arrive_csp_last;
for i = 1:Num_csp_jc
for j = 1:Num_csp
Arrive_csp((i-1)*Num_csp+j) = T_arrive_csp_last + T_csp*((i-1)*Num_csp+j-1) + T_interval_csp12*(i>=2);
end
end % 到达CSP连铸机钢水的最晚时间序列
Arrive_zhhb = zeros(1,Num_zhhb);
%Arrive_zhhb(1) = T_arrive_zhhb;
for i = 1:Num_zhhb_jc
for j = 1:Num_zhhb
Arrive_zhhb((i-1)*Num_zhhb+j) = T_arrive_zhhb_last + T_zhhb*((i-1)*Num_zhhb+j-1) + T_interval_zhhb12*(i>=2) + T_interval_zhhb23*(i >= 3) ;
end
end % 到达中厚板连铸机钢水的最晚时间序列
%倒推
%如果CSP连铸机的钢水全由1号转炉提供,则一号转炉的最晚开机时序为:
Start_csp1_last = Arrive_csp - From1_csp;
%如果CSP连铸机的钢水全由2号转炉提供,则二号转炉的最晚开机时序为:
Start_csp2_last = Arrive_csp - From2_csp;
%对CSP连铸机序列编号
No_csp_zhl2 = Num_zhhb*Num_zhhb_jc+1 : Num_zhhb*Num_zhhb_jc + Num_csp*Num_csp_jc;
Csp2_last = cat(1,No_csp_zhl2,Start_csp2_last);
%二号转炉向中厚板连铸机提供钢水的最晚开机时序为:
Start_zhhb_last = Arrive_zhhb - From2_zhhb;
%同理
%如果CSP连铸机的钢水全由1号转炉提供,则一号转炉的最早开机时序为:
Start_csp1_early = Start_csp1_last - (Start_csp1_last(1) - T_zhl1_early );
%如果CSP连铸机的钢水全由2号转炉提供,则二号转炉的最早开机时序为:
Start_csp2_early = Start_csp2_last - (Start_csp2_last(1) - T_zhl2_early );
%二号转炉向中厚板连铸机提供钢水的最早开机时序为:
Start_zhhb_early = Start_zhhb_last - (Start_zhhb_last(1) - T_zhl2_early );
%对于二号转炉而言,可用于给csp连铸机冶炼钢水的时间段为
S_zhl2 = Start_zhhb_early + T_zhl2;
E_zhl2 = Start_zhhb_last + T_zhhb - T_zhl2;
%E_zhl2 = E_zhl2(2:Num_zhhb*Num_zhhb_jc);
M = 10000; %M为一充分大的数,表示2号炉在给中厚板连铸机冶炼完钢水后可随时给CSP连铸机冶炼钢水
E_zhl2(Num_zhhb*Num_zhhb_jc) = M;
Available_TimeScale_zhl2 = cat(1,S_zhl2,E_zhl2);
%考虑2号转炉第一炉是给csp炼钢水的情况,即1号转炉的第一桶不是炼csp第一炉钢水的情况
First = zeros(2,1);
if Start_zhhb_last(1) > T_zhl2
First = Start_zhhb_last(1) - T_zhl2;
else
Frist = 0;
end
Available_TimeScale_zhl2 = cat(2,First,Available_TimeScale_zhl2);
%判断所有CSP序列中可以在2号转炉上冶炼的炉次
%判断准则:黑球(插入的CSP炉次)最晚结束时间<它后一个白球(中厚板炉次)最晚开始时间 最晚结束<最晚开始
% 黑球(插入的CSP炉次)最晚开始时间>它前面的白球(中厚板炉次)最早结束时间。 最晚开始>最早结束
%强调一下:中厚板序列的编号是1~Num_zhhb*Num_zhhb_jc,CSP序列的编号为
%Num_zhhb*Num_zhhb_jc+1 :Num_zhhb*Num_zhhb_jc + Num_csp*Num_csp_jc
[all_result,insert_disp_output,insert_disp] = sequence(Num_zhhb*Num_zhhb_jc,Num_select,Num_min,Num_max);
result_row = 3;
result_available = zeros(3,Num_zhhb*Num_zhhb_jc+1); % 可以插入中厚板序列中的CSP序列号
for i = 1:Num_zhhb*Num_zhhb_jc+1
index = 1;
for j = 1 : Num_csp*Num_csp_jc
if Csp2_last(2,j) >= Available_TimeScale_zhl2(1,i) & Csp2_last(2,j) <= Available_TimeScale_zhl2(2,i)
result_available(index,i) = Csp2_last(1,j);
index = index+1;
end
end
end
%判断所有CSP序列中可以在2号转炉上冶炼的炉次
logic_result = sum(result_available);
[row,col] = size(all_result);
index = 1;
total_logic = zeros(1,Num_zhhb*Num_zhhb_jc+1);
for i = 1:row
total_logic(i) = sum(insert_disp_output(i,:) | logic_result) ;
if total_logic(i) == Num_zhhb*Num_zhhb_jc+1
feasible_result(index,:) = all_result(i,:);
feasible_insert_result(index,:) = insert_disp_output(i,:);
feasible_insert_disp(index,:) = insert_disp(i,:);
end
end
[row_fea,col_fea] = size(feasible_insert_result);
all_disp = zeros(row_fea*3,Num_select);
for i = 1:row_fea
for j = 1:Num_select
all_disp((i-1)*3+1:(i-1)*3+3,j) = result_available(:,feasible_insert_disp(i,j));
end
end %s所有可能的炉次号
%
feasible_result(find(feasible_result==0)) = all_disp(1:3:(row_fea-1)*3+1,:);
Start1_sequence = Num_zhhb*Num_zhhb_jc+1 :Num_zhhb*Num_zhhb_jc + Num_csp*Num_csp_jc;
Start1_sequence(all_disp(1,:)-Num_zhhb*Num_zhhb_jc) = 0;
A = sort(Start1_sequence);
Start1 = A(Num_select+1:end)
Start2 = feasible_result
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -