微粒群算法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实现(两种解法)
随机推荐
- Min GW 安装教程(转载)
下载方式一:1.百度搜索关键词"mingw",点击第一个:2.进入官网后,点击右上角的"Downloads":3.进入第三个页面后,点击"mingw- ...
- Host long.com not found: 2(SERVFAIL)
环境: centos 7.9 地址:192.168.200.100 相关配置 name.conf文件: named.zones文件: 正反解析文件: 重启DNS服务: 1 [root@server ...
- 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据
1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作,今天宏哥就用具体例子,将上一篇中的理论知识实践一下.而且在实际测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以 ...
- 从零开始Blazor Server(14)--修改密码
目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它. 首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate ...
- Python自学教程7:字典类型有什么用
字典是Python中的一个重要操作,如果字典玩得顺,很多其他的数据类型就可以一通百通. Python字典的定义 字典使用一对大括号进行定义,键值对之间使用逗号隔开,键和值使用冒号分隔. 键必须是不可变 ...
- 【MySQL】从入门到精通8-SQL数据库编程
上期:[MySQL]从入门到精通7-设计多对多数据库 第零章:Mac用户看这里: mac终端写MySQL和windows基本相同,除了配置环境变量和启动有些许不同以外. 先配置环境变量,在终端输入vi ...
- .NET 开源工作流: Slickflow流程引擎高级开发(十) -- BpmnJS流程设计器集成
前言: 在Slickflow产品开发过程中,前端流程设计器经历了几个不同的版本(jsPlumb, mxGraph等),目的是为了在设计流程时的用户体验更加良好,得到客户的好评和认可.BpmnJS流程设 ...
- 跟我学Python图像处理丨何为图像的灰度非线性变换
摘要:本文主要讲解灰度线性变换,基础性知识希望对您有所帮助. 本文分享自华为云社区<[Python图像处理] 十六.图像的灰度非线性变换之对数变换.伽马变换>,作者:eastmount . ...
- Java常用类的使用
Java常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...
- 腾讯云实验室 Gitea 互动教程上线啦
如果你想学习.体验或是向他人演示开源的 Gitea 代码托管方案,那么接下来给你推荐一款神器. 使用腾讯云实验室免费获得 Gitea 实验环境,直接通过浏览器就可在 Ubuntu Server 20. ...