微粒群算法PSO 01背包问题 python
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的更多相关文章
- C语言实现粒子群算法(PSO)一
最近在温习C语言,看的书是<C primer Plus>,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法.粒子群算法.蚁群算法等等.当时是使用MATLAB来实现的,而 ...
- 算法(三)粒子群算法PSO的介绍
一.引言 在讲算法之前,先看两个例子: 例子一:背包问题,一个书包,一堆物品,每个物品都有自己的价值和体积,装满书包,使得装的物品价值最大. 例子二:投资问题,n个项目,第i个项目投资为ci 收益为p ...
- 【比较】粒子群算法PSO 和 遗传算法GA 的相同点和不同点
目录 PSO和GA的相同点 PSO和GA不同点 粒子群算法(PSO)和遗传算法(GA)都是优化算法,都力图在自然特性的基础上模拟个体种群的适应性,它们都采用一定的变换规则通过搜索空间求解. PSO和G ...
- 粒子群算法-PSO
粒子群优化算法 1. 背景知识 1995年美国社会心理学家Kennedy和电气工程师Eberhart共同提出粒子群优化算法(Particle Swarm Optimization, PSO).PSO算 ...
- 01背包问题python 2.7实现
版权声明:本文为博主原创文章,转载请注明转自 http://www.cnblogs.com/kdxb/p/6140625.html #!/usr/bin/env python # -*- coding ...
- 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 ...
- 【CI】CN.一种多尺度协同变异的微粒群优化算法
[论文标题]一种多尺度协同变异的微粒群优化算法 (2010) [论文作者]陶新民,刘福荣, 刘 玉 , 童智靖 [论文链接]Paper(14-pages // Single column) [摘要] ...
- C语言实现粒子群算法(PSO)二
上一回说了基本粒子群算法的实现,并且给出了C语言代码.这一篇主要讲解影响粒子群算法的一个重要参数---w.我们已经说过粒子群算法的核心的两个公式为: Vid(k+1)=w*Vid(k)+c1*r1*( ...
- 粒子群优化算法(PSO)的基本概念
介绍了PSO基本概念,以及和遗传算法的区别: 粒子群算法(PSO)Matlab实现(两种解法)
随机推荐
- 自己做一个RTOS
什么是操作系统?其实就是一个程序, 这个程序可以控制计算机的所有资源,对资源进行分配,包括CPU时间,内存,IO端口等,按一定规则分配给所需要的进程(进程?也就是一个程序,可以单独执行),并且自动控制 ...
- 解决zlibrary注册后,再次登录提示密码错误的问题
很多小伙伴注册后,再登录提示电子邮件或密码错误,但是可以确认账号密码都是正确的,这种应该怎么处理呢? 其实这种问题有两种处理方式, 首先使用 https://find.looks.wang/ 检测可以 ...
- DBPack 限流熔断功能发布说明
上周我们发布了 v0.4.0 版本,增加了限流熔断功能,现对这两个功能做如下说明. 限流 DBPack 限流熔断功能通过 filter 实现.要设置限流规则,首先要定义 RateLimitFilter ...
- ceph 007 双向池同步 rgw对象网关配置 s3对象存储
增量导入导出要基于快照 导出的过程当中害怕镜像被修改所以打快照.快照的数据是不会变化的 镜像级别的双向同步 镜像主到备,备到主.一对一 就算是池模式的双向同步,镜像也具有主备关系 双向同步,池模式 [ ...
- 【NOI P模拟赛】华莱士CNHLS(容斥,数论分块)
题意 出题人吃华 莱 士拉肚子了,心情不好,于是出了一道题面简单的难题. 共 T T T 组数据,对正整数 n n n 求 F ( n ) = ∑ i = 1 n μ 2 ( i ) i F(n)=\ ...
- ELK技术-Logstash
1.背景 1.1 简介 Logstash 是一个功能强大的工具,可与各种部署集成. 它提供了大量插件,可帮助业务做解析,丰富,转换和缓冲来自各种来源的数据. Logstash 是一个数据流引擎 它是用 ...
- 三 单例模式【Singleton Pattern】 来自CBF4LIFE 的设计模式
这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的 ...
- JavaScript 之 原型对象、对象原型 —— { }
JavaScript -- 构造函数 // 构造函数 function Player(name, age) { this.name = name; this.age = age; } JavaScri ...
- JS中如何删除某个父元素下的所有子元素?
JS中如何删除某个父元素下的所有子元素?这里我介绍几种方法: 1.通过元素的 innerHTML 属性来删除 这种方式我觉得是最有方便的,直接找到你想要的父元素,直接令其 element.innerH ...
- GreatSQL vs MySQL性能测试来了,速围观~
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 1.结论先行 无论ibp(innodb_buffer ...