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

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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调