ortools 中CP_SAT求解器部分函数

ortools官方文档–cp_sat求解器函数接口文件
注:CP-SAT 求解器仅限于整数变量

方法描述
Add(self, ct)ct为线性约束表达式,添加线性约束如:model.Add(x + 2 * y -1 >= z)
OnlyEnforceIf(self, boolvar)boolvar决定了约束是否有效,boolvar为一个值或一个bool列表
AddAbsEquality(self, target, var)target == Abs(var)
AddAllDifferent(self, variables)此约束强制所有变量具有不同的值
AddAllowedAssignments(self, variables, tuples_list)此处变量为一组列表,该约束为指定该组变量的值来源于tuple_lists
AddDivisionEquality(self, target, num, denom)target == num // denom
AddElement(self, index, variables, target)variables[index] == target
AddLinearConstraint(self, linear_expr, lb, ub)添加约束:lb <= linear_expr <= ub
AddMaxEquality(self, target, variables)target == Max(variables)
AddMinEquality(self, target, variables)target == Min(variables)
AddModuloEquality(self, target, var, mod)target = var % mod
AddMultiplicationEquality(self, target, variables)target == variables[0] * … * variables[n]
AddNoOverlap2D(self, x_intervals, y_intervals)NoOverlap2D 约束确保所有当前矩形不会在平面上重叠。每个矩形都与 X 和 Y 轴对齐,并由两个间隔定义,代表其在 X 和 Y 轴上的投影。
Maximize(self, obj)将模型的目标设置为最大化(obj)
Minimize(self, obj)将模型的目标设置为最小化(obj)
NewIntervalVar(self, start, size, end, name)从开始、大小和结束创建一个区间变量
ObjectiveValue(self)求解后返回目标值。
from ortools.sat.python import cp_model


def SimpleSatProgram():
    """Minimal CP-SAT example to showcase calling the solver."""
    # Creates the model.
    model = cp_model.CpModel()

    # Creates the variables.
    num_vals = 3
    x = model.NewIntVar(0, num_vals - 1, 'x')
    y = model.NewIntVar(0, num_vals - 1, 'y')
    z = model.NewIntVar(0, num_vals - 1, 'z')

    # Creates the constraints.
    model.Add(x != y)

    # Creates a solver and solves the model.
    solver = cp_model.CpSolver()
    status = solver.Solve(model)

    if status == cp_model.OPTIMAL:
        print('x = %i' % solver.Value(x))
        print('y = %i' % solver.Value(y))
        print('z = %i' % solver.Value(z))


