【ortools 源码系列7】Ortools CP-SAT 用法示例源码实战详解

本文深入解析OR-Tools的CP-SAT求解器,介绍如何创建各种变量(如Intvar、BoolVar、IntervalVar)及约束(线性、非线性等),并详细讲解了CP-SAT模型的构建和优化目标设定,包括NoOverlap、Cumulative等约束。通过源码实战示例,帮助读者理解并应用OR-Tools解决实际问题。
摘要由CSDN通过智能技术生成

OR-Tools CP-SAT 用法示例源码详解

文章目录


最近笔者一直在从事整数规划方面的排程编程,在互联网上收集了很多有意思的技巧与知识想分享一下。首先可以看官网里面有许许多多的例子,感兴趣的朋友可以自己去学习一下,笔者这里不再赘述了。本文笔者根据实战整理的它的全面用法,作为工具文档,看此一篇就够了。希望大家受用

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有一种特殊的区间变量,它可以用来表示时间间隔。通常配合约束AddNoOverLapAddCumulative使用表示区间不能重叠或者区间累计。有两种创建此变量的方式:

  • model.NewIntervalVar(self, start, size, end, name)
  • model.NewOptionalIntervalVar(self, start, size, end, is_present, name)

相同的是都需要startsizeend参数表示区间的开始的整型变量、尺寸或者时间的长度和区间的结束的整型变量。

不同的是前者表示创建的区间变量在以后的约束建立中一定生效,而后者的方法签名中有个为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:时间间
CP-ABE(Ciphertext-Policy Attribute-Based Encryption)是一种基于属性的加密技术,它允许用户将访问控制策略与加密数据关联起来。这种技术能够实现细粒度的访问控制,提供更灵活的数据共享方式。 进行CP-ABE源码分析,主要分为以下几个方面: 1. 密钥生成:源码中应包含密钥生成的模块。密钥生成主要负责生成系统的主密钥和各个用户的访问密钥。在CP-ABE中,访问密钥由用户的属性和系统的主密钥生成。 2. 数据加密/解密:源码中应包含数据加密和解密的模块。数据加密时,需要定义访问策略,即控制文件被哪些用户访问的属性要求。数据解密时,需要验证用户的访问密钥是否符合数据的访问策略,如果符合,则可以解密数据。 3. 属性管理:源码中还应该包含属性管理的模块。属性管理主要负责属性的分配和撤销。当有新用户加入系统或者用户的属性发生了变化,系统需要进行相应的属性管理操作,以确保数据访问的有效性。 4. 策略解析:源码中应包含策略解析的模块。策略解析主要负责解析访问策略,将其转换为访问控制规则。这一步骤在数据加密和解密过程中都需要进行,以确定数据的访问权限。 5. 算法实现:CP-ABE的源码应包含相应的加密算法实现。CP-ABE技术一般使用属性矩阵和多线性映射等数学工具,通过算法来实现加密和解密的功能。 综上所述,CP-ABE的源码分析主要关注密钥生成、数据加密/解密、属性管理、策略解析和算法实现等方面。通过分析源码,可以更深入地了解CP-ABE技术的实现原理和操作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值