import random
import math
import matplotlib.pyplot as plt
import numpy as np
import time
def init(b_=700,xSize_=200,iteration_=1000,c1_=0.5,c2_=0.5,w_=0.8):
global a,c,b,Dim,xSize,iteration,c1,c2,w,A,C,x,v,xbest,fxbest,gbest,fgbest
a = [90, 33, 94, 69, 77, 91, 39, 74, 24, 34, 14, 89, 98, 37, 32, 45, 15, 98, 40, 16, 17, 4, 3, 5, 94, 3, 64, 47, 85, 9, 6, 39, 44, 67, 33, 59, 17, 16, 55, 95, 69, 88, 91, 28, 66, 54, 85, 82, 24, 17, 30, 66, 96, 8, 74, 20, 84, 35, 53, 19, 25, 64, 98, 93, 86, 24, 30, 68, 56, 37, 6, 98, 48, 76, 61, 9, 29, 76, 55, 41, 93, 19, 56, 85, 20, 84, 12, 64, 94, 29, 26, 93, 83, 72, 76, 86, 4, 99, 29, 4]
c = [68, 20, 125, 85, 113, 109, 19, 93, 17, 19, 18, 79, 92, 39, 45, 50, 12, 77, 53, 16, 8, 2, 2, 7, 47, 4, 67, 9, 62, 6, 8, 51, 61, 93, 33, 35, 14, 15, 34, 136, 87, 72, 121, 28, 84, 54, 110, 44, 15, 23, 36, 95, 77, 11, 74, 14, 75, 50, 63, 26, 34, 56, 67, 77, 73, 34, 41, 59, 84, 44, 7, 112, 70, 65, 54, 6, 20, 92, 56, 21, 125, 24, 83, 113, 14, 99, 18, 49, 70, 15, 34, 88, 105, 48, 61, 128, 3, 110, 19, 4]
b = b_ #背包容量
#初始化种群
Dim = 100 #维度
xSize = xSize_ #种群数
iteration = iteration_ #迭代次数
c1 = c1_
c2 = c2_ #加速因子
w = w_ #定义惯性因子
A = np.array([a]*xSize) #将a扩展成种群数*维度的矩阵
C = np.array([c]*xSize) #将c扩展为种群数*维度的矩阵
x = np.random.randint(0,2,(xSize,Dim)) #随机生成一个种群数*维度的矩阵
v = np.random.rand(xSize,Dim) #随机生成一个种群数*维度的速度矩阵
xbest = np.zeros((xSize,Dim)) #单个粒子的初始最佳位置
fxbest = np.zeros((xSize,1)) #xbext的适应度
gbest = np.zeros((1,Dim)) #全局最优解
fgbest = 0 #全局最优解的适应度 def solve():
#寻找粒子群最优位置和单个粒子
global x,fgbest,v
fx = np.sum(np.multiply(C,x), axis=1) # 粒子适应度,即背包内物品的价格
sx = np.sum(np.multiply(A,x), axis=1) # 限制函数,即背包内物品的体积
#print(sx)
for i in range(xSize):
if list(sx)[i] > b:
fx[i] = 0
for i in range(xSize):
if fxbest[i] < fx[i]: # 当粒子适应度大于最佳适应度时,替代
fxbest[i] = fx[i]
xbest[i] = x[i] # 替换矩阵第i行
if fgbest <= max(fxbest):
fgbest = max(fxbest)
g = list(fxbest).index(fgbest)
gbest = xbest[g] #当存在粒子的最佳适应度fxbext(i)大于种群最佳适应度fgbext(i)时,替代
for i in range(xSize):
if (x[i]==gbest).all():
x[i] = np.random.randint(0,2,(1,Dim)) #随机生成一个种群数*维度的矩阵
R1 = np.random.rand(xSize,Dim)
R2 = np.random.rand(xSize,Dim)
v = v * w + c1 * np.multiply(R1,xbest-x) + c2 * np.multiply(R2,(np.array([gbest]*xSize)-x))#速度迭代公式产生新的速度
x = x + v
for i in range(xSize): #更新粒子群的位置
for j in range(Dim):
if x[i][j] < 0.5:
x[i][j] = 0
else:
x[i][j] = 1 #粒子的位置只有(0,1)两种状态 if __name__ == "__main__":
k = 2
if(k==1):
'''在不同种群规模下的算法性能表现'''
tmp = []
y = []
for scale in range(50,200,20):
tmp.append(scale)
print(scale)
init(xSize_=scale,iteration_=1500)
for i in range(iteration):
solve()
y.append(fgbest[0])
plt.plot(tmp,y)
plt.xlabel('population scale')
plt.ylabel('value')
plt.title('the effect of population scale')
elif(k==2):
'''在不同惯性因子下的算法性能表现'''
tmp = []
y = []
for w in range(4,9):
w = w / 10
tmp.append(w)
print(w)
init(w_=w,iteration_=1500)
for i in range(iteration):
solve()
y.append(fgbest[0])
plt.plot(tmp,y)
plt.xlabel('inertia factor')
plt.ylabel('value')
plt.title('the effect of inertia factor')
elif(k==3):
'''在不同加速因子下的算法性能表现'''
tmp = []
y = []
for c in range(1,20,2):
c = c / 10
tmp.append(c)
print(c)
init(c1_=c,c2_=c,iteration_=1500)
for i in range(iteration):
solve()
y.append(fgbest[0])
plt.plot(tmp,y)
plt.xlabel('acceleration factor')
plt.ylabel('value')
plt.title('the effect of acceletation factor')
elif(k==4):
'''在不同背包容量下的算法最佳迭代次数'''
tmp = []
y = []
for capacity in range(500,3501,500):
tmp.append(capacity)
best = []
print(capacity)
init(b_=capacity,iteration_=5000)
for i in range(iteration):
solve()
best.append(fgbest[0])
print(best)
for i in range(len(best)):
if(best[len(best)-i-1] != best[len(best)-i-2]):
print(4)
y.append(len(best)-i)
break plt.xlabel('capacity')
plt.ylabel('epochs')
plt.plot(tmp,y)
elif(k==5):
'''禁忌搜索算法与微粒群算法的性能比较'''
from TSA import TSA_bag
i = 500
tmp = [x for x in range(i)]
pso = []
init(iteration_=i)
for i in range(iteration):
solve()
pso.append(fgbest[0])
plt.plot(tmp,pso,color='red',label='PSO')
plt.plot(tmp,TSA_bag(interation=i),color='blue',label='TSA')
plt.xlabel('interation')
plt.ylabel('value')
plt.title('the comparison between PSA and TSA')
elif(k==6):
'''在不同背包容量下,禁忌搜索算法与微粒群算法的性能比较'''
#import TSA
tmp = []
pso = []
tsa = []
for i in range(500,3501,250):
import TSA
TSA_tmp = TSA.main(capacity_=i,interation=300)
tmp.append(i)
print(i)
init(b_=i,iteration_=1000)
for i in range(iteration):
solve()
pso.append(fgbest[0])
tsa.append(TSA_tmp)
plt.plot(tmp,pso,color='red',label='PSO')
plt.plot(tmp,tsa,color='blue',label='TSA')
plt.xlabel('capacity')
plt.ylabel('value')
plt.title('the comparison between PSA and TSA') plt.legend()
plt.show()

