基于Matlab的离散二进制粒子群算法(DPSO/BPSO)实现需要结合二进制编码特性和离散空间搜索策略
一、核心算法设计
1. 二进制编码与初始化
-
编码方式:采用0-1二进制串表示解空间,例如路径规划中节点选择(1表示选中,0表示未选)
-
粒子结构:
particles = randi([0,1], nPop, nVars); % nPop粒子数,nVars决策变量维度 velocities = zeros(nPop, nVars); % 速度矩阵 pBest = particles; % 个体最优 gBest = particles(1,:); % 全局最优
2. 速度更新策略
-
Sigmoid函数映射:将连续速度转换为转移概率
function prob = sigmoid(x) prob = 1./(1 + exp(-x)); % S型传递函数 end
-
速度更新公式:
r1 = rand(nPop, nVars); r2 = rand(nPop, nVars); velocities = w*velocities + ... c1*r1.*(pBest - particles) + ... c2*r2.*(gBest - particles);
3. 位置更新规则
-
概率选择机制:
for i = 1:nPop for j = 1:nVars if rand < sigmoid(velocities(i,j)) particles(i,j) = 1; else particles(i,j) = 0; end end end
二、关键参数设置
参数 | 典型取值范围 | 作用说明 |
---|---|---|
惯性权重w | 0.5-1.5 | 平衡全局与局部搜索能力 |
加速因子c1 | 1.5-2.5 | 个体认知权重 |
加速因子c2 | 1.5-2.5 | 群体认知权重 |
最大迭代 | 100-500 | 终止条件 |
粒子规模 | 20-100 | 种群多样性控制 |
三、Matlab
function [gBest, gBest_fitness] = BPSO(objFun, nPop, nVars, maxIter)
% 参数初始化
w = 0.9; % 惯性权重
c1 = 2.0; % 个体学习因子
c2 = 2.0; % 群体学习因子
% 粒子初始化
particles = randi([0,1], nPop, nVars);
pBest = particles;
gBest = particles(1,:);
% 主循环
for iter = 1:maxIter
% 计算适应度
fitness = arrayfun(@(i) objFun(particles(i,:)), 1:nPop);
% 更新个体最优
updateIdx = fitness < arrayfun(@(i) objFun(pBest(i,:)), 1:nPop);
pBest(updateIdx,:) = particles(updateIdx,:);
% 更新全局最优
[~, bestIdx] = min(fitness);
if fitness(bestIdx) < objFun(gBest)
gBest = particles(bestIdx,:);
end
% 速度更新
r1 = rand(nPop, nVars);
r2 = rand(nPop, nVars);
velocities = w*velocities + ...
c1*r1.*(pBest - particles) + ...
c2*r2.*(gBest - particles);
% 位置更新(Sigmoid概率转换)
for i = 1:nPop
for j = 1:nVars
if rand < 1./(1 + exp(-velocities(i,j)))
particles(i,j) = 1;
else
particles(i,j) = 0;
end
end
end
end
end
参考代码 DPSO离散二进制粒子群算法编程以及实现
四、典型应用场景
- 路径规划:栅格地图中选择最优路径节点
- 特征选择:二进制特征子集优化(0表示舍弃,1表示保留)
- 任务调度:离散时间槽的任务分配优化
- 网络路由:多跳路由中继节点选择
注:实际应用中需根据问题特性调整编码方式和适应度函数,建议通过Matlab Parallel Toolbox加速大规模计算。完整工程案例可参考《基于DPSO的无线传感器网络分簇优化系统设计》。