OR-Tools CP-SAT 用法示例源码详解
文章目录
- OR-Tools CP-SAT 用法示例源码详解
- CP-SAT 简介
- 求解器变量
- 常用求解器约束
- 拓展方法速览
- 拓展方法详解
-
- 构造函数
- CpModel构造函数详细说明
- 新建变量
- 约束
-
-
- addBoolOr方法
- addBoolOr方法
- addAtLeastOne方法
- addAtLeastOne方法
- addAtMostOne方法
- addAtMostOne方法
- addExactlyOne方法
- addExactlyOne方法
- addBoolAnd方法
- addBoolAnd方法
- addBoolXor方法
- addBoolXor方法
- addImplication方法
- addLinearExpressionInDomain方法
- addLinearConstraint方法
- addEquality方法
- addEquality方法
- addLessOrEqual方法
- addLessOrEqual方法
- addLessThan方法
- addLessThan方法
- addGreaterOrEqual方法
- addGreaterOrEqual方法
- addGreaterThan方法
- addGreaterThan方法
- addDifferent方法
- addDifferent方法
- addAllDifferent方法
- addAllDifferent方法
- addElement方法
- addElement方法
- addElement方法
- addCircuit方法
- addMultipleCircuit方法
- addAllowedAssignments方法
- addAllowedAssignments方法
- addForbiddenAssignments方法
- addForbiddenAssignments方法
- addAutomaton方法
- addInverse方法
- addReservoirConstraint方法
- addMapDomain方法
- addMinEquality方法
- addMinEquality方法
- addMaxEquality方法
- addMaxEquality方法
- addDivisionEquality方法
- addAbsEquality方法
- addModuloEquality方法
- addModuloEquality方法
- addMultiplicationEquality方法
- addMultiplicationEquality方法
-
- 区间变量和约束
-
-
- newIntervalVar方法
- newFixedSizeIntervalVar方法
- newFixedInterval方法
- newOptionalIntervalVar方法
- newOptionalFixedSizeIntervalVar方法
- newOptionalFixedInterval方法
- addNoOverlap方法
- addNoOverlap方法
- addNoOverlap2D方法
- addCumulative方法
- addCumulative方法
- addHint方法
- clearHints方法
- addAssumption方法
- addAssumptions方法
- clearAssumptions方法
-
- 优化目标
- 拓展搜索最优解
- 拓展中文源码分析
- 参考链接
最近笔者一直在从事整数规划方面的排程编程,在互联网上收集了很多有意思的技巧与知识想分享一下。首先可以看官网里面有许许多多的例子,感兴趣的朋友可以自己去学习一下,笔者这里不再赘述了。本文笔者根据实战整理的它的全面用法,作为工具文档,看此一篇就够了。希望大家受用
CP-SAT 简介
在or-tools中内置了一些第三方的开源求解器(SCIP, GLPK) 及商用求解器( Gurobi , CPLEX),同时还有google自己的求解器Google’s GLOP以及获得过多项金奖的CP-SAT.
求解器变量
非连续整形变量(Intvar)
# List of values
model.NewIntVarFromDomain(
cp_model.Domain.FromValues([1, 3, 4, 6]), 'x'
)
# List of intervals
model.NewIntVarFromDomain(
cp_model.Domain.FromIntervals([[1, 2], [4, 6]]), 'x'
)
# Exclude [-1, 1]
model.NewIntVarFromDomain(
cp_model.Domain.FromIntervals([[cp_model.INT_MIN, -2], [2, cp_model.INT_MAX]]), 'x'
)
# Constant
model.NewConstant(154)
域区间变量
model.NewIntVarFromDomain
从域区间创建整数变量。
域区间是由区间集合所指定的一组整数。 例如:
model.NewIntVarFromDomain(cp_model.Domain.FromIntervals([[1, 2], [4, 6]]), 'x')
Constant
Constant
表示一个特殊的IntVal,其上界等于其下界所以其IntVal所表示的值也是一个常量。
BoolVar
表示一个特殊的IntVal,其下界为0,上界为1。所以其变量的值只能为 0 或者 1 。
IntervalVar
CP-SAT有一种特殊的区间变量,它可以用来表示时间间隔。通常配合约束AddNoOverLap
与AddCumulative
使用表示区间不能重叠或者区间累计。有两种创建此变量的方式:
model.NewIntervalVar(self, start, size, end, name)
model.NewOptionalIntervalVar(self, start, size, end, is_present, name)
相同的是都需要start
、size
和end
参数表示区间的开始的整型变量、尺寸或者时间的长度和区间的结束的整型变量。
不同的是前者表示创建的区间变量在以后的约束建立中一定生效,而后者的方法签名中有个为is_present的参数表示这个区间变量是否生效。
常用求解器约束
Implications(离散数学里的蕴涵)
Implications方法是一种单向的约束操作:a = b (a,b均为布尔型变量) ,a为True则b也为True,反之则不成立。
其真值表为:
p | q | p-q |
---|---|---|
0 | 1 | 1 |
1 | 1 | 1 |
0 | 0 | 1 |
1 | 0 | 0 |
# a = b (both booleans)
model.AddImplication(a, b)
# a <= b (better remove one of them)
model.Add(a == b)
# a or b or c = d
model.AddImplication(a, d) # model.Add(d == 1).OnlyEnforceIf(a)
model.AddImplication(b, d)
model.AddImplication(c, d)
# a and b and c = d
model.Add(d == 1).OnlyEnforceIf([a, b, c])
or
model.AddBoolOr([a.Not(), b.Not(), c.Not(), d])
Linear Constraints(线性约束)
常用的线性约束有Add,AddLinearConstraint,AddLinearExpressionInDomain等几种:
#布尔数组work的和<=6
model.Add(sum(work[(i)] for i in range(10))<=6)
#布尔数组work的和=2 and <=6
model.AddLinearConstraint(sum(work[(i)] for i in range(10)), 2, 6)
#布尔数组work的和 in [0,2,3,5]
model.AddLinearExpressionInDomain(sum(work[(i)] for i in range(10)) ,[0,2,3,5])
Nonlinear Constraints(非线性约束)
常用的几种非线性约束如:绝对值约束、乘法约束、最大最小值约束
# Adds constraint: target == |var|
model.AddAbsEquality(target, var)
#Adds constraint: target == v1 * v2
model.AddMultiplicationEquality(target, [v1,v2])
#Adds constraint: target == Max(var_arr)
model.AddMaxEquality(target, var_arr)
#Adds constraint: target == Min(var_arr)
model.AddMinEquality(target, var_arr)
遗憾的是:没有一步到位的非线性表达式; 必须建立复杂的使用中间变量逐段地生成数学表达式。
The AllDifferent Constraints(强制所有变量都不相同约束)
#Forces all vars in the array to take on different values
model.AddAddAllDifferent(var_arr)
The Element Constraint(元素约束)
# Adds constraint: target == var_arr[index]
# Useful because index can be a variable
# The var_arr can also contain constants!
model.AddElement(index, var_arr, target)
The Inverse Constraint(逆约束)
# The arrays should have the same size 𝑛 (can’t use dicts)
# The vars in both arrays can only take values from 0 to 𝑛 − 1
# Adds the following constraints:
# If var_arr[i] == j, then inv_arr[j] == i
# If inv_arr[j] == i, then var_arr[i] == j
# Intuition: sets up a “perfect matching” between the two sets of variables
model.AddInverse(var_arr, inv_arr)
使不同的两个列表中的所有元素
NoOverlap Constraint (不重叠约束)
当笔者们创建了一组区间变量以后,有时候笔者们希望区间变量之间的时间间隔不能发生重叠,这时笔者们可以使用AddNoOverlap约束。AddNoOverlap会强制所有的时间间隔变量不发生重叠,不过它们可以使用相同的开始/结束的时间点。
# Note: there is no way to access start, end, duration of an interval by default
# Recommended: directly add them as fields of the interval, e.g.
# interval.start = start
model.AddNoOverlap(interval_arr)
# Powerful constraint: enforces that all intervals in the array do not overlap with each other!
# It’s OK to have shared start/endpoints
AllowedAssignments
Adds AllowedAssignments(variables, tuples_list).
AllowedAssignments
约束是对变量数组的约束,它要求当所有变量都被赋值时,其结果的数组内容等于 tuple_list
中的某一个元组的内容。
拓展方法速览
方法名字 | 方法解释 | 方法签名 |
---|---|---|
addAbsEquality(target, expr) | 添加约束条件 target == Abs(expr) | Constraint addAbsEquality(LinearArgument target, LinearArgument expr) |
addAllDifferent(expressions) | 添加约束条件 AllDifferent(expressions) | Constraint addAllDifferent(java.lang.Iterable<? extends LinearArgument> expressions) |
addAllDifferent(expressions) | 添加约束条件 AllDifferent(expressions) | Constraint addAllDifferent(LinearArgument[] expressions) |
addAllowedAssignments(variables) | 添加约束条件 AllowedAssignments(variables) | TableConstraint addAllowedAssignments(IntVar[] variables) |
addAllowedAssignments(variables) | 添加约束条件 AllowedAssignments(variables) | TableConstraint addAllowedAssignments(java.lang.Iterable variables) |
addAssumption(lit) | 将一个字面量作为假设添加到模型中 | void addAssumption(Literal lit) |
addAssumptions(literals) | 将多个字面量作为假设添加到模型中 | void addAssumptions(Literal[] literals) |
addAtLeastOne(literals) | 同 addBoolOr | Constraint addAtLeastOne(java.lang.Iterable literals) |
addAtLeastOne(literals) | 同 addBoolOr | Constraint addAtLeastOne(Literal[] literals) |
addAtMostOne(literals) | 添加约束条件 AtMostOne(literals) | Constraint addAtMostOne(java.lang.Iterable literals) |
addAtMostOne(literals) | 添加约束条件 AtMostOne(literals) | Constraint addAtMostOne(Literal[] literals) |
addAutomaton(transitionVariables, startingState, finalStates) | 添加自动机约束 | AutomatonConstraint addAutomaton(IntVar[] transitionVariables, long startingState, long[] finalStates) |
addBoolAnd(literals) | 添加约束条件 And(literals) == true | Constraint addBoolAnd(java.lang.Iterable literals) |
addBoolAnd(literals) | 添加约束条件 And(literals) == true | Constraint addBoolAnd(Literal[] literals) |
addBoolOr(literals) | 添加约束条件 Or(literals) == true | Constraint addBoolOr(java.lang.Iterable literals) |
addBoolOr(literals) | 添加约束条件 Or(literals) == true | Constraint addBoolOr(Literal[] literals) |
addBoolXor(literals) | 添加约束条件 XOr(literals) == true | Constraint addBoolXor(java.lang.Iterable literals) |
addBoolXor(literals) | 添加约束条件 XOr(literals) == true | Constraint addBoolXor(Literal[] literals) |
addCircuit() | 添加约束条件 Circuit() | CircuitConstraint addCircuit() |
addCumulative(capacity) | 添加约束条件 Cumulative(capacity) | CumulativeConstraint addCumulative(LinearArgument capacity) |
addCumulative(capacity) | 添加约束条件 Cumulative(capacity) | CumulativeConstraint addCumulative(long capacity) |
addDecisionStrategy(variables, varStr, domStr) | 添加决策策略 | void addDecisionStrategy(IntVar[] variables, DecisionStrategyProto.VariableSelectionStrategy varStr, DecisionStrategyProto.DomainReductionStrategy domStr) |
addDifferent(left, right) | 添加约束条件 left != right | Constraint addDifferent(LinearArgument left, LinearArgument right) |
addDifferent(expr, value) | 添加约束条件 expr != value | Constraint addDifferent(LinearArgument expr, long value) |
addDivisionEquality(target, num, denom) | 添加约束条件 target == num / denom,向0取整 | Constraint addDivisionEquality(LinearArgument target, LinearArgument num, LinearArgument denom) |
addElement(index, values, target) | 添加元素约束条件 values[index] == target | Constraint addElement(IntVar index, int[] values, IntVar target) |
addElement(index, variables, target) | 添加元素约束条件 variables[index] == target | Constraint addElement(IntVar index, IntVar[] variables, IntVar target) |
addElement(index, values, target) | 添加元素约束条件 values[index] == target | Constraint addElement(IntVar index, long[] values, IntVar target) |
addEquality(left, right) | 添加约束条件 left == right | Constraint addEquality(LinearArgument left, LinearArgument right) |
addEquality(expr, value) | 添加约束条件 expr == value | Constraint addEquality(LinearArgument expr, long value) |
addExactlyOne(literals) | 添加约束条件 ExactlyOne(literals) | Constraint addExactlyOne(java.lang.Iterable literals) |
addExactlyOne(literals) | 添加约束条件 ExactlyOne(literals) | Constraint addExactlyOne(Literal[] literals) |
addForbiddenAssignments(variables) | 添加约束条件 ForbiddenAssignments(variables) | TableConstraint addForbiddenAssignments(IntVar[] variables) |
addForbiddenAssignments(variables) | 添加约束条件 ForbiddenAssignments(variables) | TableConstraint addForbiddenAssignments(java.lang.Iterable variables) |
addGreaterOrEqual(left, right) | 添加约束条件 left >= right | Constraint addGreaterOrEqual(LinearArgument left, LinearArgument right) |
addGreaterOrEqual(expr, value) | 添加约束条件 expr >= value | Constraint addGreaterOrEqual(LinearArgument expr, long value) |
addGreaterThan(left, right) | 添加约束条件 left > right | Constraint addGreaterThan(LinearArgument left, LinearArgument right) |
addGreaterThan(expr, value) | 添加约束条件 expr > value | Constraint addGreaterThan(LinearArgument expr, long value) |
addHint(var, value) | 向变量添加提示 | void addHint(IntVar var, long value) |
addImplication(a, b) | 添加约束条件 a => b | Constraint addImplication(Literal a, Literal b) |
addInverse(variables, inverseVariables) | 添加约束条件 Inverse(variables, inverseVariables) | Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables) |
addLessOrEqual(left, right) | 添加约束条件 left <= right | Constraint addLessOrEqual(LinearArgument left, LinearArgument right) |
addLessOrEqual(expr, value) | 添加约束条件 expr <= value | Constraint addLessOrEqual(LinearArgument expr, long value) |
addLessThan(left, right) | 添加约束条件 left < right | Constraint addLessThan(LinearArgument left, LinearArgument right) |
addLessThan(expr, value) | 添加约束条件 expr < value | Constraint addLessThan(LinearArgument expr, long value) |
addLinearConstraint(expr, lb, ub) | 添加约束条件 lb <= expr <= ub | Constraint addLinearConstraint(LinearArgument expr, long lb, long ub) |
addLinearExpressionInDomain(expr, domain) | 添加约束条件 expr in domain | Constraint addLinearExpressionInDomain(LinearArgument expr, Domain domain) |
addMapDomain(var, booleans, offset) | 添加约束条件 var == i + offset <=> booleans[i] == true | void addMapDomain(IntVar var, Literal[] booleans, long offset) |
addMaxEquality(target, exprs) | 添加约束条件 target == Max(exprs) | Constraint addMaxEquality(LinearArgument target, java.lang.Iterable<? extends LinearArgument> exprs) |
addMaxEquality(target, exprs) | 添加约束条件 target == Max(vars) | Constraint addMaxEquality(LinearArgument target, LinearArgument[] exprs) |
addMinEquality(target, exprs) | 添加约束条件 target == Min(exprs) | Constraint addMinEquality(LinearArgument target, java.lang.Iterable<? extends LinearArgument> exprs) |
addMinEquality(target, exprs) | 添加约束条件 target == Min(vars) | Constraint addMinEquality(LinearArgument target, LinearArgument[] exprs) |
addModuloEquality(target, var, mod) | 添加约束条件 target == var % mod | Constraint addModuloEquality(LinearArgument target, LinearArgument var, LinearArgument mod) |
addModuloEquality(target, var, mod) | 添加约束条件 target == var % mod | Constraint addModuloEquality(LinearArgument target, LinearArgument var, long mod) |
addMultipleCircuit() | 添加约束条件 MultipleCircuit() | MultipleCircuitConstraint addMultipleCircuit() |
addMultiplicationEquality(target, exprs) | 添加约束条件 target == Product(exprs) | Constraint addMultiplicationEquality(LinearArgument target, LinearArgument[] exprs) |
addMultiplicationEquality(target, left, right) | 添加约束条件 target == left * right | Constraint addMultiplicationEquality(LinearArgument target, LinearArgument left, LinearArgument right) |
addNoOverlap(intervalVars) | 添加约束条件 NoOverlap(intervalVars) | Constraint addNoOverlap(IntervalVar[] intervalVars) |
addNoOverlap(intervalVars) | 添加约束条件 NoOverlap(intervalVars) | Constraint addNoOverlap(java.lang.Iterable intervalVars) |
addNoOverlap2D() | 添加约束条件 NoOverlap2D(xIntervals, yIntervals) | NoOverlap2dConstraint addNoOverlap2D() |
addReservoirConstraint(minLevel, maxLevel) | 添加水库约束 | ReservoirConstraint addReservoirConstraint(long minLevel, long maxLevel) |
clearAssumptions() | 从模型中移除所有假设 | void clearAssumptions() |
clearHints() | 清除所有解提示 | void clearHints() |
clearObjective() | 清除目标 | void clearObjective() |
exportToFile(file) | 将模型以协议缓冲区形式写入到文件中 | java.lang.Boolean exportToFile(java.lang.String file) |
falseLiteral() | 返回 false 字面量 | Literal falseLiteral() |
getBoolVarFromProtoIndex(index) | 从索引重建布尔变量 | BoolVar getBoolVarFromProtoIndex(int index) |
getBuilder() | 返回模型构建器 | CpModelProto.Builder getBuilder() |
getClone() | 获取模型的克隆 | CpModel getClone() |
getIntVarFromProtoIndex(index) | 从索引重建整数变量 | IntVar getIntVarFromProtoIndex(int index) |
hasObjective() | 检查模型是否包含目标 | boolean hasObjective() |
maximize(expr) | 添加一个线性表达式的最大化目标 | void maximize(DoubleLinearExpr expr) |
maximize(expr) | 添加一个线性表达式的最大化目标 | void maximize(LinearArgument expr) |
minimize(expr) | 添加一个线性表达式的最小化目标 | void minimize(DoubleLinearExpr expr) |
minimize(expr) | 添加一个线性表达式的最小化目标 | void minimize(LinearArgument expr) |
model() | 获取模型 | CpModelProto model() |
modelStats() | 以字符串形式返回模型的一些统计信息 | java.lang.String modelStats() |
negated(index) | 对索引进行否定 | int negated(int index) |
newBoolVar(name) | 创建具有给定名称的布尔变量 | BoolVar newBoolVar(java.lang.String name) |
newConstant(value) | 创建一个常量变量 | IntVar newConstant(long value) |
newFixedInterval(start, size, name) | 根据开始和大小创建一个固定的时间间隔 | IntervalVar newFixedInterval(long start, long size, java.lang.String name) |
newFixedSizeIntervalVar(start, size, name) | 根据线性表达式 start 和固定大小创建时间间隔变量 | IntervalVar newFixedSizeIntervalVar(LinearArgument start, long size, java.lang.String name) |
newIntervalVar(start, size, end, name) | 根据三个线性表达式创建时间间隔变量 | IntervalVar newIntervalVar(LinearArgument start, LinearArgument size, LinearArgument end, java.lang.String name) |
newIntVar(lb, ub, name) | 创建一个取值范围为 [lb, ub] 的整数变量 | IntVar newIntVar(long lb, long ub, java.lang.String name) |
newIntVarFromDomain(domain, name) | 根据给定域创建一个整数变量 | IntVar newIntVarFromDomain(Domain domain, java.lang.String name) |
newOptionalFixedInterval(start, size, isPresent, name) | 根据开始、大小和是否存在字面量创建一个可选的固定时间间隔 | IntervalVar newOptionalFixedInterval(long start, long size, Literal isPresent, java.lang.String name) |
newOptionalFixedSizeIntervalVar(start, size, isPresent, name) | 根据线性表达式、固定大小和是否存在字面量创建一个可选的时间间隔变量 | IntervalVar newOptionalFixedSizeIntervalVar(LinearArgument start, long size, Literal isPresent, java.lang.String name) |
newOptionalIntervalVar(start, size, end, isPresent, name) | 根据线性表达式、大小、结束和是否存在字面量创建一个可选的时间间隔变量 | IntervalVar newOptionalIntervalVar(LinearArgument start, LinearArgument size, LinearArgument end, Literal isPresent, java.lang.String name) |
trueLiteral() | 返回 true 字面量 | Literal trueLiteral() |
validate() | 如果模型无效,则返回非空字符串解释问题 | java.lang.String validate() |
拓展方法详解
构造函数
CpModel构造函数详细说明
CpModel()
方法说明
getClone方法
CpModel getClone()
- 描述:获取模型的克隆。
新建变量
newIntVar方法
IntVar newIntVar(long lb, long ub, String name)
- 描述:创建一个取值范围为[lb, ub]的整数变量。
参数:
- lb:变量的下界。
- ub:变量的上界。
- name:变量的名称。
返回值:创建的整数变量。
newIntVarFromDomain方法
IntVar newIntVarFromDomain(Domain domain, String name)
- 描述:根据给定域创建一个整数变量。
参数:
- domain:域的实例。
- name:变量的名称。
返回值:具有给定域的变量。
newBoolVar方法
BoolVar newBoolVar(String name)
- 描述:创建具有给定名称的布尔变量。
参数:
- name:变量的名称。
返回值:创建的布尔变量。
newConstant方法
IntVar newConstant(long value)
- 描述:创建一个常量变量。
参数:
- value:常量的值。
返回值:创建的常量变量。
trueLiteral方法
Literal trueLiteral()
- 描述:返回true字面量。
返回值:true字面量。
falseLiteral方法
Literal falseLiteral()
- 描述:返回false字面量。
返回值:false字面量。
getBoolVarFromProtoIndex方法
BoolVar getBoolVarFromProtoIndex(int index)
- 描述:从索引重建布尔变量。
参数:
- index:索引值。
返回值:重建的布尔变量。
getIntVarFromProtoIndex方法
IntVar getIntVarFromProtoIndex(int index)
- 描述:从索引重建整数变量。
参数:
- index:索引值。
返回值:重建的整数变量。
约束
addBoolOr方法
Constraint addBoolOr(Literal[] literals)
- 描述:添加约束条件Or(literals) == true。
参数:
- literals:字面量数组。
返回值:添加的约束条件。
addBoolOr方法
Constraint addBoolOr(Iterable<Literal> literals)
- 描述:添加约束条件Or(literals) == true。
参数:
- literals:字面量集合。
返回值:添加的约束条件。
addAtLeastOne方法
Constraint addAtLeastOne(Literal[] literals)
- 描述:同addBoolOr。Sum(literals) >= 1。
参数:
- literals:字面量数组。
返回值:添加的约束条件。
addAtLeastOne方法
Constraint addAtLeastOne(Iterable<Literal> literals)
- 描述:同addBoolOr。Sum(literals) >= 1。
参数:
- literals:字面量集合。
返回值:添加的约束条件。
addAtMostOne方法
Constraint addAtMostOne(Literal[] literals)
- 描述:添加约束条件AtMostOne(literals)。Sum(literals) <= 1。
参数:
- literals:字面量数组。
返回值:添加的约束条件。
addAtMostOne方法
Constraint addAtMostOne(Iterable<Literal> literals)
- 描述:添加约束条件AtMostOne(literals)。Sum(literals) <= 1。
参数:
- literals:字面量集合。
返回值:添加的约束条件。
addExactlyOne方法
Constraint addExactlyOne(Literal[] literals)
- 描述:添加约束条件ExactlyOne(literals)。Sum(literals) == 1。
参数:
- literals:字面量数组。
返回值:添加的约束条件。
addExactlyOne方法
Constraint addExactlyOne(Iterable<Literal> literals)
- 描述:添加约束条件ExactlyOne(literals)。Sum(literals) == 1。
参数:
- literals:字面量集合。
返回值:添加的约束条件。
addBoolAnd方法
Constraint addBoolAnd(Literal[] literals)
- 描述:添加约束条件And(literals) == true。
参数:
- literals:字面量数组。
返回值:添加的约束条件。
addBoolAnd方法
Constraint addBoolAnd(Iterable<Literal> literals)
- 描述:添加约束条件And(literals) == true。
参数:
- literals:字面量集合。
返回值:添加的约束条件。
addBoolXor方法
Constraint addBoolXor(Literal[] literals)
- 描述:添加约束条件XOr(literals) == true。
参数:
- literals:字面量数组。
返回值:添加的约束条件。
addBoolXor方法
Constraint addBoolXor(Iterable<Literal> literals)
- 描述:添加约束条件XOr(literals) == true。
参数:
- literals:字面量集合。
返回值:添加的约束条件。
addImplication方法
Constraint addImplication(Literal a, Literal b)
- 描述:添加约束条件a => b。
参数:
- a:字面量a。
- b:字面量b。
返回值:添加的约束条件。
addLinearExpressionInDomain方法
Constraint addLinearExpressionInDomain(LinearArgument expr, Domain domain)
- 描述:添加约束条件expr in domain。
参数:
- expr:线性表达式。
- domain:定义域。
返回值:添加的约束条件。
addLinearConstraint方法
Constraint addLinearConstraint(LinearArgument expr, long lb, long ub)
- 描述:添加约束条件lb <= expr <= ub。
参数:
- expr:线性表达式。
- lb:下界。
- ub:上界。
返回值:添加的约束条件。
addEquality方法
Constraint addEquality(LinearArgument expr, long value)
- 描述:添加约束条件expr == value。
参数:
- expr:线性表达式。
- value:值。
返回值:添加的约束条件。
addEquality方法
Constraint addEquality(LinearArgument left, LinearArgument right)
- 描述:添加约束条件left == right。
参数:
- left:左边的线性表达式。
- right:右边的线性表达式。
返回值:添加的约束条件。
addLessOrEqual方法
Constraint addLessOrEqual(LinearArgument expr, long value)
- 描述:添加约束条件expr <= value。
参数:
- expr:线性表达式。
- value:值。
返回值:添加的约束条件。
addLessOrEqual方法
Constraint addLessOrEqual(LinearArgument left, LinearArgument right)
- 描述:添加约束条件left <= right。
参数:
- left:左边的线性表达式。
- right:右边的线性表达式。
返回值:添加的约束条件。
addLessThan方法
Constraint addLessThan(LinearArgument expr, long value)
- 描述:添加约束条件expr < value。
参数:
- expr:线性表达式。
- value:值。
返回值:添加的约束条件。
addLessThan方法
Constraint addLessThan(LinearArgument left, LinearArgument right)
- 描述:添加约束条件left < right。
参数:
- left:左边的线性表达式。
- right:右边的线性表达式。
返回值:添加的约束条件。
addGreaterOrEqual方法
Constraint addGreaterOrEqual(LinearArgument expr, long value)
- 描述:添加约束条件expr >= value。
参数:
- expr:线性表达式。
- value:值。
返回值:添加的约束条件。
addGreaterOrEqual方法
Constraint addGreaterOrEqual(LinearArgument left, LinearArgument right)
- 描述:添加约束条件left >= right。
参数:
- left:左边的线性表达式。
- right:右边的线性表达式。
返回值:添加的约束条件。
addGreaterThan方法
Constraint addGreaterThan(LinearArgument expr, long value)
- 描述:添加约束条件expr > value。
参数:
- expr:线性表达式。
- value:值。
返回值:添加的约束条件。
addGreaterThan方法
Constraint addGreaterThan(LinearArgument left, LinearArgument right)
- 描述:添加约束条件left > right。
参数:
- left:左边的线性表达式。
- right:右边的线性表达式。
返回值:添加的约束条件。
addDifferent方法
Constraint addDifferent(LinearArgument expr, long value)
- 描述:添加约束条件expr != value。
参数:
- expr:线性表达式。
- value:值。
返回值:添加的约束条件。
addDifferent方法
Constraint addDifferent(LinearArgument left, LinearArgument right)
- 描述:添加约束条件left != right。
参数:
- left:左边的线性表达式。
- right:右边的线性表达式。
返回值:添加的约束条件。
addAllDifferent方法
Constraint addAllDifferent(LinearArgument[] expressions)
- 描述:添加约束条件AllDifferent(expressions)。
参数:
- expressions:线性表达式数组。
返回值:添加的约束条件。
addAllDifferent方法
Constraint addAllDifferent(Iterable<? extends LinearArgument> expressions)
- 描述:添加约束条件AllDifferent(expressions)。
参数:
- expressions:线性表达式集合。
返回值:添加的约束条件。
addElement方法
Constraint addElement(IntVar index, IntVar[] variables, IntVar target)
- 描述:添加元素约束条件variables[index] == target。
参数:
- index:索引变量。
- variables:整数变量数组。
- target:目标变量。
返回值:添加的约束条件。
addElement方法
Constraint addElement(IntVar index, long[] values, IntVar target)
- 描述:添加元素约束条件values[index] == target。
参数:
- index:索引变量。
- values:整数数组。
- target:目标变量。
返回值:添加的约束条件。
addElement方法
Constraint addElement(IntVar index, int[] values, IntVar target)
- 描述:添加元素约束条件values[index] == target。
参数:
- index:索引变量。
- values:整数数组。
- target:目标变量。
返回值:添加的约束条件。
addCircuit方法
CircuitConstraint addCircuit()
- 描述:添加约束条件Circuit()。
返回值:添加的约束条件。
addMultipleCircuit方法
MultipleCircuitConstraint addMultipleCircuit()
- 描述:添加约束条件MultipleCircuit()。
返回值:添加的约束条件。
addAllowedAssignments方法
TableConstraint addAllowedAssignments(IntVar[] variables)
- 描述:添加约束条件AllowedAssignments(variables)。
参数:
- variables:整数变量数组。
返回值:添加的约束条件。
addAllowedAssignments方法
TableConstraint addAllowedAssignments(Iterable<IntVar> variables)
- 描述:添加约束条件AllowedAssignments(variables)。
参数:
- variables:整数变量集合。
返回值:添加的约束条件。
addForbiddenAssignments方法
TableConstraint addForbiddenAssignments(IntVar[] variables)
- 描述:添加约束条件ForbiddenAssignments(variables)。
参数:
- variables:整数变量数组。
返回值:添加的约束条件。
addForbiddenAssignments方法
TableConstraint addForbiddenAssignments(Iterable<IntVar> variables)
- 描述:添加约束条件ForbiddenAssignments(variables)。
参数:
- variables:整数变量集合。
返回值:添加的约束条件。
addAutomaton方法
AutomatonConstraint addAutomaton(IntVar[] transitionVariables, long startingState, long[] finalStates)
- 描述:添加自动机约束。
参数:
- transitionVariables:过渡变量的数组。
- startingState:初始状态。
- finalStates:最终状态的数组。
返回值:添加的约束条件。
addInverse方法
Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
- 描述:添加约束条件Inverse(variables, inverseVariables)。
参数:
- variables:整数变量的数组。
- inverseVariables:整数变量的数组。
返回值:添加的约束条件。
addReservoirConstraint方法
ReservoirConstraint addReservoirConstraint(long minLevel, long maxLevel)
- 描述:添加水库约束。
参数:
- minLevel:水库的最小水位。
- maxLevel:水库的最大水位。
返回值:添加的约束条件。
addMapDomain方法
void addMapDomain(IntVar var, Literal[] booleans, long offset)
- 描述:添加约束条件var == i + offset <=> booleans[i] == true,对于所有i在[0, booleans.length)之间。
参数:
- var:整数变量。
- booleans:字面量数组。
- offset:偏移量。
addMinEquality方法
Constraint addMinEquality(LinearArgument target, LinearArgument[] exprs)
- 描述:添加约束条件target == Min(vars)。
参数:
- target:目标线性表达式。
- exprs:线性表达式数组。
返回值:添加的约束条件。
addMinEquality方法
Constraint addMinEquality(LinearArgument target, Iterable<? extends LinearArgument> exprs)
- 描述:添加约束条件target == Min(exprs)。
参数:
- target:目标线性表达式。
- exprs:线性表达式集合。
返回值:添加的约束条件。
addMaxEquality方法
Constraint addMaxEquality(LinearArgument target, LinearArgument[] exprs)
- 描述:添加约束条件target == Max(vars)。
参数:
- target:目标线性表达式。
- exprs:线性表达式数组。
返回值:添加的约束条件。
addMaxEquality方法
Constraint addMaxEquality(LinearArgument target, Iterable<? extends LinearArgument> exprs)
- 描述:添加约束条件target == Max(exprs)。
参数:
- target:目标线性表达式。
- exprs:线性表达式集合。
返回值:添加的约束条件。
addDivisionEquality方法
Constraint addDivisionEquality(LinearArgument target, LinearArgument num, LinearArgument denom)
- 描述:添加约束条件target == num / denom,向0取整。
参数:
- target:目标线性表达式。
- num:分子线性表达式。
- denom:分母线性表达式。
返回值:添加的约束条件。
addAbsEquality方法
Constraint addAbsEquality(LinearArgument target, LinearArgument expr)
- 描述:添加约束条件target == Abs(expr)。
参数:
- target:目标线性表达式。
- expr:线性表达式。
返回值:添加的约束条件。
addModuloEquality方法
Constraint addModuloEquality(LinearArgument target, LinearArgument var, LinearArgument mod)
- 描述:添加约束条件target == var % mod。
参数:
- target:目标线性表达式。
- var:变量。
- mod:模数。
返回值:添加的约束条件。
addModuloEquality方法
Constraint addModuloEquality(LinearArgument target, LinearArgument var, long mod)
- 描述:添加约束条件target == var % mod。
参数:
- target:目标线性表达式。
- var:变量。
- mod:模数。
返回值:添加的约束条件。
addMultiplicationEquality方法
Constraint addMultiplicationEquality(LinearArgument target, LinearArgument[] exprs)
- 描述:添加约束条件target == Product(exprs)。
参数:
- target:目标线性表达式。
- exprs:线性表达式数组。
返回值:添加的约束条件。
addMultiplicationEquality方法
Constraint addMultiplicationEquality(LinearArgument target, LinearArgument left, LinearArgument right)
- 描述:添加约束条件target == left * right。
参数:
- target:目标线性表达式。
- left:左边的线性表达式。
- right:右边的线性表达式。
返回值:添加的约束条件。
区间变量和约束
newIntervalVar方法
IntervalVar newIntervalVar(LinearArgument start, LinearArgument size, LinearArgument end, String name)
- 描述:根据三个线性表达式创建时间间隔变量。
参数:
- start:开始时间的线性表达式。
- size:时间间隔大小的线性表达式。
- end:结束时间的线性表达式。
- name:时间间隔变量的名称。
返回值:创建的时间间隔变量。
newFixedSizeIntervalVar方法
IntervalVar newFixedSizeIntervalVar(LinearArgument start, long size, String name)
- 描述:根据线性表达式和固定大小创建时间间隔变量。
参数:
- start:开始时间的线性表达式。
- size:时间间隔的固定大小。
- name:时间间隔变量的名称。
返回值:创建的时间间隔变量。
newFixedInterval方法
IntervalVar newFixedInterval(long start, long size, String name)
- 描述:根据开始时间和大小创建固定的时间间隔。
参数:
- start:开始时间。
- size:时间间隔的大小。
- name:时间间隔变量的名称。
返回值:创建的固定时间间隔变量。
newOptionalIntervalVar方法
IntervalVar newOptionalIntervalVar(LinearArgument start, LinearArgument size, LinearArgument end, Literal isPresent, String name)
- 描述:根据三个线性表达式和是否存在字面量创建可选的时间间隔变量。
参数:
- start:开始时间的线性表达式。
- size:时间间隔大小的线性表达式。
- end:结束时间的线性表达式。
- isPresent:指示时间间隔是否活动的字面量。非活动的时间间隔在所有约束中被忽略。
- name:时间间隔变量的名称。
返回值:创建的可选时间间隔变量。
newOptionalFixedSizeIntervalVar方法
IntervalVar newOptionalFixedSizeIntervalVar(LinearArgument start, long size, Literal isPresent, String name)
- 描述:根据线性表达式和固定大小以及是否存在字面量创建可选的时间间隔变量。
参数:
- start:开始时间的线性表达式。
- size:时间间隔的固定大小。
- isPresent:指示时间间隔是否活动的字面量。非活动的时间间隔在所有约束中被忽略。
- name:时间间隔变量的名称。
返回值:创建的可选时间间隔变量。
newOptionalFixedInterval方法
IntervalVar newOptionalFixedInterval(long start, long size, Literal isPresent, String name)
- 描述:根据开始时间、大小和是否存在字面量创建可选的固定时间间隔。
参数:
- start:开始时间。
- size:时间间隔的大小。
- isPresent:指示时间间隔是否活动的字面量。非活动的时间间隔在所有约束中被忽略。
- name:时间间隔变量的名称。
返回值:创建的可选固定时间间隔变量。
addNoOverlap方法
Constraint addNoOverlap(IntervalVar[] intervalVars)
- 描述:添加约束条件NoOverlap(intervalVars)。
参数:
- intervalVars:时间间隔变量的数组。
返回值:添加的约束条件。
addNoOverlap方法
Constraint addNoOverlap(Iterable<IntervalVar> intervalVars)
- 描述:添加约束条件NoOverlap(intervalVars)。
参数:
- intervalVars:时间间