在上一篇博客 粒子群优化算法(1)中介绍了基本的粒子群算法,基本粒子群算法是基于连续空间(区间)进行搜索,然而在一些实际的工程应用中,我们的待求解的变量可能并不是历需的,而实一种离散型的变量。这就需要对基本的粒子群算法做出一些相应的改进。

在离散粒子群算法中,将离散问题空间映射到连续粒子运动空间,并做适当的修改。任然保留经典粒子群算法的速度-位置更新策略。粒子在状态空间的取值只限于0,1两个值,而速度的每一个位代表的是粒子位置所对应的位取值为0/1的可能性。因此在离散粒子群算法中,粒子速度的更新公式依然保持不变,但是个体最优位置和全局最优位置每一位的取值只能为0/1。

离散粒子群算法速度和位置的更新方式如下所示:

粒子速度的更新方式不变,但是其位置的更新方式如下所示:

                        (利用sigmoid函数将例子的速度映射到0-1之间)

则粒子的速度可以表示为:

例如,对于经典的0-1背包问题:如果采用粒子群优化算法求解,只能是采用离散的粒子群算法:
问题描述:

有一个容量为V的背包,有N件物品,第i件物品的体积是c(i),价值是w(i).那么将哪些物品放入背包中,可以使得价值最大。假设具体的数据如下:

假设N=10, V = 300, 每件物品的体积为:[95, 75, 23, 73, 50, 22, 6, 57, 89, 98], 物品的价值为[89, 59,19, 43, 100, 72, 44, 16, 7, 64]

具体的计算流程如下:

1. 对速度进行初始化,对粒子的位置进行初始化,这里粒子的位置采用的二进制的表示方法。1表示选择该物体,0表示不选择该物体。其他的参数的初始化的过程与前面的方法一样。

源代码:

clc;
clear all;
NP = 100;      % 种群个数
G = 200;       % 迭代次数
D = 10;        % 决策变量的维度
c1 = 1.5;      % 学习因子
c2 = 1.5;
w_max = 0.8;   % 惯性权重
w_min = 0.4;
v_max = 5;     % 粒子的速度限制
v_min = -5;
V = 300;       % 背包容量
capacity = [95 75 23 73 50 22 6 57 89 98];      % 物品的体积
weight = [89 59 19 43 100 72 44 16 7 64];       % 物品的价值
penality = 2;
% 初始化种群个体
x = (rand(NP,D)>0.5);                        % 产生均匀分布的二进制串  randn产生的是符合正态分布的随机数
v = v_min + rand(NP,D)*(v_max - v_min);      % 速度进行初始化% 初始化个体最优
individual_best = x;       %  每个个体的历史最优
pbest = zeros(NP, 1);      %  个体最优位置对应的适应度值
for k=1:NPpbest(k, 1) = func(individual_best(k, :), capacity, weight, V, penality);
end% 初始化全局最优
global_best = zeros(1, D);
global_best_fit = eps;
for k=1:NPtemp = func(individual_best(k, :), capacity, weight, V, penality);if temp > global_best_fitglobal_best = individual_best(k, :);global_best_fit = temp;end
end% 进行迭代
for gen = 1:G% 计算动态惯性权值w = w_max - (w_max-w_min) * gen / G;for k=1:NP% 更新速度v(k, :) = w * v(k, :) + c1 * rand() * (individual_best(k, :) - x(k, :)) + c2 * rand() * (global_best - x(k, :));% 边界条件处理    % 边界吸收for t=1:Dif v(k, D) > v_maxv(k, D) = v_max;endif v(k, D) < v_minv(k, D) = v_min;endend% 使用sigmoid函数对速度进行映射vs(k, :) = 1./(1+exp(-v(k, :)));% 更新粒子的位置for t=1:Dif vs(k, t)>rand()x(k, t) = 1;elsex(k, t) = 0;endendend% 计算个体历史最优与全局最优% 个体历史最优for k=1:NPold_fitness = func(individual_best(k, :), capacity, weight, V, penality);new_fitness = func(x(k, :), capacity, weight, V, penality);if new_fitness > old_fitnessindividual_best(k, :) = x(k, :);pbest(k, 1) = new_fitness;endend% 全局最优for k=1:NPtemp = func(individual_best(k, :), capacity, weight, V, penality);if temp > global_best_fitglobal_best = individual_best(k, :);global_best_fit = temp;endendglobal_optimal(gen) = global_best_fit;      % 记录每次迭代中
endfigure(1)
plot(global_optimal);% 定义适应度函数
function res = func(x, capacity, weight, bag_volume, penality)% 适应度函数的输入参数% x: 可行解  二进制串% capacity:  物品的体积% bag_volume:  背包的容积% penality:   惩罚系数fitness = sum(x.*weight);          % 总的价值total_volume = sum(x.*capacity);   % 总的体积if total_volume <= bag_volumeres = fitness;elseres = fitness - penality * (total_volume - bag_volume);end
end

