基于二进制正余弦算法的背包问题求解- 附代码

2024-06-18 07:18

本文主要是介绍基于二进制正余弦算法的背包问题求解- 附代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于二进制正余弦算法的背包问题求解- 附代码

文章目录

  • 基于二进制正余弦算法的背包问题求解- 附代码
    • 1.二进制正余弦算法
    • 2.背包问题
    • 3.实验结果
    • 4.参考文献
    • 5.Matlab

摘要:本文主要介绍二进制正余弦算法,并用其对背包问题进行求解。

1.二进制正余弦算法

正余弦优化算法是一种随机优化算法,具有高度的灵活性,原理简单,易于实现,可以方便地应用于不同领域的优化问题。正余弦优化算法的寻优过程可分为两个阶段,在探索阶段,优化算法通过结合某随机解在所有随机解中快速寻找搜索空间中的可行区域; 到了开发阶段,随机解会逐渐发生变化,且随机解的变化速度会低于探索阶段的速度。在正弦余弦算法中,首先候选解会被随机初始化,然后会根据正弦或者余弦函数并结合随机因子来更新当前解在每一维度上的值。其具体更新方程为:
X i t + 1 = { X i t + r 1 ∗ s i n ( r 2 ) ∗ ∣ r 3 P i t − X i t ∣ r 4 < 0.5 X i t + r 1 ∗ c o s ( r 2 ) ∗ ∣ r 3 P i t − X i t ∣ r 4 > 0.5 (1) X_{i}^{t+1}=\begin{cases}X_{i}^{t}+r_{1}*sin(r_{2})*|r_{3}P_{i}^{t}-X_{i}^{t}|\quad r_{4}<0.5\\ X_{i}^{t}+r_{1}*cos(r_{2})*|r_{3}P_{i}^{t}-X_{i}^{t}|\quad r_{4}>0.5\end{cases}\tag{1} Xit+1={Xit+r1sin(r2)r3PitXitr4<0.5Xit+r1cos(r2)r3PitXitr4>0.5(1)
式中: X i t X_{i}^{t} Xit是当前个体的第 i i i维第 t t t代的位置; r 2 r_{2} r2为0到 2 π 2\pi 2π的随机数; r 3 r_{3} r3为0到2之间的随机数; r 4 r_{4} r4为0到1的随机数, P i t P_{i}^{t} Pit表示在t次迭代时最优个体位置变量的第 i i i维的位置。
r 1 = a − t a T (2) r_{1}=a-t\frac{a}{T}\tag{2} r1=atTa(2)
式中: a a a 是一个常数; t t t 为当前迭代次数; T T T 为最大迭代次数; 参数 r 1 r_{1} r1表示下一个解的位置区域在当前解和最优解之内或者之外,较小的 r 1 r_{1} r1的值有助于增强算法的局部开发能力,较大的 r 1 r_{1} r1的值有助于提高算法的全局探索能力,同时 r 1 r_{1} r1的值随迭代次数逐渐减小,平衡了算法局部开发和全局搜索的能力; r 2 , r 3 , r 4 r_{2},r_{3},r_{4} r2,r3,r4为随机因子,参数 r 2 r_{2} r2定义了当前解朝向或者远离最优解多远; 参数 r 3 r_{3} r3为最优解给出一个随机权值,是为了随机强调 ( r 3 > 1 ) (r_{3}>1) (r31) 或者忽略 ( r 3 < 1 ) (r_{3}<1) (r31) 最优解在定义候选解移动距离时的影响效果; 参数 r 4 r_{4} r4​平等地切换正弦和余弦函数。

由于原始正余弦算法是求解连续解,为了适应背包问题,需要对其进行离散化。离散化准则如下:首先算法初始化,所有解在[-1,1]之间生成,针对这些实数,利用正负信息进行离散化,并将离散化的解作为适应度的输入,求解适应度值。
Y ( i , j ) = { 1 , X ( i , j ) ≥ 0 0 , e l s e (3) Y(i,j) = \begin{cases} 1,X(i,j)\geq0\\ 0,else \end{cases}\tag{3} Y(i,j)={1,X(i,j)00,else(3)
每次经过正余弦位置更新后,需要将X约束到[-1,1]的范围。
X ( i , j ) = { 1 , X ( i , j ) > 1 − 1 , X ( i , j ) < − 1 (4) X(i,j)=\begin{cases} 1,X(i,j)>1\\ -1,X(i,j)<-1 \end{cases}\tag{4} X(i,j)={1,X(i,j)>11,X(i,j)<1(4)

2.背包问题

背包问题的一般提法为:已知 n n n 个物品 s 1 , s 2 , . . . , s n s_1,s_2,...,s_n s1,s2,...,sn 的重量及其价值分别为 w j > 0 w_j >0 wj0 c j > 0 ( j = 1 , 2 , … , n ) c_j >0( j=1,2,…,n) cj0j1,2,,n背包的容量假设为 V > 0 V >0 V0​如何选择那些物品装入背包可使在背包的容量限制之内所装物品的总价值最大,引入变量 x j x_j xj
x j = { 1 , 物 品 放 入 背 包 0 , 否 则 (5) x_j=\begin{cases}1,物品放入背包\\ 0,否则\end{cases}\tag{5} xj={1,0,(5)
则该问题的数学模型为:
m a x ( ∑ j = 1 n ) c j x j (6) max(\sum_{j=1}^n)c_jx_j\tag{6} max(j=1n)cjxj(6)
约束条件:
{ ∑ j = 1 n w j x j ≤ V x j ∈ { 0 , 1 } , j = 1 , 2 , . . . , n (7) \begin{cases} \sum_{j=1}^nw_jx_j\leq V \\ x_j\in\{0,1\},j=1,2,...,n \end{cases} \tag{7} {j=1nwjxjVxj{0,1},j=1,2,...,n(7)

3.实验结果

背包问题的实验数据如下:

 C = [72,490,651,833,833,489,359,337,267,441,...70,934,467,661,220,329,440,774,595,98,424,...37,807,320,501,309,834,851,34,459,111,...253,159,858,793,145,651,856,400,...285,405,95,391,19,96,273,152,...473,448,231];
W = [438,754,699,587,789,...912,819,347,511,287,541,784,676,198,...572,914,988,4,355,569,144,272,531,...556,741,489,321,84,194,483,205,607,...399,747,118,651,806,9,607,121,...370,999,494,743,967,718,397,...589,193,369];
V = 11258;

二进制粒子群的参数如下:

%% 二进制正余弦算法求解
dim = length(C);%维度
pop = 50;%种群数量
MaxIter = 500;%迭代次数
fobj = @(x) fun(x,C,W,V);%适应度函数

最终结果:
请添加图片描述

背包存放结果为:0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 0
总价值为:15634

4.参考文献

[1]郭晓虎,李泽文,李亚.二进制正余弦算法求解0-1背包问题[J].科技经济导刊,2019,27(25):172.

5.Matlab

这篇关于基于二进制正余弦算法的背包问题求解- 附代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071636

相关文章

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造