当前位置:文档之家› 粒子群优化算法及其在背包问题中的应用

粒子群优化算法及其在背包问题中的应用

粒子群优化算法及其在背包问题中的应用
粒子群优化算法及其在背包问题中的应用

摘要

背包问题属于NP难问题,解决背包问题是解决组合优化所面临的问题之一,在现实中有着广泛的应用背景,而粒子群算法作为群智能算法而言,它通过追随当前搜索到的最优值来寻找全局最优。本文在对背包问题进行研究分析的基础上,采用基本粒子群算法、带惯性权重和带收缩因子的改进型粒子群算法来分别解决两个三十维和十维的0/1背包问题,通过多次试验,最终得出了所给的背包问题的最优解,与已知问题最优解一致。

关键词:粒子群优化算法,智能算法,背包问题,最优化

Abstract

Knapsack problem is NP-hard problem to solve the knapsack problem solving combinatorial optimization problems faced by one of the wide range of applications in the real background, while the particle swarm algorithm as a swarm intelligence algorithm, by following the current search for the optimal.The value to find the global optimum. Based on the analysis of the knapsack problem, using the particle swarm algorithm with inertia weight and with a shrinkage factor improved particle swarm optimization to solve the two thirty-dimensional and eleven-dimensional 0/1 knapsack problem, through a multi-trials, and ultimately obtained the optimal solution to the knapsack problem with known optimal solution consistent.

Keywords: Particle swarm optimization algorithm, the intelligent algorithm, knapsack problem, optimization,

目录

1 绪论 (1)

1.1组合优化问题 (1)

1.2背包问题 (1)

1.3对背包问题的研究 (2)

1.4本文的结构 (4)

2 优化算法和背包问题 (5)

2.1粒子群算法 (6)

2.2背包问题 (7)

2.3本章小结 (9)

3 基本粒子群算法在背包问题中的应用 (10)

3.1基本粒子群算法 (10)

3.2基于基本粒子群算法的背包问题 (11)

3.3本章小结 (21)

4 基于改进型粒子群算法的背包问题 (22)

4.1引入惯性权重与收缩因子的改进型粒子群算法 (22)

4.2基于改进型粒子群算法的背包问题 (24)

4.3本章小结 (28)

5 总结与展望 (29)

5.1本文总结 (29)

5.2展望 (29)

参考文献 (30)

致谢 .......................................错误!未定义书签。

1 绪论

1.1 组合优化问题

在人们的生活和工作中,总会碰到各种各样的问题,而解决这些问题的方案又有许多,组合优化问题是一种离散最优化问题,就是在给定约束条件下,求出使目标函数极小(或极大)的变量组合问题。组合优化往往涉及排序、分类、筛选等问题,它是运筹学的一个重要分支[1]。

典型的组合优化问题有旅行商问题(Traveling Salesman Problem-TSP)、加工调度问题(Scheduling Problem,如Flow-Shop,Job-Shop)、0-1背包问题(Knapsack Problem)、装箱问题(Bin Packing Problem)、图着色问题(Graph Coloring Problem)、聚类问题(Clustering Problem)等。这些问题描述非常简单,并且有很强的工程代表性,理论上说每一个组合优化问题都可以通过枚举的方法求得最优解,但枚举是以时间为代价的,有的枚举时间还可以接受,有的则不可能接受,即所谓的“组合爆炸"[2]。对于这些NP 完全的组合优化问题,至今尚无很好的解析算法,一般采用启发式算法来解决。

组合优化问题在规划、调度、资源分配、决策等问题中有着非常广泛的应用,在国际上得到了广泛的重视[3]。国际上许多优秀的运筹学家、计算机科学家和数学家等都投入到这一领域,针对许多有重要意义的组合最优化问题提出了相应的理论和优化算法,目前已发展成为运筹学和应用数学的一个十分活跃的研究领域,具有重大的理论意义与实用价值,其目的主要是寻找离散事件的最优编排、分组、次序或筛选等,是运筹学中的一个经典而重要的分支。由于组合优化问题与大量的实际问题紧密地结合,越来越多的人开始研究组合优化问题,提出许多新的方法和思路,使得组合优化问题内容越来越丰富。组合优化问题的求解一直是近年来研究的热点领域之一。

1.2 背包问题