微粒群算法PSO 01背包问题 python的更多相关文章

  1. C语言实现粒子群算法(PSO)一

    最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等.当时是使用MATLAB来实现的,而 ...

  2. 算法(三)粒子群算法PSO的介绍

    一.引言 在讲算法之前,先看两个例子: 例子一:背包问题,一个书包,一堆物品,每个物品都有自己的价值和体积,装满书包,使得装的物品价值最大. 例子二:投资问题,n个项目,第i个项目投资为ci 收益为p ...

  3. 【比较】粒子群算法PSO 和 遗传算法GA 的相同点和不同点

    目录 PSO和GA的相同点 PSO和GA不同点 粒子群算法(PSO)和遗传算法(GA)都是优化算法,都力图在自然特性的基础上模拟个体种群的适应性,它们都采用一定的变换规则通过搜索空间求解. PSO和G ...

  4. 粒子群算法-PSO

    粒子群优化算法 1. 背景知识 1995年美国社会心理学家Kennedy和电气工程师Eberhart共同提出粒子群优化算法(Particle Swarm Optimization, PSO).PSO算 ...

  5. 01背包问题python 2.7实现

    版权声明:本文为博主原创文章,转载请注明转自 http://www.cnblogs.com/kdxb/p/6140625.html #!/usr/bin/env python # -*- coding ...

  6. 0-1背包问题python解决

    def f(i,j): while i>=0: if i==0 and j>=l[i][0]: return l[i][1] elif i==0 and j<l[i][0]: ret ...

  7. 【CI】CN.一种多尺度协同变异的微粒群优化算法

    [论文标题]一种多尺度协同变异的微粒群优化算法 (2010) [论文作者]陶新民,刘福荣, 刘  玉 , 童智靖 [论文链接]Paper(14-pages // Single column) [摘要] ...

  8. C语言实现粒子群算法(PSO)二

    上一回说了基本粒子群算法的实现,并且给出了C语言代码.这一篇主要讲解影响粒子群算法的一个重要参数---w.我们已经说过粒子群算法的核心的两个公式为: Vid(k+1)=w*Vid(k)+c1*r1*( ...

  9. 粒子群优化算法(PSO)的基本概念

    介绍了PSO基本概念,以及和遗传算法的区别: 粒子群算法(PSO)Matlab实现(两种解法)

随机推荐

  1. Apache SeaTunnel (Incubating) 2.1.0 发布,内核重构、全面支持 Flink

    2021 年 12 月 9 日,SeaTunnel (原名 Waterdrop) 成功加入 Apache 孵化器,进入孵化器后,SeaTunnel 社区花费了大量时间来梳理整个项目的外部依赖以确保整个 ...

  2. 【深入学习.Net】.泛型集合【体检管理系统】

    基于泛型List的体检管理系统(蜗牛爬坡) 第五章[体检管理系统] 一.项目展示图(基于.net core6.0) 二.首先准备两个Model类 HealthCheckItem(项目类):Name(项 ...

  3. 总结-DSU ON TREE(树上启发式合并)

    考试遇到一道题: 有一棵n个点的有根树,每个点有一个颜色,每次询问给定一个点\(u\)和一个数\(k\),询问\(u\)子是多少个不同颜色节点的\(k\)级祖先.n<=500000. 显然对每一 ...

  4. CSS 布局(一):Flex 布局

    主轴和纵轴 对某一盒子模型添加display: flex;属性后,称之为 Flexible Box 模型(或称之为 flexbox),即弹性盒子模型,简称弹性盒子. 弹性盒子为子元素提供了强大的空间分 ...

  5. df空间满,du找不到文件的问题

    最近看了一下问题: df -h Filesystem Size Used Avail Use% Mounted on rootfs 271G 267G 2.2G 100% / 根分区满了,du 找不到 ...

  6. NOI2021 同步赛游记

    写在前面的话 为什么叫游记呢?因为我第一天是在划水中度过的,错过了对原题的发现. O n e I n D a r k \tt OneInDark OneInDark 无比风光地去了浙江,却倒霉地遇上了 ...

  7. 第四十九篇:webpack的基本使用(三) --安装和配置html-webpack-plugin插件

    好家伙, 1.html-webpack-plugin的作用 讲一下为什么需要这个插件 存在问题:在点开locahost:8080之后出现的是项目的根目录,而不是网页 这时候需要再点开scr文件夹才能看 ...

  8. 利用userfaultfd + setxattr堆占位

    利用userfaultfd + setxattr堆占位 很久之前便看到过这个技术的名字,但是由于自己的摆烂,一直没有管.今天终于找到时间好好看一下这个技术的利用方式.利用userfaultfd + s ...

  9. 如何守护数据安全? 这里有一份RDS灾备方案为你支招

    当今世界是一个充满着数据的互联网世界,生活的方方面面都在不断产生着数据,比如出行记录.消费记录.浏览的网页.发送的消息等等.除了文本类型的数据,图像.音乐.声音都是数据.对于企业而言,数据更是重要的生 ...

  10. kingbaseES V8R3数据安全案例之---审计记录清除案例

    ​ 案例说明: 对于KingbaseES V8R3数据库,默认用户无权限删除审计记录,只有对审计记录做了转储以后会自动清理审计记录. 适用版本: KingbaseES V8R3 本案例数据库版本: S ...