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

📄 time_prog.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          =     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 + -