背包问题(Knapsack Problem)是典型的组合优化问题之一,工厂里的下料问题,管理中的资源分配、资金预算、投资决策、项目选择、材料切割、货物装载等均可建模为背包问题,并且还常常作为其他问题的子问题加以研究。背包问题是运筹学中的一个典型的NP问题。大多数背包问题有拟多项式的时间算法,这意味着若系数规模有所界定,在可接受的时间内能够得到最优解。背包问题的应用背景促使人们对该问题计算方法进行了深入研究,背包问题的特有计算性质又使其应用领域不断得到拓展。它的数学模型实际上是一个0-1规划问题[4]。0-1背包问题是指有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品且对每一物品,要么选,要么不选,满足被选物品的总重量

不超过背包指定的限制重量且达到被选物品的价值总和最大的问题。如果所有物品的重量之和小于背包的容量,则问题极其简单,所得利益也就是所有物品的价值之和,而实际问题往往是背包的容量小于物品的重量之和[5]。

背包问题可以衍生出一系列与之相关的优化问题,如有限背包问题(物体可具有相同价值和重量但数量是有限的),无限背包问题(具有相同价值和重量的物体数量可以是无限的),多背包问题(将物体装入多个容量不同的背包)等。

背包问题在实践中有广泛的应用背景。许多简单结构的有机组合构成了复杂结构,对简单问题的深入探索也使复杂问题的解决变得相对容易。在设计解决大量的复杂组合优化问题算法时,背包问题往往作为子问题出现。背包问题的算法改进,对复杂组合优化问题算法的改良是十分有益的。

1.3 对背包问题的研究

对于背包问题已有的求解方法可分为精确算法(盘日枚举法,动态规划法,分支定界法,图论法等指数级方法)和近似算法(如贪心算法,蚂蚁算法,遗传算法等)两大类。

Dantzig在五十年代中期首先进行了开创性的研究,利用贪心算法求得了一个理想解,得出了0/1背包问题最优解的上界。在这之后二十几年里背包问题研究没有取得太大进展,该上界也未得到改进。直到一九七四年,Horowitz和Sahni先利用分支定界技术设计出有效算法解答背包问题,并提出了背包问题的可分性,指明了解答该问题的一条新途径。之后,Martello和Toth利用整数约束和分支定界技术第一个改进了Dantzig上界。1980年,Balas和Zemel首先提出了解答背包问题的“核”(Core)思想,使该问题的研究有了较大进展。在九十年代末Pisinger利用平衡技术和“核膨胀”思想设计的算法,该算法结合了动态规划技术,使解答背包问题的算法有了实质进展。在进入二十世纪的九十年代以后,生物仿生技术和Internet技术的飞速发展.使得模拟生物物理规律的各种并行近似算法不断涌现,遗传算法已经在0/l背包问题上得到较好的应用,蚂蚁算法、粒子群算法等仿生算法也在各种组合优化问题中得到了应用。下面对几种常用的算法进行简介:

递归算法:这种方法本身是一种深度优先的穷举算法,所以不适合大规模问题的求解。

动态规划法:动态规划法是解决多阶段决策过程摄优化的一种数学方法。1951年美国数学家贝尔曼等人.根据一类多阶段决策问题的特点,把多阶段决镱问题变换为一系列相互联系单阶段问题,然后逐个加以解决,从而创建了动态规划的方法。它的特点是解决多阶段、离散性问题。它采用最优原则来建立用于计算最优解的递归武。所谓最优原则即不管前面的策略如何,此后的决策必须是基于当前状态(由上一次决策产生)的最优原则。由于对于有些问题的某些递归式来说并不一定能保证最优原则,因此在求解问

题时有必要对它进行验证。若不能保持最优原则,则不可应用动态规划方法。在得到最优解的递归式之后,需要执行回溯(Traceback)构造最优解。采用动态规划方法,可以很高效的解决许多用分支定界法或贪婪法无法解决的问题。

分支定界法:是一种求解整数规划问题的最常用算法。这种方法不但可以求解纯整数规划,还可以求解混合整数规划问题[7]。