运行结果:

除此之外,还可以使用离散粒子群算法求解单变量的优化问题:
例如,求解函数的极值,函数的表达式如下所示:

其中:

可以画出函数的图像,如下所示:

源代码:

clc;
clear all;
xx = 0:0.05:9;
f_x = xx + 6*sin(4.*xx) + 9*cos(6.*xx);
figure(1)
plot(xx, f_x);
title('f(x)=x+6sin(4x)+9cos(6x)');
xlabel('x');
ylabel('f(x)');NP = 100;      % 种群个数
G = 200;       % 迭代次数
D = 10;        % 二进制编码的为位数
c1 = 1.5;      % 学习因子
c2 = 1.5;
w_max = 0.8;   % 惯性权重
w_min = 0.4;
v_max = 5;     % 粒子的速度限制
v_min = -5;
x_min = 0;
x_max = 9;
mode = 'min';  % 模式选择,是求函数的最大值函数函数的最小值  'min' , 'max'% 初始化种群个体
x = (rand(NP,D)>0.5);                        % 产生均匀分布的二进制串  randn产生的是符合正态分布的随机数
v = v_min + rand(NP,D)*(v_max - v_min);      % 速度进行初始化% 初始化个体最优
individual_best = x;       %  每个个体的历史最优
pbest = zeros(NP, 1);      %  个体最优位置对应的适应度值
for k=1:NP pbest(k, 1) = func(individual_best(k, :), x_max, x_min, D);
end% 初始化全局最优
if strcmp(mode, 'max')      % 求函数的最大值global_best = zeros(1, D);global_best_fit = eps;for k=1:NPtemp = func(individual_best(k, :), x_max, x_min, D);if temp > global_best_fitglobal_best = individual_best(k, :);global_best_fit = temp;endend
else                        % 求函数的最小值global_best = zeros(1, D);global_best_fit = inf;for k=1:NPtemp = func(individual_best(k, :), x_max, x_min, D);if temp < global_best_fitglobal_best = individual_best(k, :);global_best_fit = temp;endend
end% 开始迭代
for gen=1:G% 计算动态惯性权值w = w_max - (w_max-w_min) * gen / G;for k=1:NP% 更新速度v(k, :) = w * v(k, :) + c1 * rand() * (individual_best(k, :) - x(k, :)) + c2 * rand() * (global_best - x(k, :));% 边界条件处理    % 边界吸收for t=1:Dif v(k, D) > v_maxv(k, D) = v_max;endif v(k, D) < v_minv(k, D) = v_min;endend% 使用sigmoid函数对速度进行映射vs(k, :) = 1./(1+exp(-v(k, :)));% 更新粒子的位置for t=1:Dif vs(k, t)>rand()x(k, t) = 1;elsex(k, t) = 0;endendend% 更新粒子的历史最有位置if strcmp(mode, 'min')% 个体最优位置for k=1:NPold_fitness = func(individual_best(k, :), x_max, x_min, D);new_fitness = func(x(k, :), x_max, x_min, D);if new_fitness < old_fitnessindividual_best(k, :) = x(k, :);     % 个体最优位置更新endend% 全局最优位置for k=1:NPtemp = func(individual_best(k, :), x_max, x_min, D);if temp < global_best_fitglobal_best = individual_best(k, :);global_best_fit = temp;endendelse% 个体最优位置for k=1:NPold_fitness = func(individual_best(k, :), x_max, x_min, D);new_fitness = func(x(k, :), x_max, x_min, D);if new_fitness > old_fitnessindividual_best(k, :) = x(k, :);     % 个体最优位置更新endend% 全局最优位置for k=1:NPtemp = func(individual_best(k, :), x_max, x_min, D);if temp > global_best_fitglobal_best = individual_best(k, :);global_best_fit = temp;endendend% 记录函数的适应度值fitness_optimal(gen) = global_best_fit;
endfigure(2)
plot(fitness_optimal);
xlabel('x')
ylabel('f(x)');
title(['适应度值  ', num2str(fitness_optimal(end)), ' | ', num2str(x_min+(x_max-x_min)/(2^D-1)*binary2dec(global_best))]);function res = func(x, xmax, xmin, D)% 参数  x 二进制串% vmax : 速度的最大值% vmin : 速度的最小值% D : 二进制的编码位数temp_ = binary2dec(x);temp = xmin + (xmax-xmin)/(2^D-1) * temp_;res = temp + 6*sin(4*temp) + 9*cos(6*temp);
endfunction res = binary2dec(x)total_value = 0;for k=length(x):-1:1total_value = total_value + x(k)*2^(length(x)-k);endres = total_value;
end

求取最大值,将mode参数设置为‘max’即可:

求取最小值,将mode参数设置为‘min’即可:

