Knapsack.doc

上传人:b****2 文档编号:1399053 上传时间:2022-10-22 格式:DOC 页数:21 大小:472.50KB
下载 相关 举报
Knapsack.doc_第1页
第1页 / 共21页
Knapsack.doc_第2页
第2页 / 共21页
Knapsack.doc_第3页
第3页 / 共21页
Knapsack.doc_第4页
第4页 / 共21页
Knapsack.doc_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

Knapsack.doc

《Knapsack.doc》由会员分享,可在线阅读,更多相关《Knapsack.doc(21页珍藏版)》请在冰豆网上搜索。

Knapsack.doc

计算机算法设计与分析

0/1背包问题研究报告

目录

1. 问题的定义 1

2. 问题的应用背景 1

3. 求解0/1背包问题的常用算法 2

3.1遗传算法 2

3.2模拟退火算法 3

3.3蚁群算法 3

3.4贪心算法 4

3.5动态规划法 5

3.6回溯法 6

3.6.1算法描述 6

3.6.2算法设计基本思想 6

3.6.3实例分析 7

3.6.4程序代码及实验结果 7

3.7分支限界法 10

3.7.1算法描述 10

3.7.2算法设计基本思想 10

3.7.3算法求解过程 11

3.7.4分支限界法求解0/1背包问题 11

3.7.5程序代码及实验结果 13

4. 常用几种算法比较 18

5. 展望 19

0/1背包问题及其求解算法研究

背包问题(KnapsackProblem,KP)又称为子集合问题,最早由Dantzing于20世纪50年代提出,是计算机算法中的一类经典问题,也是运筹学中的一类经典的NP完全组合优化问题,在资金分配、货物装载、项目选择等问题上有着广泛的应用。

根据物品特性及约束条件的不同,KP问题可分为0/1背包问题和多背包问题两大类,前者又可依据维数的不同,进一步分为一维0/1背包问题、二维0/1背包问题及多维0/1背包问题。

本文主要研究简单的0/1背包问题,即一维0/1背包问题。

1.问题的定义

给定n种重量为wi,价值为pi的物品Wi(i=1,2,...,n)和1个容量为c的背包,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。

在选择装入背包的物品时,对每种物品Wi只有两种选择,即装入背包或不装入背包。

不能将物品Wi装入背包多次,也不能只装入部分的物品Wi。

因此,该问题称为0/1背包问题。

此问题更形式化的描述为:

给定c>0,wi>0,pi>0,i=1,2,...,n,要求找出一个n元0/1向量(x1,x2,…,xi,…,xn),xi{0,1},i=1,2,...,n,使得,且达到最大。

因此,0/1背包问题是一个特殊的整数规划问题,其数学模型表示如下:

Max

s.t.

2.问题的应用背景

0/1背包问题是当前组合优化领域研究的一个热点和难点问题,其实质就是组合优化问题,即如何在有效的空间内装载更多的物品,实现背包中物品价值的最大化。

0/1背包问题是一个特殊的整数规划问题,其最终目标是寻求一种最优的分配策略以获得物品最大的价值量。

形象化说,给出一系列可以进行的操作P,每种操作都可以获得相应的价值V,但是进行每一种操作都必须付出相应的代价C,然后求出在总代价不超过给定阈值时可以获取的最大价值。

0/1背包问题在现实生活中有着广泛的应用,如下料问题、贷款组合优化问题、项目选择问题等都可以转换为0/1背包问题,即这些问题都可以转换为整数线性规划问题。

因此,研究0/1背包问题高效求解算法,无论是在理论上还是在实际应用中都具有一定的价值和意义。

3.求解0/1背包问题的常用算法

目前,求解0/1背包问题的算法主要有确定性算法和近似算法两大类,确定性算法有分支限界法、动态规划法、回溯法等;近似算法有贪心算法、遗传算法、蚁群算法等。

一般来讲,确定性算法只能在短时间内求解小规模的0/1背包问题,而不能快速地求解大规模的0/1背包问题,因此其实用性常常受到问题规模的限制;而近似算法往往只能求解问题的近似解,有时所求得的解的质量不如人意。

本节首先对求解0/1背包问题的常用算法进行简要的阐述,然后重点对回溯法和分支限界法求解一维0/1背包问题进行着重分析,并用Java语言在MyEclipse8.0平台下编程实现。

3.1遗传算法

