路径规划-车辆分配及导航

1.根据城市之间的连通状态,构建以城市为结点、两个城市间的距离(根据两个城市经纬度计算的欧式距离)作为边权重的无向图。

2.根据起始点,对除了起始点之外的其他点进行聚类,将点划分成几个部分。

3.在每个部分中找出货车运输的最优路径,根据这些路径上的订单重量分配货车。

4.配置程序的本地接口,为系统提供车辆分配和导航的服务

1.0构建河南省主要城市之间的连通状态

以下为高德地图中,河南省主要城市之间的公路连通状况:

根据城市之间公路的连通情况,大致构建的无向图如下图所示。

2.0对城市进行聚类,划分出大致方向

目的:为了找出货车要配送的不同方向,此处使用聚类算法,将城市聚成几个簇

对河南省的主要城市使用KMeans算法进行聚类,结果大致如下:

当要聚成的簇为3时:

其中 x点表示聚类中心,水平线表示所有城市纬度的均值m(用于大致划分上下两个方向)。

当要聚成的簇为4时:

其中有一个点(最右边的点,商丘市)单独为1类。

当要聚成的簇为5时:

此时就会有规模更小的,更局部性的簇产生了,并不是我们想要的大致地划分出方向,我们知道,聚类算法效果的评估更多时候要取决于业务,所以综合上述三种要聚成的簇的取值,我们决定将城市划分为3个簇

2.1根据起始点大致划分出向北,和向南两个方向

  1. 根据对城市进行的聚类分析,结合实际情况,我们先判断起始点的纬度w是否大于所有城市纬度的平均值m。
  2. 如果起始点的纬度大于m,则以w为划分线,纬度大于w的城市集合作为一个簇(位于起始点纬度以上的划分为一个簇),对纬度小于w的点(起始点以下的点)用聚类划分为2个簇;如果起始点的纬度位于m以下,则纬度小于w的城市作为一个簇,大于w的城市用聚类划分为2个簇。

2.2对聚类之后的城市所在的簇进行修正

聚类之后会出现的不合理的情况,及相应的处理如下:

1.如果一个簇中的某个城市city 与其所在的簇中的所有城市都没有连通关系,而是与另一个簇c_2中的城市有连通关系,则在c_1所构成的无向图中删除city,把city放到c_2中。

2.如果一个簇c_1中的某个城市city与自己簇中的结点无连通,但是与位于维度的均值w的另一边的簇c_3有联通,则将city归并到簇c_3中。

3.对于起始点处于边缘位置的点,进行2.1的操作以后,会出现起始点与某个簇c不直接连通的情况,此时就寻找从起始点到c的最短路径,记录下中间经过的结点,将这些结点归并到簇c当中。

2.2的第一点所述的情况

2.2的第三点所述的情况

    1. 对于每个簇c,切断c与其他簇的连通状态,但保持与起始点的连通状态

对于处于河南省边缘的城市的聚类,在执行了这一步操作之后,在不同的簇构建的无向图中,会出现与起始点不连通的情况,如下图所示:

对于这种情况,程序会寻找从起始点到与其不连通的簇c_n的最短路径,以这条路径作为媒介,连通起始点与c_n,并对这条路径经过的别的簇中的城市做记录,在后面分配重量的时候防止重复分配。

以起始点是郑州为例,修正后的聚类结果可视化如下图所示

3.0 在步骤2划分好的每一个簇中,找出配送的最优路径

3.1 构建每一个簇对应的无向图c_i

根据每一个簇中城市之间的连通状态构建对应的无向图c_i。

3.2对于每一个簇c_i,计算起始点到c内每一个城市的最短路径

对于每一个簇c_i,对c里面的每一个结点node,使用深度优先搜索遍历无向图c_i,找到以起始点为源点,node为终点的最短路径所经过的结点。

以郑州市作为起点为例,以下为步骤3.2所找到的簇c_1,c_2,c_3中的每一条最短路径,数字对应的是城市的编号:

c_1: [0, 2], [0, 11, 10], [0, 11], [0, 2, 12], [0, 2, 12, 13], [0, 2, 12, 13, 14], [0, 2, 15]

c_2: [0, 1], [0, 4], [0, 6, 5], [0, 6], [0, 6, 5, 7], [0, 1, 8], [0, 1, 9]

c_3: [0, 3], [0, 3, 16]

可以发现,有一些路径其实是另一条路径的子路径(最优子路径存在原理),于是我们判断,如果一条路径p1是另一条路径p2的子路径,就删除路径p1,最后便得到如下的路径:

c_1: [0, 11, 10], [0, 2, 12, 13, 14], [0, 2, 15]

c_2: [0, 4], [0, 6, 5, 7], [0, 1, 8], [0, 1, 9]

c_3: [0, 3, 16]

c_1,c_2,c_3里面的每一条路径,就是最后货车行驶时,从起始点出发到这个簇中进行配送的每一条路径。

3.3根据这些路径上的订单重量,将订单分配给货车

根据站点注册的货车的核载量,和货车是否空闲,给货车分配订单

我们这里有一些已注册的货车的基本信息,如下:

carrying_capacity表示货车的核载量,以吨 (t) 为单位

truck_status 表示货车的状态,0表示货车空闲,可以用于运输

本系统的货车分配的算法:使用让货车尽可能装满(对于相同的订单重量,分配能运完的,车的载重量之和尽可能小的车)的分配算法

对于每一条已经确定的行驶路径,计算路径上订单的总重量,分配空闲的货车去运输。


例:当前空闲的货车的载重量有7 t、6 t、5 t、5 t、3 t的,路径path上订单的总重量为13.4 t,则会分配 5 t、6 t、3 t的车去运输

本系统提供两种寻找货车分配最优解的算法:回溯法动态规划

3.3.1回溯法

使用深度优先搜索,穷举所有的组合可能,对每种符合要求的可能计算一下货车重量和,找出货车重量和最小的那一组组合

适用情况:适用于物流分配站拥有的货车数少,订单总数少的情况

3.3.2动态规划

此处设有n辆待分配的货车,所有的货车载重量之和为 w,货车编号为 1~nt_i表示编号为i的货车的载重量,当前路径上订单总重量为 weight_sum,函数 f(i,s_i) 表示从 [1,i] 中选择货车,未分配的货车[i+1, n]载重量之和剩下多少

此时要解决的问题为:在 [weight_sum, w] 的区间内,要找到怎么样的货车组合,使得货车组合的载重量和最小且大于weight_sum

可以将上面所述的问题分解为多个子问题 P,子问题为:当面临第i辆车的选择时,如果选取了第i辆车之后,未分配的货车载重量之和小于 weight_sum,不符合条件,则 f(i,s_i) = f(i-1,s_i),否则 fi, s_i=min⁡{fi-1,si, fi-1,si-ti-t_i}

即状态转移方程为 fi, s_i=min⁡{fi-1,si, fi-1,si-ti-t_i}

对每辆货车,对 [weight_sum, w] 中的每一个数进行遍历,最后 f(n, w) 就是最优的解

回溯找出最优解的组成:

根据子问题的条件及对应的状态转移操作,回溯出最优解的组成,找到货车对应的编号

适用情况:所有情况,当物流分配站拥有货车数多,要运送的订单多时,此算法事件复杂度会比回溯法小很多

4.0 在本地配置接口,为系统提供车辆分配和导航的服务

由于系统是使用Java语言编写的,而车辆分配和导航的算法是使用Python语言编写的,所以此算法为了提供对不同语言编写的系统的兼容,使用Django框架配置一个接口,使用Ajax技术,返回一个json格式的数据,里面的内容即车辆分配和导航的结果

