多点最优路径规划 - (商旅问题,拼车,餐饮配送,包裹配送,包裹取件,回程单)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

标签

PostgreSQL , PostGIS , pgrouting , 商旅问题 , 拼车 , 餐饮配送 , 包裹配送 , 包裹取件 , 回程单


背景

小长假,带着一家人出去旅行,计划好了去几个地方,如何设计旅行线路是最优的?(里面还涉及到路费,路途时间等因素)。

pic

又比如 拼车,餐饮配送,包裹取件、配送,都包含最佳路径计算的共性在里面。

PostgreSQL 在GIS领域有这非常丰富的用户和实际案例,路径规划方面,我之前写过一篇关于包裹配送的文章

《聊一聊双十一背后的技术 - 物流、动态路径规划》

在商旅问题,拼车,餐饮配送,包裹取件、配送,等诸多最佳路径计算的需求方面,PostgreSQL又是如何满足需求的呢?

pgrouting 核心功能

pgRouting library contains following features:

  • All Pairs Shortest Path, Johnson’s Algorithm

  • All Pairs Shortest Path, Floyd-Warshall Algorithm

  • Shortest Path A*

  • Bi-directional Dijkstra Shortest Path

  • Bi-directional A* Shortest Path

  • Shortest Path Dijkstra

  • Driving Distance

  • K-Shortest Path, Multiple Alternative Paths

  • K-Dijkstra, One to Many Shortest Path

  • Traveling Sales Person

  • Turn Restriction Shortest Path (TRSP)

最佳规划1 - 从一个点出发,经过多点,回到起点

解决 旅行、包裹配送、餐饮配送的问题

这个问题的定义如下,从一点出发,经过多点,回到起点。

Given a collection of cities and travel cost between each pair, find the cheapest way for visiting all of the cities and returning to the starting point.

详情

http://docs.pgrouting.org/latest/en/TSP-family.html#tsp

例子1

pgr_TSP - Returns a route that visits all the nodes exactly once.

从5出发,经过array[-1, 3, 5, 6, -6],回到5。

SELECT * FROM pgr_TSP(  
    $$  
    SELECT * FROM pgr_withPointsCostMatrix(  
        'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',  
        'SELECT pid, edge_id, fraction from pointsOfInterest',  
        array[-1, 3, 5, 6, -6], directed := false);  
    $$,  
    start_id := 5,  
    randomize := false  
);  
  
 seq | node | cost | agg_cost   
-----+------+------+----------  
   1 |    5 |    1 |        0  
   2 |    6 |    1 |        1  
   3 |    3 |  1.6 |        2  
   4 |   -1 |  1.3 |      3.6  
   5 |   -6 |  0.3 |      4.9  
   6 |    5 |    0 |      5.2  
(6 rows)  

例子2

pgr_eucledianTSP - Returns a route that visits all the coordinates pairs exactly once.

SET client_min_messages TO DEBUG1;  
SET  
SELECT* from pgr_eucledianTSP(  
    $$  
    SELECT id, st_X(the_geom) AS x, st_Y(the_geom) AS y FROM edge_table_vertices_pgr  
    $$,  
    tries_per_temperature := 0,  
    randomize := false  
);  
DEBUG:  pgr_eucledianTSP Processing Information  
Initializing tsp class ---> tsp.greedyInitial ---> tsp.annealing ---> OK  
  
Cycle(100) 	total changes =0	0 were because  delta energy < 0  
Total swaps: 3  
Total slides: 0  
Total reverses: 0  
Times best tour changed: 4  
Best cost reached = 18.7796  
 seq | node |       cost       |     agg_cost       
-----+------+------------------+------------------  
   1 |    1 |  1.4142135623731 |                0  
   2 |    3 |                1 |  1.4142135623731  
   3 |    4 |                1 | 2.41421356237309  
   4 |    9 | 0.58309518948453 | 3.41421356237309  
   5 |   16 | 0.58309518948453 | 3.99730875185762  
   6 |    6 |                1 | 4.58040394134215  
   7 |    5 |                1 | 5.58040394134215  
   8 |    8 |                1 | 6.58040394134215  
   9 |    7 | 1.58113883008419 | 7.58040394134215  
  10 |   14 |   1.499999999999 | 9.16154277142634  
  11 |   15 |              0.5 | 10.6615427714253  
  12 |   13 |              1.5 | 11.1615427714253  
  13 |   17 | 1.11803398874989 | 12.6615427714253  
  14 |   12 |                1 | 13.7795767601752  
  15 |   11 |                1 | 14.7795767601752  
  16 |   10 |                2 | 15.7795767601752  
  17 |    2 |                1 | 17.7795767601752  
  18 |    1 |                0 | 18.7795767601752  
