说明:节约里程法(Saving Algorithm)又称节约算法,是指用来解决运输车辆数目不确定的VRP问题的最有名的启发式算法。是由Clarke和Wright于1964年首次提出的。

背景

为什么写这个程序,因为我在做课设的时候算的过程太复杂了,一个数据出错要重算,当时就想做一个程序出来,但是因为课设只有一周的时间,所以只能作罢。附上我课设论文。虽然它只有74分o(╥﹏╥)o

https://github.com/ishelo/VRP-CW/blob/master/扫描算法介绍及题目.pdf

环境

windows 10 企业版LTSC

python 3.7.2

项目地址

项目核心代码

def savingsAlgorithms(self):

saving = 0

for i in range(1, len(self.q)):

self.Routes.append([i])

for i in range(1, len(self.Routes) + 1): # 使用Sij = Ci0 + C0j - Cij计算节约度

for j in range(1, len(self.Routes) + 1):

if i == j:

pass

else:

saving = (self.distance[i][0] + self.distance[0][j]) - self.distance[i][j]

self.savings.append([i, j, saving]) # 将结果以元组形式存放在列表中

self.savings = sorted(self.savings, key=itemgetter(2), reverse=True) # 按照节约度从大到小进行排序

for i in range(len(self.savings)):

print(self.savings[i][0],'--',self.savings[i][1], " ",self.savings[i][2]) # 打印节约度

for i in range(len(self.savings)):

startRoute = []

endRoute = []

routeDemand = 0

for j in range(len(self.Routes)):

if (self.savings[i][0] == self.Routes[j][-1]):

endRoute = self.Routes[j]

elif (self.savings[i][1] == self.Routes[j][0]):

startRoute = self.Routes[j]

if ((len(startRoute) != 0) and (len(endRoute) != 0)):

for k in range(len(startRoute)):

routeDemand += self.q[startRoute[k]]

for k in range(len(endRoute)):

routeDemand += self.q[endRoute[k]]

routeDistance = 0

routestore = [0]+endRoute+startRoute+[0]

for i in range(len(routestore)-1):

# print(routestore[i],routestore[i+1])

# print(self.distance[routestore[i]][routestore[i+1]])

routeDistance += self.distance[routestore[i]][routestore[i+1]]

#print(routestore,"== ==:",routeDistance)

if (routeDemand <= self.tons) and (routeDistance <= self.distanceLimit): # 按照限制规则对​​路线进行更改

self.Routes.remove(startRoute)

self.Routes.remove(endRoute)

self.Routes.append(endRoute + startRoute)

break

for i in range(len(self.Routes)):

self.Routes[i].insert(0, 0)

self.Routes[i].insert(len(self.Routes[i]), 0)

# -----------输出最终结果---------------------

def printRoutes(self):

for i in self.Routes:

costs = 0

for j in range(len(i)-1):

costs += self.distance[i[j]][i[j+1]]

print("路线: ",i," 路程: ",costs)

食用方法

确保电脑上安装了python3,将各点距离输入到.csv文件中,修改vrp.py中的参数,并运行main.py

输出结果

以课设数据为例,输出结果。

结语

节约里程法作为解决物流VRP中重要的启发式算法,身为一个物流人,尤其是物流管理专业的学生,是必须掌握的。

节约算法根据配送中心的运输能力和配送中心到各个用户以及各个用户之间的距离来制定使总的车辆运输的吨公里数最小的配送方案。它依次将运输问题中的两个回路合并为一个回路,每次使合并后的总运输距离减小的幅度最大,直到达到一辆车的装载限制时,再进行下一辆车的优化。

节约里程算法的python实现,解决了其复杂的计算过程,虽然还有些不足之处,以后可以再继续改进。

参考资料

版权声明:本文为原创文章,版权归 Helo 所有。

商业转载请联系作者获得授权,非商业转载请注明出处。

