首页 > 其他分享 >[Jsprit]Jsprit学习笔记-一个简单的示例

[Jsprit]Jsprit学习笔记-一个简单的示例

时间:2024-08-27 17:52:01浏览次数:8  
标签:Service 示例 newInstance 解决方案 Builder 笔记 build Jsprit vehicle

学习官网提供的例子
示例代码

public class SimpleExample {

    public static void main(String[] args) {
        /*
         * some preparation - create output folder
		 */
        File dir = new File("output");
        // if the directory does not exist, create it
        if (!dir.exists()) {
            System.out.println("creating directory ./output");
            boolean result = dir.mkdir();
            if (result) System.out.println("./output created");
        }
		/*
         * get a vehicle type-builder and build a type with the typeId "vehicleType" and one capacity dimension, i.e. weight, and capacity dimension value of 2
		 */
        final int WEIGHT_INDEX = 0;
        VehicleTypeImpl.Builder vehicleTypeBuilder = VehicleTypeImpl.Builder.newInstance("vehicleType").addCapacityDimension(WEIGHT_INDEX, 2);
        VehicleType vehicleType = vehicleTypeBuilder.build();

		/*
         * get a vehicle-builder and build a vehicle located at (10,10) with type "vehicleType"
		 */
        Builder vehicleBuilder = VehicleImpl.Builder.newInstance("vehicle");
        vehicleBuilder.setStartLocation(Location.newInstance(10, 10));
        vehicleBuilder.setType(vehicleType);
        VehicleImpl vehicle = vehicleBuilder.build();

		/*
         * build services at the required locations, each with a capacity-demand of 1.
		 */
        Service service1 = Service.Builder.newInstance("1").addSizeDimension(WEIGHT_INDEX, 1).setLocation(Location.newInstance(5, 7)).build();
        Service service2 = Service.Builder.newInstance("2").addSizeDimension(WEIGHT_INDEX, 1).setLocation(Location.newInstance(5, 13)).build();

        Service service3 = Service.Builder.newInstance("3").addSizeDimension(WEIGHT_INDEX, 1).setLocation(Location.newInstance(15, 7)).build();
        Service service4 = Service.Builder.newInstance("4").addSizeDimension(WEIGHT_INDEX, 1).setLocation(Location.newInstance(15, 13)).build();


        VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
        vrpBuilder.addVehicle(vehicle);
        vrpBuilder.addJob(service1).addJob(service2).addJob(service3).addJob(service4);

        VehicleRoutingProblem problem = vrpBuilder.build();

		/*
         * get the algorithm out-of-the-box.
		 */
        VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(problem);

		/*
         * and search a solution
		 */
        Collection<VehicleRoutingProblemSolution> solutions = algorithm.searchSolutions();

		/*
         * get the best
		 */
        VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions);

        new VrpXMLWriter(problem, solutions).write("output/problem-with-solution.xml");

        SolutionPrinter.print(problem, bestSolution, SolutionPrinter.Print.VERBOSE);

		/*
         * plot
		 */
        new Plotter(problem,bestSolution).plot("output/plot.png","simple example");

        /*
        render problem and solution with GraphStream
         */
        new GraphStreamViewer(problem, bestSolution).labelWith(Label.ID).setRenderDelay(200).display();
    }

}

代码解读
这段代码是一个 Java 程序,它演示了如何使用 Jsprit 库来解决一个简单的车辆路径问题(VRP)。以下是程序的主要步骤:

  1. 创建输出目录:如果不存在 output 目录,则创建它。

  2. 定义车辆类型:创建一个具有特定类型标识 "vehicleType" 和一个容量维度(重量)为 2 的车辆类型。

  3. 定义车辆:创建一个位于坐标 (10,10) 的车辆,使用上面定义的车辆类型。

  4. 定义服务:创建四个服务(客户地点),每个服务都有一个容量需求为 1。

  5. 构建问题实例:使用 VehicleRoutingProblem.Builder 构建 VRP 实例,将车辆和服务添加到问题中。

  6. 选择算法:使用 Jsprit 提供的默认算法来搜索解决方案。

  7. 搜索解决方案:运行算法并获取一系列解决方案。

  8. 选择最佳解决方案:从搜索到的解决方案中选择最佳(成本最低)的解决方案。

  9. 输出问题和解决方案:使用 VrpXMLWriter 将问题和解决方案写入 XML 文件。

  10. 打印解决方案详情:使用 SolutionPrinter 打印最佳解决方案的详细信息。

  11. 绘制解决方案:使用 Plotter 绘制解决方案的图形表示,并保存到文件。

  12. 使用 GraphStream 可视化:使用 GraphStreamViewer 显示问题和解决方案的动态可视化。

