⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untitled.m

📁 炼钢浇注的时序规划算法
💻 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 + -