赞
踩
今天给大家介绍一个经典的算法,粒子群算法。
然后,我们用粒子群算法解决一个经典的问题---背包问题。
先说一下背包问题:
一:背包问题:
一个小偷,背着一个空背包进入了一家珠宝店。他的背包能承受的最大重量为M。
珠宝店里面的珠宝有很多种,有些重,有些轻。有些贵,有些便宜。
假设珠宝店的珠宝重量分别为:
a1,a2,a3,a4,a5,a6......
对应的价值分别是
b1,b2,b3,b4,b5,b6......
请问,小偷应该装哪些货物的组合,才能达到自己的利益最大化呢?
二:总价值的表述
我们首先要学会如何表述总价值,因为只有价值用数学语言表述出来,我们才能有优化的方向。
我们在程序中用随机数生成物品重量与价值的数据:
我们假设,小偷一共偷了n个物品。分别是i,2,,,i,,,,n。物品的重量是g(i),物品的价值是f(i)。
我们得到:
M=g(1)+g(2)+......+g(n)<背包最大容量
Value=f(1)+f(2)+......+f(n)。
我们要做的就是在满足第一个不等式的情况下,让第二个式子的Value尽可能大。这就是优化。
三:演示的效果
大家可以看看视频:
我们将粒子群优化的可视化,得到了下面的图(原本是动图)
右边表示的其实就是小鸟觅食的过程。左边表示不断优化的结果。
四:粒子群算法介绍
PSO模拟鸟群的捕食行为。一群鸟在随机搜索食物,在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻离食物最近的鸟的周围区域。不用找食物最多的点,找鸟最多的位置,然后过去。
-----(来源:百度百科)。
你可以这样想,在一个面积已知的平面上,不均匀地分布着很多食物。有一群鸟儿在平面上方觅食,它们无法直接看到准确的全部食物的分布。因为食物太小了。但是他们可以看到在什么地方聚集的鸟比较多,鸟聚集比较多的地方通常来说食物比较多,这样,食物越多的地方聚集的鸟越多,最后,我们就找到了食物多的地方,也就是最优解。当然,我们也有可能陷入局部最优解而不是全局最优解。
五:代码实现
粒子群代码比较复杂,如果大家想深入学习,可以慢慢学一下
看几个比较关键的代码,下面是初始化生成鸟的代码。
- # 进行粒子初始化
- self.X = np.random.choice([0, 1], (M, D)) # 粒子初始化的解
- self.old_X = np.copy(self.X) # 保存下一步的解
- self.pid_list = np.copy(self.X) # 粒子历史最优解
- self.vid_list = np.random.random((M, D))*V_max # 每个粒子的初始速度
-
-
- # 计算每个粒子的适应值, 然后获得领域最优的位置
- self.best_fitness = [fit_func(self.X[i]) for i in range(np.shape(self.X)[0])]
- self.pgd = np.copy(self.X[np.argmax(self.best_fitness)])
其中的粒子就是鸟的意思。
self.X = np.random.choice([0, 1], (M, D)) # 粒子初始化的解
粒子初始化的解,就相当于我们把鸟随机洒在平面上。
- self.old_X = np.copy(self.X) # 保存下一步的解
- self.pid_list = np.copy(self.X) # 粒子历史最优解
然后,鸟要记住这个地方的距离位置。以及这个地方食物多不多。
self.vid_list = np.random.random((M, D))*V_max # 每个粒子的初始速度
我们设置鸟飞行的速度,也就是让鸟以一定的速度在平面上飞行,寻找食物。
这个速度非常重要。
如果飞行速度大,比较容易找到新的食物聚集处,但是不难在已有的食物聚集处找到最优的那个食物聚集点。如果鸟的飞行速度慢,那么不容易找到新的食物聚集处,但是容易在已有的食物聚集处找到最优的点。
所以我们要谨慎设置这个速度大小。
六:我的一个想法(只是想想)
我一直想,可不可以把一部分鸟的飞行速度设置的大一点,另一部分设置的小一点,这样,既不容易陷入局部最优解,也方便在已知的最优区域找到最优的那个点。
有兴趣的同学可以试一下,我只是想想,不知道对不对
代码来源:
author: longxin
https://github.com/Derfei/pso
封面图:图怪兽(已付费)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。