通常,分支定界法的步骤如下:首先放宽或取消原问题的某些约束条件,如求整数解的条件。如果这时求出的最优解是原问题的可行解,那么这个解就是原问题的最优解,计算结束。否则这个解的目标函数值是原问题的最优解的上界。其次将放宽了某些约束条件的替代问题分成若干子问题,要求各子问题的解集合的并集要包含原问题的所有可行解,然后对每个子问题求最优解。这些子问题的最优解中的最优者若是原问题的可行解,则它就是原问题的最优解,计算结束。否则它的目标函数值就是原问题的一个新的上界。另外,各子问题的最优解中,若有原问题的可行解的,选这些可行解的最大目标函数值,它就是原问题的最优解的一个下界。在此对最优解的目标函数值已小于这个下界的问题,其可行解中必无原问题的最优解,可以放弃。对最优解的目标函数值大于这个下界的子问题,都先保留下来,进入下一步。最优在保留下的所有子问题中,选出最优解的目标函数值最大的一个,重复第1步和第2步。如果已经找到该子问题的最优可行解,那么其目标函数值与前面保留的其他问题在内的所有子问题的可行解中目标函数值最大者,将它作为新的下界,重复第3步,直到求出最优解。

图论法:广泛的运筹学分支,它已广泛的虑用在物理学、化学、控制沦、信息论、科学管理、电子计算机等备个领域。在实际生活,生产和科学研究中,有很多问题可以用图论的理论和方法来解决。

欧拉在1736年发表了图论方面的第一篇论文,解决了著名的哥尼斯堡七桥问题。随着科学技术的发展以及电子计算机的出现与广泛应用.二十世纪五十年代,图论的理论得到进一步发展。将庞大复杂的工程系统和管理问题用图描述,可以解决很多T程设计和管理决策的最优化问题。例如,完成工程任务的时间最少,距离最短,费用最省等。图论受到数学、工程技术及经营管理等各个方面越来越广泛的重视。图论中有许多基本的概念,如边,弧,无向图,有向图,树等等,还有许多现有的方法,如破圈法,避圈法,Dijkstra法等等[8]。

启发式算法:启发式算法是一种技术。这种技术使得在可接受的计算费用内去寻找最好的解,但不一定能保证所得解的可行性和最优性,甚至在多数情况下,无法阐述所得解同最优解的近似程度。在某些情况下,特别是实际问题中,最优算法的计算时间使人无法忍受或因问题的难度使其计算时间随问题规模的增加以指数速度增加,此时只能通过启发式算法求得阀题的一个可行解。

早在40年代末期,由于实际问题的需要,人们已提出一些解决实际问题的快捷有效的癌发式算法。随着70年代算法复杂性理论的完善,不再强调一定要求得到最优解,因

此促使80年代初兴起的现代优化算法在今天得到了巨大的发展。

1.4 本文的结构

本文共五章。

第一章从组合优化问题入手,简单的阐述了一些背包问题的背景知识以及对于背包问题的求解方法的研究状态,并将解决背包问题的几种可行的方法进行列举和说明,从而对于背包问题有着更深入的了解。

第二章介绍了最优化算法的基本原理和数学模型,并列举了若干算法的意义以及概念。尤其详细的阐述了粒子群优化算法的基本信息,从发展历程,实际意义以及改进措施等方面对粒子群优化算法进行了比较全面的介绍,同时本章也简单的介绍了背包问题的若干种类型以及问题的数学描述,这对于真正理解背包问题有着很重要的意义,方便我们对其进行分析并运用粒子群算法来解决背包问题。

第三章介绍了运用基本粒子群算法来解决两个不同维度的0/1背包问题,首先是采用了固定参数的基本粒子群算法来解决背包问题,对整个实验结果进行了分析,确认了粒子群算法确实是可以用来解决背包问题的,然后对影响算法性能的参数进行了调整和设置,得出结果厚整理成表格并绘图,讨论了每种参数的变化对粒子群算法的影响,通过解决背包问题的过程也检验了粒子群算法的性能。

第四章在第三章的基础之上,介绍了两种对于基本粒子群算法的改进型算法。这两种算法分别引入了惯性权重以及收缩因子,其本质都是为了调节粒子对于种群经验和自身经验所占的比重,以及粒子飞行时的速度的衰减。从结果上看对于基本粒子群算法的改进还是有其可取之处的,取得的结果也普遍优于基本粒子群算法,这说明对于粒子群算法的改进还要继续研究。

第五章在最后对全文所做的工作进行了一个比较完整的总结,并对粒子群算法及其改进算法进行了展望。

2 优化算法和背包问题

