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

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

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

二进制文件转化成文本文件

文章中如果有写错、表述不明、有疑问或者需要扩展的知识,欢迎留言或者私信~   1.区别 如果一个文件说是文本文件,使用任何一种文本编辑器打开可以展现出人类可读信息字符,因为编码都符合某种编码方式,如ASCII、UTF8、GB2312等等(在文件头可以读出来是什么编码方式,然后文本编辑器再按照规则去读取翻译成对应的字符,展示给我们的就是可读的了)。(关于编码方式不了解可以看这一篇) 如果一

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有