文章目錄
- 0 賽題思路
- 1 模型描述
- 2 實例
- 2.1 問題描述
- 2.2 數學模型
- 2.2.1 模型流程
- 2.2.2 符號約定
- 2.2.3 求解模型
- 2.3 相關代碼
- 2.4 模型求解結果
- 建模資料
0 賽題思路
(賽題出來以后第一時間在CSDN分享)
https://blog.csdn.net/dc_sinor?type=blog
最短時間生產計劃模型
該模型出現在好幾個競賽賽題上,預測2023今年國賽也會與該模型相關。
1 模型描述
離散系統仿真在工業生產的工序安排中起到了相當重要的作用,如何就一些內部機制復雜的離散問題建立簡單易行、可監測性強的數學模型一直是仿真技術的研究熱點.
離散事件系統現有三種仿真建模策略,即:
- 事件調度法
- 活動掃描法
- 進程交互法.
該模型demo學長采用了其中的活動掃描法對生產中的一個實際例子進行了處理.
活動掃描法對于各事件之間相關性很強的系統有著很好的適用性.
2 實例
2.1 問題描述
在許多工廠生產過程中,由于設備的數量、產品加工的次序限制,往往不能簡單地安排生產任務.我們設想,應用強大的數學軟件配合簡單易行的方法進行安排.
設某重型機械廠產品都是單件性的,其中有一車間共有4種不同設備,現接受6件產品的加工任務,每件產品接受的程序在指定的設備上加工,其工序與加工周期如下表
現在我們根據這一實際問題,尋求安排的方法.
要求:
1、每件產品必須按規定的工序加工,不得顛倒.
2、每臺設備在同一時間只能擔任一項任務(每件產品的每個工序為一個任務).
3、在盡可能短的時間里,完成所接受的全部任務.
為了節省電能,合理分配生產任務,廠方還要求:
1、做出每件產品的每個工序開工、完工時間表.
2、給出每臺設備承擔任務的時間表.
2.2 數學模型
2.2.1 模型流程
2.2.2 符號約定
2.2.3 求解模型
2.3 相關代碼
clear
clc
seq=[3 1 2 3 4 0 0 0 %各產品加工時所用的設備的次序1 4 2 3 0 0 0 03 4 1 2 1 0 0 02 3 4 1 4 3 0 04 2 3 4 1 3 4 01 2 1 3 4 1 3 1];tim=[8 2 4 24 6 0 0 0 %加工對應使用的時間4 5 3 4 0 0 0 03 7 15 20 8 0 0 07 6 21 1 16 3 0 010 4 8 4 12 6 1 01 4 7 3 5 2 5 8];
whole=[0 0 0 0];
for i=1:6for j=1:8if(seq(i,j)~=0)whole(seq(i,j))=whole(seq(i,j))+tim(i,j);endend
end
whole %生產各件產品所需的總時間mes=cell(4,1); %記錄各個設備的工作時間(對應于上面tim的位置)
for k=1:4mes{k,1}=zeros(6,8);for j=1:8for i=1:6if(seq(i,j)==k)mes{k,1}(i,j)=tim(i,j);elsemes{k,1}(i,j)=100;endendend
endturn=cell(5,100); %記錄四個設備的開關時間及加工對象(on(i))
for i=1:4for j=1:100turn{i,j}='off';end
end
for i=1:100turn{5,i}=[num2str(i) '分'];
endopen=zeros(6,8);
%記錄6個產品的加工進度,0表示未進行,1表示已開始(或已結束),2表示可選,3表示沒有這個程序
for i=1:6open(i,1)=2;
end
for i=1:6for j=1:8if seq(i,j)==0open(i,j)=3;endend
endgongxu=zeros(6,1);
dai=zeros(4,1);
j=1;
s=[1 1 1 1 1 3 3 3
1 1 1 1 3 3 3 3
1 1 1 1 1 3 3 3
1 1 1 1 1 1 3 3
1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1];
while isequal(open,s)==0on=[];for i=1:4if turn{i,j}=='off'
%在turn矩陣中逐列搜索,若設備處于關機狀態,則作記錄(可用)on=[on i];endendl1=length(on);for m=1:l1 %在整個生產計劃中(對設備逐個)尋找能夠選作操作的步驟[x,y]=find(open==2);l2=length(x);a=[x(1) y(1)];for k=1:l2 %對某個設備on(m),找出當前它能操作的步驟中耗時最小的一個if mes{on(m)}(a(1),a(2))>mes{on(m)}(x(k),y(k))a=[x(k) y(k)];endendif turn{on(m),j}=='off' & mes{on(m)}(a(1),a(2))~=100
%若時間為100則意味著這個步驟不屬于我們希望使用的那件設備while tim(a(1),a(2))>0turn{on(m),tim(a(1),a(2))+j-1}=a(1);tim(a(1),a(2))=tim(a(1),a(2))-1;endendendfor i=1:4if turn{i,j}~='off'dai(i)=turn{i,j};endendfor i=1:4if turn{i,j}~='off' & turn{i,j+1}=='off'gongxu(turn{i,j})=gongxu(turn{i,j})+1;open(turn{i,j},gongxu(turn{i,j}))=1;endif gongxu(dai(i))<8 & open(dai(i),gongxu(dai(i))+1)~=3 & turn{i,j+1}=='off'open(dai(i),gongxu(dai(i))+1)=2;endendj=j+1;
end
2.4 模型求解結果
每件產品的每個工序開工、完工時間表
每臺設備承擔任務的時間表
從結果中我們可以看到,使用這種方法,只需78個單位時間就可以完成所有的工序.而我們同時也可以在論文的開始部分看到,單就完成 就需耗費75個單位時間.可見這種方法得出的結果還是相當使人滿意的,而且操作簡單,可監測性強.
建模資料
資料分享: 最強建模資料