本文主要是介绍基于二进制正余弦算法的背包问题求解- 附代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基于二进制正余弦算法的背包问题求解- 附代码
文章目录
- 基于二进制正余弦算法的背包问题求解- 附代码
- 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+r1∗sin(r2)∗∣r3Pit−Xit∣r4<0.5Xit+r1∗cos(r2)∗∣r3Pit−Xit∣r4>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=a−tTa(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) (r3>1) 或者忽略 ( r 3 < 1 ) (r_{3}<1) (r3<1) 最优解在定义候选解移动距离时的影响效果; 参数 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)>1−1,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 wj>0和 c j > 0 ( j = 1 , 2 , … , n ) c_j >0( j=1,2,…,n) cj>0(j=1,2,…,n)背包的容量假设为 V > 0 V >0 V>0如何选择那些物品装入背包可使在背包的容量限制之内所装物品的总价值最大,引入变量 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=1∑n)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=1nwjxj≤Vxj∈{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
这篇关于基于二进制正余弦算法的背包问题求解- 附代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!