資源簡介
該代碼用于解決具有機器柔性的柔性作業車間調度問題,工件數量與工序數量可自行調節,采用了傳統遺傳算法,編碼方式為三維實數編碼。
代碼片段和文件信息
%該程序用于解決柔性作業車間調度,m個工件,n道工序,其中n為最大工序數,工件的工序
%數可以少于n,加工機器數為M,每個工件的每道工序具有多個機器可以選擇,對應的時間
%不同,其中初始種群的儲存方式采用cell數據類型
%Version:1.3
%fileDescription:調度機器可選的柔性作業車間問題,甘特圖已完善改善初始解集(均衡分散原則),改善交叉(部分映射交叉)8*8實例
%last?edit?time:2019-4-15
function?main()
count?=?1000;?????%迭代次數
N?=?50;??????????%種群規模
pc?=?0.8;???????%交換概率
pm?=?0.2;???????%變異概率
m?=?8;?????????????%工件數
n?=?4;?????????????%工序數
M?=?8;?????????????%機器數
plotif?=?1;????????%控制程序是否進行繪圖
s?=?input(mn);????%數據輸入
[pTN]?=?initial_p(mnNsM);????%生成初始種群50采用細胞結構,每個元素為8*4
P?=?machine(nM);
FIT?=?zeros(count1);
aveFIT?=?zeros(count1);
X1=randperm(count);???????%收斂圖形的橫坐標X
X=sort(X1);
%------------------------輸出最優解的時有用------------------------------
best_fit?=?1000;????????????%改變模型需要修改此參數
best_p?=?zeros(mn);
best_TN?=?zeros(mn);
Y1p?=?zeros(m1);
Y2p?=?zeros(m1);
Y3p?=?zeros(m1);
%-------------------------進行迭代--------------------------------------
for?i?=?1:count
????[fitY1Y2Y3]?=?object(pTNNPmn);
????[newpnewTN]?=?selection(pTNfitN);
????[newpnewTN]?=?crossover(newppcmnNnewTN);
????[newpnewTN]?=?var(newppmmnNsnewTN);
????if?best_fit?>?min(fit)
????????[best_pbest_TNbest_fitY1pY2pY3p]=best(best_fitbest_pfitbest_TNY1pY2pY3ppTNY1Y2Y3);
????end
????p?=?newp;
????TN?=?newTN;
????FIT(i)?=?min(fit);????%用于適應度函數的
????aveFIT(i)?=?mean(fit);??????%用于適應度函數的
end
%------------------投射最佳方案數據--------------------------------------
???
????fprintf(‘最優解:%d\n‘best_fit);
????fprintf(‘工序1?工序2?工序3?工序4\n‘);
????best_p
????fprintf(‘時間1?時間2?時間3?時間4\n‘);
????best_TN
%------------------------收斂曲線----------------------------------------
????if?plotif?==?1
????figure;
????plot(XFIT‘r‘);
????hold?on;
????plot(XaveFIT‘b‘);
????title(‘收斂曲線‘);
????hold?on;
????legend(‘最優解‘‘平均值‘);
%-------------------------甘特圖-----------------------------------------
figure;
w=0.5;???????%橫條寬度?
set(gcf‘color‘‘w‘);??????%圖的背景設為白色
for?i?=?1:m
????for?j?=?1:n
????????color=[10.980.98;10.890.71;0.860.860.86;0.380.721;101;011;010.49;10.870.67;0.390.580.92;0.560.730.56];
????????a?=?[Y1p(ij)Y2p(ij)];
????????x=a(1[1?1?2?2]);??????%設置小圖框四個點的x坐標
????????y=Y3p(ij)+[-w/2?w/2?w/2?-w/2];???%設置小圖框四個點的y坐標
????????color?=?[color(i1)color(i2)color(i3)];
????????p=patch(‘xdata‘x‘ydata‘y‘facecolor‘color‘edgecolor‘‘k‘);????%facecolor為填充顏色,edgecolor為圖框顏色
????????????text(a(11)+0.5Y3p(ij)[num2str(i)‘-‘num2str(j)]);????%顯示小圖框里的數字位置和數值
????end
end
xlabel(‘加工時間/s‘);??????%橫坐標名稱
ylabel(‘機器‘);????????????%縱坐標名稱
title({[num2str(m)‘*‘num2str(M)‘的一個最佳調度(最短完工時間為‘num2str(best_fit)‘)‘]});??????%圖形名稱
axis([0best_fit+20M+1]);?????????%x軸,y軸的范圍
set(gca‘Box‘‘on‘);???????%顯示圖形邊框
set(gca‘YTick‘0:M+1);?????%y軸的增長幅度
set(gca‘YTickLabel‘{‘‘;num2str((1:M)‘‘M%d‘);‘‘});??%顯示機器號
hold?on;
????end
%--------------------------輸入數據---------------------------------
function?s?=?input(mn)??????%輸入數據
s?=?cell(mn);
評論
共有 條評論