【背包问题】基于matlab量子免疫克隆算法求解背包问题【含Matlab源码 424期】

举报
海神之光 发表于 2022/05/30 00:26:56 2022/05/30
【摘要】 一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【背包问题】基于matlab量子免疫克隆算法求解背包问题【含Matlab源码 424期】 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭...

一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【背包问题】基于matlab量子免疫克隆算法求解背包问题【含Matlab源码 424期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、背包问题简介

1【背包问题】
背包问题(Knapsack problem)是一种组合优化的NP完全问题。
问题描述为:给定一组物品,每种物品都有自己的重量weight和价格value,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
2【0-1背包问题】
对每个物品i 只有 装入/不装入背包 两种情况。
我们有n种物品,物品j的重量为wj,价格为pj。
我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。
如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。
令V(i,j)表示前i个物品中能够装入容量为j的背包中的物品价值最大值,则可得到动态规划函数:
V(i,0) = V(0,j)=0; //把前i个物品装入容量为0的背包 和 把0个物品装入容量为j的背包,价值均为0
V(i,j) = V(i-1,j) j<wi //如果第i个物品的重量大于背包容量wi>j,则装入前i个物品得到的最大价值和装入前i-1个物品得到的最大价值相同,即物品i不装入背包
V(i,j) = max{ V(i-1,j),V(i-1,j-wi)+vi } j>wi // 1.如果把第i个物品装入背包,则背包中物品的价值=把前i-1个物品装入容量为j-wi背包中的价值加上第i个物品的价值vi; 2. 如果第i个物品没有装入背包,则背包中价值=前i-1个物品装入容量为j的背包中所取得的价值。 取二者中价值较大者。
step 1:只装入前1个物品,确定各种情况下的背包能够得到的最大价值;
step 2:只装人前2个物品,确定各种情况下的背包能够得到的最大价值;.
step n:…
最后V(n,C)便是容量为C的背包中装入n个物品时取得的最大价值。
为了得到V(n,C) 需想前推到V(n-1,C)。如果V(n,C)>V(n-1,C),则第n个物品装入背包,前n-1个物品装入容量为C-wn的背包中;否则,第n个物品没有被装入背包,前n-1个物品被装入容量为C的背包中。
直到确定第一个物品是否被装入背包中。
得到:
当 V(i,j)= V(i-1,j), xi = 0;
当 V(i,j) > V(i-1,j), xi = 1,j = j-wi;

三、量子免疫克隆算法简介

在这里插入图片描述
在这里插入图片描述

四、部分源代码

