s1=pchrom; s2=zeros(1,SH); p=zeros(1,N); for i=1:SH p(s1(i))=p(s1(i))+1; s2(i)=p(s1(i)); end
时间: 2024-04-26 17:22:59 浏览: 18
这段代码是用来将个体中的工序顺序映射到对应的机器上的。具体来说,代码将个体中的每个工序映射到一个机器上,生成一个新的个体。其中,s1表示个体中的工序顺序,s2表示映射后的机器顺序,p表示每个工序对应的机器已经分配了多少次。对于每个工序,代码首先将其对应的机器分配次数加1,然后将新的机器顺序记录在s2中。最终,代码将映射后的机器顺序保存在s2中,返回给调用者。
相关问题
s1=pro_m; s2=zeros(1,SH); p=zeros(1,N); for i=1:SH p(s1(i))=p(s1(i))+1;%记录过程是否加工完成 完成一次加一 s2(i)=p(s1(i));%记录加工过程中,工件的次数 end
这段代码的作用是将一个生产过程中的产品按照顺序进行加工,并记录每个产品加工的次数。
具体来说,这段代码的输入为一个生产过程的产品序列 pro_m,其中 pro_m(i) 表示第 i 个产品的编号。输出为一个记录每个产品加工次数的向量 s2,其中 s2(i) 表示第 i 个产品加工的次数。同时,代码中使用向量 p 记录每个产品是否加工完成,其中 p(i) 表示编号为 i 的产品是否加工完成,如果完成则 p(i) 的值加 1。
具体实现方法是,通过循环遍历生产过程中的每一个产品 i,将 p(s1(i)) 的值加 1,表示编号为 s1(i) 的产品已经加工完成了一次。同时,将 s2(i) 的值设置为 p(s1(i)),表示编号为 s1(i) 的产品已经加工了 s2(i) 次。
需要注意的是,这段代码中的常量 SH 和 N 没有给出具体的定义,可能需要根据上下文进行推断。
function [pchrom,mchrom]=mutation(pchrom,mchrom) global SH N H NM M; %进行工序变异 p1=ceil(rand*SH); %第一个变异位点 p2=ceil(rand*SH); %第二个变异位点 while (p1==p2)||(pchrom(p1)==pchrom(p2)) %确保两个变异位点不同,且所对应的工序号不同 p2=ceil(rand*SH); end t=pchrom(p1); pchrom(p1)=pchrom(p2); %将两个工序进行交换 pchrom(p2)=t; %进行机器变异 s1=pchrom; s2=zeros(1,SH); p=zeros(1,N); for i=1:SH p(s1(i))=p(s1(i))+1; s2(i)=p(s1(i));%工件加工次数 end s3=mchrom; p1=ceil(rand*SH); %第一个变异位点 转换为一个介于1到SH之间的整数,作为变异位点。 p2=ceil(rand*SH); %第二个变异位点 while(p1==p2) p2=ceil(rand*SH); end n=NM{s1(p1),s2(p1)}; m=ceil(rand*n); x=M{s1(p1),s2(p1),m}; if n>1 while(s3(p1)==m) m=ceil(rand*n); x=M{s1(p1),s2(p1),m}; end end mchrom(1,sum(H(1,1:s1(p1)-1))+s2(p1))=x; n=NM{s1(p2),s2(p2)}; m=ceil(rand*n); x=M{s1(p2),s2(p2),m}; if n>1 while(s3(p1)==m) m=ceil(rand*n); x=M{s1(p2),s2(p2),m}; end end mchrom(1,sum(H(1,1:s1(p2)-1))+s2(p2))=x; end
这段代码是一个基因算法中的变异函数,用于对染色体进行变异操作。根据代码的注释,可以看出其具体的操作步骤是:
1. 随机选择两个不同的变异位点p1和p2,保证其对应的工序号不同;
2. 将p1和p2所对应的工序进行交换,进行工序变异;
3. 随机选择两个不同的变异位点p1和p2,对应于机器上的加工位置;
4. 从可能的加工选项中随机选择一个加工操作进行变异;
5. 重复步骤4,直到选择出不同于原来的加工操作为止。
其中,NM和M是保存了工件加工次数和加工操作的矩阵,H和N是与机器和工件相关的矩阵。在变异函数中,通过这些矩阵来确定变异的位置和可能的加工操作,从而实现对染色体的变异操作。