是否可以仅使用一个整数变量使用 or-tools 来计算 argmax?
Is it possible to compute argmax with or-tools with just one integer variable?
部分模型 objective 按标量列表中的项目加权。
我通过使用 0-1 范围变量的列表来解决这个问题,然后使用 LinearExpr.ScalProd 来加权 objective。
有没有办法只使用一个整数变量(objective 变量除外),我可以使用 lambda 或其他一些机制来查找 table?
这是我的一些示例代码,但我正在尝试确定它是否可以更简洁。
def argmax(
model: cp_model.CpModel, values: List[int]
) -> Tuple[List[cp_model.IntVar], cp_model.IntVar]:
objective_var = model.NewIntVar(0, 1000000, "objective_var")
ret_vars = [model.NewIntVar(0, 1, "x(%i)" % i) for i in range(len(values))]
model.Add(sum(ret_vars) == 1)
model.Add(objective_var == cp_model.LinearExpr.ScalProd(ret_vars, values))
return [ret_vars, objective_var]
这可以使用 model.AddElement 来完成。
def AddElement(self, index, variables, target)
我发现 AddElement 的文档有点晦涩难懂,所以我会尝试用我认为更简单的术语来整理它。
它指出:Adds the element constraint: variables[index] == target.
- 索引 -> 您要查找的变量。
- 变量 -> table 查找值。
- 目标 -> 您希望它等于的值。
如果有的话,阅读 C++ 代码会使它更容易理解。
Constraint CpModelBuilder::AddElement(IntVar index,
absl::Span<const int64> values,
IntVar target) {
将所有这些放在一起,我们得到:
def argmax(
model: cp_model.CpModel, values: List[int]
) -> Tuple[cp_model.IntVar, cp_model.IntVar]:
objective_var = model.NewIntVar(0, 1000000, "objective_var")
ret_var = model.NewIntVar(0, len(values) - 1, "x")
model.AddElement(ret_var, values, objective_var)
return [ret_var, objective_var]
部分模型 objective 按标量列表中的项目加权。
我通过使用 0-1 范围变量的列表来解决这个问题,然后使用 LinearExpr.ScalProd 来加权 objective。
有没有办法只使用一个整数变量(objective 变量除外),我可以使用 lambda 或其他一些机制来查找 table?
这是我的一些示例代码,但我正在尝试确定它是否可以更简洁。
def argmax(
model: cp_model.CpModel, values: List[int]
) -> Tuple[List[cp_model.IntVar], cp_model.IntVar]:
objective_var = model.NewIntVar(0, 1000000, "objective_var")
ret_vars = [model.NewIntVar(0, 1, "x(%i)" % i) for i in range(len(values))]
model.Add(sum(ret_vars) == 1)
model.Add(objective_var == cp_model.LinearExpr.ScalProd(ret_vars, values))
return [ret_vars, objective_var]
这可以使用 model.AddElement 来完成。
def AddElement(self, index, variables, target)
我发现 AddElement 的文档有点晦涩难懂,所以我会尝试用我认为更简单的术语来整理它。
它指出:Adds the element constraint: variables[index] == target.
- 索引 -> 您要查找的变量。
- 变量 -> table 查找值。
- 目标 -> 您希望它等于的值。
如果有的话,阅读 C++ 代码会使它更容易理解。
Constraint CpModelBuilder::AddElement(IntVar index,
absl::Span<const int64> values,
IntVar target) {
将所有这些放在一起,我们得到:
def argmax(
model: cp_model.CpModel, values: List[int]
) -> Tuple[cp_model.IntVar, cp_model.IntVar]:
objective_var = model.NewIntVar(0, 1000000, "objective_var")
ret_var = model.NewIntVar(0, len(values) - 1, "x")
model.AddElement(ret_var, values, objective_var)
return [ret_var, objective_var]