1、procedure search(k,v:integer); 搜索第k个物品,剩余空间为v var i,j:integer;begin if v=best then exit; sn为前n个物品的重量和 if kwk then search(k+1,v-wk);search(k+1,v);end;2.DP :FI,j为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。实现:将最优化问题转化为判定性问题 f I, j = f i-1, j-wi (wI=j0 then if j+now=n then inc(cj+now,aj);a:=c;方法2:可重复背包 A求最多可放入的重量。状态
2、转移方程为 fI,j = f I-1, j wI*k (k=1. j div wI) 进行一次竞赛,总时间T固定,有若干种可选择的题目,每种题目可选入的数量不限,每种题目有一个ti(解答此题所需的时间)和一个si(解答此题所得的分数),现要选择若干题目,使解这些题的总时间在T以内的前提下,所得的总分最大,求最大的得分。*易想到:fi,j = max f i- k*wj, j-1 + k*pj (0=k=0 Then t:=problemj.point+fi-problemj.time;If tfi Then fi:=t;Writeln(fM);End. 求自然数n本质不同的质数和的表达式的数目
3、。思路一:生成每个质数的系数的排列,在一一测试,这是通法。procedure try(dep:cal; 此过程计算当前系数的计算结果,now为结果 if nown then exit; 剪枝 if dep=l+1 then begin 生成所有系数 if now=n then inc(tot);exit;for i:=0 to n div prdep do begin xsdep:=i;try(dep+1);=0;思路二:递归搜索效率较高 procedure try(dep,rest:var i,j,x:if (rest=0) or (dep=l+1) then begin if rest=0
4、 then inc(tot);=0 to rest div prdep do try(dep+1,rest-prdep*i);main: try(1,n); 思路三:可使用动态规划求解 设V个物品,背包容量为n,求放法总数。转移方程:for k:=1 to n div now do if j+now*k=n then inc(cj+now*k,aj);main read(now); 读入第一个物品的重量 i: ai为背包容量为i时的放法总数 while i0).*(v*c-m1);cf表示惩罚力度其他过程与加入贪婪算法的基本一致。五背包问题的遗传算法应用程序(matlab)1.将贪婪算法、遗传
5、算法结合解决背包问题:源代码:%遗传算法解决背包问题 GA.mclc;clear;close all;%初始化物品价值value和质量cc=98 92 95 70 72 70 83 80 65 25 50 55 40 48 50 32 22 60 30 32 40 38 35 32 25 28 30 22 50 30 45 30 60 50 20 65 20 25 30 10 56 50 30 20 15 10 8 5 3 1 ;value=300 318 298 192 180 180 265 242 160 138 155 130 125 122 120 118 115 110 105 1
6、01 100 100 98 96 95 90 88 82 80 77 75 73 72 70 69 66 65 63 60 58 20 25 15 10 20 10 7 5 2 2;g=value./c; %价值重量比,用于贪婪算法m1=1000; %总重量约束值v = 2*rand(50,50)-1;v=hardlim(v); %v为50*50随机产生的矩阵 值为0或1%贪婪算法修复解%v=greedy(v,c,g,m1);N,L = size(v); ger = 500; pc = 0.5; pm = 0.01;disp(sprintf(代数: %d,ger);种群大小:,N);交叉概率:
7、 %.3f,pc);变异概率:,pm);% 初始化与参数设定sol1=1; it = 1; updatef=-10; %soll为当前算出的总价值,it为代数;t0 = clock; %记录初始时间figure(1);hold on;while it sp(sindex) sindex=sindex+1; %寻找要选择个体的位置 newv(i,:)=v(sindex,:); v(i,:)=newv(i,:%用选择出的个体构成的种群替代旧的种群 % 交叉 cindex(i)=i;N %产生要配对的父代的序号;经过N次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代 point=unidrn
8、d(N-i+1); temp=cindex(i); cindex(i)=cindex(i+point-1); cindex(i+point-1)=temp;2: if(ppc) point=unidrnd(L-1)+1;%1pointL 产生交叉点 for j=point:(L-1) %交叉 ch=v(cindex(i),j); v(cindex(i),j)=v(cindex(i+1),j); %cindex中相邻的两个为两个父代的序号 v(cindex(i+1),j)=ch; % 变异 M=rand(N,L)=sol1 sol1=updatef; v(indb1,:)=updatec; up
9、datef=sol1; updatec=v(indb1,: sol2,indb2 = min(fit); %indb2为适应度最小的染色体 v(indb2,:) = v(indb1,: media = mean(fit); it = it + 1; plot(it,sol1,rT = etime(clock,t0);fx = sol1; P = v;程序运行时间 %2.4f,T);最优解: %.2f,fx);%* 修正函数:function v=greedy(v,c,g,m1)m n=size(v);for i=1:m label=g; label=label.*v(i,: if sum(v(i,:).*c)m1 %修复 while sum(v(i,: min=10000; for j=1:n if label(j)=0&label(j) newv(i,: %v=greedy(v,c,g,m1); fit =v*value fit2 =v*value-v*value.*(v*c0); so
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1