行程匹配的算法python_节约里程算法的python实现相关推荐

  1. 集货运输优化:数学建模步骤,Python实现蚁群算法(解决最短路径问题), 蚁群算法解决旅行商问题(最优路径问题),节约里程算法

    目录 数学建模步骤 Python实现蚁群算法(解决最短路径问题) 蚁群算法解决旅行商问题(最优路径问题) 节约里程算法

  2. 哈希算法python_哈希算法(Python代码实现)

    1.常见的数据查找算法: 众所周知,顺序查找是最简单的查找方式,但要将所有数据遍历一遍所以效率相对较低,对大数据量的査找问题显然不行.二分查找的查找效率虽然非常高但是数据必须有序,而对数据排序通常需要 ...

  3. 蚂蚁算法python_蚁群算法python编程实现

    前言 这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下. 蚁群算法简介 蚁群算法(ant c ...

  4. 人工蜂群算法python_人工蜂群算法简介与程序分析

    目前人工蜂群算法主要分为基于婚配行为与基于釆蜜行为两大类,本文研究的是基于釆蜜行为的人工蜂群算法. 蜜蜂采蜜 自然界中的蜜蜂总能在任何环境下以极高的效率找到优质蜜源,且能适应环境的改变.蜜蜂群的采蜜系 ...

  5. 维特比算法 python_维特比算法理解与实现(Python)

    前言 写这篇文章就是想以通俗易懂的方式解析维特比算法,最后给出Python代码的实现.下面的公式和原理均出自<统计学习方法>. 算法的原理 算法的原理1.PNG 算法的原理2.PNG 上面 ...

  6. 维特比算法 python_维特比算法实现分词

    维特比算法原理可以参考以下文章,讲解的非常详细,那么接下来将讲解维特比算法如何应用到分词算法中,并如何用python代码实现.如何通俗地讲解 viterbi 算法?​www.zhihu.com 一.过 ...

  7. 自动寻路算法python_关于Dijkstra算法和其他的一些图算法(Johnson, Floyd-Warshall, A*)解决最短路径问题的方法的Python实现。...

    这篇文章其实主要想说的是如何解决最短路径的问题. 其实最短路径问题,我们在生活中都在不知不觉的使用.比如我们在上网的时候,互联网传输采用了各种各样的数据包路由方法.这些路由算法都在幕后工作. 还有一些 ...

  8. 人工鱼群算法python_蚁群算法、免疫优化算法、鱼群算法 Python 库

    github地址guofei9987/scikit-opt​github.com 安装 $pip install scikit-opt 蚁群算法(ACA, Ant Colony Algorithm) ...

  9. 花朵授粉算法python_花授粉算法的研究及应用

    摘要: 植物花授粉算法是根据自然界中植物花朵授粉行为机理进行模拟而设计的一种新型启发式优化算法,算法的局部搜索和全局搜索过程分别模拟自花授粉和异花授粉行为,并通过随机扰动来均衡算法局部搜索和全局搜索过 ...

  10. 【VRP】节约里程算法求解车辆路径规划问题【含Matlab源码 1166期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

最新文章

  1. Delete、Upadate、Insert事件触发常见错误
  2. 大型云原生项目在数字化企业落地过程解密
  3. 突然远程连接不上mysql_navicat突然连接不上远程linux服务器上的mysql
  4. JFreeChart的简单图表的制作------柱形图
  5. 福建高职单招计算机基础知识,福建高职单招计算机类试题及标准答案
  6. Linux unshare命名的一些例子
  7. I2C总线之(三)---以C语言理解IIC
  8. 批量执行命令(SSH)
  9. python 数据库驱动开发实例_Python驱动概述
  10. java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)
  11. 登陆窗体相关的控件 1124
  12. php隔行符,PHP PHP_EOL 换行符
  13. HTML/CSS 练习
  14. java HTML5 学习资料汇总
  15. 彻底搞懂vertical-align 底线、基线、中线的含义
  16. 淘气的小丁-简易聊天器
  17. selenium设置chrome代理
  18. G、S、C、P、T STATE
  19. 2022年云南最新建筑八大员(市政)模拟考试题库及答案
  20. PG服务进程(Postgres)——BeginReportingGUCOptions向客户端汇报GUC

热门文章

  1. c语言课程设计实训主要目的,《C语言课程设计实验大纲.doc
  2. linux安装tftp服务器
  3. 内蒙古一个不起眼的小城,藏着中国最大火力发电厂
  4. 关于Button控件的CommandName属性用法的一个实例
  5. 游戏封包模拟器_问道模拟器人物移动封包分析教程
  6. BUUCTF--[第二章 web进阶]死亡ping命令
  7. 怎么用dos系统进入服务器,怎么用DOS命令方式启动系统服务
  8. JVM内存模型及CMS、G1和ZGC垃圾回收器详解
  9. CSS 基本样式大全(一)
  10. SPSS统计分析行业应用实战--SPSS 23.0新增