پروژه حل مساله زمان بندی فلوشیب با نرم افزار متلب
تابع اصلی برنامه main است که با اجرای آن حل مسئله فلوشاپ با روش بهینه سازی ژنتیک در متلب انجام میشود.
خطوط اول در این تابع مقادیر اولیه را مقدار دهی میکند
% initial value
n = 5 ; % number of works
nj = round(rand(n,1)*10)+1; % number of detail works
g = 4; % steps number
mt = round(rand(g,1)*5)+1; % machine number in station
% C = rand(n,max(nj),g)*1000; % time cost
CO = rand(n,max(nj),g) * 100; % cost per work
P = rand(n,max(nj),g) * 100; % process time
d = round(rand(n,1) * 100) ; % delivery time for every job
S = rand(n,n,g)*20 ; % setting work
خط اول تعداد کارها رو مشخص میکند
خط دوم تعداد زیر کارهای هر کار
خط سوم تعداد ایستگاه ها
خط چهارم تعداد ماشین در ایستگاه
خط پنجم هزینه تاخیر را مقدار دهی میکند
P هزینه پردازش d زمان تحویل s زمان تنظیمات
تمامی نام پارامترها مبتنی بر مستند است.
در خطوط زیر جمعیت اولیه الگوریتم ژنتیک با تعداد 10 جمعیت اولیه مقدار دهی میشود و با فراخوانی تابع init_pop جمعیت اولیه الگوریتم ایجاد میشود
% initial population
num_pop = 10 ;
X = init_pop(num_pop,n,mt,g);
در تابع init_pop جایگشت های متنوع انجام کارها تولید میشود و در ماتریس پاسخ X مقدار دهی میشود
ماتریس X پنج بعدی است که بعد اول تعداد جمعیت بعد دوم کار j بعد سوم اندیس ماشین l بعد چهارم k اندیس کار و i هم اندیس ایستگاه هاست.
تمامی اندیس گزاری ها در پیاده سازی مبتنی بر مستند است.
X = zeros(num,n,max(mt),n,g);
for number =1 : num
for i = 1 :g
series = randperm(n);
for idx = 1: n-1
j = series(1,idx+1);
k = series(1,idx);
l = round(rand(1,1)*(mt(i)-1))+1;
X(number,j,l,k,i)=1;
end
% last to one
j = series(1,1);
k = series(1,n);
l = round(rand(1,1)*(mt(i)-1))+1;
X(number,j,l,k,i)=1;
end
end
در خطوط بعد از تابع main تعداد نسل در الگوریتم ژنتیک تعیین میشود
gen_num = 5 ;
و در ازای گذشت نسل ها مراحل زیر انجام میشود
for gen = 1 : gen_num
% cross over
newX = cross_over(X);
% mutation
newX = mutation(newX);
% evalution
X = merge(X,newX);
X = valid_pop(X) ;
eval = evalution(X,nj,P,S,CO,d);
% remove
X = remove(X,eval);
end
ابتدا cross over بین جمعیت اتفاق میافتد و جمعیت ایجاد شده جهش داده میشود
سپس جمعیت موجود و فرزندان باهم ترکیب میشوند و تابع valid_pop معتبر بودن پاسخ ها رو چک و در صورت عدم اعتبار انها را معتبر سازی میکند
در نهایت تابع evaluation جمعیت را ارزیابی میکند و تابع remove مقادیر کمتر بهینه جمعیت را حذف میکند.
در نهایت پاسخ مطلوب با کد زیر نمایش داده میشود.
[val idx] = min(sum(eval));
disp(max(sum(eval(idx,:,:))));
X(idx,:,:,:,:)