解决最优化问题的算法称为最优化算法,可以分为经典优化算法和启发式优化算法。经典算法的确立可以从(G.B.Dantzig 1947)提出解决线形规划的单纯形(Simplex method)开始,但单纯形不是多项式算法(在后面计算复杂性中会提到)。随后,Kamaka 提出了椭球算法(多项式算法),内点法[9]。对于非线性问题,起初人们试图用线性优化理论去逼近求解非线性问题,但效果并不理想。后来的非线性理论大多都建立在二次(凸)函数的基础上,也就用二次函数去逼近其他非线性函数。在此基础上提出许多优化经典的优化算法。无约束的优化算法包括:最速下降法(Steepest)、共轭梯度法、牛顿法(Newton Algorithm)、拟牛顿法(Pseudo Newton Algorithms)、信赖域法。

约束优化算法包括:拉格朗日乘子法(Augmented Lagrangian Algorithms),序列二次规划(SQP)等。

随着社会的发展,实际问题越来越复杂,例如全局最优化问题。经典算法一般都用得局部信息,如单个初始点及所在点的导数等,这使得经典算法无法避免局部极小问题。全局最优化是NP-Hard问题。

在多项式时间内使无法等到其绝对最优解,只能采取某些策略,使得在可接受的时间内得到近似最优解,所以原有的经典算法不再使用,必须对其进行改进,或将其与启发式算法结合。

大自然是神奇的,它造就了很多巧妙的手段和运行机制。受大自然的启发,人们从大自然的运行规律中找到了许多解决实际问题的方法。对于那些受大自然的运行规律或者面向具体问题的经验、规则启发出来的方法,人们常常称之为启发式算法(Heuristic Algorithm)。现在的启发式算法也不是全部来自然的规律,也有来自人类积累的工作经验。

启发式算法有不同的定义:一种定义为,一个基于直观或经验的构造的算法,对优化问题的实例能给出可接受的计算成本(计算时间、占用空间等)内,给出一个近似最优解,该近似解于真实最优解的偏离程度不一定可以事先预计;另一种是,启发式算法是一种技术,这种技术使得在可接受的计算成本内去搜寻最好的解,但不一定能保证所得的可行解和最优解,甚至在多数情况下,无法阐述所得解同最优解的近似程度。

启发式算法的计算量都比较大,所以启发式算法伴随着计算机技术的发展,取得了巨大的成就。Holland模拟地球上生物进化规律提出了遗传算法(Genetic Algorithm),它的与众不同的搜索机制引起了人们再次引发了人们研究启发式算法的兴趣,从而掀起了研究启发式算法的热潮[10]。

而八十年代后产生的模拟退火算法(Simulated Annealing Algorithm),人工神经网络(Artificial Neural Network),禁忌搜索(Tabu Search)相继出现。最近,演化算法

(Evolutionary Algorithm),蚁群算法(Ant Algorithms),拟人拟物算法,量子算法等油相继兴起,掀起了研究启发式算法的高潮。本文所述的粒子群优化算法(Particle Swarm optimization,PSO) 也属于新兴的优化算法,由于这些算法简单和有效,而且具有某种智能,因而成为科学计算和人类之间的桥梁[11]。

2.1 粒子群算法

粒子群算法(PSO)是一种基于群体智能的优化技巧。它模拟了鸟群的运动特性,在该模型中。用无质量、无体积的微粒作为十体,每个个体都有一定的感知能力。能够感知周围的局部最好位置的个体和整个群体的全局最好位置的个体的存在。并根据当前的状,调整自己下一步的行为,从而使整个群体表现出一定的智能性。

PSO模拟鸟群的捕食行为。设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。

PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。

PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个"极值"来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值p Best。另一个极值是整个种群目前找到的最优解,这个极值是全局极值g Best。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值[12]。

起初,PSO是为实值问题而设计,后来,算法逐渐扩展到二进制和离散问题。两种最常用的PSO算法是全局版本PSO和局部版本的PSO。这两种版本的差别在于粒子的邻域不同,即各粒子最近邻的粒子。局部PSO的粒子,其邻域仅为其两边·有限的几个粒子,而全局PSO的邻域则为该群体所有粒子。如此一来,全局PSO可看成是局部PSO的特殊情况。

研究发现,全局PSO收敛较快,但易陷入局部极小;而局部PSO可搜索到更优的解,但速度稍慢。此外,为提高PSO的性能,研究者又设计了许多不同的邻域结构,包括金字塔结构、星型结构、小邻域结构,以及冯·诺以曼结构。试验结果表明,冯诺以曼结构比其他规整邻域结构效果要好,包括全局和局部PSO[13]。研究还发现,对于复杂问题,采用小邻域结构要好,而对于简单问题适于用大邻域结构。还有的学者对动态邻域结构进行了研究。通常,每种结构都有其优势,但缺点也无法避免。对一些问题,可能该结