(18 rows)  

最佳规划2 - 从一个点出发,经过多点,到达终点

拼车的问题更加复杂一些,

从一个点出发(司机位置),经过多点(所有拼车乘客的上车地点),再去到多点(拼车乘客的下车地点)。

拼车的问题可以分为两个阶段来解决,

第一个阶段,从司机位置到接上所有拼车乘客。

第二个阶段,从最后一个乘客上车地点,到达所有乘客的下车地点。

两个阶段的规划需求是一样的,从一个点出发,经过多点,到达终点。

详情

http://docs.pgrouting.org/latest/en/TSP-family.html#tsp

例子

详情

http://docs.pgrouting.org/latest/en/pgr_dijkstraVia.html#pgr-dijkstravia

Given a list of vertices and a graph, this function is equivalent to finding the shortest path between vertexivertexi and vertexi+1vertexi+1 for all i<size_of(vertexvia)i<size_of(vertexvia).

参考

所有用到的路由函数,点对点成本矩阵函数,请参考

http://pgrouting.org/

《聊一聊双十一背后的技术 - 物流、动态路径规划》

http://docs.pgrouting.org/latest/en/TSP-family.html#tsp

目录
相关文章
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
702 0
mkdir: cannot create directory `**': No such file or directory
在mkdir时报错的解决方案,在网上找了很多文章都没有说清楚原因。
1122 0
|
前端开发 rax Python
Open3d系列 | 2. Open3d实现点云数据增强
Open3d系列 | 2. Open3d实现点云数据增强
3999 1
Open3d系列 | 2. Open3d实现点云数据增强
|
存储 前端开发 算法
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析(一)
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析
902 0
|
存储 弹性计算 安全
阿里云服务器租用价格参考:最新包年包月收费标准与活动价格整理
购买阿里云服务器一年多少钱?2025年阿里云服务器价格又调整了,轻量云服务器2核2G200M峰值带宽38元一年、2核4G4M带宽60GB ESSD云盘298元一年,e实例云服务器2核2G3M带宽99元1年,u1实例2核4G5M带宽199元一年、4核8G云服务器955元一年,4核16G10M云服务器70元1个月、210元3个月,8核32G10M带宽160元1个月、480元3个月。对于想要上云的用户来说,了解阿里云服务器的价格体系是选择合适产品的第一步。那么,2025年购买阿里云服务器到底需要多少钱呢?本文为大家整理汇总了截止目前阿里云服务器的最新包年包月收费标准和活动价格情况,以供参考。
|
Kubernetes 安全 数据安全/隐私保护
Kubernetes 安全性最佳实践
【8月更文第29天】随着容器化和微服务架构的普及,Kubernetes 已成为管理容器化应用的标准平台。然而,随着 Kubernetes 的广泛采用,其安全性问题也日益受到关注。本文将深入探讨 Kubernetes 的安全最佳实践,并通过具体的代码示例来展示如何保护 Kubernetes 集群免受攻击。
742 3
|
机器学习/深度学习 安全 TensorFlow
OpenCV的发展历史
【7月更文挑战第27天】OpenCV的发展历史。
645 3
|
SQL 存储 监控
Hive 插入大量数据
【8月更文挑战第15天】
894 0
|
Web App开发 算法 PyTorch
vLLM部署Yuan2.0:高吞吐、更便捷
vLLM是UC Berkeley开源的大语言模型高速推理框架,其内存管理核心——PagedAttention、内置的加速算法如Continues Batching等,一方面可以提升Yuan2.0模型推理部署时的内存使用效率,另一方面可以大幅提升在实时应用场景下Yuan2.0的吞吐量。
|
机器学习/深度学习 弹性计算 人工智能
滴滴派单算法_从算法模型思路到评估方案 - 详解
导读:说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,大家今天的出行体验已经发生了翻天覆地的变化,面对着每天数千万的呼叫,滴滴的派单算法一直在持续努力让更多人打到车,本篇文章会着重介绍我们是如何分析和建模这个问题,并且这其中面临了怎样的算法挑战,以及介绍一些我们常用的派单算法,这些算法能够让我们不断的提升用户的打车确定性。
10519 123
滴滴派单算法_从算法模型思路到评估方案 - 详解