求解“背包问题”的“粒子群算法”

今天给大家介绍一个经典的算法,粒子群算法。

然后,我们用粒子群算法解决一个经典的问题---背包问题。

先说一下背包问题:

一:背包问题:

一个小偷,背着一个空背包进入了一家珠宝店。他的背包能承受的最大重量为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

封面图:图怪兽(已付费)

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值