构好,但另外一些问题,则不然。

PSO速度的改变由三部分组成:社会项、认知项和动量项。三部分如何平衡,决定了PSO算法的性能。原始PSO中增加了第一个新参数为惯性权重。惯性权重的引入是为了平衡全局与局部搜索能力。惯性权值较大,全局搜索能力强,局部搜索能力弱,反之,则局部搜索能力增强,而全局搜索能力减弱。

动态惯性权值能够获得比固定值更为好的寻优结果。动态惯性权值可以在PSO搜索过程中线形变化,亦可根据PSO性能的某个测度而动态改变,比如模糊规则系统。随后,另一个参数称之为收缩因子的系数被引入,目的是希望PSO可以收敛。从数学上分析,这两个参数是等价的[14]。

PSO另一个研究的趋势是将其与其他进化计算技术相结合。有些研究者向PSO当中引入了一些算子,包括选择、交叉、和变异。通过选择算子,最好性能的粒子将被直接复制到下一代,从而保持最优性能的粒子。同进化算法类似,通过交叉算子,成对的粒子将交换相互的信息,以便有向新的搜索空间飞翔的能力。变异算子主要目的是为了增加PSO跳出局部极小的能力。另一方面,为了加快进化规划算法的速度,研究者还借鉴了PSO的速度思想,将其应用到进化规划当中,来指导变异操作的进行。

2.2 背包问题

背包问题(Knapsack Problem)在50年代末期由Dantzig首次提出之后,在近年来被广泛的研究。这不仅是因为背包问题在工业和金融投资领域能得到直接的应用,更是因为很多理论上的原因。

很多整数规划的问题的解决都依赖于一个高效的背包问题解法,在这些整数规划问题中;每当需要定界的时候我们都需要解决一个背包子问题,因此一个高效的背包问题解法就显得非常有必要。

所有的背包问题都可以定性的描述为,从给定的物品集合中选择出一个子集,在不超出所有背包的负载的前提下,实现利益最大化。

背包问题的不同种类的判定,使根据物品和背包的类型:在0/1背包问题(0/1 Knapsack Problem)中,每一个物品最多被选择一次,而与之相对应的有界背包问题(Bounded Knapsack Problem)中能选择的物品数则可以在某个范围内取值;再比如多选择背包问题(Multiple.choice Knapsack Problem)是说某几个物体必须选择一个或多个,而多背包的背包问题(Multiple Knapsack Problem)则是说某些背包必须同时被装满。在这些背包问题家族中,最通用的形式是多条件约束背包问题(Multi—constrained Knapsack Problem),而这在实质上就是正系数的整数规划问题(Integer Programming)。

0/1背包问题是从有n个物品的物品集选取一个子集,在总体积不超过包裹容量c的前提下,使得相对应的利益实现最大化。可以用以下的公式进行形式化的描述[15]:

{}1

1m ax 0,1,1,2....n

j j

j n

j j j im ize p x subject to w x c

x j n ==?

??

?

≤??

?∈=??∑∑

(2-1)

其中,如果选择物品j 那么决策变量xj 取1,否则取0。 (2) 有界背包问题

物品j 最多可以选择mj 个,那么有界背包问题可以描述为:

{}1

1m ax 0,1,...,1,2....n j j

j n

j j j im ize p x subject to w x c

x m j n ==?

??

?

≤??

?∈=??

∑∑ (2-2)

(3) 多选择背包问题

多选择背包问题是0/1背包问题的另外一种扩展。扩展不是针对数目进行的,而是针对物品的类型。也即是说,从k 类物品Ni(i=1,..k)中选择出物品j 使得最终的总获益最大。数学定义如下:

{}11m ax 0,1,1,2....,i i k n ij ij

i j N i

k n ij ij i j N i i

im ize p x subject to w x c

x i k j N

=∈=∈?

??

??

≤??

?∈=∈???

∑∑∑∑ (2-3)

(4) 最大子集和问题

如果0-1背包问题中每个物品的pj 都和他的wj 相等,就构成了最大子集和问题。数学定义如下:

{}1

1m ax 0,1,1,2....n j j

j n

j j j im ize w x subject to w x c

x j n ==?

??

?

≤??

?∈=??∑∑

(2-4)