遗传算法(GeneticAlgorithms,GAs)是由JohnH.Holland及其学生于20世纪60年代末70年代初提出的一种通过模拟生物进化和遗传选择过程来搜索最优解的智能优化方法。

基本GAs算法的步骤一般为:

确定编码方式及取值范围;初始化染色体的个数,并随机产生所有的染色体;计算个体的适应度;经过遗传算子操作,进行遗传迭代求解。

0/1背包问题的遗传算法求解策略如下:

将物品Wi按单位重量价值(pi/wi)由大到小排序;依据0/1背包问题的定义(见第1节),则放入背包的总重量为w=,总价值为p=;f[n]存放目标函数值,即个体的适应度,t[n]存放每个个体的约束条件值。

(1)产生初始种群,并计算每个个体的适应度值和其对应的约束条件值(即为在染色体中选取的物品的重量),比较初始种群中各个个体的适应度。

选择最大者所对应的个体作为第一代最优个体,并记录该个体以及它的适应度和约束条件值;

(2)计算每个个体的选择概率;

(3)利用轮盘赌法进行个体选择;

(4)进行交叉运算,随即选择一对个体产生一对有效交叉位置进行交叉运算,并计算新产生的个体的适应度值和约束条件值。

如果新产生的个体重量大于背包容量,则对新产生的个体进行修正,放弃在一个个体中的一个物品,增加另一个个体的一个物品使其重量小于背包重量;

(5)进行变异操作,如果一个个体的一个基因为1,则变为0;如果是0则变为1,重新计算该个体的适应度值和约束条件值;

(6)选取具有最大值的适应度个体,如果其适应度大于当前的最优值的适应度,则更新当前的最优值为选取的个体,更新当前最优值的约束条件和迭代次数;

(7)循环迭代直到迭代次数超过设定最大值。

分析可知,算法的时间复杂度为O(t*n2),其中t为迭代次数,n为种群大小。

在众多近似算法中,遗传算法是求解0/1背包问题的一个较好算法:

①在求解0/1背包问题时,由于遗传算法的进化特性,使得它在解的搜索过程中不需要了解0/1背包问题的内在性质,遗传算法可以处理任意形式的目标函数和约束,无论是线性的还是非线性的,离散的还是连续的,甚至是混合的搜索空间;

②遗传算法在选择、交叉和变异的过程中,都存在对每一个体进行处理的可能。

若遗传算法每一代对群体规模为n的个体进行操作,实际上处理了大约O(n3)个模式,具有很高的并行性,因而具有显著的搜索效率;

③遗传算法对于各种特殊问题可以提供极大的灵活性来混合构造领域独立的近似,从而保证算法的有效性;

④遗传算法的基本思想简单,运行和实现步骤规范,便于具体使用。

3.2模拟退火算法

模拟退火(SimulatedAnnealing,SA)算法是一种随机的全局寻优算法,其思想源于物理退火过程与组合优化问题之间的相似性,最早由Metropolis于1953年提出,1983年Kirkpatrick等将其应用于组合优化问题。

模拟退火算法求解0/1背包问题的过程如下:

(1)解空间

(2)目标函数

Max

s.t.

(3)产生新解

随机选取物品Wi,若Wi不在背包中,则将其直接放入背包中,或同时从背包中随机取出另一物品Wj;若Wi已在背包中,则将其取出,并同时随机装入另一物品Wj。

(4)背包的价值差和重量差

根据上述新解产生的3种可能,相应的背包价值差为:

相应的背包重量差为:

其中为当前状态下背包重量w的增量。

(5)接受准则

由于0/l背包问题是个有约束的最优化问题,所以通常采用扩充的Metropolis准则

其中t为温度控制参数。

在算法实现过程中,其退火温度t控制着求解过程向最小值的优化方向进行,同时又以概率P来接收劣质解,因此模拟退火算法可以跳出局部极小值点。

只要初始温度足够高、退火过程足够慢,算法就能收敛到全局最优解。

3.3蚁群算法

蚁群算法是由DorigoM.等人依据模仿真实的蚁群行为而提出的一种模拟进化算法。

蚂蚁之间是通过一种称为信息素(Pheromone)的物质传递信息的,蚂蚁能够在经过的路径上留下该种物质,而且能够感知这种物质的存在及其强度,并以此来指导自己的运动方向。

因此,由大量蚂蚁组成的集体行为便表现出一种信息正反馈现象:

某一条路径上走过的蚂蚁越多,该路径上留下的信息素就越多,则后来者选择该路径的概率就越大。

蚂蚁之间就是通过这种信息素的交流,搜索到一条从蚁巢到食物源的最短路径。

将这一问题的核心思想运用到0/1背包问题求解中即是,在某一物品上聚集的信息素越多,则该物品被选择的概率就越大。

就蚁群算法而言,当处理的数据比较小时,其具有很快的收敛速度,而随着数据规模的增大,算法的收敛速度明显降低。

假设有m只蚂蚁,n+1个城市,第0个城市代表背包,第1~n个城市代表各个物品,把第0个城市看作蚂蚁的寻优起点。

令nij=pi/wi表示蚂蚁从城市i转移到城市j的期望程度,这样价值越高同时重量越小的物品对蚂蚁的吸引就越大。

令tij表示路径中留下的信息素强度任,任一只蚂蚁k由城市i转移到城市j的概率可设为:

其中a表示路径上的信息量对蚂蚁选择路径所起的作用大小,f为吸引度的重要性。

每只蚂蚁从寻优起点出发只需一步就可到达1~n当中任意一个食物源,所以上式中有(i=1,2,..,n)。

寻优过程由多只蚂蚁进行,当每只蚂蚁以较大的概率选中食物源i时,如果有,则变量xi将加1;否则给从i到j的路径以罚值,以使后续的蚂蚁不再选择本路径。

当所有节点都受罚以后将结束一次求解过程,然后记录最优解,更新信息素。

更新的公式可为:

上式中k为正常数,d为挥发系数,xj为经过该路径的蚂蚁数量。

蚁群算法求解0/l背包问题的过程如下:

(1)初始化:

即将任意两个城市之间的道路上的信息素赋一个初值;

(2)搜索:

让若干只蚂蚁根据信息素和距离选择城市;

(3)每到一个新城市进行信息素局部更新;

(4)所有蚂蚁完成回路后进行全局信息素更新;

(5)记录最优路径,返回步骤

(2)循环直到满足退出条件。

蚁群算法是近年来发展起来的一种随机算法,已经证明可以有效解决背包问题。

但是蚁群算法的收敛性证明尚处于初步阶段,缺乏完善的理论基础,并且在减少寻优计算量和缩短算法运行时间方面,有待进一步改进。

3.4贪心算法

贪心算法(GreedyAlgorithm,GA)是一种改进了的分级处理算法,根据某个优化目标保证每一步都有局部最优解。

贪心算法是从局部最优出发,最终得到整体最优。

贪心算法每次只考虑一步,每一步数据的选取都必须满足局部最优条件。

枚举剩下的数据与当前已经选取的数据组合获得的解中,提取其中能获得最优解的唯一的一个数据,加入结果集合中,直到剩下的数据不能再加入为止。

用贪心法求解问题时应考虑如下几个方面:

(1)候选集合P:

为了构造问题的解决方案,假设有一个候选集合P可以作为问题的可能解,即问题的最终解均取自于候选集合P;

(2)解集合S:

随着贪心选择的进行,解集合S不断扩展,直到构成一个满足问题的完整解;

(3)解决函数:

检查解集合S是否构成问题的完整解;

(4)选择函数:

即贪心策略,这是贪心法的关键。

它指出哪个候选对象最有希望构成问题的解,选择函数通常和目标函数有关;

(5)可行函数:

检查解集合S中加入一个候选对象是否可行,即解集合扩展后是否满足约束条件。

具体来说,在求解0/1背包问题时,对贪心算法可以使用如下三种策略,以使其得到的解更接近最优解。

具体方案如下:

(1)价值优先策略:

从剩余的物品中选取价值最大的可以装入背包的物品。

此时,价值最大的优先被装入背包,然后装入下一个价值最大的物品,直到不能再装入剩下的物品为止。

(2)重量优先策略:

从剩余的物品中选取重量最小的物品装入背包中,这种策略一般不能得到最优解。

(3)单位价值优先策略:

根据价值/重量的比值,按照每一次选取剩下的物品中比值最大的物品装入背包,直到不能再装入为止。

上述三种策略都不能保证得到最优解,但三种策略相比较而言,第三种策略与最优解相差较小。

如果可以选择物品的一部分,用单位价值策略可以保证得到问题的最优解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1