以下是代码中关键类的简要说明:

  • VehicleTypeImpl:车辆类型的实现。
  • VehicleImpl:车辆的实现。
  • Service:服务或客户请求的实现。
  • VehicleRoutingProblem.Builder:构建 VRP 问题的构建器。
  • VehicleRoutingAlgorithm:用于搜索 VRP 问题解决方案的算法。
  • Solutions:提供解决方案工具方法的类。
  • VrpXMLWriter:用于将 VRP 问题和解决方案写入 XML 文件的工具。
  • SolutionPrinter:用于打印解决方案的类。
  • Plotter:用于绘制解决方案的图形表示的类。
  • GraphStreamViewer:用于动态显示问题和解决方案的 GraphStream 可视化工具。

这个示例程序提供了一个基本的框架,展示了如何使用 Jsprit 解决 VRP 问题,并提供了一些基本的可视化和输出选项。
核心部分
1、创建车辆类型

VehicleTypeImpl.Builder vehicleTypeBuilder = VehicleTypeImpl.Builder.newInstance("vehicleType").addCapacityDimension(0, 2);
VehicleType vehicleType = vehicleTypeBuilder.build();

2、创建1个车辆

Builder vehicleBuilder = VehicleImpl.Builder.newInstance("vehicle");
vehicleBuilder.setStartLocation(Location.newInstance(10, 10));
vehicleBuilder.setType(vehicleType);
VehicleImpl vehicle = vehicleBuilder.build();

3、创建多辆车

        int nuOfVehicles = 4;
        int capacity = 80;
        Coordinate firstDepotCoord = Coordinate.newInstance(20, 20);
        Coordinate second = Coordinate.newInstance(30, 40);
        Coordinate third = Coordinate.newInstance(50, 30);
        Coordinate fourth = Coordinate.newInstance(60, 50);

        int depotCounter = 1;
        for (Coordinate depotCoord : Arrays.asList(firstDepotCoord, second, third, fourth)) {
            for (int i = 0; i < nuOfVehicles; i++) {
                VehicleTypeImpl vehicleType = VehicleTypeImpl.Builder.newInstance(depotCounter + "_type").addCapacityDimension(0, capacity).setCostPerDistance(1.0).build();
                VehicleImpl vehicle = VehicleImpl.Builder.newInstance(depotCounter + "_" + (i + 1) + "_vehicle").setStartLocation(Location.newInstance(depotCoord.getX(), depotCoord.getY())).setType(vehicleType).build();
                vrpBuilder.addVehicle(vehicle);
            }
            depotCounter++;
        }
 }

4、创建1个服务的对象

 Service service1 = Service.Builder.newInstance("1").addSizeDimension(WEIGHT_INDEX, 1).setLocation(Location.newInstance(5, 7)).build();

5、创建多个服务对象

vrpBuilder.addJob(Service.Builder.newInstance("1").addSizeDimension(0, 18).setLocation(Location.newInstance(22, 22)).build());
vrpBuilder.addJob(Service.Builder.newInstance("2").addSizeDimension(0, 26).setLocation(Location.newInstance(36, 26)).build());

6、封装vrp问题

VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
vrpBuilder.addVehicle(vehicle);
vrpBuilder.addJob(service1).addJob(service2).addJob(service3).addJob(service4);

VehicleRoutingProblem problem = vrpBuilder.build();

7、选择算法

VehicleRoutingAlgorithm algorithm = Jsprit.createAlgorithm(problem);

8、算法求解

		/*
         * and search a solution
		 */
        Collection<VehicleRoutingProblemSolution> solutions = algorithm.searchSolutions();

		/*
         * get the best
		 */
        VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(solutions);

