1、遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术。本文在分析遗传算法的基础上,提出了将贪婪修复方法与遗传算法相结合,构成混和遗传算法,并应用于求解经典背包问题。它是可以解决复杂问题的新方法。本论文系统的介绍背包问题的遗传算法解决方案。二 背包问题的数学模型背包问题的定义:我们有n种物品,物品j的重量为wj,价格为pj。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。可以用公式表示为:方法1:每个背包只能使用一次或有限次(可转化为一次
2、): A.求最多可放入的重量。有一个箱子容量为v(正整数,ov20000),同时有n个物品(on30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。l.搜索方法 procedure search(k,v:integer); 搜索第k个物品,剩余空间为v vari,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的标志,为布尔型。实现:
3、将最优化问题转化为判定性问题 f I, j = f i-1, j-wi (wI=j0 then if j+now=n then inc(cj+now,aj);a:=c;方法2:可重复背包 A求最多可放入的重量。状态转移方程为 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 +
4、k*pj (0=k=0 Then t:=problemj.point+fi-problemj.time;If tfi Then fi:=t;Writeln(fM);End. 求自然数n本质不同的质数和的表达式的数目。思路一:生成每个质数的系数的排列,在一一测试,这是通法。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:=
5、i;try(dep+1);=0;思路二:递归搜索效率较高 procedure try(dep,rest:vari,j,x:if (rest=0) or (dep=l+1) then begin if rest=0 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); 读
6、入第一个物品的重量 i: ai为背包容量为i时的放法总数 while i=n do begin ai:=1; inc(i,now); end; 定义第一个物品重的整数倍的重量a值为1,作为初值 =2 to v do update; 动态更新 writeln(an);三算法综述遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一
7、开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。贪婪算法是从眼前最大的利益出发,寻找最优解的方法,虽然很多情况下不能找到最优解,但是找到较好的解的可能性还是比较大的。这似乎一种符合人的直觉的算法,时间复杂度比较低。四遗
8、传算法求解背包问题1. 贪婪算法求解背包问题贪婪算法属于一步式启发算法,即每采用一个贪婪准则便做出一个不可撤回的决策。用贪婪算法求解背包问题的特点是每一步迭代选一物品入包,直到无法再装。该算法没有在两个可行解之间比较选择,算法结束时得到一个可行解。常用的贪婪准则是价值密度(价值重量比C/W)贪婪算法,这种选择准则为:从剩余物品中选择可装入包的C/W值最大的物品,这也是通常所使用的贪婪策略,因为它是一个直觉上的近似的解。2. 基于贪婪算法的混合遗传算法求解背包问题将贪婪算法与遗传算法相结合构成的混合遗传算法,通过遗传算法的择优,不断重复执行选择、杂交和变异以及贪婪算法的修正这样一个过程,所求解将
9、不断进化越来越接近最优解。(1)基因编码 基因编码将n个Xi的值顺序排列,就可构成背包问题的遗传编码。即我们使用的是等长度的二进制编码方法,编码串中1表示将对应的物品放入背包中,0表示不将其放入。例如“1110011100000000000000000011”就代表一个解,它表示将第1,2,3,6,7,8,n-1,n号物品放入背包中,其他的物品则不放入。(2)编码修复 上述基因编码的方案虽然比较直观,但对于任意一个编码串,或者由交叉,变异所产生的任意一个个体,由于它们不一定满足约束条件,就不一定表示可行解,也就是说这种编码方案会产生很多无效染色体。对于这些不满足约束条件的基因编码串,我们可以利
10、用贪婪算法的思想进行修复。修复的基本思想为:在Xj=1的所有物品中,将价值重量比(C/W)最小的物品取出,直到满足背包的容量约束为止。由此可产生一些新的基因编码串,并且这些新编码串总是相对来说质量比较好的,特别是它们肯定满足问题的约束条件。(3)适应度函数 由于对每个个体使用贪婪算法修正已保证了不会产生无效染色体,所以在进行个体适应度评价时无须引入罚函数项,而是直接用目标函数值作为适应度函数值,即:(4)选择: 采用轮盘赌的方式进行选择。在本算法中,将各基因的适应值事先作处理:fi(i)=fit(i)-min(fit)+1;以防止适廊度函数值出现小于零的情况,并且可以在一定程度上防止适应值差别过大时丢失低适应值基因的有用信息。(5)交叉: 采用单点
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1