python实现客户成套订单配送策略混合遗传算法编码

news2024/11/19 11:27:50

以如下的论文文献为学习对象:2008年发表在《控制工程》的文献《客户成套订单配送策略混合遗传算法研究》

文献研究的学术意义

本文研究的目的是寻求在车队车辆数有限情况下 ,如何合理安排每天的车辆 ,使得总成本最小的方案。另外,若某天车辆不够,在应该租用多少车辆或考虑购置部分车辆来满足未来需求等策略下 ,组合各种策略使得未来一段时间内总成本最小。 目前对这类实际配送问题的研究文献尚不 多,大多数文献只是关于经典的车辆路径问题,因此,研究这类问题有很重要的实际意义。

问题描述

成套订单的配送问题与 VRPTW问题差别只在于将原来的客户需求拆成多点客户需求 ,但 已经不能简单地套用 VRPTW了, 因为在配送过程中可能存在着多辆车经过一个城市的情况 。有人认为将各个卸货点的货物需求集中起来运输就是 VRPTW 了,但若卸货点货物集中起来 的数量超过车辆容量 q,或货物因某些特性不能 放 在 一 起 运 输 ,就不满足VRPTW问题 的条件。纵使不超过 q,但它减少了车辆组合的多样性 。其组合也不一定就是最优。

目标函数

VRPTW问题的目标函数:总运输成本最小;
文献列出数学模型表示的目标函数为双目标函数:使用车辆数量最少以及车辆的总行驶距离最小。由于出动一辆车的固定成本远远大于车辆 的行驶成本 ,所以 ,本文将车辆数最小作为最小总成本的主要 目标 ,而将路程最小作为次要 目标 。

转化成一般的VRPTW问题的策略

本文采取一种增加虚拟卸货节点的方法将成套订 配送问题转化成 VRPTW模型。具体方法很简单,将原来各成套订单的任务按每天的子任务收集在 一起 ,并按卸货点位置合并,合并后每个卸货点有 几个 任务 就将其拆成几个虚拟卸货点 ,拆分前的卸货点与拆分后 的虚拟点两两间距离为 0,而与其他节点的距离不变,这样就可以将成套 订单的配送问题简化为VRPTW 问题 了 。设仓库的编号为 0,客户编号按照增加 了虚拟卸货点之后的卸货点数量来设置 ,即有多少个子任务就有多少个卸货点编号 。

遗传模拟退火算法

详细的步骤请读者参阅文献获取。

在这里插入图片描述

模拟退火算法基本原理

模拟退火算法(simulated annealing, SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火与一般的组合优化问题之间的相似性。模拟退火算法是一种通用的优化算法,其物理退火过程由以下三部分组成:
(1)加温过程。其目的是增强粒子的热运行,使其偏离平衡位置。当温度足够高时,固体将熔为液体,从而消除系统原先存在的非均匀状态。
(2)等温过程。对于与周围环境交换热量而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的进行的,当自由能达到最小时,系统达到平衡状态。
(3)冷却过程。使粒子热运动减弱,系统能量下降,得到晶体结构。
其中,加温过程对应算法的设定初温,等温过程对应算法的Metropolis抽样过程,冷却过程对应控制参数的下降。这里能量的变化就是目标函数,要得到的最优解就是能量最低态。Metropolis准则是SA算法收敛于全局最优解的关键所在,Metropolis准则以一定的概率接受恶化解,这样就使算法跳离局部最优的陷阱。

算例数据

在这里插入图片描述

使用遗传模拟退火算法求解如下10个卸货点的VRPTW问题。为了使研究的问题更加有意义,本人将时间限理解为服务点一天的具体可以允许配送的时间。 如果不要求车辆从配送中心出发的时间是统一的并且为0时刻,那么就默认第一个配送节点是一定能赶到的。采取从配送中心出发的时间不为0时刻的策略,默认一定能达到第一个配送点,所以采用最早到达时间推算车辆出发的时间。
假设配送中心营业时间是早上七点至晚上七点。卸货点1-10的时间限制理解如下:卸货点1要求在下午1点至下午4点配送,卸货点1要求的服务时间是半个小时;卸货点2要求在下午4点至下午6点配送,卸货点2要求的服务时间是1个小时,以此类推其他的卸货点的配送及服务时间限制。算法中用到配送及服务时间是下午的情况,例如卸货点1可转成数字表示是[13,16]。

在这里插入图片描述
在这里插入图片描述

先排除算例无解的场景,即配送中心开门时间都不能实现派车辆运输的场景。取10个卸货点中配送中心距离服务点最大的直线距离长度200公里,再假设车辆的单位行驶速度为40公里/小时,选择服务时间要求最早的1点,计算得出5个小时就可以满足配送任务,那么车辆可以最晚在早上8点前达到;

提前处理算例数据

在这里插入图片描述
在这里插入图片描述

考虑从配送中心不是0点出发的话,原来文献中的配送时间窗不是很合理,因为都是下午送货比较紧凑很可能没有较多可行解的产生,更改时间窗及服务时间如下数据,其中配送点为0的表示配送中心的服务时间也就是开门关门时间限制:

在这里插入图片描述

染色体编码方式

按照客户点的序号(卸货点)设计染色体,一条染色体表示所有卸货点序号的一个排列,车辆路径为从第一个基因往后搜索满足车辆容量和时间窗约束条件的基因,直到不能满足条件为止,满足条件的基因成为一条路线。依次执行此操作,直到最后一个基因。编码方式采用整数编码。

产生初始种群

在这里插入图片描述

def set_codeForm(population_size):
    population = np.zeros((population_size, demand_node_num), dtype=int)
    for i in range(population_size):
        while 1:
            population[i, :] = random.sample(range(1, demand_node_num+1), demand_node_num)
            if get_feasible_route(population[i, :]):
                break
            else:
                continue
    return population

计算初始种群中每条染色体的适应度函数

# 目标函数:使用车辆数量最少+车辆的总行驶距离最小。
# 约束条件:车辆载重量限制+硬时间窗限制
# 由于出动一辆车的固定成本远远大于车辆的行驶成本,
# 所以,本文将车辆数最小作为最小总成本的主要目标 ,而将路程最小作为次要目标 。

def main_target_func(chrom):
    # 使用车辆数量最少
    vehice_num = 0
    routes = get_feasible_route(chrom)
    for path in routes:
        for node in path[1:-1]:
            if node == 0:
                vehice_num += 1
    return vehice_num


def minor_target_func(chrom):
    # 车辆的总行驶距离最小
    # 适应度函数是总路线长度最小
    routes = get_feasible_route(chrom)
    total_length = 0
    for route in routes:
        total_length += get_route_length(route)
    target_value = total_length
    return target_value


def calculate_fitness(chrom):
    target_value = 0.6*main_target_func(chrom) + 0.4*minor_target_func(chrom)
    return target_value

按照模拟退火准则生成新种群

在这里插入图片描述

每个染色体的领域:邻域结构与中止条件 每个染色体的邻域包括随机使用 2-opt交换和 3-opt交换所产生的所有染色体.中止条件为运行 500代.

参考学习链接如下:
https://baike.baidu.com/item/2-opt
https://blog.csdn.net/sinat_41348401/article/details/126920506

在这里插入图片描述

使用matlab实现的3-opt算法

在这里插入图片描述

遗传算法的选择策略:轮盘赌选择法

将值最大的染色体直接复制一个进入下一代

Python实现轮盘赌算法
在这里插入图片描述

遗传算法的交叉和变异操作

局部收敛进行模拟退火算法的升温操作,否则进行遗传算法的交叉和变异操作。

在这里插入图片描述

小结

关联本博主的其他文章:
《遗传算法求解带时间窗的VRP问题(python)》
《【纠错】遗传算法求解VRP计算车辆容量限制的代码有bug》
《如何写代码实现VRP问题中车辆容量限制及时间窗要求(python)》

上面两篇文章都采用遗传算法求解,算得目标函数值478,本博文采用遗传模拟退火算法改进源代码,看看寻优结果。但是没搞出来,文献算法描述细节部分没理解清楚。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt使用QListWidget实现自定义Item效果

Q:如何在Qt库的基础上,实现自定义控件呢? A:根据官方文档回答,就是继承需实现的控件,然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何: listItem 主界面U…

sql高级教程-索引

文章目录 架构简介1.连接层2.服务层3.引擎层4.存储层 索引优化背景目的劣势分类基本语法索引结构和适用场景 性能分析MySq| Query Optimizerexplain 索引优化单表优化两表优化三表优化 索引失效原因 架构简介 1.连接层 最上层是一些客户端和连接服务,包含本地sock通…

shell的for循环与结构化

shell笔记 列表for循环不带列表for循环for循环举例1.例1 所有文件名大写替换为小写2. 例2 读取/etc/passwd文件,依次输出ip段3. 例3 读取/etc/hosts内容for循环,执行ping4. 例4 循环ip列表,输出对应编号5. 例5 批量添加用户 break1. 例1 brea…

python:遗传算法(Genetic Algorithm,GA)求解23个测试函数

一、遗传算法 遗传算法(Genetic Algorithm,GA)起源于对生物系统所进行的计算机模拟研究,是一种随机全局搜索优化方法,它模拟了自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象,从任一…

css之Flex弹性布局

文章目录 🐕前言:🏨定义flex容器 display:flex🏨在flex容器中子组件进行排列🪂行排列 flex-direction: row🪂将行排列进行翻转排列 flex-direction: row-reverse🏅按列排列 flex-direction: col…

统计二进制中1的个数

写一个函数返回参数二进制中 1 的个数。 比如: 15 0000 1111 4 个 1 我们先引入一个容易理解的例子,怎么得到一个十进制的数各个位置上的数为多少? 这里我们以一个十进制的三位数 123为例,要想得到它的个位,十位&#…

kubernetes-Service

文章目录 1、前言2、基本语法2.1 Service yaml2.2 关键字段2.3 port、nodePort、targetPort、containerPort字段说明 3、Service 类型3.1 ClusterIP3.2 NodePort3.3 LoadBalancer3.4 ExternalName 4、无头服务(Headless Services)5、访问service参考 1、…

R文件详细介绍、瘦身方案和原理

文章目录 1. 背景2. R文件介绍2.1 R文件概念2.1.1 标识符是怎么与资源联系起来的? 2.2 R文件内容2.3 library module和aar的R文件内容生成规则2.4 是谁生成的R文件?2.5 打包之后的R文件2.6 R文件为啥大?这么多? 3. 为什么R文件可以…

RK356x U-Boot研究所(开发篇)5.1 启动SATA硬盘中的固件

平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3RK356x支持从SATA硬盘中启动固件,只要板卡中有预留这个接口即可。值得注意的是,这个固件不能从maskrom阶段就直接进行加载,需要从别的媒介启动(Flash、eMMC或者TF卡)后跑到U-Boot阶段,在这个U-Boot阶段再去加载SATA硬盘…

黑豹程序员-架构师学习路线图-百科:Java的第二春Spring框架

文章目录 1、 Spring的发展历史2、为什么Spring能霸屏?2.1、容器的设计2.2、通过四个策略2.3、三种方式 3、学习编程设计的典范 1、 Spring的发展历史 正当SUN公司的EJB在全球开始热炒时,正当程序员纷纷转型EJB开发时,正当程序员为跑通EJB程…

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

目前,大模型凭借超强的学习能力,已经在搜索、推荐、智能交互、AIGC、生产流程变革、产业提效等场景表现出巨大的潜力。大模型经过海量数据的预训练,通常具有良好的通用性和泛化性。用户基于“大模型预训练微调”开发范式即可在实际业务场景取…

量子力学期末复习--1

量子力学解题技巧--1 基础知识 薛定谔方程 Ehrenfest 定理 不确定性原理:正则对易关系:自由粒子:对于自由粒子,分离变量解不代表物理上可实现的态。但其含时薛定谔方程的一般解仍旧是分离变量解的线性组合 典型题目 自由粒子…

029-第三代软件开发-加载本地字体库

第三代软件开发-加载本地字体库 文章目录 第三代软件开发-加载本地字体库项目介绍加载本地字体库 关键字: Qt、 Qml、 QFont、 QFontDatabase、 ttf 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Langu…

深圳世有伯乐教育科技有限公司——LJ培训

今天来吐槽一波 深圳世有伯乐教育科技有限公司就是一个垃圾的培训机构,不,说是培训机构都是扭曲事实了,因为它根本就没有国家认可的办学许可证。光说没法让人信服,以下是企查查的截图: 世有伯乐的工商信息图片 续上&…

MPC预测控制概述和C++ 中的模型库

系列续篇: C 中的模型预测路径积分 (MPPI) 控制-CSDN博客 一、说明 以下文章描述了应用模型预测控制器的简单控制系统方法。本文讨论了这种类型的控制的基本机制,该机制适用于各种工程领域。 MPC 涉及对未来系统行为的预测(由一组方程描述的模…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…

华为OD机试 - 代表团坐车 - 动态规划(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

【vue】vue本地储存、会话存储插件vue-ls的使用:

文章目录 一、安装:二、vue项目中使用:三、API说明: 一、安装: npm install vue-ls -S 或 yarn add vue-ls二、vue项目中使用: //在vue项目中的入口文件main.js中引入import Storage from vue-ls;options {namespac…

DNS和ICMP协议

目录 一、DNS协议 二、ICMP协议 1.ICMP协议 2.ping命令 在讲完了OSI模型每层协议的讲解后,还有一些协议我们需要再讲解一下。 一、DNS协议 DNS是一整套从域名映射到IP地址的系统,也叫做域名解析服务,端口号为53。 我们生活中访问网站都…

微软 Win11 Dev 预览版 Build 23570 发布,修复文件资源管理器卡顿问题

本心、输入输出、结果 文章目录 微软 Win11 Dev 预览版 Build 23570 发布,修复文件资源管理器卡顿问题前言微软 Win11 Dev 预览版 Build 23570 发布,修复文件资源管理器卡顿问题完整的更新日志[Windows 中的 Copilot][开始菜单][任务栏搜索][设置] 已知问…