?? 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 + -