计算智能-粒子群算法在物流中心选址中的应用

实现论文

《粒子群算法在物流中心选址中的应用》

链接:https://pan.baidu.com/s/1scdDvKvUviEVEeQC8fweRg
提取码:k38b

实验目的

物流中心(logistics center)是从事物流活动的场所或组 织,能够处理各种运输、储存、包装、装卸、流通加工等物流作 业,是物流信息处理的据点。在供应链管理盛行的今天,物流 中心作为衔接供应链上下游的环节,起到了至关重要的作 用。合理的物流中心选址可以有效地节省费用,保证物流系 统的高效运作,对供应链管理具有战略性意义。物流中心选 址模型一般是非凸、带有复杂约束的非线性规划模型,属NP
hard问题[1]。选址问题一直是受人关注的研究领域,已有众多 学者对选址问题进行了研究,提出了多种方法,如:Baumolwolfe法[2]、重心法[3]、禁忌算法[4]、遗传算法[1,5]、模拟退火算法[6]、 层次分析法[7] 和人工神经网络法[8]等。由于节约运输成本和缩 短运输时间是物流中心选址应该着重考虑的首要问题。因 此,将针对物流中心选址问题的特点,构造问题求解的粒子群 优化算法,力求科学、快速地得到物流中心选址的优化方案, 供决策参考。

基本思路

粒子群优化算法 PSO(Particle Swarm Optimization)由 Kennedy和Eberhart于1995年提出,是一种进化计算技术,源 于对鸟群和鱼群捕食等社会行为的模拟[10]。PSO中,每个优化 问题的解类似于搜索空间中的一只鸟,被称为“粒子”。PSO 算法随机产生一个初始种群并赋予每个粒子一个随机速度, 在飞行过程中,粒子的飞行速度和轨迹根据自己及同伴的飞 行经验来动态调整,整个群体有飞向更好搜索区域的能力。
目前,PSO及其改进算法已广泛应用于函数优化、神经网络训 练、模糊系统控制、模式识别以及工程应用等诸多领域,并被 证明能够以较小的计算代价获得良好的优化解[11]。 将粒子群算法应用于物流中心选址问题的求解。设在一 个 2 维搜索空间中,由 m 个粒子组成种群为 X ={x1x2 xm},其中:第 i 个粒子的位置向量为 xi =[xi1xi2]表示平面上一 个物流中心的可行地址坐标,其速度向量为vi=[vi1vi2] 。第 i 个粒子的适应度值 fi 由选址问题的目标函数物流成本计算公 式(1)和(2)计算得到。第 i 个粒子进化到第 g 代找到的个体 最优位置为 pi =[pi1pi2] ;整个粒子群迭代到第 h 代找到的全 局最优位置 pg =[pg1pg2] 。从第 h 代进化到第 h + 1代时,第 i 个粒子在第 j ( j = 12) 维子空间中飞行速度和位置的调整可 以根据式(5)和(6)进行。 vh + 1 ij = ω × vhij + c1 ×rand ×(pij - xhij) + c2 ×rand ×(pgj - xhij) (5) xh + 1 ij = xhij + vh + 1 ij (6) 式中:ω 为惯性权重,rand 为[0,1]区间均匀分布的随机数,c1
和 c2 为学习因子。

基本流程

步骤1 初始化。粒子群的规模 m ,最大迭代次数 gmax , 在可行域中随机产生初始粒子群。
步骤2 计算各粒子的适应度值,求出粒子的个体最优位 置和全局最优位置。
步骤3 如果当前迭代次数达到最大迭代次数 gmax ,输出 全局最优位置作为物流中心的选址结果,结束算法;否则,转 步骤4。
步骤4 根据式(5)和式(6)进行计算,得到新一代的粒子
位置,转步骤2。

代码实现

(1)

import random
import math


def initx(m):
  data=[]
  for i in range(m):
    x1=random.randint(0,10)
    x2=random.randint(0,10)
    data.append([x1,x2])
  return data
  
  
def initv(c1,c2,data,m):
  v=[]
  dis=[]
  sumdis=0
  for j in range(len(data)):
    for i in range(len(coordinate)):
      sumdis+=math.sqrt((coordinate[i][0]-data[j][0])**2+(coordinate[i][1]-data[j][1])**2)\
              *coordinate[i][2]*coordinate[i][3]
    dis.append(sumdis)
    sumdis=0
  best=data[dis.index(min(dis))]
  for i in range(m):
    v1=c1*random.random()*data[i][0]+c2*random.random()*best[0]
    v2=c1*random.random()*data[i][1]+c2*random.random()*best[1]
    v.append([v1,v2])
  return v
    
  
    
def fitness(x,c1,c2,w,coordinate,m):
  fit=[]
  sumdis=0
  for j in range(m):
    for i in range(len(coordinate)):
      sumdis+=math.sqrt((coordinate[i][0]-x[j][0])**2+(coordinate[i][1]-x[j][1])**2)\
              *coordinate[i][2]*coordinate[i][3]
    fit.append(sumdis)
    sumdis=0
  return fit
    
    
    
def update(x,v,c1,c2,w,m,bestx,mostfit):
  for i in range(m):
    v[i][0]=w*v[i][0]+c1*random.random()*(bestx[i][0]-x[i][0])+c2*random.random()*(mostfit[0]-x[i][0])
    v[i][1]=w*v[i][1]+c1*random.random()*(bestx[i][1]-x[i][1])+c2*random.random()*(mostfit[1]-x[i][1])
    x[i][0]=x[i][0]+v[i][0]
    x[i][1]=x[i][1]+v[i][1]
    
