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