粒子群优化算法(2)离散粒子群算法相关推荐

  1. 【二次分配问题】基于遗传算法 (GA)、粒子群优化 (PSO) 和萤火虫算法 (FA) 求解二次分配( QAP)问题(MATLAB 实现)

    目录 1 概述 3 运行结果 3.1 萤火虫算法 3.2 粒子群优化算法 3.3 遗传算法

  2. 基于粒子群优化的灰色预测方法(Matlab)——附代码

    目录 摘要: 研究背景: GM(1,1)模型 基于PSO的灰色预测算法 运行结果: 本文Matlab代码分享 摘要: 本文对灰色预测算法进行了研究.在GM(1,1)模型中,发展系数a和灰色作用量u是两 ...

  3. 自适应变异粒子群matlab,一种自适应变异粒子群优化算法的制作方法

    本算法属于数据挖掘领域,涉及到SVM分类器和参数寻优,特别涉及到其变异操作,使得能够最大限度的搜索到全局最优解. 背景技术: 网格划分法是SVM分类器中常用的一种参数寻优方法,原因如下:一是网格划分法 ...

  4. matlab 动态邻域粒子群,求解TSP问题的动态邻域粒子群优化算法

    1引言粒子群优化(ParticleSwarmOptimization,PSO)算法于1995年由Eberhart博士和Kennedy博士提出,它是一类新兴的基于群智能优化算法[1],同其它的进化算法相 ...

  5. 粒子群优化算法改进之多子群合作粒子群优化算法

    粒子群优化算法文献阅读 文章目录 粒子群优化算法文献阅读 前言 题目:Enhanced multi-swarm cooperative particle swarm optimizer 期刊:Swar ...

  6. 改进粒子群优化算法(IWAPSO)的MATLAB源程序

    改进粒子群优化算法(IWAPSO)的MATLAB源程序 作者:aaron8967    主页:http://aaron8967.blog.51cto.com 说明:粒子群优化算法(Particle S ...

  7. 蚁群算法优化神经网络matlab源程序,粒子群优化神经网络的程序大集合

    粒子群程序集合 866867259psobp psobp.m pso(粒子群算法)优化神经网络 粒子群算法(PSO)应用于神经网络优化[matlab] PSOt A Particle Swarm Op ...

  8. 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用

    粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...

  9. Python自定义:粒子群优化算法

    Python中的粒子群算法 例子算法又被称作飞鸟觅食算法,是一种常见的现代启发式优化算法.在Python中,处于不同的情况考虑,我们都可能使用到该算法.在这里我给出三种情况下的解决方案或者替代方案. ...

最新文章

  1. 为什么vs数据库中文显示问号_本科论文知网不收录为什么会被知网查重到?
  2. DrugBank:小分子数据信息挖掘
  3. 小能量汇聚成大能量_清体能量棒配料解析:小种子,大能量,藜麦和青稞
  4. postman发送post请求,服务器日志确保GET请求错误“ PageNotFound:208 Request method ‘GET‘ not supported”
  5. 程序图形化界面刷新以及如何从tkinter窗口中正确读出数据
  6. P6772-[NOI2020]美食家【矩阵乘法,倍增】
  7. Linux命令-关机,重启
  8. kafka 在 360 商业化的实践
  9. 前端自适应----单位rem
  10. 【STM32】USART收发---内嵌中断向量控制器
  11. 当AD19原理图导出位PCB图时报错UnkownPin和Failed to add class member可能的解决办法
  12. java.util.List 的大小
  13. linux拿虚拟机充当路由,Linux通过虚拟机模拟路由器实现主机跨路由通信
  14. java se 通用能力-判断推理专项练习(选择题)
  15. PHP实现倒计时插件代码
  16. 联想微型计算机怎么光盘启动,联想笔记本电脑win10怎么设置光盘启动
  17. android仿饿了么购物车效果,仿饿了么购物车跳动
  18. C4D模型工具—连接点/边
  19. mysql中+desc用法_mysql desc(DESCRIBE)命令实例讲解
  20. JSHOP2与ROS通信

热门文章

  1. *pdb时出错;请检查是否是磁盘空间不足、路径无效或权限不够
  2. mysql 表字段部分替换
  3. linux目录表及功能n鸟哥,鸟哥linux学习之-文件属性跟系统目录
  4. 一步一步写算法(之双向链表)
  5. php跳转到safari打开,新手教程: 如何重新打开关闭的Safari标签
  6. vue中warning_5种处理Vue异常的方法
  7. 语言图片渐入代码_这个可能打败Python的编程语言,正在征服科学界
  8. 【函数的定义、调用(嵌套调用、递归调用)、声明、函数的分类(有无返回值、有无参数)、变量(自动变量与静态变量、局部变量与全局变量、只读变量)】(学习笔记7--函数)
  9. 计算机知识ppt图片大全,PowerPoint基础知识
  10. php for 循环 try_PHP基础案例四:展示学生列表