以上的这些类型的背包问题无论在理论上,还是在实践中都具有非常多的应用。在理论上,背包问题是很多组合优化问题的子问题,背包问题研究上的任何一个进步都会使得这些问题的解决受益。由于任何一个多条件的整数规划问题都可以等价的转化为一个单条件的整数规划问题,继而转化为0/1背包问题。因此课题研究的重点也就是0/1背包问题。

2.3 本章小结

本章简单介绍了最优化算法的基本原理和数学模型,并列举了若干算法的意义以及概念。尤其详细的阐述了粒子群优化算法的基本信息,从发展历程,实际意义以及改进措施等方面对粒子群优化算法进行了比较全面的介绍,同时本章也简单的介绍了背包问题的若干种类型以及问题的数学描述,采用公式的方法来形象的列出了背包问题的实质,这对于解决背包问题有着很大的帮助。

3 基本粒子群算法在背包问题中的应用

3.1 基本粒子群算法

自1995年PSO 算法问世以来,不同领域的研究人员曾提出各种算法模型,从不同角度对PSO 算法进行了详细的分析、设计。其中倍受推崇的是Ebcrhart 、Shi 和Clerc ,他们依据PSO 算法的模拟思想,分别构造了基本PSO 模型,引入惯性权重的PSO 模型和引入收缩因子的PSO 模型,并通过了大量的实验研究,详细分析了模型中不同控制参数的意义与作用,并为其确定了相应得参考取值。这三种算法模型被后来的研究人员视为PSO 算法的经典与研究基础[16]。 3.1.1 基本粒子群算法

基本PSO 模型:在基础PSO 算法中,搜寻空间是一个D 维空间。PSO 初始化种群的粒子,每个粒子都被用p i =(p i1,p i2,…p in ),i=1,2…k 。其中k 是整个粒子群的大小。局部最优解被记为l best ,整体最优解被记为g best ,因此,l best 和g best 都与p i 相同,是n 维向量。一个重要的参数是速度,作为粒子在搜寻空间飞翔的动力。位置变化的速率被表示为v i =(v i1,v i2…v in )基础PSO 算法可以用两个公式来描述:

1122()()ij ij bestid ij bestd ij v v c r l p c r g p =+-+- (3-1) ij ij ij

p p v =+

(3-2)

其中c 1c 2是名为恒加速度两个正常数,通常情况下他们等于2。r 1r 2是两个从(0,1)中随机取值的数。所有变量都来自于算法当中的进化核心。

基本PSO 的流程可以描述为[17]:

(1)初始化。初始搜索点的位置xi 及其速度vi ,通常是在允许的范围内随机产生的,每个粒子的p best 的坐标设置为其当前位置,且计算出其相应的个体极值(即个体极值点的适应度值),而全局极值(即全局极值点的适应度值)就是当前所有个体极值中最好的,称为最好粒子,记录该粒子的序号,并将g Best 设置为该最好粒子的当前位置。

(2)判断每一个粒子。计算粒子的适应度值,如果好于该粒子当前的个体极值,则将p Best 设置为该粒子的位置,且更新个体极值。如果所有粒子的个体极值中最好的好于当前的全局极值,则将g Best 设置为该粒子的位置,记录该粒子的序号,且更新全局极值。,

(3)粒子的更新。对每一个粒子的速度和位置进行更新。

(4)检验是否符合结束条件。如果当前的迭代次数达到了预先设定的最大次数(或达到最小误差要求),则停止迭代,输出最优解,否则转到(3-2)。

3.2基于基本粒子群算法的背包问题

3.2.1 背包问题

背包问题(Knapsack Problem)在50年代末期由Dantzig首次提出之后,在近年来被广泛的研究。这不仅是因为背包问题在工业和金融投资领域能得到直接的应用,更是因为很多理论上的原因。很多整数规划的问题的解决都依赖于一个高效的背包问题解法,在这些整数规划问题中;每当需要定界的时候我们都需要解决一个背包子问题,因此一个高效的背包问题解法就显得非常有必要[18]。

0/1背包问题是NP完全问题,一般提法:n件物品的重量和价值分别是W i和C i,i=1,2,…,n,背包的容量为v,如何选择物品装入背包使装入背包的物品的总价值最大[19]。在管理中,资源分配、投资决策、装载问题都可以抽象为背包问题,下面就是需要用到粒子群优化算法来解决的两个具体的背包问题。

(1)问题1: 采用下面的典型的背包问题进行试验。

物品的价值如下

C=[220,208,198,192,180,180,165,162,160,158,155,130,125,122,120,118,115,110,105,1 01,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8,5,3,1]元;

物品的体积如下

