生鲜农产品冷链物流配送路径优化模型构建及算法实现

news2025/7/11 12:01:20

摘要:本案例讲述的案例为生鲜农产品冷链物流配送路径优化,涉及的目标函数成本包括碳排放成本、固定成本、运输成本、货损变质成本、时间惩罚成本。

目标种类:单目标模型。

求解方法:基础版蚁群算法+改进版蚁群算法。

整体对标层级:硕士


目录

1、问题描述及假设条件

1.1 问题描述

1.2 假设条件

2、参数说明及模型成本构成

2.1 成本构成

 3、模型构建

 4、蚁群算法

5、蚁群算法改进

5.1 转移规则改进

5.2 信息素更新策略的改进

 6 、源码与结果部分

6.1 源码

6.2 结果部分

7、总结展望


1、问题描述及假设条件

1.1 问题描述

        本文主要研究生鲜农产品冷链物流车辆配送环节运输路径的优化问题,可表述为:生鲜农产品配送中心以冷链运输车辆为工具,在已知一定数量的客户,客户需求量及位置坐标情况下,尽可能满足客户需求,为每个客户提供生鲜农产品配送服务,使运输成本最小、耗费时间最小。在农产品冷链配送环节涉及到的要素包含配送中心、客户、货物、车辆、运输路径。

1.2 假设条件

        根据上述描述,结合实际情况,对配送模型的建立做如下假设前提:

假设1,已知客户需求量,有一个配送中心仓库,且该仓库能够满足各客户点需求。
假设2,配送中心车辆车型唯一,且都只能从配送中心仓库出发。
假设3,每辆车匀速行驶且不能超载运输。

假设4,配送道路通畅,不考虑交通拥挤状况

假设5,每个客户对送货时间有明确要求,惩罚系数提前做好规定。
假设6,所有客户所需货物量不大于配送车辆的最大承载量。
假设7,每个客户点的货物仅由一辆车配送完成,一辆车可服务多个客户点

2、参数说明及模型成本构成

说明:由于公式中带有很多字母参数表达,本文中部分函数表达式就直接采用图片的方式。

2.1 成本构成

        模型中考虑的生鲜农产品冷链物流配送过程中的成本包含:碳排放成本;配送车辆固定成本;配送车辆运输成本;配送过程中生鲜农产品变质成本;违反时间窗惩罚成本。具体成本构成如图所示。

①碳排放成本

        现实中其碳排放量受到载重车辆类型、载重负荷、车辆的行驶速度和行驶距离等影响。这里研究中已假定车辆类型一致且均匀速行驶,因此主要考虑载重负荷和行驶距离的影响,相关参数及公式如下:

 ②固定成本

 ③运输成本

 ④货损变质成本

        生鲜农产品在运输过程中需要一定的温度保鲜,货物储存条件较为严格。运输时间越久,温度越高都会导致货物变质,综合考虑运输及卸货环节的货损成本,引入生鲜农产品腐败函数

D(t) = D_{0}e^{-\varrho t},(其中,D_{0}表示这批生鲜农产品的初始质量,\varrho _{1}表示运输过程中的农产品腐败率,\varrho _{2}表示卸货过程中的农产品腐败率)。C1表示运输过程中农产品的变质成本,C2表示在到达客户点后由于卸货开启车门使得冷空气流失,造成车厢内温度升高从而引起的货物变质成本,相关参数及公式如下:

 综上,可得整个配送过程中的货损成本

 ⑤时间窗成本

        时间窗成本相对较为好理解。

 3、模型构建

        基于上述相关参数描述、公式设定以及总成本最低的目标,建立生鲜农产品低碳物流配送路径优化的数学模型如下:

 4、蚁群算法

        基础版本的蚁群算法讲解已在智能优化算法系列中讲述到

        可跳转查阅【智能优化算法之蚁群算法】

5、蚁群算法改进

5.1 转移规则改进

        考虑到基本的蚁群算法随机性搜索易导致局部最优出现停滞现象,采用确定性搜索和随机性搜索相结合的策略,改进后的转移规则如下,蚂蚁k按照式2选择下一个节点j:

 其中,g是区间[0,1]内的一个随机数,g_{0}为假定的固定阀值,在区间[0,1]内。若g\leq g_{0},采用确定搜索算法,用信息素和启发式因子影响因素乘积选择下一节点;若g\geq g_{0},按照式2根据转移概率选择下一节点。

5.2 信息素更新策略的改进

        基本的蚁群算法在计算中容易陷入搜索停滞和过早收敛于非全局最优解的情况,因此改进信息素更新策略,初始化信息素值\tau _{ij}(t)=c,设为最大值\tau _{max}。考虑将每条边的信息素浓度限制在[\tau _{min}\tau _{max}]之间。在t+n时刻,只有找到最短路径的蚂蚁才能在其经过的路径上释放信息素,路径(i,j)上信息调整如下:

 6 源码与结果部分

6.1 源码

clear
clc
close all
tic
%% 用importdata这个函数来读取文件
c101=importdata('data.txt');
cap=300;                                                        %车辆最大装载量
%% 提取数据信息
E=c101(1,5);                                                    %配送中心时间窗开始时间
L=c101(1,6);                                                    %配送中心时间窗结束时间
vertexs=c101(:,2:3);                                            %所有点的坐标x和y
customer=vertexs(2:end,:);                                      %顾客坐标
cusnum=size(customer,1);                                        %顾客数
v_num=10;                                                       %车辆最多使用数目
demands=c101(2:end,4);                                          %需求量
a=c101(2:end,5);                                                %顾客时间窗开始时间[a[i],b[i]]
b=c101(2:end,6);                                                %顾客时间窗结束时间[a[i],b[i]]
width=b-a;                                                      %顾客的时间窗宽度
s=c101(2:end,7);  
speed = 35;                                           
dist = zeros(cusnum+1,cusnum+1)  ;                               %距离矩阵
for i =1:cusnum+1
    for j =1:cusnum+1
        if i==j
           dist(i,j) =0;
        else
            dist(i,j)=cal_distanceFun(vertexs(i,1),vertexs(i,2),vertexs(j,1),vertexs(j,2));
        end
    end      
end
%% 初始化参数
m=50;                                                           %蚂蚁数量
alpha=1;                                                        %信息素重要程度因子
beta=3;                                                         %启发函数重要程度因子
gama=2;                                                         %等待时间重要程度因子
delta=3;                                                        %时间窗跨度重要程度因子
r0=0.5;                                                         %r0为用来控制转移规则的参数
rho=0.85;                                                       %信息素挥发因子
Q=5;                                                            %更新信息素浓度的常数
Eta=1./dist;                                                    %启发函数
Tau=ones(cusnum+1,cusnum+1);                                    %信息素矩阵
Table=zeros(m,cusnum);                                          %路径记录表
iter=1;                                                         %迭代次数初值
iter_max=300;                                                   %最大迭代次数
Route_best=zeros(iter_max,cusnum);                              %各代最佳路径

c0 = 0.3;                                                       %单位距离碳排放税收价格
eta0 = 2.61;                                                    %单位距离碳排放系数
theta0 = 1;                                                     %空载时单位距离燃料消耗量
theta_start = 2;                                                %满载时单位距离燃料消耗量
p2 = 10;                                                        %生鲜农产品单位价值
zeta1 = 0.002;                                                  %运输过程中农产品腐败率
zeta2 = 0.003;                                                  %卸货过程中农产品腐败率
u1 = 10;                                                        %早于期望时间到达成本
u2 = 30;                                                        %晚于期望时间到达成本

Cost_best=zeros(iter_max,1);
%% 迭代寻找最佳路径
while iter<=iter_max
    %逐个蚂蚁选择
    for i=1:m
        %逐个顾客选择
        for j=1:cusnum
       np=next_point(i,Table,Tau,Eta,alpha,beta,gama,delta,a,b,width,s,L,dist,cap,demands);
            Table(i,j)=np;
        end
    end
    %% 计算各个蚂蚁的成本
    cost=zeros(m,1);
    NV=zeros(m,1);
    TD=zeros(m,1);
    for i=1:m
        VC=decode(Table(i,:),cap,demands,a,b,L,s,dist);
        [carbon_cost]=carbancostFun(VC,dist,demands,c0,eta0,theta0,theta_start,cap);
        [cost_oil,nv,TD]=cost_oilFun(VC,dist);
        [total_lose_cost]=lose_costFun(VC,dist,demands,p2,zeta1,zeta2,s);
        [time_cost]=timecostFun(VC,dist,a,b,s,u1,u2);
        cost(i,1) = carbon_cost+cost_oil+total_lose_cost+time_cost;
        NV(i,1) = nv;
        TD(i,1) = TD;
        
    end
    %% 计算最小成本及平均成本
    if iter == 1
        [min_Cost,min_index]=min(cost);
        Cost_best(iter)=min_Cost;
        Route_best(iter,:)=Table(min_index,:);
    else
        [min_Cost,min_index]=min(cost);
        Cost_best(iter)=min(Cost_best(iter - 1),min_Cost);
        if Cost_best(iter)==min_Cost
            Route_best(iter,:)=Table(min_index,:);
        else
            Route_best(iter,:)=Route_best((iter-1),:);
        end
    end
    %% 更新信息素
    bestR=Route_best(iter,:);
    [bestVC,bestNV,bestTD]=decode(bestR,cap,demands,a,b,L,s,dist);
    % Tau=updateTau(Tau,bestR,rho,Q,cap,demands,a,b,L,s,dist);
    Tau=updateTau(Tau,Table,rho,Q,cap,demands,a,b,L,s,dist);
    %% 打印当前最优解
    disp(['第',num2str(iter),'代最优解:'])
    disp(['车辆使用数目:',num2str(bestNV),',车辆行驶总距离:',num2str(bestTD)]);
    fprintf('\n')
    %% 迭代次数加1,清空路径记录表
    iter=iter+1;
    Table=zeros(m,cusnum);
end
%% 结果显示
bestRoute=Route_best(end,:);
[bestVC,NV,TD]=decode(bestRoute,cap,demands,a,b,L,s,dist);
draw_Best(bestVC,vertexs);

for i =1:length(vertexs)
    text(vertexs(i,1),vertexs(i,2),num2str(i-1));
end

%% 绘图
figure(2)
plot(1:iter_max,Cost_best,'b')
xlabel('迭代次数')
ylabel('成本')
title('各代最小成本变化趋势图')
toc

6.2 结果部分

1)基础版的运行结果

  2)改进版的运行结果

7、总结展望

        这里介绍了基本蚁群算法的原理、运算公式以及运算流程,针对基本蚁群算法的缺陷提出了改进的蚁群算法,详细阐述了改进蚁群算法运算流程,在此基础上进行算例分析,以并进行算例仿真,验证了该改进蚁群算法在进行路径规划求解时效果优于基本蚁群算法。

 

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

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

相关文章

快速掌握EasyExcel在web场景中的应用(读和写)

目录 一、引入依赖 二、设置表头 三、web下载模板 四、测试下载功能 五、复杂表头 六、写入数据 七、格式优化 7.1 日期自定义转换 7.2 列宽行高注解 八、动态表头 九、动态表格写入数据 一、引入依赖 <dependency><groupId>com.alibaba</groupId>…

Linux——生产者消费者模型和信号量

目录​​​​​​​ 基于BlockingQueue的生产者消费者模型 概念 条件变量的第二个参数的作用 锁的作用 生产者消费者模型的高效性 生产者而言&#xff0c;向blockqueue里面放置任务 消费者而言&#xff0c;从blockqueue里面拿取任务&#xff1a; 总结 完整代码(不含存储…

从零开始搭建一个moveit2简单机械臂模型

文章目录 前言一、设计一个简单机械臂二、构造创建文件关系CMakeLists.txt 修改增加如下&#xff1a;package.xml 修改增加如下&#xff1a;urdf.rviz 全文如下&#xff1a;demo.launch.py 全文如下&#xff1a; launch rviz构造link构造joint 总结 前言 在网上搜了许多文章&a…

游戏互动,用Python点燃【儿童节】的欢乐!

当孩子们踏入人生的旅途时&#xff0c;他们需要的并不仅仅是学习知识&#xff0c;更需要的是在快乐的氛围中成长。六一儿童节即将来临&#xff0c;让我们用Python代码为孩子们送去一份特别的礼物吧&#xff01; 在本篇文章中&#xff0c;我会带领大家一起探索如何利用Python代…

php中文字符串提取方法,preg_replace 和preg_match_all区别

在php中&#xff0c;可以利用以下两种函数来只提取字符串的中文字符 preg_replace()函数 preg_match_all()函数 方法1&#xff1a;使用preg_match_all()函数 preg_match_all()函数配合正则表达式“/[\x{4e00}-\x{9fff}]/u”可以过滤字符串&#xff0c;只获取中文字符。 会…

chatgpt赋能python:Python中[:3]的用法介绍

Python中[:3]的用法介绍 Python是一种高级编程语言&#xff0c;经常被用于数据科学、机器学习、人工智能和Web应用程序开发。在Python中&#xff0c;有许多有用的编程技巧和语法&#xff0c;其中之一就是[:3]。 什么是[:3]&#xff1f; 在Python中&#xff0c;[:3]是一种称为…

研发工程师玩转Kubernetes——使用Ingress进行路由

依据微服务理念&#xff0c;我们希望每个独立的功能由一个服务支持。比如有两个接口&#xff1a;http://www.xxx.com/plus和http://www.xxx.com/minus&#xff0c;前者由一个叫plus-service的服务支持&#xff0c;后者由一个叫minus-service的服务支持。这样就需要一个路由层&a…

华为OD机试真题B卷 Java 实现【查找两个字符串a,b中的最长公共子串】,附详细解题思路

一、题目描述 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开! 数据范围:字符串长度1≤length≤300 。 二、输入描述 输入两个字符串…

牛客网刷题学习SQL(五)

SQL25 查找山东大学或者性别为男生的信息 分析&#xff1a; 查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据&#xff0c;结果不去重。 山东大学 --》 where university“山东大学” 男性—》where gender “male” 结果不去重 所以上面不能使用or&…

改进的yolo目标检测(yolo创新与改进)

目标检测是计算机视觉领域中的一个重要问题,它需要从图像或视频中检测出物体的位置和类别。近年来,深度学习技术在目标检测领域取得了显著的进展,其中一个重要的方法是基于YOLO(You Only Look Once)算法的目标检测。 YOLO算法的优点是速度快,但是在检测小物体和密集物体…

SAP-MM-发票-采购附加成本处理简介

一&#xff0e;采购附加成本处理&#xff1a; 原材料的采购成本包括采购成本&#xff08;采购单价*采购数量&#xff09;和相关采购附加成本&#xff08;运输费、保险费、报关费、仓储费、滞期费、租船费、码头费及代理费等费用&#xff09;&#xff0c;对于采购附加成本主要有…

覆盖标准(白盒、黑盒和灰盒)

覆盖标准(白盒、黑盒和灰盒) 覆盖标准Coverage Criteria 覆盖标准采用软件的抽象表示并将其划分为可测试的功能。 每个功能构成了测试需求的基础——需要由软件的测试套件进行测试的东西。 当测试套件的一个测试用例满足测试要求时&#xff0c;我们说测试要求被覆盖。测试套件…

四、机器人整体结构的稳定性

结构的稳定性是指结构在外界载荷作用下&#xff0c;能否维持自己的形状和位置。如果结构在外界载荷作用下能够维持自己的形状和位置&#xff0c;则称为稳定&#xff1b;如果结构在外界载荷作用下无法维持自己的形状和位置&#xff0c;则称为不稳定。 结构的稳定性是一个相对概念…

管理系统总结(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat里)

根据所学的知识, 写一个管理系统, 顺便总结一些知识点 准备: 前端用vue-cli的框架, 后端用jdbc连接数据库, 项目部署tomcat服务器来完成交互 ●前端的vue-cli框架搭建可以看 点击跳转 的第二小结 ●后端的tomcat在idea里的相关的配置与集成,可以看 点击跳跃 文章目录 一、 前段…

机智云物联网低功耗转接板GE211+机智云APP遥控灯

要实现硬件的智能化&#xff0c;除了硬件本身外&#xff0c;还需要实现&#xff1a;智能云平台、手机 APP、联网模块&#xff0c;每 一个领域都需要专业的团队来支撑。机智云提供完整的解决方案&#xff0c;让厂商或开发者只需要专 注于自身产品硬件。以最小的成本和风险实现硬…

【网络】路由器和无线路由器就这么配置

目录 &#x1f352;常见的接入互联网方式 &#x1f353;WAN配置 &#x1f353;LAN口配置 &#x1f353;WLAN配置 &#x1f353;WLAN安全 &#x1f352;路由设备管理 &#x1f353;路由器内部组件 &#x1f353;Cisco路由器的启动过程 &#x1f353;基础命令 &#x1f34e;show …

数据库中的DDL、DQL、DML、DCL 和 TCL 命令

数据库中的DDL、DQL、DML、DCL 和 TCL 命令 SQLDDL&#xff08;Data Definition Language&#xff09;数据库定义语言DML&#xff08;Data Manipulation Language&#xff09;数据操纵语言TCL&#xff08;Transaction Control Language&#xff09;事务控制语言DQL (Data Query…

UEFI开发环境搭建(Windows)

重拾UEFI学习。 第一步是搭建开发环境&#xff0c;记录如下&#xff1a; 1. 安装开发工具 Visual Studio 2017 python/ASL/NASM 安装到如下目录&#xff1a; c:\Python310 c:\ASL c:\NASM 更新系统变量Path: 新建系统变量PYTHON_HOME 下载EDK2 创建工作目录&#xff…

一个技巧,让ChatGPT学会复杂编程,编程水平逼近人类程序员!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 随着 AIGC 技术迈出了一大步&#xff0c;ChatGPT 等聊天机器人被频繁地使用在生活和工作中的各个场景。想象一下&#xff0c;当你写代码陷入没有头绪的境地或者无法解决 Bug 时&#xff0c;这种基于大型语言模型&#xff08;LL…

ROS:发布者Publisher的编程实现(C++)

目录 一、话题模型二、创建功能包三、创建Publisher代码四、编译代码五、运行 一、话题模型 图中&#xff0c;我们使用ROS Master管理节点。 有两个主要节点&#xff1a; Publisher&#xff0c;名为Turtle Velocity&#xff08;即海龟的速度&#xff09; Subscriber&#xff0c…