遗传算法-流水车间调度

遗传算法

addpath('D:\matlab\.m文件夹\.m机器学习文件\遗传算法\gatbx');%增加包遗传算法的包

%fplot('varible.*sin(10*pi*varible)+2.0',[-1,2]);%画出函数曲线
fplot(@(varible)varible.*sin(10.*pi.*varible)+2.0);%画出函数曲线
NIND=50;%定义个体数目
MAXGEN=25;%定义最大遗传代数
PRECI=22;%变量的二进制位数   2-(-1)=3/0.0000001
GGAP= 0.9;%代沟,在生成的后代中,保留百分之90,去掉百分之10的不优良的后代。
trace=zeros(2,MAXGEN);%寻优结果的初始值
FieldD=[22;-1;2;1;0;1;1];%区域描述器 转化为二进制
Chrom=crtbp(NIND,PRECI);%初始群体
gen=0;%代计数器
varible=bs2rv(Chrom,FieldD);%计算初试群体的十进制转换,二进制转化为十进制
ObjV=varible.*sin(10*pi*varible)+2.0;%计算目标函数值
while gen

流水车间调度

clear all;
clc;
addpath('C:\Users\23239\Desktop\.m机器学习文件\.m机器学习文件\遗传算法\gatbx');
a=[1,2,3,4,5];   %五个工件
T=[];
x=perms(a);      %x是a的所有排列,120种排列方式
j=[31,41,25,30;19,55,3,34;23,42,27,6;13,22,14,13;33,5,57,19;];  %导入加工时间表
c=cmax(a,j);     %a是顺序,j是i工序在k机器上花费时间,返回一个最大值函数,这个是适应度函数
%计算每一个序列的加工时间
NIND=40;         %定义个体数目,种群的数目,先随机的确定自己的种群个体数目
MAXGEN=25;       %定义最大遗传代数
PRECI=7;         %变量的二进制位数,7位数表达1,2,3,4所有排列
%在取值的范围内将其改成一个二进制的编码,代表二进制编码的位数,
%因为5个工件,所以有5!=120个组合,是解的范围,120用2进制表示需要7位,2^7=128个
GGAP= 0.9;       %代沟,去掉10%的不好的数据
trace=zeros(2,MAXGEN);     %寻优结果的初始值
FieldD=[7;1;120;1;0;1;1];  %区域描述器
%FieldD=[长度 lb ub code scale lbin ubin]是译码矩阵,一般用于二进制串到实值的转换
%lb和ub是行向量,表明每个变量的上界和下界code表明如何编码(code=1二进制,code=0格雷),scale指明刻度(scale=0算数,scale=1对数),lbin和ubin表示是否包含边界,0表示去掉,1表示包含
%表示7位二进制,范围是1-120,是连续的取值
Chrom=crtbp(NIND,PRECI);  %初始群体,
%此刻的初始化已经使用了二进制的编码方式
%行数为初始种群中的个体数40个,列数为其分配的二进制编码
gen=0;    %代计数器
varible=bs2rv(Chrom,FieldD);%计算初试群体的二进制转化为十进制转换,
%因为是随机连续的取值,所以需要在取整来代表1-120的整数
varible=round(varible);%40个样本
%round()是自动四舍五入的取整函数,
for i=1:length(varible)
ObjV(i,:)=cmax(x(varible(i),:),j);  %计算目标函数值
%x(varible(i),:)是一个序列[1,2,3,5,4] 
end
while gen

cmax

function c=cmax(a,j);
b=[];
b(a(1),1)=j(a(1),1);
for i=2:length(a)
    b(a(i),1)=b(a(i-1),1)+j(a(i),1);
end
for i=2:size(j,2)
    b(a(1),i)=b(a(1),i-1)+j(a(1),i);
end
for i=2:length(a)
    for k=2:size(j,2)
        b(a(i),k)=max(b(a(i-1),k),b(a(i),k-1))+j(a(i),k);%求前面和上面值中的最大值再加上本身的值
    end
end
c=b(a(end),size(j,2));%最后一个值即为最大流程时间

你可能感兴趣的:(matlab)