W=[80,82,85,70,72,70,66,50,55,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,20,25,15,10,10,10,4,4,2,1]g;

背包的容量Wmax=1000g;

(2)问题2:考虑一个10件物品的背包问题,背包的容量是45,物品的重量、价值和单位重量物品的价值如下

通过分析和判断,对上述所说的背包问题可以采用基本粒子群算法,也可以采用一些改进型的粒子群算法比如之前描述过的带惯性权重的粒子群算法和带收缩因子的粒子群算法,下面是基于基本粒子群算法来解决上面背包问题的路线。

3.2.2 算法流程

首先是利用粒子群算法来处理背包问题的具体的流程:

利用粒子群算法来解决背包问题的关键就是如何进行编码。现在给出用于解决背包

问题的粒子群算法的编码方式[20]。

背包问题的数学模型可以描述为如下:

n

i 1

1

m ax ,.

,{0,1},1,2,,n

j j j

j j i x c st x

v x j n

ω==≤∈=∑∑ (3-3)

其中

11,2,3,...,0j x j n

?==?

?物体放入背包物体不放入背包

接下来,用Xik 表示粒子群中的第i 个粒子在进化的第k 代的位置值。每一个Xik 表示成背包问题的一个解,其中

123[,,,...,]

k

k

k

k

k

i i i i in X x x x x =,n 表示粒子群中粒子具有的维数,在

背包问题中表示成有n 个物品等待被选择是否装入背包。如果xijk 表示第i 个粒子在进化的第k 代时不将第j 个物品装入背包,否则将第j 个物品装入背包,Vik 表示粒子群中的第i 个粒子在进化的第k 代的速度值

[21]

。其中

123[,,,...,]

k k k k k

i i i i in V v v v v =

求解背包问题的粒子群算法流程如下: Step1:确定参数值

确定种群规模N ,确定学习因子c 1和c 2,并令进化代数k=0 Step2:初始化所有粒子的位置和速度 每个粒子的位置由

0(0,1)0.51,2,...,;1,2,...1ij R x i N j n

?否则

(3-4)

随机生成,其中R(0,1)表示随机产生在[0,1]之间的随机数。 每个粒子的速度由

min max min (0,1)()

ij v v R v v =+-随机生成,其中vmax 和vmin 表示速度

的最大和最小限制值。

Step3:计算粒子的适应值并更新记忆库

粒子的适应值为

11

()()m in 0,n

n

k

k i j ij

j ij

j j f x c x Q V w x ==?

?=--

??

?

?

∑∑

,其中Q 为一充分大的正

数。令PBik 表示第i 个粒子进化k 代所经历的最好位置,用GBk 表示整个种群进化k 代之后所经历的最好位置。如果k=0,则PBi0=xi0,除此之外:

1

1

()()

k k

k i i i k

i k i

PB f x f PB PB x --?

??否则

(3-5)

m ax()

1,2,...,k

k

i G B PB i N

==

并将GB k 存入记忆库[19],检查是否满足结束条件,满足则退出,否则继续。 Step4:用记忆库中的记忆粒子替换粒子群中适应值小的粒子

从记忆库中选择M个粒子,来替换粒子群中那些适应值排在整个粒子群中后M位粒子。

Step5:更新粒子的速度和位置。

对于每一种粒子群算法来说,粒子速度和位置的更新公式是不一样的,在基本的粒子群算法当中,粒子的速度和位置是依据之前的公式1和公式2来进行更新的,而对于改进的PSO算法来说,需要更复杂的公式来对粒子进行更新[22]。在这一部当中我们需要注意,粒子很可能在更新的时候陷入局部最优,所以在设定参数的时候要予以注意[23]。

整个流程可以简单地描述为下面的图3-1:

图3-1基本粒子群算法在解决背包问题的流程图

3.2.3 基于基本粒子群算法的背包问题

(1)运用基本粒子群算法来解决三十维的背包问题

经过MATLAB仿真,每改变一次参数就将程序独立运行三十次,试验的参数有种群规模、迭代次数、学习因子。(所有仿真均在主频1.66GHz Intel Core Duo CPU, 3G内存,Windows7 32位操作系统的计算机上由MATLAB7.6.0语言运行30次。)

如上所述,采用基本粒子群算法的思想来解决背包问题,进行编程,其中粒子群算法的参数设置如下(已知该问题的最优解为3103):

种群规模=100;学习因子C1=C2=2;迭代次数=100

