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

相关文章

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

PyQt5+Python-docx实现一键生成测试报告

《PyQt5+Python-docx实现一键生成测试报告》作为一名测试工程师,你是否经历过手动填写测试报告的痛苦,本文将用Python的PyQt5和python-docx库,打造一款测试报告一键生成工... 目录引言工具功能亮点工具设计思路1. 界面设计:PyQt5实现数据输入2. 文档生成:python-

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例