clear;
C=[253 245 243 239 239 239 238 238 237 232 231 231 230 229 228 227 224 217 213 207 203 201 195 194 191 187 187 177 175 171 169 168 165 164 161 160 158 150 149 147 141 140 139 136 135 132 128 126 122 120 119 116 116 114 111 110 105 105 104 103 93 92 90 79 78 77 76 76 75 73 62 62 61 60 60 59 57 56 53 53 51 50 44 44 42 42 38 36 34 28 27 24 22 18 12 10 7 4 4 1];
W=[253 245 243 239 239 239 238 238 237 232 231 231 230 229 228 227 224 217 213 207 203 201 195 194 191 187 187 177 175 171 169 168 165 164 161 160 158 150 149 147 141 140 139 136 135 132 128 126 122 120 119 116 116 114 111 110 105 105 104 103 93 92 90 79 78 77 76 76 75 73 62 62 61 60 60 59 57 56 53 53 51 50 44 44 42 42 38 36 34 28 27 24 22 18 12 10 7 4 4 1];
V=6666;
a=2.40;
q=(sqrt(1/2)).*ones(20,100);
[N,L] = size(q); ger =500; pm=0.0088; pc=0.88; fat=0.1;
disp(sprintf('Number of generations: %d',ger));
disp(sprintf('Population size: %d',N/2));
% General parameters & Initial operations
vmfit = []; it = 1; vx = []; T=[]; vw=[];
f='dot(v,C1,2)'; 
updatef=0;
% Generations
t0 = clock; 
c1=0; 
while it <= ger
    itemp=[1 3 5 7 9 11 13 15 17 19];
    v=observe(q(itemp,:));  
    rate=C./W;
    [a,ind] = sort(rate);
    for j=1:N/2
    i1=1;
    %repair
    knoverfilled=0;
    if  dot(v(j,:),W)>6666
        knoverfilled=1;
    end
    while knoverfilled==1
        v(j,ind(i1))=0;
        if dot(v(j,:),W)<=6666
             knoverfilled=0;
         end
     i1=i1+1;    
     end
     v(j,:)=v(j,:);
   end
   %and/or Crossver
   for i=1:N/2
   cind(i)=i;
   end
   for i=1:N/2
   point=unidrnd(N/2-i+1);
   temp=cind(i);
   cind(i)=cind(i+point-1);
   cind(i+point-1)=temp;
   end
   for i=1:2:N/2
   p=rand(1);
   if(p<pc)
      c1=and(v(cind(i),:),v(cind(i+1),:));
      c2=or(v(cind(i),:),v(cind(i+1),:));
      v(cind(i),:)=c1;
      v(cind(i+1),:)=c2;    
  end
  end
  for j=1:N/2
    i1=1; 
  %repair
    knoverfilled=0;
    if  dot(v(j,:),W)>6666
        knoverfilled=1;
    end
    while knoverfilled==1
        v(j,ind(i1))=0;
        if dot(v(j,:),W)<=6666
             knoverfilled=0;
         end
     i1=i1+1;    
     end
     v(j,:)=v(j,:);
   end
  C1=ones(N/2,1)*C;
  fit=eval(f);
  [sol,indb] = max(fit);
  maxf=sol;
  max1=v(indb,:);
  minf=min(fit);
  if updatef>=sol
      maxf=updatef;
      max1=updatec;
  else
      maxf=sol;
      max1=v(indb,:);
  end
   %量子变异
       for i=1:2:size(q,1)
           for j=1:size(q,2)
              if v((i+1)/2,j)==max1(1,j)
                if max1(1,j)==0
                    s=0;
                    angle=0;
                else
                      if q(i,j)*q(i+1,j)>0
                         s=1;
                         angle=0.015;
                      end
                      if q(i,j)*q(i+1,j)<0
                         s=-1;
                         angle=0.015;
                      end
                      if q(i,j)==0
                         s=0;
                         angle=0.015;
                      end
                      if q(i+1,j)==0
                         s=1;
                         angle=0.015;
                      end   
                end
           elseif v((i+1)/2,j)==0
              if maxf>fit((i+1)/2)
                 s=0;
                 angle=0;
              else
                 if q(i,j)*q(i+1,j)>0
                    s=-1;
                    angle=0.015;
                    end
                 if q(i,j)*q(i+1,j)<0
                    s=1;
                    angle=0.015;
                    end
                 if q(i,j)==0
                    s=1;
                    angle=0.015;
                    end
                 if q(i+1,j)==0
                    s=0;
                    angle=0.015;
                 end
              end
           else
              if maxf>fit((i+1)/2)
                 if q(i,j)*q(i+1,j)>0
                    s=-1;
                    angle=0.015;
                 end
                 if q(i,j)*q(i+1,j)<0
                    s=1;
                    angle=0.015;
                 end
                 if q(i,j)==0
                    s=1;
                    angle=0.015;
                 end
                 if q(i+1,j)==0
                    s=0;
                    angle=0.015;
                 end
              else
                 if q(i,j)*q(i+1,j)>0
                    s=1;
                    angle=0.015;
                 end
                 if q(i,j)*q(i+1,j)<0
                    s=-1;
                    angle=0.015;
                 end
                 if q(i,j)==0
                    s=0;
                    angle=0.015;
                 end
                 if q(i+1,j)==0
                    s=1;
                    angle=0.015;
                 end
              end
           end
        o=s*angle*pi;
        u=[cos(o) -sin(o);sin(o) cos(o)];
        temp1=[q(i,j);q(i+1,j)];
        temp2=u*temp1;
        q(i,j)=temp2(1,1);
        q(i+1,j)=temp2(2,1);
    end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176

五、运行结果

在这里插入图片描述

六、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/114223754

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。