参考资料:
https://blog.csdn.net/yake827/article/details/42651829
一、在matlab中编程
因为我想生成16进制的数,所以加了一个dec2hex,加了之后生成的文件有点问题,因为这个时候生成的y是两列字符,不是数字,可能因为这个原因生成的文件莫名其妙多了一个空格,所以只能把加的逗号去掉。
二、问题
现在想想直接生成十进制数也不是不可以。
算法流程
背包问题
Matlab 代码
%% 二进制蝙蝠算法 %初始化种群 r = 0.7; narvs = 10; %问题的维度 n = 100; dim = narvs; maxgen = 100; populationSize = 100; Qmin=0; % Frequency minimum 频率最小值 Qmax=2; % Frequency maximum 频率最大值 Q=zeros(n,1); % Frequency v=zeros(n,dim); % Velocities 速度 cg_curve=zeros(1,maxgen); x = randsrc(n,narvs,[0,1;0.5,0.5]); %计算适应度值 fitness =targetPackage(x',100); %找到当前最好 [fmax,I]=max(fitness); best=x(I,:); A = 0.6; bestfit = zeros(maxgen,1); for i = 1:maxgen cg_curve(i)=fmax; %当前值 for j = i:populationSize for d = 1:dim Q(i) = Qmin+(Qmin-Qmax)*rand; %更新频率 v(j,d) = v(j,d)+(x(j,d)-best(d))*Q(j); %更新速度 % V型的转换函数,很多采用的是西格玛函数用于速度到位置的离散转换 V_shaped_transfer_function=abs((2/pi)*atan((pi/2)*v(j,d))); if rand<V_shaped_transfer_function % Equation 10 in the paper x(j,d)=~x(j,d); else x(j,d)=x(j,d); end if rand > r % Pulse rate () x(j,d)=best(d); end end Fnew = targetPackage(x(j,:)',1); if (Fnew >= fitness(j,:))&&(rand < A) x(j,:)=x(j,:); fitness(j,:) = Fnew; end if Fnew>=fmax best=x(j,:); fmax=Fnew; end end bestfit(i,:) = fmax; end targetPackage(best',1) plot(bestfit)
目标函数
function fitness = targetPackage(x,indNum) %targetPackage 此处显示有关此函数的摘要 % X:表示种群 volume=[95 75 23 73 50 22 6 57 89 98]; %物品体积 value=[89 59 19 43 100 72 44 16 7 64]; %物品价值 Weight=300; %背包重量 % a = zeros(indNum,1); % for i=1:indNum % a(i,1) = volume*x(:,i); % end %超过总重量的个体的适应度值都视为0 k = find(volume*x<Weight); fitness=zeros(indNum,1); for j=1:size(k,2) fitness(k(j),1) = value*x(:,k(j)); end end
仿真结果
参考文献
[1] Mirjalili, Seyedali, Seyed Mohammad Mirjalili, and Xin-She Yang. 2014. “Binary Bat Algorithm.” Neural Computing and Applications 25 (3): 663–81.
参考资料:
https://blog.csdn.net/yake827/article/details/42651829
一、在matlab中编程
因为我想生成16进制的数,所以加了一个dec2hex,加了之后生成的文件有点问题,因为这个时候生成的y是两列字符,不是数字,可能因为这个原因生成的文件莫名其妙多了一个空格,所以只能把加的逗号去掉。
二、问题
现在想想直接生成十进制数也不是不可以。
转载于:https://www.cnblogs.com/zlll/p/9732289.html
Polynomial : 多项式
InitialState:初始化状态。移位寄存器的初始内容。 可以将此属性指定为二进制标量,二进制向量或以’0x’开头的字符串,该字符串是二进制向量的十六进制表示形式。 作为二进制矢量,其长度必须比多项式的二进制矢量表示的长度小一。
ReflectInput:输入。一个布尔量,指定在进入移位寄存器之前是否应按字节对输入数据进行翻转。
ReflectRemainder: 一个布尔量,指定在输入数据完全通过移位寄存器后,是否应将二进制输出CRC校验和绕其中心翻转。
c r c . generator的理解:
Usage Example:% Construct a CRC generator with a polynomial defined % by x^4+x^3+x^2+x+1: h = crc.generator([1 1 1 1 1]) % Construct a CRC generator with a polynomial defined % by x^4+x^3+x^2+x+1, all-ones initial states, reflected % input, and all-zeros final XOR value: h = crc.generator('Polynomial', '0xF', 'InitialState', ... '0xF', 'ReflectInput', true, 'FinalXOR', '0x0') % Create a CRC-16 CRC generator, then use it to generate % a checksum for the % binary vector represented by the ASCII sequence '123456789'. gen = crc.generator('Polynomial', '0x8005', ... 'ReflectInput', true, 'ReflectRemainder', true); % The message below is an ASCII representation of ... % the digits 1-9 msg = reshape(de2bi(49:57, 8, 'left-msb')', 72, 1); % 将49:57这些数字转换为8行的2禁止数据,左位为最高位。然后再把数组变为9*8的 72行 1列数据 encoded = generate(gen, msg); % Construct a CRC generator with a polynomial defined % by x^3+x+1, with zero initial states, % and with an all-ones final XOR value: h = crc.generator('Polynomial', [1 0 1 1], ... 'InitialState', [0 0 0], ... 'FinalXOR', [1 1 1])
函数:de2bi( 把一个十进制数转换成一个字符串形式的二进制数)
具体参看 CRC在matlab中运用 篇博客
MATLAB遗传算法函数总结
种群表示和初始化函数 bs2rv:
二进制串到实值的转换
Phen=bs2rv(Chrom,FieldD) FieldD=[len, lb, ub, code, scale, lbin, ubin]
code(i)=1为标准的二进制编码,code(i)=0为格雷编码
scale(i)=0为算术刻度,scale(i)=1为对数刻度
函数 crtbp:
创建初始种群
[Chrom,Lind,BaseV]=crtbp(Nind,Lind)
[Chrom,Lind,BaseV]=crtbp(Nind,BaseV)
[Chrom,Lind,BaseV]=crtbp(Nind,Lind,BaseV)
Nind指定种群中个体的数量,Lind指定个体的长度
函数 crtrp:
创建实值原始种群
Chrom=crtrp(Nind,FieldDR)
适应度计算函数 ranking:
基于排序的适应度分配(此函数是从最小化方向对个体进行排序的)
FitV=ranking(ObjV)
FitV=ranking(ObjV, RFun)
FitV=ranking(ObjV, RFun, SUBPOP)
Rfun(1)线性排序标量在[1 2]间为,非线性排序在[1 length(ObjV)-2]
Rfun(2)指定排序方法,0为线性排序,1为非线性排序
SUBPOP指明ObjV中子种群的数量,默认为1
选择高级函数 select:
从种群中选择个体
SelCh=select(SEL_F, Chrom, FitnV)
SelCh=select(SEL_F, Chrom, FitnV, GGAP)
SelCh=select(SEL_F, Chrom, FitnV, GGAP, SUBPOP)
SEL_F是一字符串,为一低级选择函数名,如rws或sus
GGAP指出了代沟,默认为1;也可大于1,允许子代数多于父代的数量
rws: 轮盘赌选择
NewChrIx=rws(FitnV, Nsel) 使用轮盘赌选择从一个种群中选择Nsel个个体
NewChrIx 是为育种选择的个体的索引值
sus:
随机遍历抽样
NewChrIx=sus(FitnV, Nsel)
交叉高级函数 recombin:
重组个体
NewChrom=recombin(REC_F, Chrom)
NewChrom=recombin(REC_F, Chrom, RecOpt)
NewChrom=recombin(REC_F, Chrom, RecOpt, SUBPOP)
REC_F是包含低级重组函数名的字符串,例如recdis,recint,reclin,xovdp, xovdprs, xovmp, xovsh, xovshrs, xovsp, xovsprs
recdis:
离散重组
NewChrom=recdis(OldChorm)
recint:
中间重组
NewChrom=recint(OldChorm)
reclin:
线性重组
NewChrom=reclin(OldChorm)
xovdp:
两点交叉
NewChrom=xovdp(OldChrom, XOVR)
XOVR为交叉概率, 默认为0.7
Xovdprs:
减少代理的两点交叉
NewChrom=xovdprs(OldChrom, XOVR)
Xovmp:
多点交叉
NewChrom=xovmp(OldChrom, XOVR, Npt, Rs)
Npt指明交叉点数, 0 洗牌交叉;1 单点交叉;2 两点交叉;
默认为0
Rs指明使用减少代理, 0 不减少代理;1 减少代理;
默认为0
Xovsh:
洗牌交叉
NewChrom=xovsh(OldChrom, XOVR)
Xovshrs:
减少代理的洗牌交叉
NewChrom=xovshrs(OldChrom, XOVR)
Xovsp:
单点交叉
NewChrom=xovsp(OldChrom, XOVR)
Xovsprs:
减少代理的单点交叉
NewChrom=xovsprs(OldChrom, XOVR)
变异高级函数 mutate:
个体的变异
NewChorm=mutate(MUT_F, OldChorm, FieldDR) NewChorm=mutate(MUT_F, OldChorm, FieldDR, MutOpt) NewChorm=mutate(MUT_F, OldChorm, FieldDR, MutOpt, SUBPOP) MUT_F为包含低级变异函数的字符串,例如mut, mutbga, recmut
mut:
离散变异算子
NewChrom=mut(OldChorm, Pm) NewChrom=mut(OldChorm, Pm, BaseV)
Pm为变异概率,默认为Pm=0.7/Lind
mutbga:
实值种群的变异(遗传算法育种器的变异算子) NewChrom=mutbga(OldChorm, FieldDR)
NewChrom=mubga(OldChorm, FieidDR, MutOpt)
MutOpt(1)是在[ 0 1]间的重组概率的标量,默认为1
MutOpt(2)是在[0 1]间的压缩重组范围的标量,默认为1(不压缩)
recmut:
具有突变特征的线性重组
NewChrom=recmut(OldChorm, FieldDR)
NewChrom=recmut(OldChorm, FieidDR, MutOpt)
重插入函数 reins:
重插入子群到种群
Chorm=reins(Chorm, SelCh)
Chorm=reins(Chorm, SelCh, SUBPOP)
Chorm=reins(Chorm, SelCh, SUBPOP, InsOpt, ObjVch)
[Chorm, ObjVch]=reins(Chorm, SelCh, SUBPOP, InsOpt, ObjVch, ObjVSel)
InsOpt(1)指明用子代代替父代的选择方法,0为均匀选择,1为基于适应度的选择,默认为0
InsOpt(2)指明在[0 1]间每个子种群中重插入的子代个体在整个子种群的中个体的比率,默认为1
ObjVch包含Chorm中个体的目标值,对基于适应度的重插入是必需的
ObjVSel包含Selch中个体的目标值,如子代数量大于重插入种群的子代数量是必需的
其他函数矩阵复试函数 rep:
MatOut=rep(MatIn, REPN)
REPN为复制次数