Python笔记之按订单重量与去向进行拼车运输算法

2023-12-01 15:52

本文主要是介绍Python笔记之按订单重量与去向进行拼车运输算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求

在TMS模块,对同去向不同客户之间的订单进行拼车以节省运输成本。

算法

使用Python的interval、itertools 进行拼车。

# -*- codeing = utf-8 -*-
# @File : TMS拼车2.py
# @Author : 一起种梧桐吧
# @Version : Python 3.10.0
# @Software : PyCharm
# @Time : 2023年7月31日
# @Purpose : TMS运输管理系统同路线客户拼车from interval import Interval
from itertools import combinationsXL = ["东", "西", "南", "北"]
KH = {"客户01": ["东", 100],"客户02": ["东", 150],"客户03": ["东", 190],"客户04": ["东", 250],"客户05": ["南", 160],"客户06": ["南", 170],"客户07": ["南", 200]}
ZZ = {"客户01": {"dd01": 12550, "dd02": 300},"客户02": {"dd03": 11020, "dd04": 11000, "dd05": 1180, },"客户03": {"dd06": 11050, "dd07": 1220, "dd08": 110, },"客户04": {"dd09": 6350, "dd10": 5280},"客户05": {"dd11": 3050, "dd12": 3180},"客户06": {"dd13": 3520, "dd14": 3180},"客户07": {"dd15": 5390, "dd16": 3210}}
CL = {"X": 11500, "D": 13500}def load_1shop1order(shop: str, zzl_min: float, zzl_max: float):'''单门店-单订单装车:param zzl_min: 最小载重量:param zzl_max: 最大载重量:return: 满足条件的订单ID'''zzl_interval = Interval(zzl_min, zzl_max)for item in sorted(ZZ[shop].items(), key=lambda x: x[1], reverse=True):if item[1] in zzl_interval:return item[0], item[1]elif item[1] < zzl_min:return Noneelse:continueelse:return Nonedef load_1shop2order(shop: str, zzl_min: float, zzl_max: float):'''单门店-多订单装车:param zzl_min: 最小载重量:param zzl_max: 最大载重量:return: 满足条件的订单ID'''zzl_interval = Interval(zzl_min, zzl_max)dct_order = ZZ[shop]if sum(dct_order.values()) in zzl_interval:return tuple(dct_order.keys()), sum(dct_order.values())elif sum(dct_order.values()) <= zzl_min:return Noneelse:lst_order = []for key, value in dct_order.items():if value <= zzl_max:lst_order.append(key)lst_comb = []for i in range(1, len(lst_order) + 1):lst_comb.extend(combinations(lst_order, i))dct_comb = {}for order_comb in lst_comb:zl_order_comb = 0for order in order_comb:zl_order_comb += dct_order[order]if zl_order_comb in zzl_interval:dct_comb.update({order_comb: zl_order_comb})for item in sorted(dct_comb.items(), key=lambda x: x[1], reverse=True):if item[1] in zzl_interval:return item[0], item[1]elif item[1] < zzl_min:return Noneelse:continueelse:return Nonedef load(truck=CL):'''根据卡车装载量进行自动装载:param truck: 卡车信息:return: 满足条件的订单ID'''zzl_min = truck["X"]zzl_max = truck["D"]zzl_interval = Interval(zzl_min, zzl_max)dct_order = {}for item in ZZ.values():dct_order.update(item)# step_01:尝试单店单订单装载lst_order1 = []for shop in ZZ.keys():res = load_1shop1order(shop, zzl_min, zzl_max)if res:lst_order1.append(res)# print(lst_order1)dct_order_load1 = {}for item_comb in lst_order1:if item_comb:dct_order_load1.update({item_comb[0]: item_comb[1]})if dct_order_load1:for key, value in sorted(dct_order_load1.items(), key=lambda x: x[1], reverse=True):# return key, valueprint("step_01", key, value)# step_02:尝试单店多订单装载lst_order2 = []for shop in ZZ.keys():res = load_1shop2order(shop, zzl_min, zzl_max)if res:lst_order2.append(res)# print(lst_order2)dct_order_load2 = {}for item_comb in lst_order2:if item_comb:dct_order_load2.update({item_comb[0]: item_comb[1]})if dct_order_load2:for key, value in sorted(dct_order_load2.items(), key=lambda x: x[1], reverse=True):# return key, valueprint("step_02", key, value)# step_03:尝试2店拼订单装载(由远及近)dct_shop_03 = {}zzl_interval_03 = Interval(zzl_min * 0.5, zzl_max * 0.75)for shop in ZZ.keys():zzl_shop = sum(ZZ[shop].values())if zzl_shop in zzl_interval_03:dct_shop_03[shop] = zzl_shopfor key03, value03 in sorted(dct_shop_03.items(), key=lambda x: x[1], reverse=True):zzl_interval_new_03 = Interval(value03 * 0.33, value03) & Interval(zzl_min - value03, zzl_max - value03)if not zzl_interval_new_03:continue[qx03, yj03] = KH[key03]lst_shop_03_02 = []for shop03_02, qxyj03_02 in KH.items():if (qxyj03_02[0] == qx03) & (yj03 - qxyj03_02[1] in Interval(0, 50, lower_closed=False)):lst_shop_03_02.append(shop03_02)if not lst_shop_03_02:continueelse:lst_order03 = []for shop02 in lst_shop_03_02:res = load_1shop2order(shop02, zzl_interval_new_03.lower_bound, zzl_interval_new_03.upper_bound)if res:lst_order03.append(res)if not res:continuedct_order_load03 = {}for item_comb in lst_order03:if item_comb:dct_order_load03.update({item_comb[0]: item_comb[1]})if dct_order_load03:for key03_02, value03_02 in sorted(dct_order_load03.items(), key=lambda x: x[1], reverse=True):lst_order_shop = list(ZZ[key03].keys())for order in key03_02:lst_order_shop.append(order)# return key, valueprint("step_03", tuple(lst_order_shop), value03_02 + value03)# step_04:尝试2店拼订单装载(由近到远)dct_shop_04 = {}zzl_interval_04 = Interval(zzl_min * 0.25, zzl_max * 0.5)for shop in ZZ.keys():zzl_shop = sum(ZZ[shop].values())if zzl_shop in zzl_interval_04:dct_shop_04[shop] = zzl_shopfor key04, value04 in sorted(dct_shop_04.items(), key=lambda x: x[1], reverse=True):# print(Interval(value * 0.33, value), Interval(zzl_min - value, zzl_max - value))zzl_interval_new_04 = Interval(value04, value04 * 3) & Interval(zzl_min - value04, zzl_max - value04)if not zzl_interval_new_04:continue[qx04, yj04] = KH[key04]lst_shop_04 = []for shop04_02, qxyj04_02 in KH.items():if (qxyj04_02[0] == qx04) & (qxyj04_02[1] - yj04 in Interval(0, 50, lower_closed=False)):lst_shop_04.append(shop04_02)if not lst_shop_04:continueelse:lst_order04 = []for shop04_02 in lst_shop_04:res = load_1shop2order(shop04_02, zzl_interval_new_04.lower_bound, zzl_interval_new_04.upper_bound)if res:lst_order04.append(res)# print(lst_order04)dct_order_load04 = {}for item_comb in lst_order04:if item_comb:dct_order_load04.update({item_comb[0]: item_comb[1]})if dct_order_load04:for key04_02, value04_02 in sorted(dct_order_load04.items(), key=lambda x: x[1], reverse=True):lst_order_shop = list(ZZ[key04].keys())for order in key04_02:lst_order_shop.append(order)# return key, valueprint("step_04", tuple(lst_order_shop), value04_02 + value04)if __name__ == "__main__":load()

这篇关于Python笔记之按订单重量与去向进行拼车运输算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/441775

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互