当前位置:   article > 正文

0-1背包问题及其可视化_0-1背包界面显示

0-1背包界面显示

经过长时间的查找,终于找到能把论文下载下来的软件了。昨天发的图片是算例2,今天是算例1的问题及源码。求解结果有图片,我把未经过FB处理和经过FB处理的图片做过比较,前面三张是未经过FB处理。变化最大的是“20次循环结果”,未处理是看不见他的三个点在哪的。

 

本例的特点是已知物品价值及其重量,背包的容量也是已知的。所以此代码可适应已知所有条件的0-1背包问题。

  1. clc
  2. clear
  3. close all
  4. LoopNumber=1;
  5. traceAll=cell(LoopNumber);
  6. for ii=1:LoopNumber
  7. %% 基于遗传算法的0-1背包算法
  8. % 物品价值
  9. val =[220 208 18 192 180 180 165 162 160 158 155 130 125 122 120 ...
  10. 118 115 110 105 101 100 100 98 96 95 90 88 82 80 77 75....
  11. 73 72 70 69 66 65 63 60 58 56 50 30 20 15 10 8 ...
  12. 5 3 1];
  13. % 物品体积
  14. vol =[80 82 85 70 72 70 66 50 55 25 50 55 40 48 50 32 22 60 30 32 ...
  15. 40 38 35 32 25 28 30 22 50 30 45 30 60 50 20 65 20 25 30 10 20 ...
  16. 25 15 10 10 10 4 4 2 1];
  17. % 背包的最大容量
  18. MAX_CAP = 1000;
  19. % 参数
  20. LEN=size(val, 2); %样本长度
  21. POP_NUM=50; %群体数
  22. P_CROSS=0.8; %交叉概率
  23. P_MUTA=0.07; %变异概率
  24. % 最大迭代代数
  25. MAX_GEN = 500;
  26. % 初始化样本
  27. samp_arr= 2*rand(POP_NUM, LEN) - 1;
  28. samp_arr=hardlim(samp_arr);
  29. % 记录参数
  30. max_samp=samp_arr(1,:);
  31. max_val_old=-9999999;
  32. max_index_old=0;
  33. max_val_new=0;
  34. max_index_new=0;
  35. min_val=0;
  36. min_index=0;
  37. % 记录参数
  38. % 存放优胜劣汰得到的样本的索引
  39. winner_index =ones(1, POP_NUM);
  40. % 轮盘
  41. rtable=ones(1, POP_NUM);
  42. % 最大适应度值记录
  43. fit_best=zeros(1, MAX_GEN);
  44. fit_worst=zeros(1,MAX_GEN);
  45. fit_mean=zeros(1,MAX_GEN);
  46. % 适应度
  47. fit_arr=zeros(1, POP_NUM);
  48. % 初始化随机种子
  49. rand('state',sum(100*clock));
  50. % 迭代计数器
  51. count=0;
  52. while 1
  53. count=count + 1;
  54. P_MUTA=0.05+count*0.0001;
  55. % 计算适应度值
  56. temp_sum=vol*samp_arr'; %利用矩阵相乘的方便性来计算每个个体的总体积注意第二个矩阵必须取其转置
  57. rate=val./vol; %计算每个物体单位体积的价值量即价值密度
  58. for i=1:POP_NUM
  59. j = 0;
  60. if temp_sum(i) > MAX_CAP
  61. [temp, index]=sort(rate, 'ascend');
  62. while temp_sum(i) > MAX_CAP
  63. j=j+1;
  64. if samp_arr(i,index(j) )==1
  65. samp_arr(i,index(j)) = 0;
  66. temp_sum(i)=temp_sum(i)-vol(index(j));
  67. end
  68. end
  69. end
  70. end
  71. % 更新最优值
  72. fit_arr = val*samp_arr'; %同上方法一样采用计算每个个体的总价值
  73. [max_val_new, max_index_new]= max(fit_arr);
  74. fit_worst(count)=min(fit_arr);
  75. fit_mean(count)=mean(fit_arr);
  76. %如果比上一次的小用上一次的替换
  77. if max_val_new < max_val_old
  78. max_val_new = max_val_old;
  79. samp_arr(max_index_new, :)= max_samp;
  80. fit_arr(max_index_new)= max_val_old;
  81. end
  82. %保存这一次的结果
  83. max_val_old=max_val_new;
  84. max_index_old=max_index_new;
  85. max_samp=samp_arr(max_index_new, :);
  86. %找到适应度最小的个体淘汰之用适应度最大的个体替换
  87. [min_val, min_index]=min(fit_arr);%找到适应度最小个体的编号
  88. samp_arr(min_index, :)=max_samp;
  89. fit_arr(min_index)=max_val_new;
  90. %将这一代得到的最大适应度值保存起来方便最后的曲线绘制
  91. fit_best(count)=max_val_new;
  92. %依据迭代次数的终止判断
  93. if count >=MAX_GEN
  94. break;
  95. end
  96. % 选择操作轮盘赌
  97. fit_sum=sum(fit_arr);
  98. rtable=fit_arr./fit_sum; %轮盘rotary table
  99. %生成轮盘类似于概率分布
  100. for i=2:POP_NUM
  101. rtable(i)=rtable(i-1) + rtable(i);
  102. end
  103. for i=1:POP_NUM
  104. p=rand(1);
  105. index=1;
  106. while p > rtable(index)
  107. index= index + 1;
  108. end
  109. winner_index(i)=index;
  110. end
  111. % 更新样本集
  112. samp_arr=samp_arr(winner_index, :);
  113. % 交叉操作
  114. cross_index=1:POP_NUM; %参与交叉的样本的索引
  115. for i=1:POP_NUM
  116. temp=unidrnd(POP_NUM - i + 1);%在1到POP_NUM - i + 1之间取随机数
  117. temp_pos=i+temp - 1;
  118. temp_val=cross_index(temp_pos);
  119. cross_index(temp_pos)= cross_index(i);
  120. cross_index(i)=temp_val;
  121. end
  122. % 交叉操作
  123. for i = 1:2:POP_NUM %相邻两个进行交叉
  124. %随机得到一个数小于交叉概率的话进行交叉
  125. if rand(1) < P_CROSS
  126. cross_pos=unidrnd(POP_NUM - 1 ); %交叉点位置,[1, POP_NUM-1]
  127. temp_cross=samp_arr(cross_index(i), cross_pos:end);
  128. samp_arr(cross_index(i), cross_pos:end) = ...
  129. samp_arr(cross_index(i+1), cross_pos:end);
  130. samp_arr(cross_index(i+1), cross_pos:end) = temp_cross;
  131. end
  132. end
  133. %变异操作直接针对整个样本集操作
  134. muta_arr=( rand(POP_NUM, LEN) < P_MUTA );
  135. index= find(muta_arr);
  136. samp_arr(index)=1-samp_arr(index);
  137. end
  138. %找到最后一代中的最佳样本
  139. [max_val, max_index]=max(fit_arr);
  140. temp=samp_arr(max_index, :);
  141. index=find(temp); %index记录所取得物体编号
  142. trace(count,:)=[max(fit_arr,[],2),min(fit_arr,[],2),mean(fit_arr)];
  143. traceAll{ii}=trace;
  144. tracedo(ii,:)=max(trace);
  145. end
  146. %绘制结果曲线
  147. figure(1);
  148. plot(1:MAX_GEN, fit_best, 'b-');
  149. title('历代最优解');
  150. grid on;
  151. figure(3)
  152. plot(1:LoopNumber, tracedo);
  153. title('20次循环结果');
  154. grid on;
  155. disp( sprintf('求解结果如下所示 ') );
  156. disp('==================================================================');
  157. disp( sprintf('\n\n%-10s\t%-10s\t%-10s\n', '物品编号', '价值','容量') );
  158. for i = 1:size(index, 2)
  159. disp( sprintf('%-10d\t%-10d\t%-10d\n', index(i), val(i), vol(i) ));
  160. end
  161. disp('==================================================================');
  162. disp( sprintf('物品总数%d\n', size(index, 2) ) );
  163. disp( sprintf('总价值%d\n', val*temp'));
  164. disp( sprintf('总体积%d\n', vol*temp' ));
  165. figure
  166. plot(fit_best)
  167. hold on
  168. plot(fit_mean,'r')
  169. plot(fit_worst,'k')
  170. legend('best','mean','worst')
  171. grid on

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/466362
推荐阅读
相关标签
  

闽ICP备14008679号