车间作业调度问题是一种NP完全问题,下面的源码是车间作业调度问题的源码,算法设计细节主要参考了以下文献
谢胜利,董金祥,黄强. 基于遗传算法的车间作业调度问题求解. 计算机工程与应用. 2002

function [S_best,T_min,LC]=JSPGA(M,N,Pc,Pm,Q,W)
%% 车间作业调度问题遗传算法
%  GreenSim团队原创作品,转载请注明
%  GreenSim团队长期从事算法设计、代写程序等业务
%  欢迎访问GreenSim——算法仿真团队→[url=http://blog.sina.com.cn/greensim]http://blog.sina.com.cn/greensim[/url]
%% 输入参数列表
%  M        遗传算法进化代数
%  N        种群规模
%  Pc       交叉概率
%  Pm       变异概率
%  Q        机器序号矩阵
%  W        操作时间矩阵
%% 输出参数列表
%  S_best   最优调度方案,m×1的细胞结构,每个细胞单元为La×2的矩阵
%  T_min    最优调度方案对应的最短调度时间
%  LC       历史最优适应值收敛曲线
%% 第一步:参数初始化
[n,k]=size(Q);%n为工件总数,k为工序总数
m=max(max(Q));%m为机器总数
S_best=cell(m,1);
T_min=inf;
LC=zeros(1,M);
%% 第二步:产生初始种群
farm=InitPop(N,Q,W,n,k,m);%调用产生初始种群的子函数
%%
counter=0;%设置迭代计数器
while counter<M%停止条件为达到最大迭代次数    
%%   第三步:交叉
    FARM=Cross(farm,Pc,m);%调用交叉子函数    
%%   第四步:变异
    FARM=Mutate(FARM,Pm,m);%调用变异子函数    
%%   第五步:修正算子
    FARM=Modify(FARM,Q,W,n,k);%调用修正子函数    
%%   第六步:计算适应值
    FITNESS=Fit(FARM);%调用计算适应值的子函数    
%%   第七步:选择复制
    [farm,fitness]=Select(FARM,FITNESS);%调用选择复制子函数    
%%   第八步:记录和更新
    [S_best,T_min,LC]=Updata(S_best,T_min,LC,farm,fitness,counter);%记录和更新子函数
    counter=counter+1;
    disp(counter);
end
function FARM=Cross(farm,Pc,m)
%% 子函数:交叉子函数
%% 输入参数列表
%  farm     交叉操作之前的种群
%  Pc       交叉概率
%  Q        机器序号矩阵,n×k的矩阵
%  W        操作时间矩阵,n×k的矩阵
%  n        工件总数
%  k        工序总数
%  m        机器总数
%% 输出参数列表
%  FARM        输出种群
%%
N=size(farm,2);
newfarm=cell(m,2*N);
SER=randperm(N);
A=farm(:,1);
B=farm(:,N);
pos=unidrnd(m-1);
AA=[A(1:pos,:);B((pos+1):end,:)];
BB=[B(1:pos,:);A((pos+1):end,:)];
newfarm(:,1)=AA;
newfarm(:,2)=BB;
for i=1:(N-1)
    A=farm(:,SER(i));
    B=farm(:,SER(i+1));
    pos=unidrnd(m-1);
    AA=[A(1:pos,:);B((pos+1):end,:)];
    BB=[B(1:pos,:);A((pos+1):end,:)];
    newfarm(:,2*i+1)=AA;
    newfarm(:,2*i+2)=BB;
end
%%
for i=1:(2*N)
    if Pc>rand
        A=newfarm(:,i);
        for j=1:m
            Aj=A{j};
            L=size(Aj,2);
            if L>2
                pos=unidrnd(L-2)+1;
                Bj=[Aj(:,1),Aj(:,(pos+1):end),Aj(:,2:pos)];
                A{j}=Bj;
            end
        end
        newfarm(:,i)=A;
    end
end
FARM=[farm,newfarm];
function FARM=Mutate(FARM,Pm,m)
%% 子函数:变异子函数
%% 输入参数列表
%  FARM     交叉操作之后新旧种群的合并种群
%  Pm       变异概率
%% 输出参数列表
%  FARM     输出种群
%%
NN=size(FARM,2);
for i=1:NN
    if Pm>rand
        A=FARM(:,i);
        for j=1:m
            Aj=A{j};
            L=size(Aj,2);
            if L>2
                pos=randperm(L-1)+1;
                pos1=pos(1);
                pos2=pos(2);
                temp=Aj(:,pos1);
                Aj(:,pos1)=Aj(:,pos2);
                Aj(:,pos2)=temp;
                A{j}=Aj;
            end
        end
        FARM(:,i)=A;
    end
end
欢迎访问GreenSim团队主页:http://blog.sina.com.cn/greensim
[color=red]欢迎访问GreenSim——算法仿真团队→[url=http://blog.sina.com.cn/greensim]http://blog.sina.com.cn/greensim[/url][/color]
function [S_best,T_min,LC]=Updata(S_best,T_min,LC,farm,fitness,counter)
%% 子函数:记录和更新子函数
%% 输入参数列表
%  S_best   最优调度方案,m×1的细胞结构,每个细胞单元为La×2的矩阵
%  T_min    最优调度方案对应的最短调度时间
%  LC       历史最优适应值收敛曲线
%  farm     种群
%  fitness  种群的适应值
%  counter  计数器
%% 输出参数列表
%  S_best   最优调度方案,m×1的细胞结构,每个细胞单元为La×2的矩阵
%  T_min    最优调度方案对应的最短调度时间
%  LC       历史最优适应值收敛曲线
%%
minfitness=min(fitness);
pos=find(fitness==minfitness);
POS=pos(1);
if minfitness<=T_min
    T_min=minfitness;
    S_best=farm(:,POS);
end
LC(counter+1)=T_min;