if __name__ == "__main__":
  m=25
  w=0.2
  c1,c2=1.5,1.5
  gmax=30
  time=0
  
  coordinate=[[2,1,3,0.002],[5,2,5,0.0015],[9,1,17,0.002],[7,4,12,0.0013],[2,5,9,0.0015],\
              [10,5,10,0.0012],[2,7,24,0.002],[4,7,14,0.0014],[5,8,23,0.0024],[8,9,30,0.0011],
              [9,6,147,0.0005]]
  
  #初始化种群
  #x=initx(m)
  x=[[9, 0], [7, 2], [9, 0], [9, 3], [7, 8], [6, 8], [9, 6], [10, 9], [4, 1], [0, 3], [7, 3],\
     [8, 4], [1, 1], [6, 1], [7, 4], [2, 10], [6, 0], [6, 1], [0, 9], [9, 0], [2, 10], [10, 2],\
     [5, 9], [0, 6], [9, 9]]
  
  v=initv(c1,c2,x,m)
  fit=fitness(x,c1,c2,w,coordinate,m)
  bestx=x.copy()
  bestfit=fit.copy()
  while time<gmax:
    newfit=fitness(x,c1,c2,w,coordinate,m)
    for i in range(len(newfit)):
      if bestfit[i] > newfit[i]:
        bestx[i]=x[i]
        bestfit[i]=newfit[i]
    mostfit=bestx[bestfit.index(min(bestfit))]
    update(x,v,c1,c2,w,m,bestx,mostfit)
    time+=1
    
  print("最优仓库地址:X=",round(mostfit[0],3),",Y=",round(mostfit[1],3))

(2)

import random
import math


def initx(m):
  data=[]
  for i in range(m):
    x1=random.randint(0,20)
    x2=random.randint(0,20)
    data.append([x1,x2])
  return data
  
  
def initv(c1,c2,data,m):
  v=[]
  dis=[]
  sumdis=0
  for j in range(len(data)):
    for i in range(len(coordinate)):
      sumdis+=math.sqrt((coordinate[i][0]-data[j][0])**2+(coordinate[i][1]-data[j][1])**2)\
              *coordinate[i][2]*coordinate[i][3]
    dis.append(sumdis)
    sumdis=0
  best=data[dis.index(min(dis))]
  for i in range(m):
    v1=c1*random.random()*data[i][0]+c2*random.random()*best[0]
    v2=c1*random.random()*data[i][1]+c2*random.random()*best[1]
    v.append([v1,v2])
  return v
    
  
    
def fitness(x,c1,c2,w,coordinate,m):
  fit=[]
  sumdis=0
  for j in range(m):
    for i in range(len(coordinate)):
      sumdis+=math.sqrt((coordinate[i][0]-x[j][0])**2+(coordinate[i][1]-x[j][1])**2)\
              *coordinate[i][2]*coordinate[i][3]
    fit.append(sumdis)
    sumdis=0
  return fit
    
    
    
def update(x,v,c1,c2,w,m,bestx,mostfit):
  for i in range(m):
    v[i][0]=w*v[i][0]+c1*random.random()*(bestx[i][0]-x[i][0])+c2*random.random()*(mostfit[0]-x[i][0])
    v[i][1]=w*v[i][1]+c1*random.random()*(bestx[i][1]-x[i][1])+c2*random.random()*(mostfit[1]-x[i][1])
    x[i][0]=x[i][0]+v[i][0]
    x[i][1]=x[i][1]+v[i][1]
    
if __name__ == "__main__":
  m=40
  w=0.2
  c1,c2=1.8,1.8
  gmax=50
  time=0
  
  coordinate=[[5.3,6.6,3,5],[9.3,12.4,2,4],[15.5,18.7,3,6],[5.5,0.4,4,4],[13.3,10.2,3,5],\
              [9.5,10.9,5,7],[9.0,14.8,3,4],[5.9,17.1,3,4],[19.3,19.3,6,6],[14.5,7.2,3,7],\
              [11.4,4.1,4,5],[5.7,4.4,3,4],[4.7,2.3,2,5],[11.1,13.6,2,6],[2.8,16.4,20,3],\
              [3.0,8.7,30,3]]
  
  #初始化种群
  #x=initx(m)
  x=[[17, 0], [6, 7], [12, 18], [19, 9], [12, 3], [12, 16], [7, 9], [15, 5], [20, 16], [4, 11],\
     [18, 10], [8, 17], [13, 16], [9, 9], [3, 7], [6, 3], [13, 1], [16, 16], [1, 6], [12, 19],\
     [14, 18], [15, 13], [3, 13], [19, 11], [17, 13], [17, 19], [14, 13], [11, 18], [12, 15],\
     [2, 5], [11, 4], [9, 0], [9, 3], [12, 16], [18, 18], [5, 10], [8, 1], [16, 1], [7, 16], \
     [13, 11]]
  v=initv(c1,c2,x,m)
  fit=fitness(x,c1,c2,w,coordinate,m)
  bestx=x.copy()
  bestfit=fit.copy()
  while time<gmax:
    newfit=fitness(x,c1,c2,w,coordinate,m)
    for i in range(len(newfit)):
      if bestfit[i] > newfit[i]:
        bestx[i]=x[i]
        bestfit[i]=newfit[i]
    mostfit=bestx[bestfit.index(min(bestfit))]
    update(x,v,c1,c2,w,m,bestx,mostfit)
    time+=1 
    
  print("最优仓库地址:X=",round(mostfit[0],3),",Y=",round(mostfit[1],3))
  print("运输成本为:",min(bestfit))

实验结果

(1)
在这里插入图片描述
(2)
在这里插入图片描述

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值