目录

1 基础知识储备

1.1 LINGO 具有9种逻辑运算符

1.2 lingo的窗口状态解析

1.3 @wrap函数解析

1.3.1 官方解释

1.3.2 示例代码及解释

2 CVRP问题描述与模型

2.1 问题描述

2.2 定义集合和数据段

2.2.1 定义集合

2.2.2 定义数据段

2.2.3 定义目标函数

2.2.4 定义模型约束条件

3 结果演示


带容量约束的车辆路径问题,是使用一组具有核定载重约束的车队为一组顾客点提供服务,要求服务的总路径最短。

本文的视频参考B站视频:Lingo求解车辆路径问题模型代码演示

1 基础知识储备

1.1 LINGO 具有9种逻辑运算符

#not# 否定该操作数的逻辑值,#not#是一个一元表达式
#eq# 若两个运算数相等,则为true;否则为flase
#ne# 若两个运算符不相等,则为true;否则为flase
#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase
#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase
#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase
#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase
#and# 仅当两个参数都为true 时,结果为true;否则为flase
#or# 仅当两个参数都为false 时,结果为false;否则为true

这些运算符的优先级由高到低为

1.2 lingo的窗口状态解析

1.3 @wrap函数解析

1.3.1 官方解释

@wrap(index,limit)

@WRAP( INDEX, LIMIT)

This allows you to "wrap" an index around the end of a set and continue indexing at the other end of the set. That is, when the last (first) member of a set is reached in a set looping function, use of @WRAP will allow you to wrap the set index to the first (last) member of the set. This is a particularly useful function in cyclical, multiperiod planning models.

Formally speaking, @WRAP returns J such that J = INDEX - K * LIMIT, where K is an integer such that J is in the interval [1,LIMIT]. Informally speaking, @WRAP will subtract or add LIMIT to INDEX until it falls in the range 1 to LIMIT.

For an example on the use of the @WRAP function in a staff scheduling model, refer to the Primitive Set Example section in Using Sets.

@wrap函数的确是返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间[1,limit]内。可是它并不等于做简单的取模再加1的作用。如果硬要在取模方面来说明@wrap函数的话只能这么来解释了:@wrap(index,limit)函数相当于index模limit,如果取模结果不等于0,就返回该结果,否则返回limit。

1.3.2 示例代码及解释

resault = @wrap(10,2);
resault1 = @wrap(10,1);
resault2 = @wrap(10,3);
resault3 = @wrap(10,4);
resault4 = @wrap(10,5);
resault5 = @wrap(10,6);
resault6 = @wrap(10,7);
resault7 = @wrap(10,8);
resault8 = @wrap(10,9);
resault9 = @wrap(10,0); !本行代码会报错误代码86;

代码演示结果

最后一行代码的报错及解释:不允许分母为0

An undefined arithmetic operation (e.g., 1/0 or @LOG( -1)) occurred while LINGO was solving the model. If you have specified a row name for the constraint, LINGO will print the name of the constraint. If you haven't specified row names in your model, you may want to add them to assist in tracking down this error. Check the referenced constraint for any undefined operations and try to either, 1) rewrite it avoiding operations that can potentially become undefined, or, 2) use the @BND function to restrict variables to ranges where all operations are defined.

2 CVRP问题描述与模型

2.1 问题描述

假定存在一个车场Depot和3个顾客需求点,4个节点之间的距离和每个顾客点的需求量如下图所示:

我们的任务是安排车辆从depot出发,然后服务完成这三个顾客需求点所需的车辆行驶路径最短

2.2 定义集合和数据段

我们在模型中使用到如下变量:

q_{i}:表示顾客节点的需求量,对应需求向量Q,维度为1*4;其中4为模型涉及的节点个数,并将车场点设置为0;

u_{i}:车辆行驶至节点i时的累积需求量,对应需求量向量U

d_{ij}:表示节点 i 到节点 j 的空间距离,对应距离矩阵DIST

x_{ij}:表示弧段i,j是否为车辆方位,若访问则取值为1,否则取值为0

2.2.1 定义集合

!定义集合;
SETS:
CITY/1..4/: Q, U; !定义需求量向量Q_{i}和累积载重量向量U(i);
CXC(CITY, CITY): DIST, X;!定义距离矩阵d_{ij}和二进制变量x_{ij};
ENDSETS

2.2.2 定义数据段

!定义数据段;
DATA:
Q = 0 2 3 5;!需求量向量;
DIST = !距离矩阵;0 3 4 23 0 4 54 4 0 72 5 7 0;
C = 5;!车辆的最大载重量为5;
ENDDATA

2.2.3 定义目标函数

对应Latex源码:

min z = \sum_{i=1}^{4}  \sum_{i=1}^{4} x_{ij} * d_{ij}

对应Lingo源码:

min = @sum(CXC : X * DIST);

2.2.4 定义模型约束条件

(1)限定变量x_{ij}为二进制变量

!设置整数约束;
@for(cxc : @bin(x)); !规定变量x_{ij}为二进制变量,只能取值为0或者1;

(2)为x_{ij}赋值:

程序逻辑:

  • 第一步,将矩阵X的对角线元素赋值为0;
  • 第二步:为非对角线元素赋值
    • 若下一个节点为depot节点则设置为x_{ij} = 1,否则为0
    • 若为非depot节点,判断累加需求量是否大于车辆约束C,若是设置x_{ij} = 1

对应Lingo源码:

@for(city(k) | k #gt# 1 : x(k,k) = 0;@sum(city (i) | i #ne# k #and# (i #eq# 1 #or# Q(i) + Q(k) < C) : x(i,k) = 1;@sum(city (j) | j #ne# k #and# (j #eq# 1 #or# Q(i) + Q(k) < C) : x(k,j) = 1;@for(city(i) | i #ne# k #and# i #ne# 1 :U(k) >= U(i) + Q(k) - C + C * (x(k,i) + x(i,k)) - (Q(k) + Q(i)) * x(k,i););U(k) <= C - (C - Q(k)) * x(1, k);U(k) >= Q(k) + @sum(city(i) | i #gt# 1: Q(i) * x(i,k));
);

(3)车辆数目约束

vechileCnt = @SUM( city(i) | i #gt# : Q(i)) / C;
vehicleR = vechileCnt + 1.999 - @wrap(vechileCnt - 0.001, 1);
@sum(city(j) | j #gt# 1 : x(1,j) >= vehicleR;必须有足够的车辆离开车场

3 结果演示

Local optimal solution found.
  Objective value:                              15.00000
  Objective bound:                              15.00000
  Infeasibilities:                              0.000000
  Extended solver steps:                               2
  Total solver iterations:                           113

Variable           Value
                                                  C        5.000000
                                               VCAP        37766.16
                                             VEHCLF       0.2647873E-03
                                             VEHCLR        1.000000
                                              Q( 1)        0.000000
                                              Q( 2)        2.000000
                                              Q( 3)        3.000000
                                              Q( 4)        5.000000
                                              U( 1)        0.000000
                                              U( 2)        2.000000
                                              U( 3)        5.000000
                                              U( 4)        5.000000
                                        DIST( 1, 1)        0.000000
                                        DIST( 1, 2)        3.000000
                                        DIST( 1, 3)        4.000000
                                        DIST( 1, 4)        2.000000
                                        DIST( 2, 1)        3.000000
                                        DIST( 2, 2)        0.000000
                                        DIST( 2, 3)        4.000000
                                        DIST( 2, 4)        5.000000
                                        DIST( 3, 1)        4.000000
                                        DIST( 3, 2)        4.000000
                                        DIST( 3, 3)        0.000000
                                        DIST( 3, 4)        7.000000
                                        DIST( 4, 1)        2.000000
                                        DIST( 4, 2)        5.000000
                                        DIST( 4, 3)        7.000000
                                        DIST( 4, 4)        0.000000
                                           X( 1, 1)        0.000000
                                           X( 1, 2)        1.000000
                                           X( 1, 3)        0.000000
                                           X( 1, 4)        1.000000
                                           X( 2, 1)        0.000000
                                           X( 2, 2)        0.000000
                                           X( 2, 3)        1.000000
                                           X( 2, 4)        0.000000
                                           X( 3, 1)        1.000000
                                           X( 3, 2)        0.000000
                                           X( 3, 3)        0.000000
                                           X( 3, 4)        0.000000
                                           X( 4, 1)        1.000000
                                           X( 4, 2)        0.000000
                                           X( 4, 3)        0.000000
                                           X( 4, 4)        0.000000

Row    Slack or Surplus
                                                  1        15.00000
                                                  2        0.000000
                                                  3        0.000000
                                                  4        0.000000
                                                  5        0.000000
                                                  6        37761.16
                                                  7        0.000000
                                                  8        0.000000
                                                  9        0.000000
                                                 10        0.000000
                                                 11        0.000000
                                                 12        0.000000
                                                 13        37763.16
                                                 14        37761.16
                                                 15        0.000000
                                                 16        0.000000
                                                 17        0.000000
                                                 18        0.000000
                                                 19        37764.16
                                                 20        37761.16
                                                 21        0.000000
                                                 22        0.000000
                                                 23        0.000000
                                                 24        0.000000
                                                 25        1.000000

最优解:  1 --> 4 --> 1;   1-->2-->3-->1

对CVRP的求解过程进行分析,并给出源代码的编写过程,对于代码本身可能还有其他的编码方式,也希望高人无私共享,共同学习

有兴趣共同学习的欢迎关注个人公众账号"学而立行“”

本文模型及代码将在【运筹优化与地理信息】公众号付费发布,如不愿意付费,可移步B站同名帐号,观看手敲代码及演示视频

运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)相关推荐

  1. 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题(总成本最低)【含Matlab源码 2590期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  2. 【TWVRP】基于matlab模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  3. 【TWVRP】基于matlab蚁群算法求解带时间窗的车辆路径规划(成本最低)【含Matlab源码 2514期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  4. 【TWVRP】基于matlab模拟退火算法结合狼群算法求解带时间窗的车辆路径规划问题【含Matlab源码 1075期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  5. 【TWVRP】基于matlab鲸鱼算法求解带时间窗开放式车辆路径问题【含Matlab源码 1986期】

    ⛄一.鲸鱼算法简介 鲸鱼优化算法(Whale Optimization Algorithm,WOA)是澳大利亚学者Mirjalili等根据座头鲸的狩猎方式提出的一种新的群智能优化算法.鲸鱼在大海中随机 ...

  6. 惩罚函数外点matlab,禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版 附MATLAB代码)...

    本周应小伙伴要求继续学习TS求VRPTW,不过这次通过使用惩罚约束的形式允许解违反时间窗约束和容量约束,不过要给违反约束的解加以惩罚. 这次我们的目标函数就不单单只有车辆总行驶距离了,还要包括当前解中 ...

  7. 转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

  8. 0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题...

    蚁群算法求解VRPTW问题https://www.zhihu.com/video/1235315908018298880 今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题. ...

  9. java随机数时间窗_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题

    今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题.在讲解蚁群算法求解VRPTW问题之前,不知道各位是否观察过现实生活中蚂蚁是怎么觅食的,说得形象一点的话就是成群的蚂蚁前赴后 ...

最新文章

  1. 正确地使用投影仪和移动硬盘
  2. 原理简介_消息通信的利器MQTT协议简介及协议原理
  3. Qt控件大小自适应电脑分辨率问题
  4. windows2003配置
  5. 2.移植uboot-添加2440单板,并实现NOR、NAND启动
  6. python 拟合分布_如何使用python将weibull分布拟合到数据?
  7. 万万字详解自动驾驶、车路协同中的高精度地图
  8. HTML 有序列表 字母,HTML之有序列表教程
  9. 怎么让面试官喜欢你?
  10. 软件工程导论第六版 第一章 软件工程学概述知识点总结(上)
  11. 下载 | mqtt4aliyun 阿里云 IoT 物联网 设备模拟器 Mac , Windows版本
  12. ant Design 中使用 :globa
  13. 《Android开发从零开始》——3.第一个Android程序
  14. html mako
  15. Windows下开启Mysql慢查询详解
  16. jQuery仿QQ空间图片查看特效(全屏,放大,缩小,旋转,镜像,鼠标滚轮缩放)
  17. SQLServer常用快捷键汇总
  18. 想知道香港汇丰银行如何开户吗?
  19. Unity3D GPU Instancing测试
  20. 60GHz通信标准简介

热门文章

  1. 10个快速优化Web性能的手段
  2. 干货大总结!链报时空梭区块链高峰论坛圆满落幕
  3. APK TOOL配置教程
  4. AdaBoost学习笔记+公示推导(思维导图版)
  5. HTTP 常用响应状态码记录
  6. java redis 批量删除_在Spring中使用Redis Lua脚本批量删除缓存
  7. PHP 学生信息管理系统mysql数据库web结构apache计算机软件工程网页wamp
  8. 一篇入门深度学习OCR:数据集和算法合集
  9. SpringBoot项目集成字体工具类
  10. Python制作微信自动回复机器人