思路即适应度函数的设计
参考:[Matlab] 离散二进制粒子群算法(BPSO )解决背包问题
Matlab 代码
%% BQPSO 解决背包问题
%% 想法:解决十进制问题时需要将十进制的参数转化为二进制,二进制则可理解为粒子群中的粒子仅有一维
clc
clear
%% 创建初始种群
l = 40; % 粒子的个数
d = 10; % 维数
initPop = randsrc(l,d,[1 0;0.5 0.5]);
x = initPop;
beta = 0.7298; % 收缩膨胀因子参考 [2] 中的第六页的公式 2.8
% 计算适应度值
pbest = x; % 初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)
mbest = Get_mbest(pbest);
fitness = targetPackage(initPop',l);
ind = find(fitness == max(fitness), 1); % 找到适应度最大的那个粒子的下标
gbest = x(ind,:); % 定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)
fitnessbest=zeros(200,1);
best=0;
for t=1:200
P = zeros(l,d);
for i = 1:l
P(i,:) = Get_P(pbest(i,:), gbest);
c = [x(i,:);mbest];
b = beta*pdist(c,'hamming')*size(mbest,2)*log(1/rand);
if b/size(mbest,2)<1
Pr = b/size(mbest,2);
else
Pr = 1;
end
x(i,:) = Transf(P(i,:),Pr);
tempFit = targetPackage(x(i,:)',1);
if tempFit > targetPackage(pbest(i,:)',1)
pbest(i,:) = x(i,:);
end
if tempFit> targetPackage(gbest',1)
gbest = x(i,:);
end
end
h = targetPackage(gbest',1);
fitnessbest(t,1)=h;
end
%画图
plot(1:200,fitnessbest,'-');
grid on;
grid minor;
function mbest = Get_mbest(pbest)
[l,d] = size(pbest);
mbest = zeros(1,d);
for j = 1:d %个体维数
sums = 0;
for i = 1:l % 种群中个体的个数
sums = sums+ pbest(i,j);
end
avg = sums/l;
if avg > 0.5
mbest(:,j) = 1;
elseif avg == 0.5
if rand < 0.5
mbest(:,j) = 0;
else
mbest(:,j) = 1;
end
end
end
end
function Pi = Get_P(pbesti, gbest)
%对pbest和gbest执行交叉操作,以生成两个后代二进制字符串z1和z2;
d = size(gbest,2);
n = 1+ceil((d-2)*rand);
z1 = [pbesti(1,1:n),gbest(1,n+1:end)];
z2 = [gbest(1,1:n),pbesti(1,n+1:end)];
if rand > 0.5
Pi = z1;
else
Pi = z2;
end
end
function Xid = Transf(Pid,Pr)
% dvl 表示的是决策变量的长度,那什么是决策变量呢?,我理解为将十进制的参数转化为二进制时二进制的位数
% 比如 2 的决策变量的长度就是 2 ,因为 2 的二进制是10,8的决策变量是1000,dvl 的长度就是4;
dvl =size(Pid,2);
for i = 1:dvl
if rand < Pr
if Pid(:,i)==0
Pid(:,i)=1;
else
Pid(:,i)=0;
end
end
end
Xid = Pid;
end
% 汉明距离的计算 pdist(c,'hamming') 返回的是相异坐标所占的百分比,
%若想知道相异坐标个数,只需 pdist(c,'hamming') * 坐标的总个数
% 参考论文:
% [1] Sun J , Xu W , Fang W , et al. Quantum-Behaved Particle Swarm Optimization with Binary Encoding[C]// Adaptive & Natural Computing Algorithms, International Conference, Icannga, Warsaw, Poland, April, Part I. 2010.
% [2] 张兰. 量子粒子群算法及其应用[D]. 西北大学, 2010.
图像
最后吐槽一下 CSDN 没有 Matlab 的语法高亮真是让人看着难受,最后只能用C的语法高亮凑活用一下