以郑州市为起始点为例,展示其中的一部分

  1. {  
  2.   "0": {  
  3.     "error": 0,  
  4.     "truck_number_list": [  
  5.       1,  
  6.       3  
  7.     ],  
  8.     "path": [  
  9.       "许昌",  
  10.       "周口",  
  11.       "商丘"  
  12.     ],  
  13.     "orders_weight": [  
  14.       4998.5,  
  15.       2932.0  
  16.     ],  
  17.     "order_id_list": [  
  18.       [  
  19.         5,  
  20.         14,  
  21.         24,  
  22.         35,  
  23.             …  
  24.       ],  
  25.       [  
  26.         505,  
  27.         513,  
  28.         518,  
  29.             …  
  30.       ]  
  31.     ]  
  32.   }  

Json里包含了字符串从 0n的键,分别包含每一条路径的信息

“error” 0表示分配过程中没有产生异常(当前拥有的货车能够装得下此路径上的订单),为1表示产生异常

“truck_number_list” 表示这条路径上分配的货车的id

“path” 表示在这条路径上运输经过的城市

“orders_weight” 分配的不同货车对应运输的订单总重量

“order_id_list” 分配的不同货车对应运输的订单的id

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/135587.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot Web开发

SpringBoot3-Web开发 SpringBoot的Web开发能力,由SpringMVC提供。 Web开发的三种方式 方式处理过程注意事项实现效果全自动直接编写控制逻辑全部使用自动给配置默认效果手自一体Configuration、 配置WebMvcConfigurer、 配置WebMvcRegistrations不要标注 EnableWeb…

matlab模糊控制文件m代码实现和基础理论

1、内容简介 略 15-可以交流、咨询、答疑 通过m代码来实现生成模糊文件fis文件 2、内容说明 模糊文件m代码实现和基础理论 matlab模糊控制文件m代码实现和基础理论 模糊文件、m代码和模糊基础理论 3、仿真分析 略 4、参考论文 略 链接:https://pan.baidu.co…

【C++】非类型模板参数 | array容器 | 模板特化 | 模板为什么不能分离编译

目录 一、非类型模板参数 二、array容器 三、模板特化 为什么要对模板进行特化 函数模板特化 补充一个问题 类模板特化 全特化与偏特化 全特化 偏特化 四、模板为什么不能分离编译 为什么 怎么办 五、总结模板的优缺点 一、非类型模板参数 模板参数分两类&#x…

【MongoDB】索引 – 文本索引(用权重控制搜索结果)

一、准备工作 这里准备一些数据 db.books.drop();db.books.insert({_id: 1, name: "Java", alias: "java 入门", description: "入门图书" }); db.books.insert({_id: 2, name: "C", alias: "c", description: "C 入…

[护网杯 2018]easy_tornado 1(两种解法!)

题目环境:发现有三个txt文本文件 /flag.txt/welcome.txt/hints.txt 依此点开 flag在/fllllllllllllag文件中 在hints.txt文件中发现md5计算 md5(cookie_secretmd5(filename)) 并且三个文件中都存在filehash(文件名被哈希算法加密32位小写) 猜…

轻量封装WebGPU渲染系统示例<23>- 可渲染对象添加到多个渲染器Pass节点(源码)

渲染和计算混合系统, 可以看做基于算力驱动设计理念的一种实现。 此系统中,可渲染(rendering)/计算(computing)实体可以任意添加到一个渲染器pass节点。若干个这样的节点相关联,就能构成对应的pass node graph,也就实现了整个3D渲…

CS224W6.2——深度学习基础

在本文中,我们回顾了深度学习的概念和技术,这些概念和技术对理解图神经网络至关重要。从将机器学习表述为优化问题开始,介绍了目标函数、梯度下降、非线性和反向传播的概念。 文章目录 1. 大纲2. 优化问题2.1 举例损失函数 3. 如何优化目标函…

【FISCO BCOS】十九、区块链浏览器部署

目录 一、环境依赖 检查环境 1.检查java 二、拉取安装脚本 获取部署安装包 ​编辑 解压安装包 进入目录 三、修改配置 四、部署服务 五、状态检查 检查前后端进程 1.检查后端server进程 2.检查前端的nginx进程 检查进程端口 六、使用区块链浏览器 1.配置群组…

(二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

HarmonyOS 高级特性

引言 本章将探讨 HarmonyOS 的高级特性,包括分布式能力、安全机制和性能优化。这些特性可以帮助你构建更强大、更安全、更高效的应用。 目录 HarmonyOS 的分布式能力HarmonyOS 的安全机制HarmonyOS 的性能优化总结 1. HarmonyOS 的分布式能力 HarmonyOS 的分布…

Zabbix监控SSL证书有效期

一、介绍 由于业务需要,最近通过 Let’s Encrypt 申请了一些 SSL 证书,而证书有效期为 3 个月,需要在证书到期之前 renew。由于域名较多经常忘记 renew,导致证书过期,因此想通过 Zabbix 的方式监控证书的到期时间&…

linux 下非sudo安装cmake

1.查看位数 getconf LONG_BIT2.下载对应压缩包 Download CMake Source Distribution 未编译源代码 Binary Distribution已经编译好的 3.解压至文件夹 tar -zxvf cmake-3.28.0-rc4-linux-x86_64.tar.gz 4.添加环境变量 vi ~/.bashrc 最后一行添加 写到bin目录 export P…

2023亚太杯数学建模B题思路

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

Python BeautifulSoup 库使用教程

文章目录 简介安装 BeautifulSoup 库BeautifulSoup 库的导入BeautifulSoup 库依赖的解析库创建 BeautifulSoup 对象CSS选择器1、通过标签名查找2、通过 CSS 的类名查找3、通过 Tag(标签) 的 id 查找4、通过 是否存在某个属性来查找5、通过 某个标签是否存在某个属性来查找 获取…

怎么制作安装电子版说明书?方法献上~

在现代科技发展的背景下,制作一份优质的电子版说明书对于帮助用户正确、高效地使用产品至关重要。无论是软件、设备还是家电产品,一份清晰明了的电子版说明书可以为用户提供指导和支持,提升用户体验和满意度。那么,如何制作一份出…

springcloud电影购票选座网站系统源码

开发技术: jdk1.8,mysql5.7,idea springcloud springboot mybatis vue elementui 功能介绍: 用户端: 登录注册 首页显示搜索电影,轮播图,电影分类,最近上架电影(可…

C++进阶-STL list容器的简单认识

STL list容器的简单认识 list容器基本概念list容器构造函数list容器赋值和交换list容器大小操作list容器插入和删除list容器数据存取list容器反转和排序list排序案例 list容器基本概念 list容器是将数据进行链式存储的容器,链表(list)是一种…

如何查看反汇编(VS)

如何查看反汇编 1. 设置断点2. 运行到该处3. 右键 反汇编结果 1. 设置断点 2. 运行到该处 3. 右键 反汇编 结果 即可跳转查看反汇编

【Linux】无废话教你如何用vs code连接云服务器

目录 1. 前言2. 云服务器准备3. 插件准备4. 连接云服务器5. 如何连接一台云服务器多个用户 1. 前言 本文章针对已经成功下载vs code的朋友,如若还未下载移步vscode官网 2. 云服务器准备 这里首先我们需要一台云服务器。云服务器选择有很多,阿里云、腾讯云…

Qt贝塞尔曲线

目录 引言核心代码基本表达绘制曲线使用QEasingCurve 完整代码 引言 贝塞尔曲线客户端开发中常见的过渡效果,如界面的淡入淡出、数值变化、颜色变化等等。为了能够更深的了解地理解贝塞尔曲线,本文通过Demo将贝塞尔曲线绘制出来,如下所示&am…