1、基于時間窗
https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_=1741880736197&bdQuery=%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95
2.2019年MathorCup高校數學建模挑戰賽B題
2019-mathorcupB題-環形穿梭機調度模型(思路篇)_環形調度算法-CSDN博客
2019年MathorCup數學建模B題環形穿梭車系統的設計與調度解題全過程文檔及程序_2019-mathorcupb題-環形穿梭機調度模型-CSDN博客
基于遺傳算法的穿梭車調度主函數
function [time]=GA()
N=3;num=10;%每次迭代一個口貨物的數量,染色體攜帶的基因個數
popsize=20; %初始種群大小
Generationnmax=20; %最大代數
pcrossover=0.8; %交配概率
pmutation=0.1;%變異概率
fitness=zeros(1,popsize);%%產生初始種群,兩個矩陣
A_2=xlsread('A.xlsx');A_2(:,1)=A_2(:,1)+A_2(:,2);A_2(:,2)=A_2(:,1)-A_2(:,2);
A_2(:,1)=A_2(:,1)-A_2(:,2);A_2_ini=A_2;
population=[ceil(4+3*rand(100,4,popsize)),ceil(N*rand(100,6,popsize))];
for i=1:popsizepopulation(52:100,2,i)=0;population(72:100,3,i)=0;population(52:100,8,i)=0;population(72:100,9,i)=0;
end%%迭代的時候用到的 population 信息,ini 為所有信息,raise 隨著迭代不斷上升,
best 為最優種群
population_ini=population;population_raise=[];scnew=zeros(num,10,popsize);
smnew=zeros(num,10,popsize);handle_waitbar=waitbar(0,'Please wait...');%%每次迭代10個
貨物
for s=1:10start=10*s-9;the_end=10*s;%%每次迭代取 ini 對應的 10 行,population_part 的值每次都在變population_part_s=population_ini(start:the_end,:,:);A_2_part=A_2_ini(1:the_end,:);Generation=0;
while Generation<GenerationnmaxGeneration=Generation+1;%%算 raise 后的適應度
for i=1:popsize fitness(i)=simulation([population_raise;population_part_s(:,:,i)],A_2_part,N);
end%給適應度函數加上一個大小合理的數以便保證種群適應值為正數
fitness=fitness';
valuemax=max(fitness);
fitness=(valuemax-fitness);
fsum=sum(fitness);
Pperpopulation=fitness/fsum;
cumsump=cumsum(Pperpopulation);
cumsump=cumsump';%%只對 part 進行交叉等操作
for j=1:2:popsize %選擇操作seln=selection(cumsump); %交叉操作scro=crossover(population_part_s,seln,pcrossover);scnew(:,:,j)=scro(:,:,1);scnew(:,:,j+1)=scro(:,:,2); smnew(:,:,j)=mutation(scnew(:,:,j),pmutation,N);smnew(:,:,j+1)=mutation(scnew(:,:,j+1),pmutation,N);
end%產生了新的種群,part
population_part_s=smnew;
end%%計算 raise 后的適應度
for i=1:popsizefitness(i)=simulation([population_raise();population_part_s(:,:,i)],A_2_part,N);
end[~,index]=min(fitness); population_raise(start:the_end,:)=population_part_s(:,:,index);waitbar(s/20,handle_waitbar)
end
close(handle_waitbar);time=simulation(population_raise,A_2_ini,N);
xlswrite('task.xlsx',population_raise);
end
?環形穿梭車調度過程
function
[port_state,vehicle_state]=Fnc_update_state(task_assignment,task_information,port_state,veh
icle_state,vehicle_coordinate,in_coordinate,out_coordinate,N)
% vehicle_state 第一行代表 N 個運輸車的狀態,
%0 表示空閑%1 代表正在裝貨%2 代表正在運貨%3 代表正在卸貨
% 第二行代表貨物來源于哪個進貨口(編號 1-6),從開始裝貨到開始卸貨此數值不為
0
% 第三行代表需要將貨物送到哪個出貨口(編號 1-7),從開始裝貨到開始卸貨此數值
不為 0
% 第四行在運輸車不處于 flag=1 或 3 時為 0,當 flag==1 或 3 時其數字代表裝卸貨剩余
的時間,本程序中由于取了 h=0.01
% 因為浮點數的判定條件問題所以取這個數字的范圍為 0-100,每當進行一個 whlie 循
環 t 增加 0.1, 10s 對應 100 次循環
%%port_state 口的狀態,列數為 6,6 個進貨口
%%第一行代表每一個口下一個有待裝箱的貨物編號%%第二行代表這個貨物由哪個運
輸車負責%%第三行代表這個貨物要送到哪個口
for i=1:N%%如果空閑則滿足一定條件變成裝貨if(vehicle_state(1,i)==0) %%檢測第 i 個車是否到達對應進貨口,如果已經到達進貨口則進行裝箱,%%并將小車狀態改為正在裝貨,記錄起始地和目的地,并將等待時間置 100.%%0.15=0.1*1.5,代表進貨出貨區間delta=vehicle_coordinate(i)-in_coordinate;%index 代表哪個進貨口index=find((0<delta)&(delta<=0.15));%有空閑的運輸車到達進貨口if(~isempty(index))if port_state(2,index)==ivehicle_state(1,i)=1; vehicle_state(2,i)=index;vehicle_state(3,i)=port_state(3,index); vehicle_state(4,i)=100; endend
%%如果在裝貨,則時間減一,如果減一后為 0,變為運貨狀態,此時進貨口的狀態進行
更新,%%貨物信息進行移位elseif(vehicle_state(1,i)==1)vehicle_state(4,i)=vehicle_state(4,i)-1;if(vehicle_state(4,i)==0)vehicle_state(1,i)=2;index=vehicle_state(2,i); %%當有一個貨物完成裝貨后,對應 port 貨物編號+1,并更新對應 port 信息port_state(1,index)=port_state(1,index)+1;port_state(2,index)=task_assignment(port_state(1,index),index);port_state(3,index)=task_information(port_state(1,index),index);end
%%處于運貨狀態時,檢測第 i 個車是否到達對應出貨口,如果已經到達出貨口進行卸貨
%%小車狀態改為卸貨,并將時間置 1000elseif(vehicle_state(1,i)==2)delta=vehicle_coordinate(i)-out_coordinate;index=find((0<delta)&(delta<=0.15));if(~isempty(index))if vehicle_state(3,i)==indexvehicle_state(1,i)=3; vehicle_state(4,i)=100; end
end%%如果在卸貨,則時間減一,如果減一后為 0,變為空閑狀態,并清空該
車的進貨口和出貨口信息elseif(vehicle_state(1,i)==3)vehicle_state(4,i)=vehicle_state(4,i)-1;if(vehicle_state(4,i)==0)vehicle_state(1,i)=0; vehicle_state(2,i)=0; vehicle_state(3,i)=0; end end
end
end