背包问题的一般提法为:已知 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)
背包问题的实验数据如下:
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;
乌燕鸥算法原理请参考:https://blog.csdn.net/u011835903/article/details/111936344
dim = length(C);%维度
pop = 50;%种群数量
lb = 0;
ub = 1;
MaxIter = 500;%迭代次数
fobj = @(x) fun(x,C,W,V);%适应度函数
%优化算法求解
最终结果:
[1]李超文,何正友,张海平,高辉.基于二进制粒子群算法的辐射状配电网故障定位[J].电力系统保护与控制,2009,37(07):35-39.
[1]马慧民,叶春明,张爽.二进制改进粒子群算法在背包问题中的应用[J].上海理工大学学报,2006(01):31-34.