SimpleSatProgram()
<think>嗯,用户现在想了解的是OR-Tools中的CP-SAT求解器的主要函数。之前已经问过OR-Tools里的求解器有哪些,现在具体到CP-SAT了。我需要详细介绍一下它的主要函数,但用户可能不太清楚具体有哪些类或者方法,所以得结构清晰一点。 首先,CP-SAT求解器主要用于约束规划和整数规划,用户可能需要知道如何建立模型,定义变量,添加约束,设置目标函数,然后求解。所以应该分步骤来介绍,比如模型初始化、变量创建、约束添加、目标设置、求解和结果输出这几个部分。 记得要提到关键函数,比如CpModel()类,NewIntVar,NewBoolVar,AddLinearConstraint,AddAllDifferent,AddBoolOr等。还有求解器部分,比如CpSolver(),Solve方法,以及如何获取变量值,状态信息等。 用户可能是开发者或者研究人员,需要实际应用这些函数来解决问题,所以例子可能对理解有帮助。但用户没有要求代码示例,可能只需要函数的功能说明,所以应该简明扼要地解释每个函数的作用和使用场景。 另外,可能需要提到一些高级功能,比如时间限制、搜索策略、回调函数等,这些对优化求解过程很重要。但要根据用户的问题来决定是否深入,当前问题主要问的是主要函数,所以可能需要简要提及。 注意用户之前的问题是关于OR-Tools中的求解器,现在细化到CP-SAT,说明他们可能已经开始使用这个工具,需要更深入的技术细节。要确保信息准确,并且覆盖常用的函数,避免遗漏关键部分。 最后,总结一下各个部分,帮助用户快速找到所需函数,并建议查阅官方文档,这样用户如果有进一步的问题可以自行查找资源。</think>Google OR-Tools 中的 **CP-SAT 求解器**(Constraint Programming and Satisfiability Solver)是一个专门用于处理 **整数规划**、**布尔逻辑约束**和**复杂组合优化问题**的高效工具。以下是其核心函数及其功能的详细介绍,按照建模、求解、结果解析的流程分类: --- ### **1. 模型初始化** - **`model = cp_model.CpModel()`** 创建一个新的约束编程模型容器,所有变量和约束需添加到该模型中。 --- ### **2. 变量定义** #### **整数变量** - **`model.NewIntVar(lb, ub, name)`** 定义整数变量,指定取值范围 `[lb, ub]`(例如:`x = model.NewIntVar(0, 10, 'x')`)。 - **`model.NewIntVarFromDomain(domain, name)`** 通过自定义离散域定义变量(例如:允许的值为 {1, 3, 5})。 #### **布尔变量** - **`model.NewBoolVar(name)`** 定义布尔变量(0 或 1),常用于逻辑条件(如 `b = model.NewBoolVar('b')`)。 --- ### **3. 约束添加** #### **线性约束** - **`model.AddLinearExpressionInDomain(expr, domain)`** 约束线性表达式 `expr` 的值在指定域内(例如:`x + 2y ∈ [5, 10]`)。 - **`model.Add(expr_lb <= expr <= expr_ub)`** 直接添加线性范围约束(例如:`model.Add(3 <= x + 2*y <= 7)`)。 #### **逻辑约束** - **`model.AddBoolOr([vars])`** 要求变量列表中至少一个为 `True`(例如:`model.AddBoolOr([b1, b2, b3])`)。 - **`model.AddBoolAnd([vars])`** 要求所有变量必须为 `True`(例如:`model.AddBoolAnd([b1, b2])`)。 - **`model.AddImplication(a, b)`** 添加逻辑蕴含约束:`a → b`(若 `a` 为 `True`,则 `b` 必须为 `True`)。 #### **全局约束** - **`model.AddAllDifferent(vars)`** 强制所有变量取不同值(例如:用于排班问题中的唯一性约束)。 - **`model.AddCircuit(arcs)`** 定义哈密尔顿回路约束(例如:旅行商问题中的路径闭合性)。 -- ### **4. 目标函数** - **`model.Minimize(expr)`** 设置最小化目标(例如:`model.Minimize(2*x + 3*y)`)。 - **`model.Maximize(expr)`** 设置最大化目标。 --- ### **5. 求解器配置与执行** - **`solver = cp_model.CpSolver()`** 创建求解器实例。 #### **参数配置** - **`solver.parameters.max_time_in_seconds = 60`** 设置求解时间上限(秒)。 - **`solver.parameters.num_search_workers = 4`** 指定并行线程数加速求解。 #### **求解与状态检查** - **`status = solver.Solve(model)`** 执行求解,返回状态码(例如:`cp_model.OPTIMAL`、`cp_model.FEASIBLE`)。 - **`solver.StatusName(status)`** 将状态码转为可读字符串(如 "OPTIMAL")。 --- ### **6. 结果解析** - **`solver.Value(var)`** 获取变量的最优值(例如:`x_val = solver.Value(x)`)。 - **`solver.ObjectiveValue()`** 返回目标函数的最优值。 - **`solver.WallTime()`** 获取实际求解耗时(秒)。 -- ### **7. 高级功能** #### **回调函数** - **`solver = CpSolver()`** **`solution_printer = VarPrinter(...)`** **`solver.SolveWithSolutionCallback(model, solution_printer)`** 实时获取中间解(用于大模型或需要实时监控的场景)。 #### **搜索策略** - **`model.AddDecisionStrategy(vars, cp_model.CHOOSE_FIRST, cp_model.SELECT_MIN_VALUE)`** 自定义变量选择策略(例如:优先选择最小值)。 --- ### **示例代码片段** ```python from ortools.sat.python import cp_model # 初始化模型 model = cp_model.CpModel() # 定义变量 x = model.NewIntVar(0, 10, 'x') y = model.NewIntVar(0, 5, 'y') b = model.NewBoolVar('b') # 添加约束 model.Add(x + 2*y <= 8) model.AddAllDifferent([x, y]) model.AddImplication(b, x == 5) # 若b为True,则x必须为5 # 设置目标 model.Maximize(x + 3*y) # 求解 solver = cp_model.CpSolver() status = solver.Solve(model) # 输出结果 if status == cp_model.OPTIMAL: print(f"x = {solver.Value(x)}, y = {solver.Value(y)}") print(f"目标值 = {solver.ObjectiveValue()}") ``` -- ### **适用场景** - **排班调度**:通过逻辑约束(如 `AddImplication`)定义员工轮班规则。 - **资源分配**:使用整数变量和线性约束优化资源利用率。 - **组合优化**:如装箱问题、路径规划中的 `AddCircuit` 约束。 通过灵活组合这些函数CP-SAT 能够高效解决包含复杂逻辑和离散决策的优化问题。建议参考 [OR-Tools 官方文档](https://developers.google.com/optimization/cp/cp_solver) 获取更多高级用法和示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值