【車間調度】基于樽海鞘算法求解帶小車的車間調度AGV-fjsp問題附matlab代碼
?作者簡介:熱愛科研的Matlab仿真開發(fā)者,修心和技術同步精進,matlab項目合作可私信。
??個人主頁:Matlab科研工作室
??個人信條:格物致知。
更多Matlab完整代碼及仿真定制內容點擊??
智能優(yōu)化算法 ? ? ? 神經網絡預測 ? ? ? 雷達通信 ?? ? ?無線傳感器 ? ? ? ?電力系統(tǒng)
信號處理 ? ? ? ? ? ? ?圖像處理 ? ? ? ? ? ? ? 路徑規(guī)劃 ? ? ? 元胞自動機 ? ? ? ?無人機
?? 內容介紹
在現代制造業(yè)中,車間調度是一個至關重要的環(huán)節(jié)。通過合理安排車間內各個工序的順序和時間,可以提高生產效率,減少生產成本,提升產品質量。而隨著自動化技術的發(fā)展,自動導引車(Automated Guided Vehicles,簡稱AGV)在車間調度中起到了越來越重要的作用。本文將介紹一種基于樽海鞘算法的車間調度方法,用于解決帶小車的車間調度AGV-fjsp問題。
AGV-fjsp問題是指在車間調度中,需要考慮到AGV和作業(yè)工序之間的關系。在傳統(tǒng)的車間調度中,通常只需要考慮作業(yè)工序之間的先后次序。而在AGV-fjsp問題中,還需要考慮到AGV與作業(yè)工序之間的時間和空間關系,以及AGV之間的沖突避免。這使得AGV-fjsp問題更加復雜,需要使用更加高效的算法來求解。
樽海鞘算法是一種基于自然界中樽海鞘行為的啟發(fā)式算法。樽海鞘是一種生物,它們通過釋放化學物質來吸引其他樽海鞘,形成聚集。這種聚集行為可以用來解決優(yōu)化問題。樽海鞘算法通過模擬樽海鞘的聚集行為,來求解復雜的優(yōu)化問題。
在車間調度AGV-fjsp問題中,樽海鞘算法可以用來尋找最優(yōu)的車間調度方案。首先,將車間調度問題抽象為一個優(yōu)化問題,其中目標是最小化總的調度時間和沖突次數。然后,使用樽海鞘算法來搜索最優(yōu)解。樽海鞘算法通過模擬樽海鞘的聚集和分散行為,來搜索解空間中的最優(yōu)解。
具體來說,樽海鞘算法包括以下幾個步驟。首先,初始化一群隨機生成的樽海鞘個體,每個個體代表一個可能的車間調度方案。然后,根據每個個體的適應度評估,選擇一部分個體作為父代。接下來,通過模擬樽海鞘的聚集行為,生成新的個體。然后,根據一定的概率,對新生成的個體進行變異操作,以增加搜索空間。最后,根據適應度評估,選擇新生成的個體和父代中的個體,作為下一代的父代。重復以上步驟,直到滿足停止準則。
通過使用樽海鞘算法求解車間調度AGV-fjsp問題,可以得到較優(yōu)的車間調度方案。這種方案可以最大程度地減少總的調度時間和沖突次數,提高車間生產效率。同時,樽海鞘算法具有較好的全局搜索能力,能夠避免局部最優(yōu)解。因此,它在解決車間調度AGV-fjsp問題中具有較高的應用價值。
總之,車間調度是現代制造業(yè)中的重要環(huán)節(jié),而AGV-fjsp問題則是車間調度中的一種復雜問題。通過使用樽海鞘算法,可以求解帶小車的車間調度AGV-fjsp問題,并得到較優(yōu)的調度方案。這種方法可以提高車間生產效率,降低生產成本,提升產品質量。因此,樽海鞘算法在車間調度AGV-fjsp問題中具有廣泛的應用前景。
?? 部分代碼
function [so,sm,sv] = heuristic_Population()
%% 功能:啟發(fā)式初始化
global AGV_num ps job_number machine_number operations_number operations_vector operations_start_vector feasible_machines_table time_table trans_time_table operations_number_vector
so1=zeros(ps,operations_number);
sm1=zeros(ps,operations_number); % 存機器
sv1=zeros(ps,operations_number); % 存機器
for i=1:ps
%% 工序:初始化
indices=randperm(operations_number); % 將300以內的數隨機排列
so1(i,:)=operations_vector(indices); % 得到工件號排序的工序
%% 機器:選擇完工時間最早的機器
ML=zeros(1,machine_number); % 記錄全局機器時間
TT=zeros(1,machine_number); % 用來臨時比較
% 生成機器
Number=operations_number_vector;
WPNumberTemp=Number;
for j=1:operations_number
? ?val=so1(i,j);
? ?WPNumberTemp(val)=WPNumberTemp(val)-1;
? ?temp=[val,operations_number_vector(val)-WPNumberTemp(val)]; % 第一個數表示工件號,第二個數表示工件內對應的工序號
? ?op_position=sum(operations_number_vector(1:val-1))+temp(2); % 總工序表中第幾個 如O13表示3
? ?machines_list = 1:machine_number;
? ?Temp1 = machines_list(logical(feasible_machines_table(op_position,:))); % 工序Oij可選機器
? ?time1 = time_table(op_position,:); % 例[3 7]
? ?time1(find(time1==0))=[];
? ?Temp2=time1;
? ?Temp=[Temp1;Temp2];
? ?SizeTemp=size(Temp,2);%查看該工序有幾個可用機器
? ?if SizeTemp == 1
? ? ? ?sm1(i,op_position)=Temp(1,1); % 如果只有一個可選機器,就直接存入
? ? ? ?ML(Temp(1))=Temp(2,1); % 更新ML表
? ?elseif SizeTemp>=2
? ? ? ?% TT=ML+time 選全局最小機器
? ? ? ?for ii=1:SizeTemp
? ? ? ? ? ?job=Temp(1,ii); % 取可選機器集內第ii個機器
? ? ? ? ? ?time=Temp(2,ii); % 取對應時間
? ? ? ? ? ?TT(job)=ML(job)+time; % 加入TT時間表用來比較選機器
? ? ? ?end
? ? ? ?[~,indice]=min(TT(Temp(1,:)));
? ? ? ?TT=zeros(1,machine_number); % 清空TT表,以備下一個工序選機器
? ? ? ?ML(Temp(1,indice))=Temp(2,indice); % 更新ML
? ? ? ?sm1(i,op_position)=Temp(1,indice);
? ?end
end
? ?%% AGV初始化
% ? ? AGV_current_machine=zeros(AGV_num,operations_number*2); % 存AGV當前在哪個機器
? ?machineoRagV=zeros(AGV_num,machine_number+1); % 用0-1存當前機器是否有AGV
? ?machineoRagV(:,1)=1; % 首先對裝卸站位置賦值(所有的AGV初始時刻均在裝卸站)
? ?job_current_op=ones(1,job_number);
? ?for j=1:operations_number
% ? ? ? ? j
? ? ? ?job=so1(i,j); operation=job_current_op(1,job);
? ? ? ?index=operations_start_vector(1,job)+operation; % 該工序索引
? ? ? ?job_current_op(1,job)=job_current_op(1,job)+1; % 更新當前加工工序
? ? ? ?if operation==1 ?% 判斷是否是首道工序
% ? ? ? ? ? ? sv1(1,index)=randi([1,AGV_num],1,1); % 首道工序隨機選擇AGV
% ? ? ? ? else
? ? ? ? ? ?if ismember(1,machineoRagV(:,1)) % 判斷起點是否有AGV
? ? ? ? ? ? ? tempm=sm1(i,index); % 當前工序對應機器編號
? ? ? ? ? ? ? tempm=tempm+1;
? ? ? ? ? ? ? startindex=find(machineoRagV(:,1)==1); % 裝卸站可用的AGV編號
? ? ? ? ? ? ? AGV_code=startindex(randi([1 length(startindex)])); % 選擇在裝卸站的AGV
? ? ? ? ? ? ? machineoRagV(AGV_code,1)=0; machineoRagV(AGV_code,tempm)=1; % 更新AGV當前所在的位置
? ? ? ? ? ? ? sv1(i,index)=AGV_code; % 將選擇的AGV的編號放入初始編碼中
? ? ? ? ? ?else % 裝卸站沒有AGV
? ? ? ? ? ? ? ?tempm=sm1(i,index); % 當前工序對應機器編號
? ? ? ? ? ? ? ?tempm=tempm+1;
? ? ? ? ? ? ? ?distance=zeros(1,AGV_num); % 初始距離矩陣
? ? ? ? ? ? ? ?agvmac=[];
? ? ? ? ? ? ? ?for k=1:AGV_num % 循環(huán)所有的AGV
? ? ? ? ? ? ? ? ? ?% 計算距離
? ? ? ? ? ? ? ? ? ?nowAgvIndex=find(machineoRagV(k,:)==1); % 當前AGV所在的位置
? ? ? ? ? ? ? ? ? ?agvmac=[agvmac;nowAgvIndex]; % 存一下agv所在機器
? ? ? ? ? ? ? ? ? ?distance(1,k)=trans_time_table(nowAgvIndex,1)+trans_time_table(1,tempm);
? ? ? ? ? ? ? ?end
? ? ? ? ? ? ? ?% 選擇距離最小的AGV
? ? ? ? ? ? ? ? [~,sv1(i,index)]=min(distance);
? ? ? ? ? ? ? ? ?% 更新一下當前AGV的位置
? ? ? ? ? ? ? machineoRagV(sv1(i,index),agvmac(sv1(i,index),1))=0; machineoRagV(sv1(i,index),tempm)=1; % 更新AGV當前所在的位置
? ? ? ? ? ?agvmac=[];
? ? ? ? ? ?end
? ? ? ?else % 非首道工序,只需要計算與上一個工序所在機器
? ? ? ? ? ?tempm=sm1(i,index); % 當前工序對應機器編號
? ? ? ? ? ?premac=sm1(i,index-1); % 上一個工序所在機器編號
? ? ? ? ? ?premac1=premac+1;
? ? ? ? ? ?tempm=tempm+1;
? ? ? ? ? ?distance=zeros(1,AGV_num); % 初始距離矩陣
? ? ? ? ? ?agvmac=[];
? ? ? ? ? ?for k=1:AGV_num % 循環(huán)所有的AGV
? ? ? ? ? ? ? ?% 計算距離
? ? ? ? ? ? ? ?nowAgvIndex=find(machineoRagV(k,:)==1); % 當前AGV所在的位置
% ? ? ? ? ? ? ? ? nowAgvIndex
? ? ? ? ? ? ? ?agvmac=[agvmac;nowAgvIndex]; % 存一下agv所在機器
? ? ? ? ? ? ? ?distance(1,k)=trans_time_table(premac1,tempm)+trans_time_table(nowAgvIndex,premac1);
? ? ? ? ? ?end
? ? ? ? ? ?% 選擇距離最小的AGV
? ? ? ? ? ?[~,sv1(i,index)]=min(distance);
? ? ? ? ? ?% 更新一下當前AGV的位置
? ? ? ? ? ?machineoRagV(sv1(i,index),agvmac(sv1(i,index),1))=0; machineoRagV(sv1(i,index),tempm)=1; % 更新AGV當前所在的位置
? ? ? ? ? ?agvmac=[];
? ? ? ?end
? ?end
so=so1;sm=sm1;sv=sv1;
end
?? 運行結果


?? 參考文獻
[1] 閻慶,邰蕾蕾.用混合遺傳算法解決有時間窗的車輛路徑規(guī)劃問題[J].安徽大學學報:自然科學版, 2007, 31(2):4.DOI:CNKI:SUN:AHDX.0.2007-02-010.
[2] 王原,李曉苗.基于T型傳遞函數的二進制樽海鞘算法求解0-1背包問題[J].電子技術與軟件工程, 2022(011):000.
[3] LI Changan,ZHAO Delong,WANG Guoyong,等.基于改進樽海鞘群算法的卸車調度優(yōu)化[J].重慶交通大學學報(自然科學版), 2021, 40(11):32-39.DOI:10.3969/j.issn.1674-0696.2021.11.05.
[4] 袁友偉,高一鳴,黃笑成,等.一種基于改進樽海鞘算法的工作流優(yōu)化調度方法.CN202211260945.8[2023-10-13].