Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
普通会员
注册日期: 2008-10-06
年龄: 25
帖子: 53
声望力: 18 ![]() |
![]()
车间作业调度问题是一种NP完全问题,下面的源码是车间作业调度问题的源码,算法设计细节主要参考了以下文献
谢胜利,董金祥,黄强. 基于遗传算法的车间作业调度问题求解. 计算机工程与应用. 2002 本源码由GreenSim团队原创,转载请注明,有意购买源码或代写相关程序,请与GreenSim团队联系。 function [S_best,T_min,LC]=JSPGA(M,N,Pc,Pm,Q,W) %% 车间作业调度问题遗传算法 % GreenSim团队原创作品,转载请注明 % 欢迎访问GreenSim——算法仿真团队→http://blog.sina.com.cn/greensim %% 输入参数列表 % 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 欢迎访问GreenSim——算法仿真团队→http://blog.sina.com.cn/greensim 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;
__________________
算法设计、代写程序,欢迎访问GreenSim团队主页→ http://blog.sina.com.cn/greensim |
![]() |
![]() |