📄 time_prog.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 = 13; %CSP连铸机上冶炼钢水的数目
Num_zhhb = 7; %中厚板连铸机上冶炼钢水的数目
T_arrive_csp = 95; %第一炉钢水到达CSP连铸机的时间
T_arrive_zhhb = 115; %第一炉钢水到达中厚板连铸机的时间
m = 3;
%以下参数为工厂根据实际情况设定的值,通常设定后不要轻易修改
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; %二号转炉到中厚板连铸机的时间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输出参数 %%%%%%%%%%
%Start1 = zeros(1,Num_csp); %输出一号转炉的工作时序
%Start2 = zeros(1,Num_csp); %输出二号转炉的工作时序
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 主程序 %%%%%%%%%%
Arrive_csp = zeros(1,Num_csp);
Arrive_csp(1) = T_arrive_csp;
for i = 2:Num_csp
Arrive_csp(i) = Arrive_csp(i-1) + T_csp;
end % 到达CSP连铸机钢水的时序
Arrive_zhhb = zeros(1,Num_zhhb);
Arrive_zhhb(1) = T_arrive_zhhb;
for i = 2:Num_zhhb
Arrive_zhhb(i) = Arrive_zhhb(i-1) + T_zhhb;
end % 到达中厚板连铸机的钢水时序
%如果CSP连铸机的钢水全由1号转炉提供,则一号转炉的开机时序为:
Start_csp1 = Arrive_csp - From1_csp;
%如果CSP连铸机的钢水全由2号转炉提供,则二号转炉的开机时序为:
Start_csp2 = Arrive_csp - From2_csp;
%二号转炉向中厚板连铸机提供钢水的开机时序为:
Start_zhhb = Arrive_zhhb - From2_zhhb;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
entire_number = cat(2,Start_csp1,Start_zhhb);
entire_index = 1:(Num_csp+Num_zhhb);
Entire = cat(1,entire_index,entire_number);
%二号炉可用于给CSP连铸机冶炼钢水的时间Available_TimeScale_zhl2为:
S_zhl2 = Start_zhhb + T_zhl2;
S_zhl2 = S_zhl2(1:Num_zhhb-1);
E_zhl2 = Start_zhhb - T_zhl2;
E_zhl2 = E_zhl2(2:Num_zhhb);
Available_TimeScale_zhl2 = cat(1,S_zhl2,E_zhl2);
%可用二号转炉向CSP连铸机提供钢水的时间,如果没有可行解将会报错
index = 1;
for i = 1:Num_csp
for j = 1:Num_zhhb-1
if Start_csp2(i) >= Available_TimeScale_zhl2(1,j) & Start_csp2(i) <= Available_TimeScale_zhl2(2,j)
Available_time(index) = Start_csp2(i);
Csp_subtract(index) = i;
index = index + 1;
end
end
end
%Available_time中存储的数据便是可以插入二号炉的冶炼时间点,目的是要使一号,二号转炉所练钢水尽可能的平均,
% 如果Available_time中的数据少于
%(Num_csp+Num_zhhb)/2 -Num_zhhb,则将Available_time中的数据全插入二号转炉的时序中。
% 如果Available_time中的数据大于
%(Num_csp+Num_zhhb)/2 -Num_zhhb,则从Available_time中的数据中选任选
%(Num_csp+Num_zhhb)/2-Num_zhhb个数据插入二号转炉的时序中,均为可行解
N_Available_time = size(Available_time); %Available_time中存储的数据的个数
N_need = m;%floor((Num_csp + Num_zhhb)/2 - Num_zhhb); %需要插入二号转炉时间点的个数
if N_Available_time <= N_need
Start_csp(Csp_subtract) = 0;
Start_csp = sort(Start_csp);
Start1 = Start_csp(N_Available:Num_csp);
Start2 = cat(2,Start_zhhb,Available_time);
else
Available_need = nchoosek(Available_time,N_need); %选出可以插入时间点的组合
%求炉次的序号
Sequence_index = nchoosek(Csp_subtract,N_need); %从Csp序列中抽出的炉次
Csp_subtract_index = (nchoosek(Csp_subtract,N_need))'; %选出可以插入时间点组合编号
%输出一号转炉的时序
[A_col,A_row] = size(Available_need );
row_csp = 1:Num_csp;
col_csp = ones(1,A_col);
%%%
zhl1_index = 1:Num_csp;
zhl1_index_matrix = (zhl1_index(col_csp,zhl1_index))';
%zhl1_index_matrix(Sequence_index) = 0;
Start_csp_matrix = (Start_csp1(col_csp,row_csp))';
%纯粹为达目的的种数学变换,就是要将插入转炉2中的钢水号从转炉1的序列中去掉
for i = 1:A_col
Csp_subtract_index(:,i) = Csp_subtract_index(:,i) + Num_csp*(i-1);
end
Start_csp_matrix(Csp_subtract_index) = 0;
Start_csp_matrix = sort(Start_csp_matrix)';
Start1 = Start_csp_matrix(:,N_need+1:Num_csp);
%%
zhl1_index_matrix(Csp_subtract_index) = 0;
zhl1_index_matrix = sort(zhl1_index_matrix)';
zhl1_index = zhl1_index_matrix(:,N_need+1:Num_csp);
%
row_zhhb = 1:Num_zhhb;
col_zhhb = ones(1,A_col);
Start_zhhb_matrix = Start_zhhb(col_zhhb,row_zhhb);
Start2 = cat(2,Start_zhhb_matrix,Available_need);
Start2 = (sort(Start2'))';
end
%求炉次标号
%[Start1_row,Start1_col] = size(Start1);
%zhl1_index = zeros(Start1_row,Start1_col);
[Start2_row,Start2_col] = size(Start2);
zhl2_index = zeros(Start2_row,Start2_col);
for i = 1:Start2_row
for j = 1:Start2_col;
for t = 1:(Num_csp+Num_zhhb)
if Start2(i,j) == Entire(2,t)
zhl2_index(i,j) = Entire(1,t);
end
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -