问题定义

车辆路线规划问题是一个经典的组合优化问题,也是旅行商问题的泛化。该问题的定义为:

  • 有给定数量的客户有运输需求;
  • 为从某个固定地点出发和返回的车辆寻找一个最优路线试的可以服务所有的客户
    车辆路线规划问题是NP-hard问题,一般建议求最优解的近似解。

车辆路线规划问题有很多变种,主要包含 Classical VRP(VRP)、 Capacitated Vehicle Routing Problem (CVRP)、 Vehicle Routing Problem with Time Windows (VRPTW)、 Vehicle Routing Problem with Pick-Up and Delivery (VRPPD)等。现实生活中VRP模型用处较少,其它都很常见;CVRP对应配送中心对配送站点的送货,VRPTW则面向客户的送货,如外卖;VRPPD对应取货和送货,如京东快递即可以送快递又可以取快递。

本本主要套餐CVRP,其定义如下:

令G =(V,A)表示一个有向图,其中V是顶点集,而A是弧集。一个顶点表示 m个容量为Q的相同车辆组成的车队所在的仓库,其它顶点表示要服务的客户。每个客户顶点vi与需求qi关联。每个弧(vi,vj)通过A与耗费成本cij相关联。每个客户包含一个就绪时间,一个过期时间。 CVRPTW目标是找到一系列路线,以便:

  • 每条路线以仓库为起始点;
  • 每个用户仅被服务一次;
  • 每条路线的需求量不超过Q;
  • 所有路线总消耗成本最小;
  • 客户在就绪时间和过期时间之间被服务;

VRPTW问题描述

C101(测试用例名称)

VEHICLE(车辆信息)
NUMBER CAPACITY
25(辆) 200(每辆车最大负载)

CUSTOMER(用户信息)
用户号 位置X坐标 位置Y坐标 需求 用户就绪时间 截止时间 服务时间
CUST NO. XCOORD. YCOORD. DEMAND READY TIME DUE DATE SERVICE TIME

0      40         50          0          0       1236          0
1      45         68         10        912        967         90
2      45         70         30        825        870         90
3      42         66         10         65        146         90
4      42         68         10        727        782         90
5      42         65         10         15         67         90
6      40         69         20        621        702         90
7      40         66         20        170        225         90
8      38         68         20        255        324         90
9      38         70         10        534        605         90
10      35         66         10        357        410         90
11      35         69         10        448        505         90
12      25         85         20        652        721         90
13      22         75         30         30         92         90
14      22         85         10        567        620         90
15      20         80         40        384        429         90
16      20         85         40        475        528         90
17      18         75         20         99        148         90
18      15         75         20        179        254         90
19      15         80         10        278        345         90
20      30         50         10         10         73         90
21      30         52         20        914        965         90
22      28         52         20        812        883         90
23      28         55         10        732        777         90
24      25         50         10         65        144         90
25      25         52         40        169        224         90

通过Optaoplanner求解获取的结果类似如下样式:Vechicle i(包含仓库坐标) -> Customer 1 -> Customeri -> Vechicle i(包含仓库坐标),排线后获取结果类似如下:
A-n32-k5
Vehicle 1: 1(0)->13(21)->2(19)->17(18)->31(14)->1(0) totalDemand = 72.0
Vehicle 2: 1(0)->28(20)->25(24)->1(0) totalDemand = 44.0
Vehicle 3: 1(0)->22(12)->32(9)->20(24)->18(19)->14(16)->8(16)->27(2)->1(0) totalDemand = 98.0
Vehicle 4: 1(0)->7(12)->4(6)->3(21)->24(8)->5(19)->12(14)->29(15)->15(3)->1(0) totalDemand = 98.0
Vehicle 5: 1(0)->21(8)->6(7)->26(24)->11(8)->30(2)->16(22)->23(4)->10(16)->9(6)->19(1)->1(0) totalDemand = 98.0
最优解: 787.08

Vehicle 1(仓库) -> 13(21) -> 2(19) -> 17(18) -> 31(14) -> Vehicle 1(仓库) totalDemand = 72.0

VRPTW问题简单方式计算得分算法源码

VehicleRoutingEasyScoreCalculator分析

    @Overridepublic HardSoftLongScore calculateScore(VehicleRoutingSolution solution) {boolean timeWindowed = solution instanceof TimeWindowedVehicleRoutingSolution;List<Customer> customerList = solution.getCustomerList();List<Vehicle> vehicleList = solution.getVehicleList();Map<Vehicle, Integer> vehicleDemandMap = new HashMap<>(vehicleList.size());for (Vehicle vehicle : vehicleList) {vehicleDemandMap.put(vehicle, 0);}long hardScore = 0L;long softScore = 0L;for (Customer customer : customerList) {// Entity(Customer)的planningVariable(Customer  or  Vehivle),计算当前用户和前驱节点之间的距离(前驱可以是车,可以是人,车必须在列表第一个)Standstill previousStandstill = customer.getPreviousStandstill();if (previousStandstill != null) {// 每个Entity分配一辆VehicleVehicle vehicle = customer.getVehicle();// 以车辆为单位计算每辆车的总载荷vehicleDemandMap.put(vehicle, vehicleDemandMap.get(vehicle) + customer.getDemand());// 计算当前节点和前驱节点之间的距离// Score constraint distanceToPreviousStandstillsoftScore -= customer.getDistanceFromPreviousStandstill();if (customer.getNextCustomer() == null) {// Score constraint distanceFromLastCustomerToDepot// 如果这个客户是最后一个被服务的客户,还要计算当前客户与仓库(车辆包含仓库信息)之间的距离(软限制,越大越好)softScore -= customer.getLocation().getDistanceTo(vehicle.getLocation());}if (timeWindowed) {// 如果是VRPTW问题,则需要计算车辆arrivalTime是否打破了用户的dueTime时间限制(强限制,越大越好)TimeWindowedCustomer timeWindowedCustomer = (TimeWindowedCustomer) customer;long dueTime = timeWindowedCustomer.getDueTime();Long arrivalTime = timeWindowedCustomer.getArrivalTime();if (dueTime < arrivalTime) {// Score constraint arrivalAfterDueTimehardScore -= (arrivalTime - dueTime);}}}}// 计算每个车辆的是否打破容量限制(强限制,越大越好)for (Map.Entry<Vehicle, Integer> entry : vehicleDemandMap.entrySet()) {int capacity = entry.getKey().getCapacity();int demand = entry.getValue();if (demand > capacity) {// Score constraint vehicleCapacityhardScore -= (demand - capacity);}}// Score constraint arrivalAfterDueTimeAtDepot is a built-in hard constraint in VehicleRoutingImporterreturn HardSoftLongScore.valueOf(hardScore, softScore);}

OptaPlanner源码学习-VRPTW问题计算得分相关推荐

  1. jieba源码学习------TF-IDF方法 计算词权重

    # encoding=utf-8 from __future__ import absolute_import import os import jieba import jieba.posseg f ...

  2. caffe源码学习:softmaxWithLoss前向计算

    caffe源码学习:softmaxWithLoss 在caffe中softmaxwithLoss是由两部分组成,softmax+Loss组成,其实主要就是为了caffe框架的可扩展性. 表达式(1)是 ...

  3. LambdaMART简介——基于Ranklib源码(一 lambda计算)

     LambdaMART简介--基于Ranklib源码(一 lambda计算) 时间:2014-08-09 21:01:49      阅读:168      评论:0      收藏:0      ...

  4. Simple-Faster-RCNN源码学习笔记

    Simple-Faster-RCNN 源码学习 项目github地址: https://github.com/chenyuntc/simple-faster-rcnn-pytorch 源码 源文件: ...

  5. ERNIE源码学习与实践:为超越ChatGPT打下技术基础!

    ★★★ 本文源自AlStudio社区精品项目,[点击此处]查看更多精品内容 >>> ERNIE学习与实践:为超越ChatGPT打下技术基础! ERNIE是BERT相爱相杀的好基友,由 ...

  6. 文心ERNIE源码学习与实践:为超越ChatGPT打下技术基础!

    ERNIE学习与实践:为超越ChatGPT打下技术基础! ERNIE是BERT相爱相杀的好基友,由ERNIE发展起来的文心大模型,是GPT3.0的强劲竞争对手,未来还会挑战ChatGPT的江湖地位! ...

  7. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  8. Java 源码学习系列(三)——Integer

    Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还 ...

  9. 以太坊源码学习 -- EVM

    以太坊源码学习 – EVM 学习文档链接:here 一.虚拟机外 主要功能: 执行前将Transaction类型转化成Message,创建虚拟机(EVM)对象,计算一些Gas消耗,以及执行交易完毕后创 ...

最新文章

  1. 若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2
  2. Windows环境下spyder调用Arcpy
  3. linux文件查找工具,分享|Linux 中一种友好的 find 替代工具
  4. python九九乘法表矩形_python实现九九乘法表
  5. K-Means聚类算法的原理及实现
  6. 【文献学习】强化学习1:基于值函数的方法
  7. Linux下安装amsn
  8. Sphinx安装与基本设置
  9. 代理商为何要卖增值业务?
  10. oop思想php,避免OOP的形式,POP的思想
  11. PayPal完成对区块链公司的投资首秀
  12. C# 静态函数调用窗体控件
  13. 单元测试@Test+@RunWith(SpringRunner.class)
  14. c语言课程设计报告停车系统,停车场管理系统C语言课程设计
  15. 【CSS3动画】利用CSS3制作“百度浏览器”官网奔跑的北极熊效果(不含背景移动)
  16. html 体温单源码,体温单 三色单
  17. 比较山海鲸数据可视化和Data MAX,谁赢了?
  18. javascript面向对象——Math对象
  19. 需要使用电话外呼系统的行业都有哪些?好处何在?
  20. 查询学生信息表班级的平均成绩

热门文章

  1. Team30 第四次作业-四象限法分析项目
  2. flv如何转换成mp4格式?
  3. 【docker-compose】一键部署WordPress博客
  4. 试图5天学会python——Mooc 实例
  5. mysql数据库文件移机_MySQL简易备份方法
  6. STM32G070RBT6基于Arduino框架下串口数据接收使用示例
  7. cdsn怎么查看我的关注(我关注过谁)
  8. 江苏python二级考试时间,江苏2021年3月计算机二级考试报名时间安排
  9. python计算机二级考试时间
  10. Mac 版Android studio 分配内存设置方法