09车间作业调度问题(JSP)的遗传算法通用MATLAB源代码

更新时间:2023-09-10 05:56:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

欢迎访问GreenSim团队主页→http://blog.sina.com.cn/greensim 邮箱:greensim@163.com 车间作业调度问题(JSP)的遗传算法通用MATLAB源代码

车间作业调度问题(JSP)是一类满足任务配置和顺序约束要求的资源分配问题,是最难的组合优化问题之一。下面的MATLAB源代码可用于求解标准JSP问题,虽然采用的是最普通的遗传算法,但在编解码环节,采用了十分巧妙的设计,可以大幅提高搜索效率。

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

FARM=Cross(farm,Pc,m);%调用交叉子函数 %% 第四步:变异

FARM=Mutate(FARM,Pm,m);%调用变异子函数 %% 第五步:修正算子

FARM=Modify(FARM,Q,W,n,k);%调用修正子函数 %% 第六步:计算适应值

FITNESS=Fit(FARM);%调用计算适应值的子函数 %% 第七步:选择复制

第1页

欢迎访问GreenSim团队主页→http://blog.sina.com.cn/greensim 邮箱:greensim@163.com [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};

第2页

欢迎访问GreenSim团队主页→http://blog.sina.com.cn/greensim 邮箱:greensim@163.com 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团队——专业级算法设计&代写程序

% 欢迎访问GreenSim团队主页→http://blog.sina.com.cn/greensim %% 子函数:记录和更新子函数 %% 输入参数列表

% S_best 最优调度方案,m×1的细胞结构,每个细胞单元为La×2的矩阵

第3页

欢迎访问GreenSim团队主页→http://blog.sina.com.cn/greensim 邮箱:greensim@163.com % 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; 源代码运行结果展示 调度干特图761242643455255614152211335411513143226636232441456262534565231636163335424154600102030时间405060 第4页

本文来源:https://www.bwwdw.com/article/sulh.html

Top