每次运算结果都记录在下表当中,一共运行三十次,并在最后计算最大值、最小值、平均值以及方差。

表3.1 基于基本粒子群算法的30维背包问题的解

图3-2 基本粒子群算法的结果分布

根据上述图所示,粒子群算法分布大体呈现线性,这说明粒子群算法在运算结果上还是很稳定的,取得的结果比较可靠,即既不会出现某一结果特别偏低,也不会出现某一结果十分突出,整体而言,单次运行粒子群算法得到的结果与题目已知的最优解(3103)偏差都控制在5%以内,平均值与最优解的偏差在2.5%。考虑到参数会影响粒子群算法的性能,下面就讨论每一个参数对粒子群算法的影响。

基本粒子群算法可以设置的参数有三个,即种群规模,迭代次数以及学习因子。其中种群规模代表着运算的广度,迭代次数代表运算的深度,学习因子的比值代表着粒子群算法当中粒子的自身经验与群体经验所占的比重大小,改变这三个参数可以对结果产生很大的影响。

试验中种群规模从100取到2000,迭代次数从10代取到300代,学习因子比值从1:4一直到4:1,然后每改变一次参数都将程序运行三十次,得到的结果算出平均值,找出最大和最小值并将方差计算出来,得到的结果见下页三张表。

为了便于分析,现在将改变三种参数得到的结果绘成如下三张图,其中第一张图是对迭代次数进行分析,第二张图是对学习因子的比值进行分析,第三张图是对种群规模进行分析。其中每个曲线的点都是取得实验结果的平均值。

表3.2 种群规模对于粒子群算法的影响

表3.3 迭代次数对于粒子群算法的影响

表3.4学习因子对粒子群算法的影响

下面三张图可以更好的让我们分析对于处理三十维的0/1背包问题,粒子群参数的设置对于结果的影响。

图3-3迭代次数影响曲线

图3-4学习因子比例影响曲线

图3-5种群规模影响曲线

如上图曲线所示,我们不难发现粒子群算法结果和参数之间的关系如下:

种群规模对于粒子群算法的影响是显著的,种群规模越大,得到的结果越接近最优值,但是付出的代价是运算时间有着明显的增长,根据结果和经验来说,种群规模取到维数的平方值是比较不错的选择。

迭代次数对于粒子群算法来说在次数较少的时候有显著影响,但是随着迭代次数的提高,粒子群算法的结果改善并不明显,说明迭代次数是有其自身的阈值的。以问题1为例,迭代次数一般在一百代以内都可以去到较好的结果。

学习因子代表着自身经验和全局经验的比重,通过结果可以看出,基本粒子群算法对于粒子自身经验的依赖性要高于全局经验,但是并不是说全局经验没有用处,可以看到在C1:C2=2时候得到的结果方差最小,最稳定,所以说适当的学习因子比是取得最优解的重要因素。

需要说明的是,实验在粒子维数取到2000的时候,程序已经可以得出此三十维度的0/1背包问题的最优解,这说明了粒子群算是切实可行的,不过对具体的问题要经过反复的实验才能确定最佳的参数组合,而且随着问题的变换,参数的设置经验也不能通用,需要经过新的实验来探讨,但是参数的变化导致的结果变化趋势却是有迹可循的,这些都说明了粒子群算法的参数设定依赖于经验,是一种经验型的智能算法。

(2)运用基本粒子群算法来解决十维的背包问题

对于问题2,在初始设定的参数下,同问题一一样经过三十次的运算得到结果,现得到的结果如下表:

表3.5基于基本粒子群算法的背包问题的解(10维)

表中可知粒子群算法在低维的背包问题中表现出色,能够准确的找出问题的最优解834。分析不难看出,粒子群在面对维数较低的背包问题时,在多次重复试验时可以达到要求,这从正面说明了粒子群算法来解决背包问题是切实可行的,而且在对待低维度的背包问题效果更佳出色。

相比问题1而言,许多参数改动之后,粒子群算法依然可以寻找到最优解。这一点可以被应用在实际当中,当背包问题的维数较低时,采用粒子群算法来计算最优解是一种非常好的手段。而从中暴露的问题也显而易见,就是粒子群算法解决问题的时候,问题的难度以及复杂程度也影响着粒子群算法的效果。

0/1背包问题的复杂程度由他的物体数量决定,而粒子群算法若是想要在背包问题中取得好的效果,就要讨论粒子群算法公式当中的参数。

相关主题
文本预览
相关文档 最新文档