标签:Service,示例,newInstance,解决方案,Builder,笔记,build,Jsprit,vehicle
From: https://blog.csdn.net/ywf008/article/details/141604842

相关文章

  • 给自己复盘用的tjxt笔记day10
    领取优惠券开发流程页面原型分析,接口统计,数据库设计,生成代码,引入枚举状态接口开发查询发放中的优惠券根据页面原型和接口分析和前端设计的要求,获得四要素@OverridepublicList<CouponVO>queryIssuingCoupons(){//1.查询发放中的优惠券列表List<Coupon>......
  • 周志华机器学习西瓜书学习笔记(一)| 第一章 绪论
    1.引言    机器学习(machinelearning,ML)是一门研究如何通过计算的手段,利用经验来改善系统自身性能的学科。由于在计算机系统中,“经验”通常以数据形式储存,因此,机器学习研究的主要内容,是关于在计算机上从数据中产生模型(model)的算法,称作“学习算法”*(learningalgorith......
  • QT学习笔记1
    夹竹桃掉落在青草上,是刚刚醒来的风车,静止多年的水,轻轻晃动成冰。QWidget类是QMainwindow类和QDialog类的父类,它是一个空窗口。QMainWindow是一个主窗口程序的类,它会提供一个预定义的布局,在这个预定义的布局中包含:一个菜单栏、多个工具栏、多个浮动窗口(铆接部件)、一个状态栏、......
  • QT学习笔记2(QPushButton类、对象树、信号与槽,Lambdabiao表达式)
    那些难过的日子,都一起陪伴,也不说些什么大道理。难过的时候,所有人都给你讲一堆大道理。只有你的好朋友,懂你的沉默,陪你一起在墙角蹲着。对象树QT中创建QObject对象会时,构造函数会接收一个Parent父对象指针作为参数。这就于相当于创建QObject对象时,可以提供一个父类,创建的Q......
  • Datawhale X 李宏毅苹果书(进阶) AI夏令营 task01笔记
    官方学习文档:https://linklearner.com/activity/16/14/42目录深度学习基础局部极小值与鞍点临界点及其种类判断临界值种类的方法逃离鞍点的方法批量和动量批量大小对梯度下降法的影响大的批量跟小的批量的对比        动量法深度学习基础       ......
  • python入门笔记 1.环境配置
    1.python编译器下载https://www.python.org/downloads/windows/下载3.10版本的python,因为3.13还在prerelease,3.12和3.11在bugfix,担心有稳定性问题。负责代码的执行,并且有python的一些基础包,比如os。可以进行一些基础功能,就好像游戏的本体。有游戏的基本玩法,后续可以通过买dlc......
  • CANopen学习笔记(二)通讯对象PDO和SDO等
    通讯对象PDO我的观点:一个CANopen设备可以拥有最多512个RPDO和512个TPDO,总共最多1024个PDO。(得到GPT4o的肯定)CiA协议栈观点:一个只有一个逻辑设备的CANopen设备最多有512个PDO。PDO的两种用法:TPDO:生产者PDORPDO:消费者PDO特点小而快传输模式同步传......
  • qt 串口学习笔记
    qt6.7串口通信在Qt6.7中进行串口通信,主要依赖于QtSerialPort模块。QtSerialPort模块提供了一套方便的API,用于访问串口。下面是如何在Qt6.7项目中使用串口通信的基本步骤:1. 添加 QtSerialPort 模块首先,确保在你的Qt项目中包含了QtSerialPort模块......
  • CANopen学习笔记(三)NMT
    NMTNMT主要用来管理和控制各个节点的状态,具体协议可以分为以下四类:NMTprotocolNodeguardprotocolHeartbeatprotocolBootupprotocolNMTprotocol该协议是CANopen中网络管理的协议,控制和管理节点的状态,通过发送相关报文,可以让目标节点进入特定的工作状态。工作状态有......
  • CANopen学习笔记(总)
    CANOpen定位:小网络,控制信号的实时通讯​ 确保实时性采取的措施ID域:11bit(CAN标准帧格式)控制报文采用数据最小字节数采用生产消费模型(数据无需应答)需要应答时,采用快速单字传输(一个报文最多传输一个32字节参数变量)一、协议分类主从协议一对多无应答模式和应答......