利用 一种二进制编码的量子粒子群优化算法(BQPSO)解决背包问题 [Matlab]

该博客详细介绍了如何利用Matlab实现基于二进制粒子群优化(BPSO)算法解决背包问题。文章首先阐述了适应度函数的设计思路,接着提供了完整的Matlab代码实现,包括初始化种群、计算适应度值、更新粒子位置等关键步骤。此外,还展示了适应度值随迭代次数变化的图像,以验证算法效果。
摘要由CSDN通过智能技术生成

思路即适应度函数的设计

参考[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 的二进制是108的决策变量是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的语法高亮凑活用一下

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值