gurobi学习笔记1OR-Tools约束规划(2)输出所有可行解

本文介绍了如何利用OR-Tools中的CpModel和CpSolverSolutionCallback创建VarArraySolutionPrinter类,以获取和打印线性规划模型的所有可行解。通过定义回调接口,解决过程中的每个解都会被逐一输出,包括目标函数值和变量值。

列出多个可行解
方法为定义一个回调接口供Solver使用,方便获取所有的解

# 定义一个类VarArraySolutionPrinter(大意为多可行解,官网命名), 类中命名方法:cp_model.CpSolverSolutionCallback
class VarArraySolutionPrinter(cp_model.CpSolverSolutionCallback):

python使用类(class)来创建对象
class 类名(父类名:成员函数及成员变量),其中父类名可略,默认为object
父类名表示继承这个父类的属性

    #定义函数:命名为self,有variables属性   
    def __init__(self, variables): 

__init__表示类的对象被建立时,马上运行,对对象进行初始化。
在对类对象(class)进行实例化过程中,为防止缺少类中属性等情况发展,希望将类“封装”,解决方法为类内部定义一个def __init__(命名, 属性1,属性2)函数,在执行实例化过程中预先设定好需要哪些属性,同时可以在输入class中不同实例时可以正确地初始化
相当于用先用一段注释占着__init__函数内的位置
定义__init__后,执行实例化的过程须变成命名(属性1, 属性2) 新建的实例包括其参数,传给__init__函数并初始化后,执行它。
def __init__(命名, 属性1,属性2)语句中习惯上J将命名设为self。新建的实例传给self后,就可以在__init__函数内创建并初始化它的属性,一般呈现为 def __init__(self, 属性1,属性2)

    cp_model.CpSolverSolutionCallback.__init__(self)#调用__init__(self)
    self.__variables = variables   #定义selfvariables等于求到的解
    self.__solution_count = 1     #定义solution_count等于1,用于计数结构数

__前单下划线:保护变量,一般只能够被类对象和子类对象内部才能够访问到这些变量,一般情况下外部不得访问,

 def on_solution_callback(self):
        print('可行解第 %i 组' % self.__solution_count)
        print('目标函
在 Java 中使用 Google OR-Tools 进行路径规划,可以通过调用其提供的路由库(Routing Library)实现。该库专门用于决车辆路径规划问题(Vehicle Routing Problem, VRP),包括旅行商问题(TSP)、带容量约束的路径问题(CVRP)等。以下是一个基本的调用示例,展示如何使用 OR-Tools 在 Java 中构建并求一个简单的路径规划问题。 ### 添加 OR-Tools 依赖 首先,在 `pom.xml` 文件中添加 OR-Tools 的 Maven 依赖: ```xml <dependency> <groupId>com.google.ortools</groupId> <artifactId>ortools-java</artifactId> <version>9.7.2996</version> <!-- 请根据最新版本调整 --> </dependency> ``` ### Java 调用示例 以下是一个简单的路径规划问题的 Java 实现: ```java import com.google.ortools.Loader; import com.google.orts.Route; import com.google.ortools.algorithms.KnapsackSolver; import com.google.ortools.constraintsolver.Assignment; import com.google.ortools.constraintsolver.RoutingIndexManager; import com.google.ortools.constraintsolver.RoutingModel; import com.google.ortools.constraintsolver.FirstSolutionStrategy; import com.google.ortools.constraintsolver.Solver; public class PathPlanningExample { private static final Logger logger = Logger.getLogger(PathPlanningExample.class.getName()); public static void main(String[] args) { Loader.loadNativeLibraries(); // 定义城市数量和车辆数量 final int CITY_COUNT = 5; final int VEHICLE_COUNT = 1; final int START_INDEX = 0; // 定义距离矩阵 final int[][] distanceMatrix = { {0, 10, 15, 20, 5}, {10, 0, 35, 25, 30}, {15, 35, 0, 30, 10}, {20, 25, 30, 0, 15}, {5, 30, 10, 15, 0} }; // 创建索引管理器 RoutingIndexManager manager = new RoutingIndexManager(CITY_COUNT, VEHICLE_COUNT, START_INDEX); // 创建路由模型 RoutingModel routing = new RoutingModel(manager); // 定义回调函数,返回两个节点之间的距离 routing.setArcCostEvaluatorOfAllVehicles((long fromIndex, long toIndex) -> { int fromNode = manager.indexToNode(fromIndex); int toNode = manager.indexToNode(toIndex); return distanceMatrix[fromNode][toNode]; }, 0); // 设置求策略 FirstSolutionStrategy.Builder strategy = FirstSolutionStrategy.newBuilder() .setStrategyName("PathCheapestArc"); routing.getMutableSearchParameters().setFirstSolutionStrategy(strategy.build()); // 求问题 Assignment solution = routing.solve(); // 输出结果 if (solution != null) { long routeDistance = 0; for (int vehicle = 0; vehicle < VEHICLE_COUNT; ++vehicle) { long index = routing.start(vehicle); logger.info("Route for Vehicle " + vehicle + ":"); StringBuilder route = new StringBuilder(); while (!routing.isEnd(index)) { route.append(manager.indexToNode(index)).append(" -> "); index = solution.value(routing.nextVar(index)); } route.append(manager.indexToNode(index)); logger.info(route.toString()); routeDistance += routing.getArcCostEvaluator().apply(routing.getRoute(vehicle)); } logger.info("Total Distance: " + routeDistance); } else { logger.warning("No solution found."); } } } ``` ### 示例说明 - **RoutingIndexManager**:用于管理节点索引,将内部索引映射到用户定义的节点标识。 - **RoutingModel**:构建路径规划模型,定义车辆路径问题的约束条件。 - **setArcCostEvaluatorOfAllVehicles**:设置路径成本计算方式,通常基于距离矩阵。 - **FirstSolutionStrategy**:定义初始的构建策略,例如使用“PathCheapestArc”来选择最短路径。 ### 拓展功能 - 可以添加时间窗约束(Time Windows)以实现更复杂的路径规划- 支持多车辆路径规划,通过调整 `VEHICLE_COUNT` 和起点设置。 - 可以集成求器如 Gurobi 或 SCIP,以提高求效率[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值